diff --git a/lib/src/third_party/tar/README.md b/lib/src/third_party/tar/README.md index a2a220f25..a2fbf7b20 100644 --- a/lib/src/third_party/tar/README.md +++ b/lib/src/third_party/tar/README.md @@ -4,4 +4,4 @@ Vendored elements from `package:tar` for use in creation and extraction of tar-archives. * Repository: `https://github.com/simolus3/tar/` - * Revision: `7cdb563c9894600c6a739ec268f8673d6122006f` + * Revision: `901ae404e0a225d9b08e5253415ca092f5c08706` diff --git a/lib/src/third_party/tar/src/charcodes.dart b/lib/src/third_party/tar/src/charcodes.dart index 1d34a6de7..de0762fbf 100644 --- a/lib/src/third_party/tar/src/charcodes.dart +++ b/lib/src/third_party/tar/src/charcodes.dart @@ -1,3 +1,6 @@ +@internal +import 'package:meta/meta.dart'; + /// "Line feed" control character. const int $lf = 0x0a; diff --git a/lib/src/third_party/tar/src/constants.dart b/lib/src/third_party/tar/src/constants.dart index 05accb0ea..d74a2b00f 100644 --- a/lib/src/third_party/tar/src/constants.dart +++ b/lib/src/third_party/tar/src/constants.dart @@ -1,8 +1,11 @@ +@internal import 'dart:typed_data'; +import 'package:meta/meta.dart'; + import 'charcodes.dart'; import 'exception.dart'; -import 'header.dart' show TarHeader; // for dartdoc +import 'header.dart'; // Magic values to help us identify the TAR header type. const magicGnu = [$u, $s, $t, $a, $r, $space]; // 'ustar ' @@ -11,74 +14,6 @@ const magicUstar = [$u, $s, $t, $a, $r, 0]; // 'ustar\x00' const versionUstar = [$0, $0]; // '00' const trailerStar = [$t, $a, $r, 0]; // 'tar\x00' -/// Type flags for [TarHeader]. -/// -/// The type flag of a header indicates the kind of file associated with the -/// entry. This enum contains the various type flags over the different TAR -/// formats, and users should be careful that the type flag corresponds to the -/// TAR format they are working with. -enum TypeFlag { - /// [reg] indicates regular files. - /// - /// Old tar implementations have a seperate `TypeRegA` value. This library - /// will transparently read those as [regA]. - reg, - - /// Legacy-version of [reg] in old tar implementations. - /// - /// This is only used internally. - regA, - - /// Hard link - header-only, may not have a data body - link, - - /// Symbolic link - header-only, may not have a data body - symlink, - - /// Character device node - header-only, may not have a data body - char, - - /// Block device node - header-only, may not have a data body - block, - - /// Directory - header-only, may not have a data body - dir, - - /// FIFO node - header-only, may not have a data body - fifo, - - /// Currently does not have any meaning, but is reserved for the future. - reserved, - - /// Used by the PAX format to store key-value records that are only relevant - /// to the next file. - /// - /// This package transparently handles these types. - xHeader, - - /// Used by the PAX format to store key-value records that are relevant to all - /// subsequent files. - /// - /// This package only supports parsing and composing such headers, - /// but does not currently support persisting the global state across files. - xGlobalHeader, - - /// Indiates a sparse file in the GNU format - gnuSparse, - - /// Used by the GNU format for a meta file to store the path or link name for - /// the next file. - /// This package transparently handles these types. - gnuLongName, - gnuLongLink, - - /// Vendor specific typeflag, as defined in POSIX.1-1998. Seen as outdated but - /// may still exist on old files. - /// - /// This library uses a single enum to catch them all. - vendor -} - /// Generates the corresponding [TypeFlag] associated with [byte]. TypeFlag typeflagFromByte(int byte) { switch (byte) { diff --git a/lib/src/third_party/tar/src/entry.dart b/lib/src/third_party/tar/src/entry.dart index 160974bb0..71d17309e 100644 --- a/lib/src/third_party/tar/src/entry.dart +++ b/lib/src/third_party/tar/src/entry.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'constants.dart'; import 'header.dart'; /// An entry in a tar file. diff --git a/lib/src/third_party/tar/src/format.dart b/lib/src/third_party/tar/src/format.dart index b6be2f55c..ef65ec9ee 100644 --- a/lib/src/third_party/tar/src/format.dart +++ b/lib/src/third_party/tar/src/format.dart @@ -28,7 +28,7 @@ class TarFormat { int get hashCode => _value; @override - bool operator ==(Object? other) { + bool operator ==(Object other) { if (other is! TarFormat) return false; return _value == other._value; diff --git a/lib/src/third_party/tar/src/header.dart b/lib/src/third_party/tar/src/header.dart index f28dc79c2..2f3566252 100644 --- a/lib/src/third_party/tar/src/header.dart +++ b/lib/src/third_party/tar/src/header.dart @@ -7,6 +7,74 @@ import 'exception.dart'; import 'format.dart'; import 'utils.dart'; +/// Type flags for [TarHeader]. +/// +/// The type flag of a header indicates the kind of file associated with the +/// entry. This enum contains the various type flags over the different TAR +/// formats, and users should be careful that the type flag corresponds to the +/// TAR format they are working with. +enum TypeFlag { + /// [reg] indicates regular files. + /// + /// Old tar implementations have a seperate `TypeRegA` value. This library + /// will transparently read those as [regA]. + reg, + + /// Legacy-version of [reg] in old tar implementations. + /// + /// This is only used internally. + regA, + + /// Hard link - header-only, may not have a data body + link, + + /// Symbolic link - header-only, may not have a data body + symlink, + + /// Character device node - header-only, may not have a data body + char, + + /// Block device node - header-only, may not have a data body + block, + + /// Directory - header-only, may not have a data body + dir, + + /// FIFO node - header-only, may not have a data body + fifo, + + /// Currently does not have any meaning, but is reserved for the future. + reserved, + + /// Used by the PAX format to store key-value records that are only relevant + /// to the next file. + /// + /// This package transparently handles these types. + xHeader, + + /// Used by the PAX format to store key-value records that are relevant to all + /// subsequent files. + /// + /// This package only supports parsing and composing such headers, + /// but does not currently support persisting the global state across files. + xGlobalHeader, + + /// Indiates a sparse file in the GNU format + gnuSparse, + + /// Used by the GNU format for a meta file to store the path or link name for + /// the next file. + /// This package transparently handles these types. + gnuLongName, + gnuLongLink, + + /// Vendor specific typeflag, as defined in POSIX.1-1998. Seen as outdated but + /// may still exist on old files. + /// + /// This library uses a single enum to catch them all. + vendor +} + /// Header of a tar entry /// /// A tar header stores meta-information about the matching tar entry, such as diff --git a/lib/src/third_party/tar/src/sparse.dart b/lib/src/third_party/tar/src/sparse.dart index 06b88b1ea..35c0311a9 100644 --- a/lib/src/third_party/tar/src/sparse.dart +++ b/lib/src/third_party/tar/src/sparse.dart @@ -1,3 +1,4 @@ +@internal import 'package:async/async.dart'; import 'package:meta/meta.dart'; @@ -21,7 +22,7 @@ class SparseEntry { String toString() => 'offset: $offset, length $length'; @override - bool operator ==(Object? other) { + bool operator ==(Object other) { if (other is! SparseEntry) return false; return offset == other.offset && length == other.length; diff --git a/lib/src/third_party/tar/src/utils.dart b/lib/src/third_party/tar/src/utils.dart index 4fa75b1ca..e2bb5b671 100644 --- a/lib/src/third_party/tar/src/utils.dart +++ b/lib/src/third_party/tar/src/utils.dart @@ -1,8 +1,11 @@ +@internal import 'dart:async'; import 'dart:convert'; import 'dart:math'; import 'dart:typed_data'; +import 'package:meta/meta.dart'; + import 'charcodes.dart'; import 'constants.dart'; import 'exception.dart'; @@ -95,7 +98,7 @@ extension ByteBufferUtils on Uint8List { int computeUnsignedHeaderChecksum() { // Accessing the last element first helps the VM eliminate bounds checks in // the loops below. - this[blockSize - 1]; + this[blockSize - 1]; // ignore: unnecessary_statements var result = checksumLength * _checksumPlaceholder; for (var i = 0; i < checksumOffset; i++) { @@ -109,7 +112,7 @@ extension ByteBufferUtils on Uint8List { } int computeSignedHeaderChecksum() { - this[blockSize - 1]; + this[blockSize - 1]; // ignore: unnecessary_statements // Note that _checksumPlaceholder.toSigned(8) == _checksumPlaceholder var result = checksumLength * _checksumPlaceholder; @@ -445,7 +448,7 @@ class BlockReader { var state = _StreamState.initial; - /// Sends trailing data to the stream. Reeturns true if the subscription + /// Sends trailing data to the stream. Returns true if the subscription /// should still be resumed afterwards. bool emitTrailing() { // Attempt to serve requests from pending data first. @@ -512,13 +515,25 @@ class BlockReader { controller ..onListen = scheduleInitialEmit ..onPause = () { - assert(state == _StreamState.initial || state == _StreamState.attached); + assert( + state == _StreamState.initial || + state == _StreamState.attached || + state == _StreamState.done, + 'Unexpected pause event in $state ($_remainingBlocksInOutgoing blocks remaining).'); if (state == _StreamState.initial) { state = _StreamState.pausedAfterInitial; - } else { + } else if (state == _StreamState.attached) { _pause(); state = _StreamState.pausedAfterAttached; + } else if (state == _StreamState.done) { + // It may happen that onPause is called in a state where we believe + // the stream to be done already. After the stream is done, we close + // the controller in a new microtask. So if the subscription is paused + // after the last event it emitted but before we close the controller, + // we can get a pause event here. + // There's nothing to do in that case. + assert(_subscription?.isPaused != false); } } ..onResume = () { diff --git a/lib/src/third_party/tar/tar.dart b/lib/src/third_party/tar/tar.dart index 14247bdbf..9948c4f71 100644 --- a/lib/src/third_party/tar/tar.dart +++ b/lib/src/third_party/tar/tar.dart @@ -8,10 +8,9 @@ library tar; import 'src/reader.dart'; import 'src/writer.dart'; -export 'src/constants.dart' show TypeFlag; export 'src/entry.dart' show TarEntry, SynchronousTarEntry; export 'src/exception.dart'; export 'src/format.dart'; -export 'src/header.dart' show TarHeader; +export 'src/header.dart' show TarHeader, TypeFlag; export 'src/reader.dart' show TarReader; export 'src/writer.dart';