@@ -17,43 +17,29 @@ module Shards
17
17
end
18
18
19
19
Shards .logger.info do
20
- total = pkgs.reduce(0 ) { |acc , (name , pkg )| acc + pkg.versions.size }
20
+ total = pkgs.reduce(0 ) { |acc , (_ , pkg )| acc + pkg.versions.size }
21
21
" Collected #{ pkgs.size } dependencies (total: #{ total } specs, duration: #{ spent } )"
22
22
end
23
23
24
- sat = Shards ::SAT .new
25
-
26
24
Shards .logger.info { " Building SAT clauses..." }
27
25
28
26
spent = Time .measure do
29
- negation = " ~#{ spec.name } "
30
-
31
27
# the package to install dependencies for:
32
28
sat.add_clause [spec.name]
33
29
34
30
# main dependencies:
35
- spec.dependencies.each do |d |
36
- clause = [negation]
37
- Versions
38
- .resolve(pkgs[d.name].versions.keys, {d.version})
39
- .each { |v | clause << " #{ d.name } :#{ v } " }
40
- sat.add_clause(clause)
41
- end
31
+ negation = " ~#{ spec.name } "
32
+ add_dependencies(negation, spec.dependencies)
33
+ add_dependencies(negation, spec.development_dependencies) unless Shards .production?
42
34
43
35
# nested dependencies:
44
36
pkgs.each do |name , pkg |
45
37
pkg.versions.each do |version , s |
46
- s.dependencies.each do |d |
47
- clause = [" ~#{ name } :#{ version } " ]
48
- Versions
49
- .resolve(pkgs[d.name].versions.keys, {d.version})
50
- .map { |v | clause << " #{ d.name } :#{ v } " }
51
- sat.add_clause(clause) unless clause.size == 1
52
- end
38
+ add_dependencies(" ~#{ name } :#{ version } " , s.dependencies)
53
39
end
54
40
end
55
41
56
- # version conflicts (only 1 version per package)
42
+ # version conflicts (we want only 1 version per package):
57
43
pkgs.each do |name , pkg |
58
44
pkg.versions.keys.each_combination(2 ) do |(a , b )|
59
45
sat.add_clause [" ~#{ name } :#{ a } " , " ~#{ name } :#{ b } " ]
@@ -62,9 +48,9 @@ module Shards
62
48
end
63
49
Shards .logger.info { " Built #{ sat.@clauses .size } clauses (duration: #{ spent } )" }
64
50
65
- sat.@clauses .each do |clause |
66
- STDERR .puts sat.clause_to_s(clause)
67
- end
51
+
52
+ # STDERR.puts sat.clause_to_s(clause)
53
+ # end
68
54
69
55
Shards .logger.info { " Solving dependencies..." }
70
56
count = 0
@@ -73,10 +59,8 @@ module Shards
73
59
sat.solve do |solution |
74
60
# p solution
75
61
count += 1
76
- print " found: #{ count } solutions\r " if count == 100
77
62
end
78
63
end
79
- print " found: #{ count } solutions\n "
80
64
81
65
if count == 0
82
66
Shards .logger.error { " Failed to find a solution (duration: #{ spent } )" }
@@ -85,15 +69,29 @@ module Shards
85
69
end
86
70
end
87
71
88
- protected def sat
72
+ private def sat
89
73
@sat ||= SAT .new
90
74
end
91
75
92
- protected def pkgs
76
+ private def add_dependencies (negation , dependencies )
77
+ dependencies.each do |d |
78
+ versions = Versions .resolve(pkgs[d.name].versions.keys, {d.version})
79
+
80
+ # FIXME: looks like we couldn't resolve a constraint here; maybe it's
81
+ # related to a git refs, or something?
82
+ next if versions.empty?
83
+
84
+ clause = [negation]
85
+ versions.each { |v | clause << " #{ d.name } :#{ v } " }
86
+ sat.add_clause(clause)
87
+ end
88
+ end
89
+
90
+ private def pkgs
93
91
@pkgs ||= {} of String => Pkg
94
92
end
95
93
96
- protected def dig (dependencies , resolve = false )
94
+ private def dig (dependencies , resolve = false )
97
95
dependencies.each do |dependency |
98
96
next if pkgs.has_key?(dependency.name)
99
97
@@ -109,7 +107,6 @@ module Shards
109
107
pkg.versions.each do |version , spec |
110
108
next unless version =~ VERSION_REFERENCE
111
109
dig(spec.dependencies)
112
- dig(spec.development_dependencies) unless Shards .production?
113
110
end
114
111
end
115
112
end
0 commit comments