Skip to content

Commit 2275ffa

Browse files
committed
Use asyncMap to read the installed versions more asyncly
1 parent bbb5c29 commit 2275ffa

File tree

1 file changed

+26
-32
lines changed

1 file changed

+26
-32
lines changed

lib/utils/read-installed.js

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,46 @@ var npm = require("../../npm")
77
, fs = require("./graceful-fs")
88
, path = require("path")
99
, mkdir = require("./mkdir-p")
10+
, asyncMap = require("./async-map")
11+
, semver = require("./semver")
1012

1113
module.exports = readInstalled
1214

1315
function readInstalled (args, cb) {
1416
var showAll = args.length === 0
17+
, data = {}
1518
fs.readdir(npm.dir, function (er, packages) {
1619
if (er) return cb(er)
1720
packages = packages.filter(function (dir) {
1821
return (showAll || args.indexOf(dir) !== -1) && dir.charAt(0) !== "."
1922
})
20-
// maybe nothing found
21-
if (!packages.length) cb(null, [])
22-
23-
var p = packages.length
24-
, data = {}
25-
function listed () { if (--p === 0) cb(null, data) }
26-
packages.forEach(function (package) {
27-
var packageDir = path.join(npm.dir, package)
28-
, activeVersion = null
23+
asyncMap(packages, function (package, cb) {
2924
data[package] = data[package] || {}
25+
var packageDir = path.join(npm.dir, package)
26+
, active = path.join(packageDir, "active")
27+
28+
fs.lstat(active, function (er, s) {
29+
if (er || !s.isSymbolicLink()) return cb()
30+
fs.readlink(active, function (er, p) {
31+
if (er) return cb(er)
32+
var activeVersion = path.basename(p)
33+
data[package][activeVersion] = data[package][activeVersion] || {}
34+
data[package][activeVersion].active = true
35+
return cb()
36+
})
37+
})
38+
3039
fs.readdir(packageDir, function (er, versions) {
31-
if (er) return listed() // skip over non-dirs or missing things.
32-
;(function V () {
33-
var version = versions.pop()
34-
if (activeVersion && data[package][activeVersion]) {
35-
data[package][activeVersion].active = true
36-
}
37-
if (!version) return listed()
38-
if (version !== "active" && version.charAt(0) !== ".") {
40+
if (er) return cb() // skip over non-dirs or missing things.
41+
asyncMap(versions, function (version, cb) {
42+
if (!version) return cb()
43+
if (semver.valid(version)) {
3944
data[package][version] = data[package][version] || {}
40-
return process.nextTick(V)
4145
}
42-
var active = path.join(packageDir, "active")
43-
fs.lstat(active, function (er, s) {
44-
if (er || !s.isSymbolicLink()) {
45-
data[package][version] = data[package][version] || {}
46-
return process.nextTick(V)
47-
}
48-
fs.readlink(active, function (er, p) {
49-
if (er) return cb(er)
50-
activeVersion = path.basename(active)
51-
return process.nextTick(V)
52-
})
53-
})
54-
})()
46+
}, cb)
5547
})
56-
})
48+
49+
// just return the data object we've created.
50+
}, function (er) { cb(er, data) })
5751
})
5852
}

0 commit comments

Comments
 (0)