Tar
Tar.create
— Functioncreate(
[ predicate, ] dir, [ tarball ];
[ skeleton, ] [ portable = false ]
) -> tarball
predicate :: String --> Bool
dir :: AbstractString
tarball :: Union{AbstractString, AbstractCmd, IO}
skeleton :: Union{AbstractString, AbstractCmd, IO}
portable :: Bool
Создайте архив tar ("tarball") каталога dir
. Результирующий архив записывается по пути tarball
, или, если путь не указан, создается временный путь, который возвращается вызовом функции. Если tarball
является объектом IO, то содержимое tarball записывается в этот дескриптор вместо этого (дескриптор остается открытым).
Если передана функция predicate
, она вызывается для каждого системного пути, который встречается при рекурсивном поиске в dir
, и path
включается в tarball только если predicate(path)
истинно. Если predicate(path)
возвращает ложь для каталога, то каталог полностью исключается: ничего под этим каталогом не будет включено в архив.
Если передан ключевое слово skeleton
, то указанный файл или дескриптор IO используется в качестве "скелета" для генерации tarball. Вы создаете файл-скелет, передавая ключевое слово skeleton
команде extract
. Если create
вызывается с этим файлом-скелетом и извлеченные файлы не изменились, создается идентичный tarball. Аргументы skeleton
и predicate
не могут использоваться вместе.
Если флаг portable
истинный, то имена путей проверяются на допустимость в Windows, что гарантирует, что они не содержат недопустимых символов или имеют зарезервированные имена. См. https://stackoverflow.com/a/31976060/659248 для получения подробной информации.
Tar.extract
— Functionextract(
[ 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
Извлекает архив tar ("tarball"), расположенный по пути tarball
, в директорию dir
. Если tarball
является объектом IO вместо пути, то содержимое архива будет прочитано из этого потока IO. Архив извлекается в dir
, который должен быть либо существующей пустой директорией, либо несуществующим путем, который может быть создан как новая директория. Если dir
не указан, архив извлекается во временную директорию, которая возвращается функцией extract
.
Если передана функция predicate
, она вызывается для каждого объекта Header
, который встречается при извлечении tarball
, и запись извлекается только в том случае, если predicate(hdr)
истинно. Это можно использовать для выборочного извлечения только частей архива, для пропуска записей, которые вызывают ошибку extract
, или для записи того, что извлекается в процессе извлечения.
Перед тем как передать в функцию предиката, объект Header
несколько изменяется по сравнению с сырым заголовком в tarball: поле path
нормализуется для удаления записей .
и замены нескольких последовательных слешей на один слеш. Если запись имеет тип :hardlink
, путь к целевому объекту нормализуется таким же образом, чтобы он соответствовал пути целевой записи; поле размера устанавливается на размер целевого пути (который должен быть уже увиденным файлом).
Если передан ключевое слово skeleton
, то "скелет" извлеченного tarball записывается в файл или дескриптор IO, указанный. Этот файл-скелет можно использовать для воссоздания идентичного tarball, передав ключевое слово skeleton
функции create
. Аргументы skeleton
и predicate
не могут использоваться вместе.
Если copy_symlinks
равно true
, то вместо извлечения символических ссылок как таковых, они будут извлечены как копии того, на что они ссылаются, если они внутренние для tarball и если это возможно. Не внутренние символические ссылки, такие как ссылка на /etc/passwd
, не будут скопированы. Символические ссылки, которые каким-либо образом цикличны, также не будут скопированы и будут пропущены. По умолчанию extract
будет определять, могут ли быть созданы символические ссылки в dir
или нет, и автоматически скопирует символические ссылки, если их нельзя создать.
Если set_permissions
равно false
, то на извлеченные файлы не устанавливаются права.
Tar.list
— Functionlist(tarball; [ strict = true ]) -> Vector{Header}
list(callback, tarball; [ strict = true ])
callback :: Header, [ <data> ] --> Any
tarball :: Union{AbstractString, AbstractCmd, IO}
strict :: Bool
Список содержимого архива tar ("tarball"), расположенного по пути tarball
. Если tarball
является дескриптором IO, считывайте содержимое tar из этого потока. Возвращает вектор структур Header
. См. Header
для получения подробной информации.
Если предоставлен callback
, то вместо возврата вектора заголовков, функция обратного вызова вызывается для каждого Header
. Это может быть полезно, если количество элементов в tarball велико или если вы хотите проверить элементы перед ошибкой в tarball. Если функция callback
может принимать второй аргумент типа Vector{UInt8}
или Vector{Pair{Symbol, String}}
, то она будет вызвана с представлением необработанных данных заголовка либо в виде одного вектора байтов, либо в виде вектора пар, сопоставляющих имена полей с необработанными данными для этого поля (если эти поля объединены, результатом будет необработанные данные заголовка).
По умолчанию list
выдаст ошибку, если встретит любые содержимое tarball, которые функция extract
откажется извлекать. При strict=false
она пропустит эти проверки и перечислит все содержимое tar файла, независимо от того, извлечет ли extract
их или нет. Будьте осторожны, что злонамеренные tarball могут делать всевозможные хитрые и неожиданные вещи, чтобы попытаться обмануть вас на что-то плохое.
Если аргумент tarball
является файлом-скелетом (см. extract
и create
), то list
обнаружит это по заголовку файла и соответствующим образом перечислит или итерирует заголовки файла-скелета.
Tar.rewrite
— Functionrewrite(
[ предикат, ] старый_тарбол, [ новый_тарбол ];
[ портативный = false, ]
) -> новый_тарбол
предикат :: Заголовок --> Bool
старый_тарбол :: Union{AbstractString, AbstractCmd, IO}
новый_тарбол :: Union{AbstractString, AbstractCmd, IO}
портативный :: Bool
Перепишите старый_тарбол
в стандартный формат, который генерирует create
, одновременно проверяя, что он не содержит ничего, что могло бы вызвать ошибку при extract
. Это функционально эквивалентно выполнению
Tar.create(Tar.extract(предикат, старый_тарбол), новый_тарбол)
Однако он никогда не извлекает ничего на диск и вместо этого использует функцию seek
для навигации по данным старого тарбола. Если аргумент новый_тарбол
не передан, новый тарбол записывается во временный файл, путь к которому возвращается.
Если передана функция предикат
, она вызывается для каждого объекта Заголовок
, который встречается при извлечении старый_тарбол
, и запись пропускается, если предикат(hdr)
не истинно. Это можно использовать для выборочного переписывания только частей архива, для пропуска записей, которые могут вызвать ошибку при extract
, или для записи того, какой контент встречается в процессе переписывания.
Перед тем как он будет передан функции предиката, объект Заголовок
несколько модифицируется из сырого заголовка в тарболе: поле path
нормализуется для удаления записей .
и замены нескольких последовательных слэшей на один слэш. Если запись имеет тип :hardlink
, путь к целевой ссылке нормализуется тем же образом, чтобы он соответствовал пути целевой записи; поле размера устанавливается на размер целевого пути (который должен быть уже увиденным файлом).
Если флаг портативный
истинный, то имена путей проверяются на допустимость в Windows, что гарантирует, что они не содержат недопустимых символов или имеют зарезервированные имена. См. https://stackoverflow.com/a/31976060/659248 для получения подробной информации.
Tar.tree_hash
— Functiontree_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. По умолчанию используется алгоритм хеширования дерева git с функцией хеширования SHA1 (как в текущих версиях git). Это означает, что для любого tarball, файловое дерево которого может быть представлено git — т.е. одного, содержащего только файлы, символические ссылки и непустые директории — значение хеша, вычисленное этой функцией, будет таким же, как значение хеша, которое git вычислил бы для этого файлового дерева. Обратите внимание, что tarball может представлять файловые деревья с пустыми директориями, которые git не может хранить, и эта функция может генерировать хеши для таких деревьев, которые, по умолчанию (см. skip_empty
ниже, чтобы изменить это поведение), будут отличаться от хеша tarball, который опускает эти пустые директории. Короче говоря, функция хеширования согласуется с git для всех деревьев, которые git может представить, но расширяет (последовательно) область хешируемых деревьев на другие деревья, которые git не может представить.
Если передана функция predicate
, она вызывается для каждого объекта Header
, который встречается при обработке tarball
, и запись хешируется только в том случае, если predicate(hdr)
истинно. Это можно использовать для выборочного хеширования только частей архива, чтобы пропустить записи, которые вызывают ошибку extract
, или для записи того, что извлекается в процессе хеширования.
Перед тем как передать в функцию предиката, объект Header
несколько модифицируется из сырого заголовка в tarball: поле path
нормализуется, чтобы удалить записи .
и заменить несколько последовательных слешей на один слеш. Если запись имеет тип :hardlink
, путь к целевой ссылке нормализуется таким же образом, чтобы он соответствовал пути целевой записи; поле размера устанавливается на размер целевого пути (который должен быть уже увиденным файлом).
В настоящее время поддерживаемые значения для algorithm
— это git-sha1
(по умолчанию) и git-sha256
, который использует тот же основной алгоритм, что и git-sha1
, но заменяет функцию хеширования SHA1 на SHA2-256, функцию хеширования, которую git будет использовать в будущем (из-за известных атак на SHA1). Поддержка других алгоритмов хеширования файловых деревьев может быть добавлена в будущем.
Опция skip_empty
управляет тем, включаются ли директории в tarball, которые рекурсивно не содержат файлов или символических ссылок, в хеш или игнорируются. В общем, если вы хешируете содержимое tarball или файлового дерева, вам важны все директории, а не только непустые, поэтому включение их в вычисленный хеш является значением по умолчанию. Так почему же эта функция вообще предоставляет возможность пропускать пустые директории? Потому что git отказывается хранить пустые директории и будет игнорировать их, если вы попытаетесь добавить их в репозиторий. Поэтому, если вы вычисляете хеш дерева ссылки, добавляя файлы в репозиторий git, а затем запрашиваете у git хеш дерева, значение хеша, которое вы получите, будет совпадать со значением хеша, вычисленным tree_hash
с skip_empty=true
. Другими словами, эта опция позволяет tree_hash
эмулировать то, как git будет хешировать дерево с пустыми директориями. Однако, если вы хешируете деревья, которые могут содержать пустые директории (т.е. не происходят из репозитория git), рекомендуется хешировать их с помощью инструмента (например, этого), который не игнорирует пустые директории.
Tar.Header
— TypeТип Header
представляет собой структуру, описывающую основную метаданные для одной записи в tar-файле с следующим определением:
struct Header
path :: String # путь относительно корня
type :: Symbol # индикатор типа (см. ниже)
mode :: UInt16 # режим/разрешения (лучше всего просматривать в восьмеричном формате)
size :: Int64 # размер данных записи в байтах
link :: String # целевой путь символической ссылки
end
Типы представлены следующими символами: file
, hardlink
, symlink
, chardev
, blockdev
, directory
, fifo
, или для неизвестных типов, символ типафлага. Обратите внимание, что extract
отказывается извлекать записи типов, отличных от file
, symlink
и directory
; list
будет перечислять другие виды записей только в том случае, если вызван с strict=false
.
Формат tar включает различные другие метаданные о записях, включая идентификаторы пользователя и группы, имена пользователя и группы, а также временные метки. Пакет Tar
по своему дизайну полностью игнорирует их. При создании tar-файлов эти поля всегда устанавливаются в ноль/пустые. При чтении tar-файлов эти поля игнорируются, за исключением проверки контрольных сумм заголовков для каждой записи заголовка для всех полей.