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.
		
		
		
		
		
			
		
			
				
					
					
						
							177 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							177 lines
						
					
					
						
							3.7 KiB
						
					
					
				// Set the umask, so that it works the same everywhere. | 
						|
process.umask(parseInt('22', 8)) | 
						|
 | 
						|
var fs = require('fs') | 
						|
var path = require('path') | 
						|
 | 
						|
var fstream = require('fstream') | 
						|
var test = require('tap').test | 
						|
 | 
						|
var tar = require('../tar.js') | 
						|
var file = path.resolve(__dirname, 'dir-normalization.tar') | 
						|
var target = path.resolve(__dirname, 'tmp/dir-normalization-test') | 
						|
var ee = 0 | 
						|
 | 
						|
var expectEntries = [ | 
						|
  { path: 'fixtures/', | 
						|
    mode: '755', | 
						|
    type: '5', | 
						|
    linkpath: '' | 
						|
  }, | 
						|
  { path: 'fixtures/a/', | 
						|
    mode: '755', | 
						|
    type: '5', | 
						|
    linkpath: '' | 
						|
  }, | 
						|
  { path: 'fixtures/the-chumbler', | 
						|
    mode: '755', | 
						|
    type: '2', | 
						|
    linkpath: path.resolve(target, 'a/b/c/d/the-chumbler'), | 
						|
  }, | 
						|
  { path: 'fixtures/a/b/', | 
						|
    mode: '755', | 
						|
    type: '5', | 
						|
    linkpath: '' | 
						|
  }, | 
						|
  { path: 'fixtures/a/x', | 
						|
    mode: '644', | 
						|
    type: '0', | 
						|
    linkpath: '' | 
						|
  }, | 
						|
  { path: 'fixtures/a/b/c/', | 
						|
    mode: '755', | 
						|
    type: '5', | 
						|
    linkpath: '' | 
						|
  }, | 
						|
  { path: 'fixtures/a/b/c/y', | 
						|
    mode: '755', | 
						|
    type: '2', | 
						|
    linkpath: '../../x', | 
						|
  } | 
						|
] | 
						|
 | 
						|
var ef = 0 | 
						|
var expectFiles = [ | 
						|
  { path: '', | 
						|
    mode: '40755', | 
						|
    type: 'Directory', | 
						|
    depth: 0, | 
						|
    linkpath: undefined | 
						|
  }, | 
						|
  { path: '/fixtures', | 
						|
    mode: '40755', | 
						|
    type: 'Directory', | 
						|
    depth: 1, | 
						|
    linkpath: undefined | 
						|
  }, | 
						|
  { path: '/fixtures/a', | 
						|
    mode: '40755', | 
						|
    type: 'Directory', | 
						|
    depth: 2, | 
						|
    linkpath: undefined | 
						|
  }, | 
						|
  { path: '/fixtures/a/b', | 
						|
    mode: '40755', | 
						|
    type: 'Directory', | 
						|
    depth: 3, | 
						|
    linkpath: undefined | 
						|
  }, | 
						|
  { path: '/fixtures/a/b/c', | 
						|
    mode: '40755', | 
						|
    type: 'Directory', | 
						|
    depth: 4, | 
						|
    linkpath: undefined | 
						|
  }, | 
						|
  { path: '/fixtures/a/b/c/y', | 
						|
    mode: '120755', | 
						|
    type: 'SymbolicLink', | 
						|
    depth: 5, | 
						|
    linkpath: '../../x' | 
						|
  }, | 
						|
  { path: '/fixtures/a/x', | 
						|
    mode: '100644', | 
						|
    type: 'File', | 
						|
    depth: 3, | 
						|
    linkpath: undefined | 
						|
  }, | 
						|
  { path: '/fixtures/the-chumbler', | 
						|
    mode: '120755', | 
						|
    type: 'SymbolicLink', | 
						|
    depth: 2, | 
						|
    linkpath: path.resolve(target, 'a/b/c/d/the-chumbler') | 
						|
  } | 
						|
] | 
						|
 | 
						|
test('preclean', function (t) { | 
						|
  require('rimraf').sync(path.join(__dirname, '/tmp/dir-normalization-test')) | 
						|
  t.pass('cleaned!') | 
						|
  t.end() | 
						|
}) | 
						|
 | 
						|
test('extract test', function (t) { | 
						|
  var extract = tar.Extract(target) | 
						|
  var inp = fs.createReadStream(file) | 
						|
 | 
						|
  inp.pipe(extract) | 
						|
 | 
						|
  extract.on('end', function () { | 
						|
    t.equal(ee, expectEntries.length, 'should see ' + expectEntries.length + ' entries') | 
						|
 | 
						|
    // should get no more entries after end | 
						|
    extract.removeAllListeners('entry') | 
						|
    extract.on('entry', function (e) { | 
						|
      t.fail('Should not get entries after end!') | 
						|
    }) | 
						|
 | 
						|
    next() | 
						|
  }) | 
						|
 | 
						|
  extract.on('entry', function (entry) { | 
						|
    var mode = entry.props.mode & (~parseInt('22', 8)) | 
						|
    var found = { | 
						|
      path: entry.path, | 
						|
      mode: mode.toString(8), | 
						|
      type: entry.props.type, | 
						|
      linkpath: entry.props.linkpath, | 
						|
    } | 
						|
 | 
						|
    var wanted = expectEntries[ee++] | 
						|
    t.equivalent(found, wanted, 'tar entry ' + ee + ' ' + (wanted && wanted.path)) | 
						|
  }) | 
						|
 | 
						|
  function next () { | 
						|
    var r = fstream.Reader({ | 
						|
      path: target, | 
						|
      type: 'Directory', | 
						|
      sort: 'alpha' | 
						|
    }) | 
						|
 | 
						|
    r.on('ready', function () { | 
						|
      foundEntry(r) | 
						|
    }) | 
						|
 | 
						|
    r.on('end', finish) | 
						|
 | 
						|
    function foundEntry (entry) { | 
						|
      var p = entry.path.substr(target.length) | 
						|
      var mode = entry.props.mode & (~parseInt('22', 8)) | 
						|
      var found = { | 
						|
        path: p, | 
						|
        mode: mode.toString(8), | 
						|
        type: entry.props.type, | 
						|
        depth: entry.props.depth, | 
						|
        linkpath: entry.props.linkpath | 
						|
      } | 
						|
 | 
						|
      var wanted = expectFiles[ef++] | 
						|
      t.equivalent(found, wanted, 'unpacked file ' + ef + ' ' + (wanted && wanted.path)) | 
						|
 | 
						|
      entry.on('entry', foundEntry) | 
						|
    } | 
						|
 | 
						|
    function finish () { | 
						|
      t.equal(ef, expectFiles.length, 'should have ' + ef + ' items') | 
						|
      t.end() | 
						|
    } | 
						|
  } | 
						|
})
 | 
						|
 |