9fb1e6fb1b502cc82618c525626b1076fcb385a2
[platform/upstream/nodejs.git] / deps / npm / node_modules / tar / lib / extract.js
1 // give it a tarball and a path, and it'll dump the contents
2
3 module.exports = Extract
4
5 var tar = require("../tar.js")
6   , fstream = require("fstream")
7   , inherits = require("inherits")
8   , path = require("path")
9
10 function Extract (opts) {
11   if (!(this instanceof Extract)) return new Extract(opts)
12   tar.Parse.apply(this)
13
14   // have to dump into a directory
15   opts.type = "Directory"
16   opts.Directory = true
17
18   if (typeof opts !== "object") {
19     opts = { path: opts }
20   }
21
22   // better to drop in cwd? seems more standard.
23   opts.path = opts.path || path.resolve("node-tar-extract")
24   opts.type = "Directory"
25   opts.Directory = true
26
27   // similar to --strip or --strip-components
28   opts.strip = +opts.strip
29   if (!opts.strip || opts.strip <= 0) opts.strip = 0
30
31   this._fst = fstream.Writer(opts)
32
33   this.pause()
34   var me = this
35
36   // Hardlinks in tarballs are relative to the root
37   // of the tarball.  So, they need to be resolved against
38   // the target directory in order to be created properly.
39   me.on("entry", function (entry) {
40     // if there's a "strip" argument, then strip off that many
41     // path components.
42     if (opts.strip) {
43       var p = entry.path.split("/").slice(opts.strip).join("/")
44       entry.path = entry.props.path = p
45       if (entry.linkpath) {
46         var lp = entry.linkpath.split("/").slice(opts.strip).join("/")
47         entry.linkpath = entry.props.linkpath = lp
48       }
49     }
50     if (entry.type !== "Link") return
51     entry.linkpath = entry.props.linkpath =
52       path.join(opts.path, path.join("/", entry.props.linkpath))
53   })
54
55   this._fst.on("ready", function () {
56     me.pipe(me._fst, { end: false })
57     me.resume()
58   })
59
60   this._fst.on('error', function(err) {
61     me.emit('error', err)
62   })
63
64   this._fst.on('drain', function() {
65     me.emit('drain')
66   })
67
68   // this._fst.on("end", function () {
69   //   console.error("\nEEEE Extract End", me._fst.path)
70   // })
71
72   this._fst.on("close", function () {
73     // console.error("\nEEEE Extract End", me._fst.path)
74     me.emit("end")
75     me.emit("close")
76   })
77 }
78
79 inherits(Extract, tar.Parse)
80
81 Extract.prototype._streamEnd = function () {
82   var me = this
83   if (!me._ended) me.error("unexpected eof")
84   me._fst.end()
85   // my .end() is coming later.
86 }