@@ -14,6 +14,27 @@ module Shards
1414 def prepare (@development = true )
1515 end
1616
17+ private def add_lock (base , lock_index , name )
18+ if lock = lock_index.delete(name)
19+ resolver = Shards .find_resolver(lock)
20+
21+ if version = lock[" version" ]?
22+ spec = resolver.spec(version)
23+ elsif commit = lock[" commit" ]?
24+ spec = resolver.spec(commit)
25+ lock[" version" ] = " #{ spec.version } +git.commit.#{ commit } "
26+ else
27+ return
28+ end
29+
30+ base.add_vertex(lock.name, lock, true )
31+
32+ spec.dependencies.each do |dep |
33+ add_lock(base, lock_index, dep.name)
34+ end
35+ end
36+ end
37+
1738 def solve : Array (Package )
1839 deps = if @development
1940 @spec .dependencies + @spec .development_dependencies
@@ -23,18 +44,16 @@ module Shards
2344
2445 base = Molinillo ::DependencyGraph (Dependency , Dependency ).new
2546 if locks = @locks
26- locks.each do |lock |
27- if version = lock[" version" ]?
28- dep = deps.find { |d | d.name == lock.name }
29- next if dep && ! Versions .matches?(version, dep.version)
30- end
47+ lock_index = locks.to_h { |d | {d.name, d} }
48+
49+ deps.each do |dep |
50+ if lock = lock_index[dep.name]?
51+ if version = lock[" version" ]?
52+ next unless Versions .matches?(version, dep.version)
53+ end
3154
32- if commit = lock[" commit" ]?
33- resolver = Shards .find_resolver(lock)
34- spec = resolver.spec(commit)
35- lock[" version" ] = " #{ spec.version } +git.commit.#{ commit } "
55+ add_lock(base, lock_index, dep.name)
3656 end
37- base.add_vertex(lock.name, lock, true )
3857 end
3958 end
4059
@@ -45,6 +64,7 @@ module Shards
4564
4665 packages = [] of Package
4766 result.each do |v |
67+ next unless v.payload
4868 spec = v.payload.as?(Spec ) || raise " BUG: returned graph payload was not a Spec"
4969 v.requirements.each do |dependency |
5070 unless dependency.name == spec.name
@@ -140,7 +160,7 @@ module Shards
140160 # to [HEAD], we must resolve the refs to an actual version:
141161 versions_for_refs(" HEAD" , dependency, resolver)
142162 else
143- matching
163+ matching.uniq
144164 end
145165 end
146166
0 commit comments