|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070 |
- # node-tar
-
- Fast and full-featured Tar for Node.js
-
- The API is designed to mimic the behavior of `tar(1)` on unix systems.
- If you are familiar with how tar works, most of this will hopefully be
- straightforward for you. If not, then hopefully this module can teach
- you useful unix skills that may come in handy someday :)
-
- ## Background
-
- A "tar file" or "tarball" is an archive of file system entries
- (directories, files, links, etc.) The name comes from "tape archive".
- If you run `man tar` on almost any Unix command line, you'll learn
- quite a bit about what it can do, and its history.
-
- Tar has 5 main top-level commands:
-
- * `c` Create an archive
- * `r` Replace entries within an archive
- * `u` Update entries within an archive (ie, replace if they're newer)
- * `t` List out the contents of an archive
- * `x` Extract an archive to disk
-
- The other flags and options modify how this top level function works.
-
- ## High-Level API
-
- These 5 functions are the high-level API. All of them have a
- single-character name (for unix nerds familiar with `tar(1)`) as well
- as a long name (for everyone else).
-
- All the high-level functions take the following arguments, all three
- of which are optional and may be omitted.
-
- 1. `options` - An optional object specifying various options
- 2. `paths` - An array of paths to add or extract
- 3. `callback` - Called when the command is completed, if async. (If
- sync or no file specified, providing a callback throws a
- `TypeError`.)
-
- If the command is sync (ie, if `options.sync=true`), then the
- callback is not allowed, since the action will be completed immediately.
-
- If a `file` argument is specified, and the command is async, then a
- `Promise` is returned. In this case, if async, a callback may be
- provided which is called when the command is completed.
-
- If a `file` option is not specified, then a stream is returned. For
- `create`, this is a readable stream of the generated archive. For
- `list` and `extract` this is a writable stream that an archive should
- be written into. If a file is not specified, then a callback is not
- allowed, because you're already getting a stream to work with.
-
- `replace` and `update` only work on existing archives, and so require
- a `file` argument.
-
- Sync commands without a file argument return a stream that acts on its
- input immediately in the same tick. For readable streams, this means
- that all of the data is immediately available by calling
- `stream.read()`. For writable streams, it will be acted upon as soon
- as it is provided, but this can be at any time.
-
- ### Warnings and Errors
-
- Tar emits warnings and errors for recoverable and unrecoverable situations,
- respectively. In many cases, a warning only affects a single entry in an
- archive, or is simply informing you that it's modifying an entry to comply
- with the settings provided.
-
- Unrecoverable warnings will always raise an error (ie, emit `'error'` on
- streaming actions, throw for non-streaming sync actions, reject the
- returned Promise for non-streaming async operations, or call a provided
- callback with an `Error` as the first argument). Recoverable errors will
- raise an error only if `strict: true` is set in the options.
-
- Respond to (recoverable) warnings by listening to the `warn` event.
- Handlers receive 3 arguments:
-
- - `code` String. One of the error codes below. This may not match
- `data.code`, which preserves the original error code from fs and zlib.
- - `message` String. More details about the error.
- - `data` Metadata about the error. An `Error` object for errors raised by
- fs and zlib. All fields are attached to errors raisd by tar. Typically
- contains the following fields, as relevant:
- - `tarCode` The tar error code.
- - `code` Either the tar error code, or the error code set by the
- underlying system.
- - `file` The archive file being read or written.
- - `cwd` Working directory for creation and extraction operations.
- - `entry` The entry object (if it could be created) for `TAR_ENTRY_INFO`,
- `TAR_ENTRY_INVALID`, and `TAR_ENTRY_ERROR` warnings.
- - `header` The header object (if it could be created, and the entry could
- not be created) for `TAR_ENTRY_INFO` and `TAR_ENTRY_INVALID` warnings.
- - `recoverable` Boolean. If `false`, then the warning will emit an
- `error`, even in non-strict mode.
-
- #### Error Codes
-
- * `TAR_ENTRY_INFO` An informative error indicating that an entry is being
- modified, but otherwise processed normally. For example, removing `/` or
- `C:\` from absolute paths if `preservePaths` is not set.
-
- * `TAR_ENTRY_INVALID` An indication that a given entry is not a valid tar
- archive entry, and will be skipped. This occurs when:
- - a checksum fails,
- - a `linkpath` is missing for a link type, or
- - a `linkpath` is provided for a non-link type.
-
- If every entry in a parsed archive raises an `TAR_ENTRY_INVALID` error,
- then the archive is presumed to be unrecoverably broken, and
- `TAR_BAD_ARCHIVE` will be raised.
-
- * `TAR_ENTRY_ERROR` The entry appears to be a valid tar archive entry, but
- encountered an error which prevented it from being unpacked. This occurs
- when:
- - an unrecoverable fs error happens during unpacking,
- - an entry has `..` in the path and `preservePaths` is not set, or
- - an entry is extracting through a symbolic link, when `preservePaths` is
- not set.
-
- * `TAR_ENTRY_UNSUPPORTED` An indication that a given entry is
- a valid archive entry, but of a type that is unsupported, and so will be
- skipped in archive creation or extracting.
-
- * `TAR_ABORT` When parsing gzipped-encoded archives, the parser will
- abort the parse process raise a warning for any zlib errors encountered.
- Aborts are considered unrecoverable for both parsing and unpacking.
-
- * `TAR_BAD_ARCHIVE` The archive file is totally hosed. This can happen for
- a number of reasons, and always occurs at the end of a parse or extract:
-
- - An entry body was truncated before seeing the full number of bytes.
- - The archive contained only invalid entries, indicating that it is
- likely not an archive, or at least, not an archive this library can
- parse.
-
- `TAR_BAD_ARCHIVE` is considered informative for parse operations, but
- unrecoverable for extraction. Note that, if encountered at the end of an
- extraction, tar WILL still have extracted as much it could from the
- archive, so there may be some garbage files to clean up.
-
- Errors that occur deeper in the system (ie, either the filesystem or zlib)
- will have their error codes left intact, and a `tarCode` matching one of
- the above will be added to the warning metadata or the raised error object.
-
- Errors generated by tar will have one of the above codes set as the
- `error.code` field as well, but since errors originating in zlib or fs will
- have their original codes, it's better to read `error.tarCode` if you wish
- to see how tar is handling the issue.
-
- ### Examples
-
- The API mimics the `tar(1)` command line functionality, with aliases
- for more human-readable option and function names. The goal is that
- if you know how to use `tar(1)` in Unix, then you know how to use
- `require('tar')` in JavaScript.
-
- To replicate `tar czf my-tarball.tgz files and folders`, you'd do:
-
- ```js
- tar.c(
- {
- gzip: <true|gzip options>,
- file: 'my-tarball.tgz'
- },
- ['some', 'files', 'and', 'folders']
- ).then(_ => { .. tarball has been created .. })
- ```
-
- To replicate `tar cz files and folders > my-tarball.tgz`, you'd do:
-
- ```js
- tar.c( // or tar.create
- {
- gzip: <true|gzip options>
- },
- ['some', 'files', 'and', 'folders']
- ).pipe(fs.createWriteStream('my-tarball.tgz'))
- ```
-
- To replicate `tar xf my-tarball.tgz` you'd do:
-
- ```js
- tar.x( // or tar.extract(
- {
- file: 'my-tarball.tgz'
- }
- ).then(_=> { .. tarball has been dumped in cwd .. })
- ```
-
- To replicate `cat my-tarball.tgz | tar x -C some-dir --strip=1`:
-
- ```js
- fs.createReadStream('my-tarball.tgz').pipe(
- tar.x({
- strip: 1,
- C: 'some-dir' // alias for cwd:'some-dir', also ok
- })
- )
- ```
-
- To replicate `tar tf my-tarball.tgz`, do this:
-
- ```js
- tar.t({
- file: 'my-tarball.tgz',
- onentry: entry => { .. do whatever with it .. }
- })
- ```
-
- For example, to just get the list of filenames from an archive:
-
- ```js
- const getEntryFilenames = async tarballFilename => {
- const filenames = []
- await tar.t({
- file: tarballFilename,
- onentry: entry => filenames.push(entry.path),
- })
- return filenames
- }
- ```
-
- To replicate `cat my-tarball.tgz | tar t` do:
-
- ```js
- fs.createReadStream('my-tarball.tgz')
- .pipe(tar.t())
- .on('entry', entry => { .. do whatever with it .. })
- ```
-
- To do anything synchronous, add `sync: true` to the options. Note
- that sync functions don't take a callback and don't return a promise.
- When the function returns, it's already done. Sync methods without a
- file argument return a sync stream, which flushes immediately. But,
- of course, it still won't be done until you `.end()` it.
-
- ```js
- const getEntryFilenamesSync = tarballFilename => {
- const filenames = []
- tar.t({
- file: tarballFilename,
- onentry: entry => filenames.push(entry.path),
- sync: true,
- })
- return filenames
- }
- ```
-
- To filter entries, add `filter: <function>` to the options.
- Tar-creating methods call the filter with `filter(path, stat)`.
- Tar-reading methods (including extraction) call the filter with
- `filter(path, entry)`. The filter is called in the `this`-context of
- the `Pack` or `Unpack` stream object.
-
- The arguments list to `tar t` and `tar x` specify a list of filenames
- to extract or list, so they're equivalent to a filter that tests if
- the file is in the list.
-
- For those who _aren't_ fans of tar's single-character command names:
-
- ```
- tar.c === tar.create
- tar.r === tar.replace (appends to archive, file is required)
- tar.u === tar.update (appends if newer, file is required)
- tar.x === tar.extract
- tar.t === tar.list
- ```
-
- Keep reading for all the command descriptions and options, as well as
- the low-level API that they are built on.
-
- ### tar.c(options, fileList, callback) [alias: tar.create]
-
- Create a tarball archive.
-
- The `fileList` is an array of paths to add to the tarball. Adding a
- directory also adds its children recursively.
-
- An entry in `fileList` that starts with an `@` symbol is a tar archive
- whose entries will be added. To add a file that starts with `@`,
- prepend it with `./`.
-
- The following options are supported:
-
- - `file` Write the tarball archive to the specified filename. If this
- is specified, then the callback will be fired when the file has been
- written, and a promise will be returned that resolves when the file
- is written. If a filename is not specified, then a Readable Stream
- will be returned which will emit the file data. [Alias: `f`]
- - `sync` Act synchronously. If this is set, then any provided file
- will be fully written after the call to `tar.c`. If this is set,
- and a file is not provided, then the resulting stream will already
- have the data ready to `read` or `emit('data')` as soon as you
- request it.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `cwd` The current working directory for creating the archive.
- Defaults to `process.cwd()`. [Alias: `C`]
- - `prefix` A path portion to prefix onto the entries in the archive.
- - `gzip` Set to any truthy value to create a gzipped archive, or an
- object with settings for `zlib.Gzip()` [Alias: `z`]
- - `filter` A function that gets called with `(path, stat)` for each
- entry being added. Return `true` to add the entry to the archive,
- or `false` to omit it.
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths. [Alias: `P`]
- - `mode` The mode to set on the created file archive
- - `noDirRecurse` Do not recursively archive the contents of
- directories. [Alias: `n`]
- - `follow` Set to true to pack the targets of symbolic links. Without
- this option, symbolic links are archived as such. [Alias: `L`, `h`]
- - `noPax` Suppress pax extended headers. Note that this means that
- long paths and linkpaths will be truncated, and large or negative
- numeric values may be interpreted incorrectly.
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
- [Alias: `m`, `no-mtime`]
- - `mtime` Set to a `Date` object to force a specific `mtime` for
- everything added to the archive. Overridden by `noMtime`.
-
- The following options are mostly internal, but can be modified in some
- advanced use cases, such as re-using caches between runs.
-
- - `linkCache` A Map object containing the device and inode value for
- any file whose nlink is > 1, to identify hard links.
- - `statCache` A Map object that caches calls `lstat`.
- - `readdirCache` A Map object that caches calls to `readdir`.
- - `jobs` A number specifying how many concurrent jobs to run.
- Defaults to 4.
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 16 MB.
-
- ### tar.x(options, fileList, callback) [alias: tar.extract]
-
- Extract a tarball archive.
-
- The `fileList` is an array of paths to extract from the tarball. If
- no paths are provided, then all the entries are extracted.
-
- If the archive is gzipped, then tar will detect this and unzip it.
-
- Note that all directories that are created will be forced to be
- writable, readable, and listable by their owner, to avoid cases where
- a directory prevents extraction of child entries by virtue of its
- mode.
-
- Most extraction errors will cause a `warn` event to be emitted. If
- the `cwd` is missing, or not a directory, then the extraction will
- fail completely.
-
- The following options are supported:
-
- - `cwd` Extract files relative to the specified directory. Defaults
- to `process.cwd()`. If provided, this must exist and must be a
- directory. [Alias: `C`]
- - `file` The archive file to extract. If not specified, then a
- Writable stream is returned where the archive data should be
- written. [Alias: `f`]
- - `sync` Create files and directories synchronously.
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `filter` A function that gets called with `(path, entry)` for each
- entry being unpacked. Return `true` to unpack the entry from the
- archive, or `false` to skip it.
- - `newer` Set to true to keep the existing file on disk if it's newer
- than the file in the archive. [Alias: `keep-newer`,
- `keep-newer-files`]
- - `keep` Do not overwrite existing files. In particular, if a file
- appears more than once in an archive, later copies will not
- overwrite earlier copies. [Alias: `k`, `keep-existing`]
- - `preservePaths` Allow absolute paths, paths containing `..`, and
- extracting through symbolic links. By default, `/` is stripped from
- absolute paths, `..` paths are not extracted, and any file whose
- location would be modified by a symbolic link is not extracted.
- [Alias: `P`]
- - `unlink` Unlink files before creating them. Without this option,
- tar overwrites existing files, which preserves existing hardlinks.
- With this option, existing hardlinks will be broken, as will any
- symlink that would affect the location of an extracted file. [Alias:
- `U`]
- - `strip` Remove the specified number of leading path elements.
- Pathnames with fewer elements will be silently skipped. Note that
- the pathname is edited after applying the filter, but before
- security checks. [Alias: `strip-components`, `stripComponents`]
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `preserveOwner` If true, tar will set the `uid` and `gid` of
- extracted entries to the `uid` and `gid` fields in the archive.
- This defaults to true when run as root, and false otherwise. If
- false, then files and directories will be set with the owner and
- group of the user running the process. This is similar to `-p` in
- `tar(1)`, but ACLs and other system-specific data is never unpacked
- in this implementation, and modes are set by default already.
- [Alias: `p`]
- - `uid` Set to a number to force ownership of all extracted files and
- folders, and all implicitly created directories, to be owned by the
- specified user id, regardless of the `uid` field in the archive.
- Cannot be used along with `preserveOwner`. Requires also setting a
- `gid` option.
- - `gid` Set to a number to force ownership of all extracted files and
- folders, and all implicitly created directories, to be owned by the
- specified group id, regardless of the `gid` field in the archive.
- Cannot be used along with `preserveOwner`. Requires also setting a
- `uid` option.
- - `noMtime` Set to true to omit writing `mtime` value for extracted
- entries. [Alias: `m`, `no-mtime`]
- - `transform` Provide a function that takes an `entry` object, and
- returns a stream, or any falsey value. If a stream is provided,
- then that stream's data will be written instead of the contents of
- the archive entry. If a falsey value is provided, then the entry is
- written to disk as normal. (To exclude items from extraction, use
- the `filter` option described above.)
- - `onentry` A function that gets called with `(entry)` for each entry
- that passes the filter.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `noChmod` Set to true to omit calling `fs.chmod()` to ensure that the
- extracted file matches the entry mode. This also suppresses the call to
- `process.umask()` to determine the default umask value, since tar will
- extract with whatever mode is provided, and let the process `umask` apply
- normally.
-
- The following options are mostly internal, but can be modified in some
- advanced use cases, such as re-using caches between runs.
-
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 16 MB.
- - `umask` Filter the modes of entries like `process.umask()`.
- - `dmode` Default mode for directories
- - `fmode` Default mode for files
- - `dirCache` A Map object of which directories exist.
- - `maxMetaEntrySize` The maximum size of meta entries that is
- supported. Defaults to 1 MB.
-
- Note that using an asynchronous stream type with the `transform`
- option will cause undefined behavior in sync extractions.
- [MiniPass](http://npm.im/minipass)-based streams are designed for this
- use case.
-
- ### tar.t(options, fileList, callback) [alias: tar.list]
-
- List the contents of a tarball archive.
-
- The `fileList` is an array of paths to list from the tarball. If
- no paths are provided, then all the entries are listed.
-
- If the archive is gzipped, then tar will detect this and unzip it.
-
- If the `file` option is _not_ provided, then returns an event emitter that
- emits `entry` events with `tar.ReadEntry` objects. However, they don't
- emit `'data'` or `'end'` events. (If you want to get actual readable
- entries, use the `tar.Parse` class instead.)
-
- If a `file` option _is_ provided, then the return value will be a promise
- that resolves when the file has been fully traversed in async mode, or
- `undefined` if `sync: true` is set. Thus, you _must_ specify an `onentry`
- method in order to do anything useful with the data it parses.
-
- The following options are supported:
-
- - `file` The archive file to list. If not specified, then a
- Writable stream is returned where the archive data should be
- written. [Alias: `f`]
- - `sync` Read the specified file synchronously. (This has no effect
- when a file option isn't specified, because entries are emitted as
- fast as they are parsed from the stream anyway.)
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `filter` A function that gets called with `(path, entry)` for each
- entry being listed. Return `true` to emit the entry from the
- archive, or `false` to skip it.
- - `onentry` A function that gets called with `(entry)` for each entry
- that passes the filter. This is important for when `file` is set,
- because there is no other way to do anything useful with this method.
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 16 MB.
- - `noResume` By default, `entry` streams are resumed immediately after
- the call to `onentry`. Set `noResume: true` to suppress this
- behavior. Note that by opting into this, the stream will never
- complete until the entry data is consumed.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
-
- ### tar.u(options, fileList, callback) [alias: tar.update]
-
- Add files to an archive if they are newer than the entry already in
- the tarball archive.
-
- The `fileList` is an array of paths to add to the tarball. Adding a
- directory also adds its children recursively.
-
- An entry in `fileList` that starts with an `@` symbol is a tar archive
- whose entries will be added. To add a file that starts with `@`,
- prepend it with `./`.
-
- The following options are supported:
-
- - `file` Required. Write the tarball archive to the specified
- filename. [Alias: `f`]
- - `sync` Act synchronously. If this is set, then any provided file
- will be fully written after the call to `tar.c`.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `cwd` The current working directory for adding entries to the
- archive. Defaults to `process.cwd()`. [Alias: `C`]
- - `prefix` A path portion to prefix onto the entries in the archive.
- - `gzip` Set to any truthy value to create a gzipped archive, or an
- object with settings for `zlib.Gzip()` [Alias: `z`]
- - `filter` A function that gets called with `(path, stat)` for each
- entry being added. Return `true` to add the entry to the archive,
- or `false` to omit it.
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths. [Alias: `P`]
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 16 MB.
- - `noDirRecurse` Do not recursively archive the contents of
- directories. [Alias: `n`]
- - `follow` Set to true to pack the targets of symbolic links. Without
- this option, symbolic links are archived as such. [Alias: `L`, `h`]
- - `noPax` Suppress pax extended headers. Note that this means that
- long paths and linkpaths will be truncated, and large or negative
- numeric values may be interpreted incorrectly.
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
- [Alias: `m`, `no-mtime`]
- - `mtime` Set to a `Date` object to force a specific `mtime` for
- everything added to the archive. Overridden by `noMtime`.
-
- ### tar.r(options, fileList, callback) [alias: tar.replace]
-
- Add files to an existing archive. Because later entries override
- earlier entries, this effectively replaces any existing entries.
-
- The `fileList` is an array of paths to add to the tarball. Adding a
- directory also adds its children recursively.
-
- An entry in `fileList` that starts with an `@` symbol is a tar archive
- whose entries will be added. To add a file that starts with `@`,
- prepend it with `./`.
-
- The following options are supported:
-
- - `file` Required. Write the tarball archive to the specified
- filename. [Alias: `f`]
- - `sync` Act synchronously. If this is set, then any provided file
- will be fully written after the call to `tar.c`.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `cwd` The current working directory for adding entries to the
- archive. Defaults to `process.cwd()`. [Alias: `C`]
- - `prefix` A path portion to prefix onto the entries in the archive.
- - `gzip` Set to any truthy value to create a gzipped archive, or an
- object with settings for `zlib.Gzip()` [Alias: `z`]
- - `filter` A function that gets called with `(path, stat)` for each
- entry being added. Return `true` to add the entry to the archive,
- or `false` to omit it.
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths. [Alias: `P`]
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 16 MB.
- - `noDirRecurse` Do not recursively archive the contents of
- directories. [Alias: `n`]
- - `follow` Set to true to pack the targets of symbolic links. Without
- this option, symbolic links are archived as such. [Alias: `L`, `h`]
- - `noPax` Suppress pax extended headers. Note that this means that
- long paths and linkpaths will be truncated, and large or negative
- numeric values may be interpreted incorrectly.
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
- [Alias: `m`, `no-mtime`]
- - `mtime` Set to a `Date` object to force a specific `mtime` for
- everything added to the archive. Overridden by `noMtime`.
-
-
- ## Low-Level API
-
- ### class tar.Pack
-
- A readable tar stream.
-
- Has all the standard readable stream interface stuff. `'data'` and
- `'end'` events, `read()` method, `pause()` and `resume()`, etc.
-
- #### constructor(options)
-
- The following options are supported:
-
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `cwd` The current working directory for creating the archive.
- Defaults to `process.cwd()`.
- - `prefix` A path portion to prefix onto the entries in the archive.
- - `gzip` Set to any truthy value to create a gzipped archive, or an
- object with settings for `zlib.Gzip()`
- - `filter` A function that gets called with `(path, stat)` for each
- entry being added. Return `true` to add the entry to the archive,
- or `false` to omit it.
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths.
- - `linkCache` A Map object containing the device and inode value for
- any file whose nlink is > 1, to identify hard links.
- - `statCache` A Map object that caches calls `lstat`.
- - `readdirCache` A Map object that caches calls to `readdir`.
- - `jobs` A number specifying how many concurrent jobs to run.
- Defaults to 4.
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 16 MB.
- - `noDirRecurse` Do not recursively archive the contents of
- directories.
- - `follow` Set to true to pack the targets of symbolic links. Without
- this option, symbolic links are archived as such.
- - `noPax` Suppress pax extended headers. Note that this means that
- long paths and linkpaths will be truncated, and large or negative
- numeric values may be interpreted incorrectly.
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
- - `mtime` Set to a `Date` object to force a specific `mtime` for
- everything added to the archive. Overridden by `noMtime`.
-
- #### add(path)
-
- Adds an entry to the archive. Returns the Pack stream.
-
- #### write(path)
-
- Adds an entry to the archive. Returns true if flushed.
-
- #### end()
-
- Finishes the archive.
-
- ### class tar.Pack.Sync
-
- Synchronous version of `tar.Pack`.
-
- ### class tar.Unpack
-
- A writable stream that unpacks a tar archive onto the file system.
-
- All the normal writable stream stuff is supported. `write()` and
- `end()` methods, `'drain'` events, etc.
-
- Note that all directories that are created will be forced to be
- writable, readable, and listable by their owner, to avoid cases where
- a directory prevents extraction of child entries by virtue of its
- mode.
-
- `'close'` is emitted when it's done writing stuff to the file system.
-
- Most unpack errors will cause a `warn` event to be emitted. If the
- `cwd` is missing, or not a directory, then an error will be emitted.
-
- #### constructor(options)
-
- - `cwd` Extract files relative to the specified directory. Defaults
- to `process.cwd()`. If provided, this must exist and must be a
- directory.
- - `filter` A function that gets called with `(path, entry)` for each
- entry being unpacked. Return `true` to unpack the entry from the
- archive, or `false` to skip it.
- - `newer` Set to true to keep the existing file on disk if it's newer
- than the file in the archive.
- - `keep` Do not overwrite existing files. In particular, if a file
- appears more than once in an archive, later copies will not
- overwrite earlier copies.
- - `preservePaths` Allow absolute paths, paths containing `..`, and
- extracting through symbolic links. By default, `/` is stripped from
- absolute paths, `..` paths are not extracted, and any file whose
- location would be modified by a symbolic link is not extracted.
- - `unlink` Unlink files before creating them. Without this option,
- tar overwrites existing files, which preserves existing hardlinks.
- With this option, existing hardlinks will be broken, as will any
- symlink that would affect the location of an extracted file.
- - `strip` Remove the specified number of leading path elements.
- Pathnames with fewer elements will be silently skipped. Note that
- the pathname is edited after applying the filter, but before
- security checks.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `umask` Filter the modes of entries like `process.umask()`.
- - `dmode` Default mode for directories
- - `fmode` Default mode for files
- - `dirCache` A Map object of which directories exist.
- - `maxMetaEntrySize` The maximum size of meta entries that is
- supported. Defaults to 1 MB.
- - `preserveOwner` If true, tar will set the `uid` and `gid` of
- extracted entries to the `uid` and `gid` fields in the archive.
- This defaults to true when run as root, and false otherwise. If
- false, then files and directories will be set with the owner and
- group of the user running the process. This is similar to `-p` in
- `tar(1)`, but ACLs and other system-specific data is never unpacked
- in this implementation, and modes are set by default already.
- - `win32` True if on a windows platform. Causes behavior where
- filenames containing `<|>?` chars are converted to
- windows-compatible values while being unpacked.
- - `uid` Set to a number to force ownership of all extracted files and
- folders, and all implicitly created directories, to be owned by the
- specified user id, regardless of the `uid` field in the archive.
- Cannot be used along with `preserveOwner`. Requires also setting a
- `gid` option.
- - `gid` Set to a number to force ownership of all extracted files and
- folders, and all implicitly created directories, to be owned by the
- specified group id, regardless of the `gid` field in the archive.
- Cannot be used along with `preserveOwner`. Requires also setting a
- `uid` option.
- - `noMtime` Set to true to omit writing `mtime` value for extracted
- entries.
- - `transform` Provide a function that takes an `entry` object, and
- returns a stream, or any falsey value. If a stream is provided,
- then that stream's data will be written instead of the contents of
- the archive entry. If a falsey value is provided, then the entry is
- written to disk as normal. (To exclude items from extraction, use
- the `filter` option described above.)
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `onentry` A function that gets called with `(entry)` for each entry
- that passes the filter.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `noChmod` Set to true to omit calling `fs.chmod()` to ensure that the
- extracted file matches the entry mode. This also suppresses the call to
- `process.umask()` to determine the default umask value, since tar will
- extract with whatever mode is provided, and let the process `umask` apply
- normally.
-
- ### class tar.Unpack.Sync
-
- Synchronous version of `tar.Unpack`.
-
- Note that using an asynchronous stream type with the `transform`
- option will cause undefined behavior in sync unpack streams.
- [MiniPass](http://npm.im/minipass)-based streams are designed for this
- use case.
-
- ### class tar.Parse
-
- A writable stream that parses a tar archive stream. All the standard
- writable stream stuff is supported.
-
- If the archive is gzipped, then tar will detect this and unzip it.
-
- Emits `'entry'` events with `tar.ReadEntry` objects, which are
- themselves readable streams that you can pipe wherever.
-
- Each `entry` will not emit until the one before it is flushed through,
- so make sure to either consume the data (with `on('data', ...)` or
- `.pipe(...)`) or throw it away with `.resume()` to keep the stream
- flowing.
-
- #### constructor(options)
-
- Returns an event emitter that emits `entry` events with
- `tar.ReadEntry` objects.
-
- The following options are supported:
-
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `filter` A function that gets called with `(path, entry)` for each
- entry being listed. Return `true` to emit the entry from the
- archive, or `false` to skip it.
- - `onentry` A function that gets called with `(entry)` for each entry
- that passes the filter.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
-
- #### abort(error)
-
- Stop all parsing activities. This is called when there are zlib
- errors. It also emits an unrecoverable warning with the error provided.
-
- ### class tar.ReadEntry extends [MiniPass](http://npm.im/minipass)
-
- A representation of an entry that is being read out of a tar archive.
-
- It has the following fields:
-
- - `extended` The extended metadata object provided to the constructor.
- - `globalExtended` The global extended metadata object provided to the
- constructor.
- - `remain` The number of bytes remaining to be written into the
- stream.
- - `blockRemain` The number of 512-byte blocks remaining to be written
- into the stream.
- - `ignore` Whether this entry should be ignored.
- - `meta` True if this represents metadata about the next entry, false
- if it represents a filesystem object.
- - All the fields from the header, extended header, and global extended
- header are added to the ReadEntry object. So it has `path`, `type`,
- `size`, `mode`, and so on.
-
- #### constructor(header, extended, globalExtended)
-
- Create a new ReadEntry object with the specified header, extended
- header, and global extended header values.
-
- ### class tar.WriteEntry extends [MiniPass](http://npm.im/minipass)
-
- A representation of an entry that is being written from the file
- system into a tar archive.
-
- Emits data for the Header, and for the Pax Extended Header if one is
- required, as well as any body data.
-
- Creating a WriteEntry for a directory does not also create
- WriteEntry objects for all of the directory contents.
-
- It has the following fields:
-
- - `path` The path field that will be written to the archive. By
- default, this is also the path from the cwd to the file system
- object.
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `myuid` If supported, the uid of the user running the current
- process.
- - `myuser` The `env.USER` string if set, or `''`. Set as the entry
- `uname` field if the file's `uid` matches `this.myuid`.
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 1 MB.
- - `linkCache` A Map object containing the device and inode value for
- any file whose nlink is > 1, to identify hard links.
- - `statCache` A Map object that caches calls `lstat`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths.
- - `cwd` The current working directory for creating the archive.
- Defaults to `process.cwd()`.
- - `absolute` The absolute path to the entry on the filesystem. By
- default, this is `path.resolve(this.cwd, this.path)`, but it can be
- overridden explicitly.
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `win32` True if on a windows platform. Causes behavior where paths
- replace `\` with `/` and filenames containing the windows-compatible
- forms of `<|>?:` characters are converted to actual `<|>?:` characters
- in the archive.
- - `noPax` Suppress pax extended headers. Note that this means that
- long paths and linkpaths will be truncated, and large or negative
- numeric values may be interpreted incorrectly.
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
-
-
- #### constructor(path, options)
-
- `path` is the path of the entry as it is written in the archive.
-
- The following options are supported:
-
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `maxReadSize` The maximum buffer size for `fs.read()` operations.
- Defaults to 1 MB.
- - `linkCache` A Map object containing the device and inode value for
- any file whose nlink is > 1, to identify hard links.
- - `statCache` A Map object that caches calls `lstat`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths.
- - `cwd` The current working directory for creating the archive.
- Defaults to `process.cwd()`.
- - `absolute` The absolute path to the entry on the filesystem. By
- default, this is `path.resolve(this.cwd, this.path)`, but it can be
- overridden explicitly.
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `win32` True if on a windows platform. Causes behavior where paths
- replace `\` with `/`.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
- - `umask` Set to restrict the modes on the entries in the archive,
- somewhat like how umask works on file creation. Defaults to
- `process.umask()` on unix systems, or `0o22` on Windows.
-
- #### warn(message, data)
-
- If strict, emit an error with the provided message.
-
- Othewise, emit a `'warn'` event with the provided message and data.
-
- ### class tar.WriteEntry.Sync
-
- Synchronous version of tar.WriteEntry
-
- ### class tar.WriteEntry.Tar
-
- A version of tar.WriteEntry that gets its data from a tar.ReadEntry
- instead of from the filesystem.
-
- #### constructor(readEntry, options)
-
- `readEntry` is the entry being read out of another archive.
-
- The following options are supported:
-
- - `portable` Omit metadata that is system-specific: `ctime`, `atime`,
- `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note
- that `mtime` is still included, because this is necessary for other
- time-based operations. Additionally, `mode` is set to a "reasonable
- default" for most unix systems, based on a `umask` value of `0o22`.
- - `preservePaths` Allow absolute paths. By default, `/` is stripped
- from absolute paths.
- - `strict` Treat warnings as crash-worthy errors. Default false.
- - `onwarn` A function that will get called with `(code, message, data)` for
- any warnings encountered. (See "Warnings and Errors")
- - `noMtime` Set to true to omit writing `mtime` values for entries.
- Note that this prevents using other mtime-based features like
- `tar.update` or the `keepNewer` option with the resulting tar archive.
-
- ### class tar.Header
-
- A class for reading and writing header blocks.
-
- It has the following fields:
-
- - `nullBlock` True if decoding a block which is entirely composed of
- `0x00` null bytes. (Useful because tar files are terminated by
- at least 2 null blocks.)
- - `cksumValid` True if the checksum in the header is valid, false
- otherwise.
- - `needPax` True if the values, as encoded, will require a Pax
- extended header.
- - `path` The path of the entry.
- - `mode` The 4 lowest-order octal digits of the file mode. That is,
- read/write/execute permissions for world, group, and owner, and the
- setuid, setgid, and sticky bits.
- - `uid` Numeric user id of the file owner
- - `gid` Numeric group id of the file owner
- - `size` Size of the file in bytes
- - `mtime` Modified time of the file
- - `cksum` The checksum of the header. This is generated by adding all
- the bytes of the header block, treating the checksum field itself as
- all ascii space characters (that is, `0x20`).
- - `type` The human-readable name of the type of entry this represents,
- or the alphanumeric key if unknown.
- - `typeKey` The alphanumeric key for the type of entry this header
- represents.
- - `linkpath` The target of Link and SymbolicLink entries.
- - `uname` Human-readable user name of the file owner
- - `gname` Human-readable group name of the file owner
- - `devmaj` The major portion of the device number. Always `0` for
- files, directories, and links.
- - `devmin` The minor portion of the device number. Always `0` for
- files, directories, and links.
- - `atime` File access time.
- - `ctime` File change time.
-
- #### constructor(data, [offset=0])
-
- `data` is optional. It is either a Buffer that should be interpreted
- as a tar Header starting at the specified offset and continuing for
- 512 bytes, or a data object of keys and values to set on the header
- object, and eventually encode as a tar Header.
-
- #### decode(block, offset)
-
- Decode the provided buffer starting at the specified offset.
-
- Buffer length must be greater than 512 bytes.
-
- #### set(data)
-
- Set the fields in the data object.
-
- #### encode(buffer, offset)
-
- Encode the header fields into the buffer at the specified offset.
-
- Returns `this.needPax` to indicate whether a Pax Extended Header is
- required to properly encode the specified data.
-
- ### class tar.Pax
-
- An object representing a set of key-value pairs in an Pax extended
- header entry.
-
- It has the following fields. Where the same name is used, they have
- the same semantics as the tar.Header field of the same name.
-
- - `global` True if this represents a global extended header, or false
- if it is for a single entry.
- - `atime`
- - `charset`
- - `comment`
- - `ctime`
- - `gid`
- - `gname`
- - `linkpath`
- - `mtime`
- - `path`
- - `size`
- - `uid`
- - `uname`
- - `dev`
- - `ino`
- - `nlink`
-
- #### constructor(object, global)
-
- Set the fields set in the object. `global` is a boolean that defaults
- to false.
-
- #### encode()
-
- Return a Buffer containing the header and body for the Pax extended
- header entry, or `null` if there is nothing to encode.
-
- #### encodeBody()
-
- Return a string representing the body of the pax extended header
- entry.
-
- #### encodeField(fieldName)
-
- Return a string representing the key/value encoding for the specified
- fieldName, or `''` if the field is unset.
-
- ### tar.Pax.parse(string, extended, global)
-
- Return a new Pax object created by parsing the contents of the string
- provided.
-
- If the `extended` object is set, then also add the fields from that
- object. (This is necessary because multiple metadata entries can
- occur in sequence.)
-
- ### tar.types
-
- A translation table for the `type` field in tar headers.
-
- #### tar.types.name.get(code)
-
- Get the human-readable name for a given alphanumeric code.
-
- #### tar.types.code.get(name)
-
- Get the alphanumeric code for a given human-readable name.
|