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.
		
		
		
		
			
				
					178 lines
				
				3.7 KiB
			
		
		
			
		
	
	
					178 lines
				
				3.7 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								// 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()
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 |