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
Erstellen Sie ein Tar-Archiv ("tarball") des Verzeichnisses dir
. Das resultierende Archiv wird an den Pfad tarball
geschrieben oder, wenn kein Pfad angegeben ist, wird ein temporärer Pfad erstellt und von dem Funktionsaufruf zurückgegeben. Wenn tarball
ein IO-Objekt ist, wird der Inhalt des Tarballs stattdessen an diesen Handle geschrieben (der Handle bleibt offen).
Wenn eine predicate
-Funktion übergeben wird, wird sie für jeden Systempfad aufgerufen, der beim rekursiven Durchsuchen von dir
gefunden wird, und path
wird nur in den Tarball aufgenommen, wenn predicate(path)
wahr ist. Wenn predicate(path)
für ein Verzeichnis falsch zurückgibt, wird das Verzeichnis vollständig ausgeschlossen: Nichts unter diesem Verzeichnis wird im Archiv enthalten sein.
Wenn das Schlüsselwort skeleton
übergeben wird, wird die angegebene Datei oder IO-Handle als "Skelett" verwendet, um den Tarball zu generieren. Sie erstellen eine Skelettdatei, indem Sie das Schlüsselwort skeleton
an den extract
-Befehl übergeben. Wenn create
mit dieser Skelettdatei aufgerufen wird und die extrahierten Dateien sich nicht geändert haben, wird ein identischer Tarball neu erstellt. Die Argumente skeleton
und predicate
können nicht zusammen verwendet werden.
Wenn das Flag portable
wahr ist, werden die Pfadnamen auf Gültigkeit unter Windows überprüft, was sicherstellt, dass sie keine illegalen Zeichen enthalten oder Namen haben, die reserviert sind. Siehe https://stackoverflow.com/a/31976060/659248 für Details.
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
Extrahieren Sie ein Tar-Archiv ("tarball"), das sich unter dem Pfad tarball
befindet, in das Verzeichnis dir
. Wenn tarball
ein IO-Objekt anstelle eines Pfades ist, werden die Inhalte des Archivs aus diesem IO-Stream gelesen. Das Archiv wird in dir
extrahiert, das entweder ein vorhandenes leeres Verzeichnis oder ein nicht vorhandener Pfad sein muss, der als neues Verzeichnis erstellt werden kann. Wenn dir
nicht angegeben ist, wird das Archiv in ein temporäres Verzeichnis extrahiert, das von extract
zurückgegeben wird.
Wenn eine predicate
-Funktion übergeben wird, wird sie für jedes Header
-Objekt aufgerufen, das beim Extrahieren von tarball
begegnet, und der Eintrag wird nur extrahiert, wenn predicate(hdr)
wahr ist. Dies kann verwendet werden, um selektiv nur Teile eines Archivs zu extrahieren, um Einträge zu überspringen, die dazu führen, dass extract
einen Fehler auslöst, oder um aufzuzeichnen, was während des Extraktionsprozesses extrahiert wird.
Bevor es an die Prädikatsfunktion übergeben wird, wird das Header
-Objekt etwas vom Rohheader im Tarball modifiziert: Das path
-Feld wird normalisiert, um .
-Einträge zu entfernen und mehrere aufeinanderfolgende Schrägstriche durch einen einzelnen Schrägstrich zu ersetzen. Wenn der Eintrag vom Typ :hardlink
ist, wird der Zielpfad des Links auf die gleiche Weise normalisiert, damit er mit dem Pfad des Ziel-Eintrags übereinstimmt; das Größenfeld wird auf die Größe des Zielpfads gesetzt (der bereits gesehen worden sein muss).
Wenn das Schlüsselwort skeleton
übergeben wird, wird ein "Skelett" des extrahierten Tarballs in die angegebene Datei oder IO-Handle geschrieben. Diese Skelettdatei kann verwendet werden, um einen identischen Tarball zu reproduzieren, indem das Schlüsselwort skeleton
an die Funktion create
übergeben wird. Die Argumente skeleton
und predicate
können nicht zusammen verwendet werden.
Wenn copy_symlinks
true
ist, werden anstelle von symbolischen Links diese als Kopien dessen extrahiert, auf was sie verweisen, wenn sie intern im Tarball sind und wenn dies möglich ist. Nicht-internale Symlinks, wie ein Link zu /etc/passwd
, werden nicht kopiert. Symlinks, die in irgendeiner Weise zyklisch sind, werden ebenfalls nicht kopiert und stattdessen übersprungen. Standardmäßig erkennt extract
, ob Symlinks in dir
erstellt werden können oder nicht, und kopiert automatisch Symlinks, wenn sie nicht erstellt werden können.
Wenn set_permissions
false
ist, werden keine Berechtigungen für die extrahierten Dateien festgelegt.
Tar.list
— Functionlist(tarball; [ strict = true ]) -> Vector{Header}
list(callback, tarball; [ strict = true ])
callback :: Header, [ <data> ] --> Any
tarball :: Union{AbstractString, AbstractCmd, IO}
strict :: Bool
Listet die Inhalte eines Tar-Archivs ("tarball"), das sich unter dem Pfad tarball
befindet. Wenn tarball
ein IO-Handle ist, werden die Tar-Inhalte aus diesem Stream gelesen. Gibt einen Vektor von Header
-Strukturen zurück. Siehe Header
für Details.
Wenn ein callback
bereitgestellt wird, wird anstelle der Rückgabe eines Vektors von Headern der Callback für jeden Header
aufgerufen. Dies kann nützlich sein, wenn die Anzahl der Elemente im Tarball groß ist oder wenn Sie Elemente vor einem Fehler im Tarball untersuchen möchten. Wenn die callback
-Funktion ein zweites Argument vom Typ Vector{UInt8}
oder Vector{Pair{Symbol, String}}
akzeptieren kann, wird sie mit einer Darstellung der rohen Headerdaten entweder als einzelner Byte-Vektor oder als Vektor von Paaren, die Feldnamen den rohen Daten für dieses Feld zuordnen, aufgerufen (wenn diese Felder zusammengefügt werden, ergibt das die rohen Daten des Headers).
Standardmäßig wird list
einen Fehler ausgeben, wenn es auf Inhalte des Tarballs stößt, die die extract
-Funktion nicht extrahieren würde. Mit strict=false
werden diese Überprüfungen übersprungen und alle Inhalte der Tar-Datei aufgelistet, unabhängig davon, ob extract
sie extrahieren würde oder nicht. Seien Sie vorsichtig, dass bösartige Tarballs allerlei raffinierte und unerwartete Dinge tun können, um Sie zu versuchen, etwas Schlechtes zu tun.
Wenn das Argument tarball
eine Skelettdatei ist (siehe extract
und create
), wird list
dies anhand des Dateikopfes erkennen und die Header der Skelettdatei entsprechend auflisten oder iterieren.
Tar.rewrite
— Functionrewrite(
[ 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
Schreibt old_tarball
im Standardformat um, das create
erzeugt, während gleichzeitig überprüft wird, dass es nichts enthält, was extract
dazu bringen würde, einen Fehler auszulösen. Dies ist funktional äquivalent zu
Tar.create(Tar.extract(predicate, old_tarball), new_tarball)
Es extrahiert jedoch niemals etwas auf die Festplatte und verwendet stattdessen die Funktion seek
, um durch die Daten des alten Tarballs zu navigieren. Wenn kein new_tarball
-Argument übergeben wird, wird der neue Tarball in eine temporäre Datei geschrieben, deren Pfad zurückgegeben wird.
Wenn eine predicate
-Funktion übergeben wird, wird sie für jedes Header
-Objekt aufgerufen, das beim Extrahieren von old_tarball
begegnet, und der Eintrag wird übersprungen, es sei denn, predicate(hdr)
ist wahr. Dies kann verwendet werden, um selektiv nur Teile eines Archivs umzuschreiben, um Einträge zu überspringen, die dazu führen würden, dass extract
einen Fehler auslöst, oder um aufzuzeichnen, welcher Inhalt während des Umschreibvorgangs begegnet wird.
Bevor es an die Prädikatsfunktion übergeben wird, wird das Header
-Objekt etwas von der rohen Kopfzeile im Tarball modifiziert: Das path
-Feld wird normalisiert, um .
-Einträge zu entfernen und mehrere aufeinanderfolgende Schrägstriche durch einen einzelnen Schrägstrich zu ersetzen. Wenn der Eintrag vom Typ :hardlink
ist, wird der Zielpfad ebenfalls auf die gleiche Weise normalisiert, damit er mit dem Pfad des Ziel-Eintrags übereinstimmt; das Größenfeld wird auf die Größe des Zielpfads gesetzt (der bereits gesehen worden sein muss).
Wenn das portable
-Flag wahr ist, werden die Pfadnamen auf Gültigkeit unter Windows überprüft, was sicherstellt, dass sie keine illegalen Zeichen enthalten oder Namen haben, die reserviert sind. Siehe https://stackoverflow.com/a/31976060/659248 für Details.
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
Berechnen Sie einen Baum-Hashwert für den Dateibaum, den das Tarball enthält. Standardmäßig verwendet dies den Baum-Hashing-Algorithmus von git mit der SHA1-sicheren Hashfunktion (wie aktuelle Versionen von git). Das bedeutet, dass für jedes Tarball, dessen Dateibaum git darstellen kann – d.h. eines mit nur Dateien, Symlinks und nicht leeren Verzeichnissen – der von dieser Funktion berechnete Hashwert derselbe sein wird wie der Hashwert, den git für diesen Dateibaum berechnen würde. Beachten Sie, dass Tarballs Dateibäume mit leeren Verzeichnissen darstellen können, die git nicht speichern kann, und diese Funktion kann Hashes für diese generieren, die standardmäßig (siehe skip_empty
unten, um dieses Verhalten zu ändern) von dem Hash eines Tarballs abweichen, der diese leeren Verzeichnisse weglässt. Kurz gesagt, die Hashfunktion stimmt mit git bei allen Bäumen überein, die git darstellen kann, erweitert jedoch (auf konsistente Weise) den Bereich der hashbaren Bäume auf andere Bäume, die git nicht darstellen kann.
Wenn eine predicate
-Funktion übergeben wird, wird sie für jedes Header
-Objekt aufgerufen, das beim Verarbeiten des tarball
begegnet, und ein Eintrag wird nur gehasht, wenn predicate(hdr)
wahr ist. Dies kann verwendet werden, um selektiv nur Teile eines Archivs zu hashen, um Einträge zu überspringen, die dazu führen, dass extract
einen Fehler auslöst, oder um aufzuzeichnen, was während des Hashing-Prozesses extrahiert wird.
Bevor es an die Prädikatsfunktion übergeben wird, wird das Header
-Objekt etwas von der rohen Kopfzeile im Tarball modifiziert: Das path
-Feld wird normalisiert, um .
-Einträge zu entfernen und mehrere aufeinanderfolgende Schrägstriche durch einen einzelnen Schrägstrich zu ersetzen. Wenn der Eintrag vom Typ :hardlink
ist, wird der Linkzielpfad auf die gleiche Weise normalisiert, damit er mit dem Pfad des Ziel-Eintrags übereinstimmt; das Größenfeld wird auf die Größe des Zielpfads gesetzt (der bereits gesehen worden sein muss).
Derzeit unterstützte Werte für algorithm
sind git-sha1
(der Standard) und git-sha256
, das denselben grundlegenden Algorithmus wie git-sha1
verwendet, aber die SHA1-Hashfunktion durch SHA2-256 ersetzt, die Hashfunktion, zu der git in Zukunft übergehen wird (aufgrund bekannter Angriffe auf SHA1). Die Unterstützung für andere Dateibaum-Hashing-Algorithmen kann in Zukunft hinzugefügt werden.
Die Option skip_empty
steuert, ob Verzeichnisse im Tarball, die rekursiv keine Dateien oder Symlinks enthalten, im Hash enthalten oder ignoriert werden. Im Allgemeinen, wenn Sie den Inhalt eines Tarballs oder eines Dateibaums hashen, interessieren Sie sich für alle Verzeichnisse, nicht nur für nicht leere, sodass die Einbeziehung dieser in den berechneten Hash der Standard ist. Warum bietet diese Funktion also überhaupt die Option, leere Verzeichnisse zu überspringen? Weil git sich weigert, leere Verzeichnisse zu speichern, und sie ignoriert, wenn Sie versuchen, sie zu einem Repo hinzuzufügen. Wenn Sie also einen Referenzbaum-Hash berechnen, indem Sie Dateien zu einem git-Repo hinzufügen und dann git nach dem Baum-Hash fragen, wird der Hashwert, den Sie erhalten, mit dem Hashwert übereinstimmen, der von tree_hash
mit skip_empty=true
berechnet wurde. Mit anderen Worten, diese Option ermöglicht es tree_hash
, zu emulieren, wie git einen Baum mit leeren Verzeichnissen hashen würde. Wenn Sie jedoch Bäume hashen, die leere Verzeichnisse enthalten können (d.h. nicht aus einem git-Repo stammen), wird empfohlen, diese mit einem Tool (wie diesem) zu hashen, das leere Verzeichnisse nicht ignoriert.
Tar.Header
— TypeDer Header
-Typ ist eine Struktur, die die wesentlichen Metadaten für einen einzelnen Datensatz in einer Tar-Datei mit dieser Definition darstellt:
struct Header
path :: String # Pfad relativ zum Root
type :: Symbol # Typindikator (siehe unten)
mode :: UInt16 # Modus/Berechtigungen (am besten in oktal anzeigen)
size :: Int64 # Größe der Datensatzdaten in Bytes
link :: String # Zielpfad eines Symlinks
end
Typen werden mit den folgenden Symbolen dargestellt: file
, hardlink
, symlink
, chardev
, blockdev
, directory
, fifo
oder für unbekannte Typen das Typflag-Zeichen als Symbol. Beachten Sie, dass extract
sich weigert, Datensätze anderer Typen als file
, symlink
und directory
zu extrahieren; list
listet andere Arten von Datensätzen nur auf, wenn es mit strict=false
aufgerufen wird.
Das Tar-Format enthält verschiedene andere Metadaten über Datensätze, einschließlich Benutzer- und Gruppen-IDs, Benutzer- und Gruppennamen sowie Zeitstempel. Das Tar
-Paket ignoriert diese absichtlich vollständig. Beim Erstellen von Tar-Dateien werden diese Felder immer auf null/leer gesetzt. Beim Lesen von Tar-Dateien werden diese Felder ignoriert, abgesehen von der Überprüfung der Header-Prüfziffern für jeden Header-Datensatz für alle Felder.