forked from corruptmem/nodejsmodules
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path03-ReverseDependencies.coffee
More file actions
111 lines (88 loc) · 2.62 KB
/
03-ReverseDependencies.coffee
File metadata and controls
111 lines (88 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
require('js-yaml')
mongoose = require('mongoose')
_ = require('underscore')
NpmPackage = require('./model/NpmPackage')
config = require('./config')
mongodb = mongoose.connect(config.mongodb)
class DepGraph
constructor: (ids) ->
@ids = ids
@map = {}
@len = ids.length
@matrix = new Buffer(@len * @len)
for n in [0...(@len*@len)-1]
@matrix[n] = 0
@calculated = {}
for id, n in ids
@map[id] = n
addDependency: (fromPackage, toPackage, n = 1) =>
from = @map[fromPackage]
to = @map[toPackage]
existing = @matrix[from*@len + to]
if n < existing or existing == 0
@matrix[from*@len + to] = n
getDependencies: (fromPackage) =>
deps = []
from = @map[fromPackage]
for to in [0..(@len - 1)]
if @matrix[from*@len + to] == 1
deps.push(@ids[to])
return deps
calculate: (id, seen = {}) =>
if id of @calculated
return
seen = _.clone(seen)
seen[id] = true
@calculated[id] = true
for rdep in @getReverseDependencies(id)
@calculate(rdep, seen) if rdep not of seen
for rdep in @getReverseDependencies(id)
for drdep, val of @getAllReverseDependencies(rdep)
#console.log("Dep from #{drdep} on #{id} with val #{val + 1} (via #{rdep})")
@addDependency(drdep, id, val + 1)
getAllReverseDependencies: (toPackage) =>
rdeps = {}
to = @map[toPackage]
for from in [0..(@len - 1)]
distance = @matrix[from*@len + to]
if distance >= 1
rdeps[@ids[from]] = distance
return rdeps
getReverseDependencies: (toPackage) =>
rdeps = []
to = @map[toPackage]
for from in [0..(@len - 1)]
if @matrix[from*@len + to] == 1
rdeps.push(@ids[from])
return rdeps
NpmPackage.find().exec((error, docs) =>
if error?
console.error(error)
process.exit()
packages = (doc.id for doc in docs)
dg = new DepGraph(packages)
for doc in docs
for dep in doc.dependencies.concat(doc.devDependencies)
dg.addDependency(doc.id, dep)
#for id in packages
console.log("Calculating")
for pkg, i in packages
console.log("#{i} of #{packages.length}: #{pkg}")
dg.calculate(pkg)
# write changes back to database
writeOne = (error) =>
if error?
console.error(error)
process.exit()
if docs.length == 0
mongoose.connection.close()
console.log("Done")
process.exit()
doc = docs.splice(-1)[0]
doc.allDependencies = []
for id, distance of dg.getAllReverseDependencies(doc.id)
doc.allDependencies.push({id: id, distance: distance})
console.log("Saving #{doc.id}")
doc.save(writeOne)
writeOne()
)