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

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.

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

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.

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

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.

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

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.

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

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.

source
Tar.HeaderType

Der 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.

source