You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					112 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					112 lines
				
				2.3 KiB
			| 
											3 years ago
										 | '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 | ||
|  | } |