All files / tar/lib create.js

100% Statements 54/54
100% Branches 33/33
100% Functions 12/12
100% Lines 47/47
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79      2x   2x 2x   2x 12x 1x   12x 1x   12x 2x   10x   10x 1x   9x 1x   8x           2x 3x   3x   3x 3x 6x 3x 3x 2x 2x   3x 1x       2x 3x 3x 3x   3x 3x 3x 3x     3x 3x   3x     2x 1x 1x 1x     2x 1x 1x 1x    
'use strict'
 
// tar -c
const hlo = require('./high-level-opt.js')
 
const Pack = require('./pack.js')
const fs = require('fs')
 
const c = 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')
 
  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)
 
  let threw = true
  let fd
  try {
    fd = fs.openSync(opt.file, 'w', opt.mode || 0o666)
    p.on('data', chunk => fs.writeSync(fd, chunk, 0, chunk.length))
    p.on('end', _ => fs.closeSync(fd))
    files.forEach(file => p.add(file))
    p.end()
    threw = false
  } finally {
    if (threw)
      try { fs.closeSync(fd) } catch (er) {}
  }
}
 
const createFile = (opt, files, cb) => {
  const p = new Pack(opt)
  const stream = fs.createWriteStream(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)
  })
 
  files.forEach(file => p.add(file))
  p.end()
 
  return cb ? promise.then(cb, cb) : promise
}
 
const createSync = (opt, files) => {
  const p = new Pack.Sync(opt)
  files.forEach(file => p.add(file))
  return p.end()
}
 
const create = (opt, files) => {
  const p = new Pack(opt)
  files.forEach(file => p.add(file))
  return p.end()
}