123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 'use strict'
-
- // tar -c
- const hlo = require('./high-level-opt.js')
-
- const Pack = require('./pack.js')
- const fsm = require('fs-minipass')
- const t = require('./list.js')
- const path = require('path')
-
- module.exports = (opt_, files, cb) => {
- if (typeof files === 'function') {
- cb = files
- }
-
- if (Array.isArray(opt_)) {
- files = opt_, opt_ = {}
- }
-
- if (!files || !Array.isArray(files) || !files.length) {
- throw new TypeError('no files or directories specified')
- }
-
- files = Array.from(files)
-
- const opt = hlo(opt_)
-
- if (opt.sync && typeof cb === 'function') {
- throw new TypeError('callback not supported for sync tar functions')
- }
-
- if (!opt.file && typeof cb === 'function') {
- throw new TypeError('callback only supported with file option')
- }
-
- return opt.file && opt.sync ? createFileSync(opt, files)
- : opt.file ? createFile(opt, files, cb)
- : opt.sync ? createSync(opt, files)
- : create(opt, files)
- }
-
- const createFileSync = (opt, files) => {
- const p = new Pack.Sync(opt)
- const stream = new fsm.WriteStreamSync(opt.file, {
- mode: opt.mode || 0o666,
- })
- p.pipe(stream)
- addFilesSync(p, files)
- }
-
- const createFile = (opt, files, cb) => {
- const p = new Pack(opt)
- const stream = new fsm.WriteStream(opt.file, {
- mode: opt.mode || 0o666,
- })
- p.pipe(stream)
-
- const promise = new Promise((res, rej) => {
- stream.on('error', rej)
- stream.on('close', res)
- p.on('error', rej)
- })
-
- addFilesAsync(p, files)
-
- return cb ? promise.then(cb, cb) : promise
- }
-
- const addFilesSync = (p, files) => {
- files.forEach(file => {
- if (file.charAt(0) === '@') {
- t({
- file: path.resolve(p.cwd, file.slice(1)),
- sync: true,
- noResume: true,
- onentry: entry => p.add(entry),
- })
- } else {
- p.add(file)
- }
- })
- p.end()
- }
-
- const addFilesAsync = (p, files) => {
- while (files.length) {
- const file = files.shift()
- if (file.charAt(0) === '@') {
- return t({
- file: path.resolve(p.cwd, file.slice(1)),
- noResume: true,
- onentry: entry => p.add(entry),
- }).then(_ => addFilesAsync(p, files))
- } else {
- p.add(file)
- }
- }
- p.end()
- }
-
- const createSync = (opt, files) => {
- const p = new Pack.Sync(opt)
- addFilesSync(p, files)
- return p
- }
-
- const create = (opt, files) => {
- const p = new Pack(opt)
- addFilesAsync(p, files)
- return p
- }
|