@@ -7,52 +7,46 @@ var npm = require("../../npm")
7
7
, fs = require ( "./graceful-fs" )
8
8
, path = require ( "path" )
9
9
, mkdir = require ( "./mkdir-p" )
10
+ , asyncMap = require ( "./async-map" )
11
+ , semver = require ( "./semver" )
10
12
11
13
module . exports = readInstalled
12
14
13
15
function readInstalled ( args , cb ) {
14
16
var showAll = args . length === 0
17
+ , data = { }
15
18
fs . readdir ( npm . dir , function ( er , packages ) {
16
19
if ( er ) return cb ( er )
17
20
packages = packages . filter ( function ( dir ) {
18
21
return ( showAll || args . indexOf ( dir ) !== - 1 ) && dir . charAt ( 0 ) !== "."
19
22
} )
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 ) {
29
24
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
+
30
39
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 ) ) {
39
44
data [ package ] [ version ] = data [ package ] [ version ] || { }
40
- return process . nextTick ( V )
41
45
}
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 )
55
47
} )
56
- } )
48
+
49
+ // just return the data object we've created.
50
+ } , function ( er ) { cb ( er , data ) } )
57
51
} )
58
52
}
0 commit comments