Tar

Tar.createFunction
create(
    [ predicate, ] dir, [ tarball ];
    [ skeleton, ] [ portable = false ]
) -> tarball

    predicate :: String --> Bool
    dir       :: AbstractString
    tarball   :: Union{AbstractString, AbstractCmd, IO}
    skeleton  :: Union{AbstractString, AbstractCmd, IO}
    portable  :: Bool

디렉토리 dir의 tar 아카이브("tarball")를 생성합니다. 결과 아카이브는 tarball 경로에 기록되거나 경로가 지정되지 않은 경우 임시 경로가 생성되어 함수 호출에 의해 반환됩니다. tarball이 IO 객체인 경우 tarball 내용은 해당 핸들에 대신 기록됩니다(핸들은 열려 있습니다).

predicate 함수가 전달되면, 이는 dir을 재귀적으로 검색하는 동안 만나는 각 시스템 경로에 대해 호출되며, predicate(path)가 true인 경우에만 path가 tarball에 포함됩니다. predicate(path)가 디렉토리에 대해 false를 반환하면 해당 디렉토리는 완전히 제외됩니다: 해당 디렉토리 아래의 내용은 아카이브에 포함되지 않습니다.

skeleton 키워드가 전달되면, 주어진 파일 또는 IO 핸들이 tarball 생성을 위한 "스켈레톤"으로 사용됩니다. extract 명령에 skeleton 키워드를 전달하여 스켈레톤 파일을 생성합니다. 해당 스켈레톤 파일로 create가 호출되고 추출된 파일이 변경되지 않은 경우, 동일한 tarball이 재생성됩니다. skeletonpredicate 인자는 함께 사용할 수 없습니다.

portable 플래그가 true인 경우, 경로 이름이 Windows에서 유효성을 검사하여 불법 문자가 포함되지 않거나 예약된 이름이 없도록 합니다. 자세한 내용은 https://stackoverflow.com/a/31976060/659248을 참조하십시오.

source
Tar.extractFunction
extract(
    [ predicate, ] tarball, [ dir ];
    [ skeleton = <none>, ]
    [ copy_symlinks = <auto>, ]
    [ set_permissions = true, ]
) -> dir

    predicate       :: Header --> Bool
    tarball         :: Union{AbstractString, AbstractCmd, IO}
    dir             :: AbstractString
    skeleton        :: Union{AbstractString, AbstractCmd, IO}
    copy_symlinks   :: Bool
    set_permissions :: Bool

tarball 경로에 위치한 tar 아카이브를 dir 디렉토리로 추출합니다. tarball이 경로 대신 IO 객체인 경우, 아카이브 내용은 해당 IO 스트림에서 읽어옵니다. 아카이브는 dir로 추출되며, dir은 기존의 빈 디렉토리이거나 새 디렉토리로 생성할 수 있는 존재하지 않는 경로여야 합니다. dir이 지정되지 않으면, 아카이브는 임시 디렉토리에 추출되며, 이 임시 디렉토리는 extract에 의해 반환됩니다.

predicate 함수가 전달되면, tarball을 추출하는 동안 만나는 각 Header 객체에 대해 호출되며, 항목은 predicate(hdr)가 true일 때만 추출됩니다. 이는 아카이브의 일부만 선택적으로 추출하거나, extract가 오류를 발생시키는 항목을 건너뛰거나, 추출 과정에서 무엇이 추출되었는지를 기록하는 데 사용할 수 있습니다.

Header 객체는 predicate 함수에 전달되기 전에 tarball의 원시 헤더에서 다소 수정됩니다: path 필드는 . 항목을 제거하고 여러 개의 연속 슬래시를 단일 슬래시로 대체하도록 정규화됩니다. 항목의 유형이 :hardlink인 경우, 링크 대상 경로도 동일한 방식으로 정규화되어 대상 항목의 경로와 일치하게 됩니다; 크기 필드는 대상 경로의 크기로 설정됩니다(이미 본 파일이어야 함).

skeleton 키워드가 전달되면, 추출된 tarball의 "스켈레톤"이 주어진 파일 또는 IO 핸들에 기록됩니다. 이 스켈레톤 파일은 create 함수에 skeleton 키워드를 전달하여 동일한 tarball을 재생성하는 데 사용할 수 있습니다. skeletonpredicate 인자는 함께 사용할 수 없습니다.

copy_symlinkstrue인 경우, 심볼릭 링크를 그대로 추출하는 대신, tarball 내부에 있고 가능할 경우 링크된 내용을 복사하여 추출됩니다. /etc/passwd와 같은 비내부 심볼릭 링크는 복사되지 않습니다. 어떤 식으로든 순환하는 심볼릭 링크도 복사되지 않으며 대신 건너뛰어집니다. 기본적으로, extractdir에서 심볼릭 링크를 생성할 수 있는지 여부를 감지하고, 생성할 수 없는 경우 자동으로 심볼릭 링크를 복사합니다.

set_permissionsfalse인 경우, 추출된 파일에 대한 권한이 설정되지 않습니다.

source
Tar.listFunction
list(tarball; [ strict = true ]) -> Vector{Header}
list(callback, tarball; [ strict = true ])

    callback  :: Header, [ <data> ] --> Any
    tarball   :: Union{AbstractString, AbstractCmd, IO}
    strict    :: Bool

주어진 경로 tarball에 위치한 tar 아카이브("tarball")의 내용을 나열합니다. tarball이 IO 핸들이면 해당 스트림에서 tar 내용을 읽습니다. Header 구조체의 벡터를 반환합니다. 자세한 내용은 Header를 참조하십시오.

callback이 제공되면 헤더의 벡터를 반환하는 대신 각 Header에 대해 콜백이 호출됩니다. 이는 tarball의 항목 수가 많거나 tarball의 오류 이전에 항목을 검사하고 싶을 때 유용할 수 있습니다. callback 함수가 Vector{UInt8} 또는 Vector{Pair{Symbol, String}} 유형의 두 번째 인수를 수용할 수 있는 경우, 원시 헤더 데이터의 표현으로 호출되며, 이는 단일 바이트 벡터 또는 필드 이름을 해당 필드의 원시 데이터에 매핑하는 쌍의 벡터로 제공됩니다(이 필드들이 함께 연결되면 결과는 헤더의 원시 데이터입니다).

기본적으로 listextract 함수가 추출을 거부할 tarball 내용이 발견되면 오류를 발생시킵니다. strict=false로 설정하면 이러한 검사를 건너뛰고 extract가 추출할 수 있는지 여부에 관계없이 tar 파일의 모든 내용을 나열합니다. 악의적인 tarball은 당신을 속이기 위해 여러 가지 교묘하고 예상치 못한 일을 할 수 있으니 주의하십시오.

tarball 인수가 스켈레톤 파일(see extract and create)인 경우, list는 파일 헤더에서 이를 감지하고 스켈레톤 파일의 헤더를 적절하게 나열하거나 반복합니다.

source
Tar.rewriteFunction
rewrite(
    [ predicate, ] old_tarball, [ new_tarball ];
    [ portable = false, ]
) -> new_tarball

    predicate   :: Header --> Bool
    old_tarball :: Union{AbstractString, AbstractCmd, IO}
    new_tarball :: Union{AbstractString, AbstractCmd, IO}
    portable    :: Bool

old_tarballcreate가 생성하는 표준 형식으로 다시 작성하면서, extract가 오류를 발생시키는 원인이 되는 내용을 포함하지 않도록 확인합니다. 이는 기능적으로 다음과 같습니다.

Tar.create(Tar.extract(predicate, old_tarball), new_tarball)

그러나, 디스크에 아무것도 추출하지 않고 대신 seek 함수를 사용하여 이전 tarball의 데이터를 탐색합니다. new_tarball 인수가 전달되지 않으면, 새로운 tarball은 경로가 반환되는 임시 파일에 작성됩니다.

predicate 함수가 전달되면, old_tarball을 추출하는 동안 만나는 각 Header 객체에 대해 호출되며, predicate(hdr)가 true가 아닌 경우 항목은 건너뜁니다. 이는 아카이브의 일부만 선택적으로 다시 작성하거나, extract가 오류를 발생시키는 항목을 건너뛰거나, 다시 작성 과정에서 만나는 내용을 기록하는 데 사용할 수 있습니다.

predicate 함수에 전달되기 전에 Header 객체는 tarball의 원시 헤더에서 다소 수정됩니다: path 필드는 . 항목을 제거하고 여러 개의 연속 슬래시를 단일 슬래시로 대체하도록 정규화됩니다. 항목의 유형이 :hardlink인 경우, 링크 대상 경로도 동일한 방식으로 정규화되어 대상 항목의 경로와 일치하도록 합니다. 크기 필드는 대상 경로의 크기로 설정됩니다(이미 본 파일이어야 함).

portable 플래그가 true인 경우, 경로 이름이 Windows에서 유효성을 검사하여 불법 문자가 포함되지 않거나 예약된 이름이 없도록 합니다. 자세한 내용은 https://stackoverflow.com/a/31976060/659248을 참조하십시오.

source
Tar.tree_hashFunction
tree_hash([ predicate, ] tarball;
          [ algorithm = "git-sha1", ]
          [ skip_empty = false ]) -> hash::String

    predicate  :: Header --> Bool
    tarball    :: Union{AbstractString, AbstractCmd, IO}
    algorithm  :: AbstractString
    skip_empty :: Bool

tarball이 포함하고 있는 파일 트리에 대한 트리 해시 값을 계산합니다. 기본적으로 이는 SHA1 보안 해시 함수를 사용하는 git의 트리 해싱 알고리즘을 사용합니다(현재 버전의 git과 유사). 이는 git이 표현할 수 있는 파일 트리를 가진 모든 tarball—즉, 파일, 심볼릭 링크 및 비어 있지 않은 디렉토리만 있는 tarball—에 대해 이 함수로 계산된 해시 값이 해당 파일 트리에 대해 git이 계산할 해시 값과 동일함을 의미합니다. tarball은 git이 저장할 수 없는 비어 있는 디렉토리를 포함하는 파일 트리를 표현할 수 있으며, 이 함수는 이러한 디렉토리에 대한 해시를 생성할 수 있습니다. 기본적으로(아래의 skip_empty를 참조하여 이 동작을 변경하는 방법) 이러한 비어 있는 디렉토리를 생략하는 tarball의 해시와는 다릅니다. 요약하자면, 해시 함수는 git이 표현할 수 있는 모든 트리에 대해 git과 일치하지만, git이 표현할 수 없는 다른 트리에 대해 해시 가능한 트리의 도메인을 일관된 방식으로 확장합니다.

predicate 함수가 전달되면, tarball을 처리하는 동안 만나는 각 Header 객체에 대해 호출되며, predicate(hdr)가 true인 경우에만 항목이 해시됩니다. 이는 아카이브의 일부만 선택적으로 해시하거나, extract가 오류를 발생시키는 항목을 건너뛰거나, 해싱 과정에서 추출된 내용을 기록하는 데 사용할 수 있습니다.

Header 객체는 predicate 함수에 전달되기 전에 tarball의 원시 헤더에서 다소 수정됩니다: path 필드는 . 항목을 제거하고 여러 개의 연속 슬래시를 단일 슬래시로 대체하도록 정규화됩니다. 항목의 유형이 :hardlink인 경우, 링크 대상 경로도 동일한 방식으로 정규화되어 대상 항목의 경로와 일치하도록 합니다; 크기 필드는 대상 경로의 크기로 설정됩니다(이미 본 파일이어야 함).

현재 지원되는 algorithm 값은 git-sha1(기본값)과 git-sha256이며, 이는 git-sha1과 동일한 기본 알고리즘을 사용하지만 SHA1 해시 함수를 SHA2-256으로 교체합니다. 이는 git이 향후 사용할 해시 함수입니다(SHA1에 대한 알려진 공격으로 인해). 향후 다른 파일 트리 해싱 알고리즘에 대한 지원이 추가될 수 있습니다.

skip_empty 옵션은 파일이나 심볼릭 링크가 재귀적으로 포함되지 않은 tarball의 디렉토리를 해시에 포함할지 무시할지를 제어합니다. 일반적으로 tarball이나 파일 트리의 내용을 해시하는 경우, 비어 있지 않은 디렉토리뿐만 아니라 모든 디렉토리에 관심이 있으므로 이러한 디렉토리를 계산된 해시에 포함하는 것이 기본값입니다. 그렇다면 이 함수가 비어 있는 디렉토리를 건너뛰는 옵션을 제공하는 이유는 무엇인가요? git은 비어 있는 디렉토리를 저장하는 것을 거부하고, 이를 repo에 추가하려고 하면 무시합니다. 따라서 git repo에 파일을 추가하여 참조 트리 해시를 계산한 후 git에 트리 해시를 요청하면, 얻는 해시 값은 skip_empty=truetree_hash로 계산된 해시 값과 일치합니다. 다시 말해, 이 옵션은 tree_hash가 비어 있는 디렉토리가 있는 트리를 해시하는 방법을 에뮬레이트할 수 있게 해줍니다. 그러나 비어 있는 디렉토리를 포함할 수 있는 트리를 해시하는 경우(즉, git repo에서 오지 않는 경우), 비어 있는 디렉토리를 무시하지 않는 도구(이 도구와 같은)를 사용하여 해시하는 것이 권장됩니다.

source
Tar.HeaderType

Header 타입은 tar 파일의 단일 레코드에 대한 필수 메타데이터를 나타내는 구조체로, 다음과 같은 정의를 가지고 있습니다:

struct Header
    path :: String # root에 대한 상대 경로
    type :: Symbol # 타입 표시기 (아래 참조)
    mode :: UInt16 # 모드/권한 (8진수로 보는 것이 가장 좋음)
    size :: Int64  # 레코드 데이터의 크기 (바이트 단위)
    link :: String # 심볼릭 링크의 대상 경로
end

타입은 다음 기호로 표현됩니다: file, hardlink, symlink, chardev, blockdev, directory, fifo, 또는 알 수 없는 타입의 경우 타입 플래그 문자를 기호로 사용합니다. extractfile, symlinkdirectory 이외의 레코드 타입을 추출하는 것을 거부합니다; liststrict=false로 호출될 경우 다른 종류의 레코드만 나열합니다.

tar 형식은 레코드에 대한 다양한 다른 메타데이터를 포함하며, 여기에는 사용자 및 그룹 ID, 사용자 및 그룹 이름, 타임스탬프가 포함됩니다. Tar 패키지는 설계상 이들을 완전히 무시합니다. tar 파일을 생성할 때, 이 필드는 항상 0/비어 있는 값으로 설정됩니다. tar 파일을 읽을 때, 이 필드는 모든 필드에 대해 각 헤더 레코드의 체크섬을 검증하는 것을 제외하고는 무시됩니다.

source