Revision 5aef65a9 deps/npm/lib/utils/tar.js

View differences:

deps/npm/lib/utils/tar.js
27 27
exports.pack = pack
28 28
exports.unpack = unpack
29 29

  
30
function pack (targetTarball, folder, pkg, dfc, cb) {
31
  log.verbose("tar pack", [targetTarball, folder])
30
function pack (tarball, folder, pkg, dfc, cb) {
31
  log.verbose("tar pack", [tarball, folder])
32 32
  if (typeof cb !== "function") cb = dfc, dfc = false
33 33

  
34
  log.verbose("tarball", targetTarball)
34
  log.verbose("tarball", tarball)
35 35
  log.verbose("folder", folder)
36 36

  
37 37
  if (dfc) {
38 38
    // do fancy crap
39 39
    return lifecycle(pkg, "prepublish", folder, function (er) {
40 40
      if (er) return cb(er)
41
      pack_(targetTarball, folder, pkg, cb)
41
      pack_(tarball, folder, pkg, cb)
42 42
    })
43 43
  } else {
44
    pack_(targetTarball, folder, pkg, cb)
44
    pack_(tarball, folder, pkg, cb)
45 45
  }
46 46
}
47 47

  
48
function pack_ (targetTarball, folder, pkg, cb_) {
48
function pack_ (tarball, folder, pkg, cb_) {
49
  var tarballLock = false
50
    , folderLock = false
51

  
49 52
  function cb (er) {
50
    unlock(targetTarball, function () {
51
      return cb_(er)
52
    })
53
    if (folderLock)
54
      unlock(folder, function() {
55
        folderLock = false
56
        cb(er)
57
      })
58
    else if (tarballLock)
59
      unlock(tarball, function() {
60
        tarballLock = false
61
        cb(er)
62
      })
63
    else
64
      cb_(er)
53 65
  }
54
  lock(targetTarball, function (er) {
66

  
67
  lock(folder, function(er) {
55 68
    if (er) return cb(er)
69
    folderLock = true
70
    next()
71
  })
72

  
73
  lock(tarball, function (er) {
74
    if (er) return cb(er)
75
    tarballLock = true
76
    next()
77
  })
78

  
79
  function next () {
80
    if (!tarballLock || !folderLock) return
56 81

  
57 82
    new Packer({ path: folder, type: "Directory", isDirectory: true })
58 83
      .on("error", function (er) {
......
67 92
      // non-compliant tar implementations.
68 93
      .pipe(tar.Pack({ noProprietary: !npm.config.get("proprietary-attribs") }))
69 94
      .on("error", function (er) {
70
        if (er) log.error("tar.pack", "tar creation error", targetTarball)
95
        if (er) log.error("tar.pack", "tar creation error", tarball)
71 96
        cb(er)
72 97
      })
73 98
      .pipe(zlib.Gzip())
74 99
      .on("error", function (er) {
75
        if (er) log.error("tar.pack", "gzip error "+targetTarball)
100
        if (er) log.error("tar.pack", "gzip error "+tarball)
76 101
        cb(er)
77 102
      })
78
      .pipe(fstream.Writer({ type: "File", path: targetTarball }))
103
      .pipe(fstream.Writer({ type: "File", path: tarball }))
79 104
      .on("error", function (er) {
80
        if (er) log.error("tar.pack", "Could not write "+targetTarball)
105
        if (er) log.error("tar.pack", "Could not write "+tarball)
81 106
        cb(er)
82 107
      })
83 108
      .on("close", cb)
84
  })
109
  }
85 110
}
86 111

  
87 112

  
......
101 126
function unpack_ ( tarball, unpackTarget, dMode, fMode, uid, gid, cb_ ) {
102 127
  var parent = path.dirname(unpackTarget)
103 128
    , base = path.basename(unpackTarget)
129
    , folderLock
130
    , tarballLock
104 131

  
105 132
  function cb (er) {
106
    unlock(unpackTarget, function () {
107
      return cb_(er)
108
    })
133
    if (folderLock)
134
      unlock(unpackTarget, function() {
135
        folderLock = false
136
        cb(er)
137
      })
138
    else if (tarballLock)
139
      unlock(tarball, function() {
140
        tarballLock = false
141
        cb(er)
142
      })
143
    else
144
      cb_(er)
109 145
  }
110 146

  
111 147
  lock(unpackTarget, function (er) {
112 148
    if (er) return cb(er)
113
    rmGunz()
149
    folderLock = true
150
    next()
114 151
  })
115 152

  
153
  lock(tarball, function (er) {
154
    if (er) return cb(er)
155
    tarballLock = true
156
    next()
157
  })
158

  
159
  function next() {
160
    if (!tarballLock || !folderLock) return
161
    rmGunz()
162
  }
163

  
116 164
  function rmGunz () {
117 165
    rm(unpackTarget, function (er) {
118 166
      if (er) return cb(er)

Also available in: Unified diff