Skip to content

Commit 38b3d21

Browse files
authored
Use Molinillo to resolve dependencies (#322)
1 parent 019b82d commit 38b3d21

File tree

19 files changed

+226
-941
lines changed

19 files changed

+226
-941
lines changed

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ dry:
1111
steps: &steps
1212
- run: *prepare
1313
- checkout
14-
- run: make
1514
- run: shards install
15+
- run: make
1616
- run: make test
1717

1818
jobs:
@@ -34,7 +34,7 @@ workflows:
3434
nightly:
3535
triggers:
3636
- schedule:
37-
cron: "0 2 * * *"
37+
cron: '0 2 * * *'
3838
filters:
3939
branches:
4040
only:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/.shards
33
/lib
44
/bin/shards
5+
/bin/shards.dwarf
56
/test/.repositories
67
/test/.shards
78
/test/.lib

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
CRYSTAL = crystal
44
CRFLAGS =
5-
SOURCES = src/*.cr src/**/*.cr
5+
SOURCES = src/*.cr src/**/*.cr lib/molinillo/**/*.cr
66
TEMPLATES = src/templates/*.ecr
77

88
DESTDIR =

shard.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@ shards:
44
github: ysbaddaden/minitest.cr
55
version: 0.5.0
66

7+
molinillo:
8+
github: crystal-lang/crystal-molinillo
9+
commit: 00fbe6c5ef9492d56cc7ec7b9a8b9cf2fe1a36ea
10+

shard.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ version: 0.9.0
44
authors:
55
- Julien Portalier <[email protected]>
66

7+
dependencies:
8+
molinillo:
9+
github: crystal-lang/crystal-molinillo
10+
711
development_dependencies:
812
minitest:
913
github: ysbaddaden/minitest.cr

src/commands/command.cr

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,12 @@ module Shards
5555
Shards.logger.info { "Writing #{LOCK_FILENAME}" }
5656
Shards::Lock.write(packages, LOCK_FILENAME)
5757
end
58+
59+
def handle_resolver_errors
60+
yield
61+
rescue e : Molinillo::ResolverError
62+
Shards.logger.error e.message
63+
raise Shards::Error.new("Failed to resolve dependencies")
64+
end
5865
end
5966
end

src/commands/install.cr

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require "./command"
2-
require "../solver"
2+
require "../molinillo_solver"
33

44
module Shards
55
module Commands
66
class Install < Command
77
def run
88
Shards.logger.info { "Resolving dependencies" }
99

10-
solver = Solver.new(spec)
10+
solver = MolinilloSolver.new(spec)
1111

1212
if lockfile?
1313
# install must be as conservative as possible:
@@ -16,23 +16,17 @@ module Shards
1616

1717
solver.prepare(development: !Shards.production?)
1818

19-
if packages = solver.solve
20-
return if packages.empty?
19+
packages = handle_resolver_errors { solver.solve }
20+
return if packages.empty?
2121

22-
if lockfile?
23-
validate(packages)
24-
end
22+
if lockfile?
23+
validate(packages)
24+
end
2525

26-
install(packages)
26+
install(packages)
2727

28-
if generate_lockfile?(packages)
29-
write_lockfile(packages)
30-
end
31-
else
32-
solver.each_conflict do |message|
33-
Shards.logger.warn { "Conflict #{message}" }
34-
end
35-
raise Shards::Error.new("Failed to resolve dependencies")
28+
if generate_lockfile?(packages)
29+
write_lockfile(packages)
3630
end
3731
end
3832

src/commands/lock.cr

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require "./command"
2-
require "../solver"
2+
require "../molinillo_solver"
33

44
module Shards
55
module Commands
66
class Lock < Command
77
def run(shards : Array(String), print = false, update = false)
88
Shards.logger.info { "Resolving dependencies" }
99

10-
solver = Solver.new(spec)
10+
solver = MolinilloSolver.new(spec)
1111

1212
if lockfile?
1313
if update
@@ -24,19 +24,13 @@ module Shards
2424

2525
solver.prepare(development: !Shards.production?)
2626

27-
if packages = solver.solve
28-
return if packages.empty?
27+
packages = handle_resolver_errors { solver.solve }
28+
return if packages.empty?
2929

30-
if print
31-
Shards::Lock.write(packages, STDOUT)
32-
else
33-
write_lockfile(packages)
34-
end
30+
if print
31+
Shards::Lock.write(packages, STDOUT)
3532
else
36-
solver.each_conflict do |message|
37-
Shards.logger.warn { "Conflict #{message}" }
38-
end
39-
raise Shards::Error.new("Failed to resolve dependencies")
33+
write_lockfile(packages)
4034
end
4135
end
4236

src/commands/outdated.cr

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,18 @@ module Shards
1313

1414
Shards.logger.info { "Resolving dependencies" }
1515

16-
solver = Solver.new(spec, @prereleases)
16+
solver = MolinilloSolver.new(spec, @prereleases)
1717
solver.prepare(development: !Shards.production?)
1818

19-
if packages = solver.solve
20-
packages.each { |package| analyze(package) }
19+
packages = handle_resolver_errors { solver.solve }
20+
packages.each { |package| analyze(package) }
2121

22-
if @up_to_date
23-
Shards.logger.info "Dependencies are up to date!"
24-
else
25-
@output.rewind
26-
Shards.logger.warn "Outdated dependencies:"
27-
puts @output.to_s
28-
end
22+
if @up_to_date
23+
Shards.logger.info "Dependencies are up to date!"
2924
else
30-
solver.each_conflict do |message|
31-
Shards.logger.warn { "Conflict #{message}" }
32-
end
33-
raise Shards::Error.new("Failed to resolve dependencies")
25+
@output.rewind
26+
Shards.logger.warn "Outdated dependencies:"
27+
puts @output.to_s
3428
end
3529
end
3630

src/commands/update.cr

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require "./command"
2-
require "../solver"
2+
require "../molinillo_solver"
33

44
module Shards
55
module Commands
66
class Update < Command
77
def run(shards : Array(String))
88
Shards.logger.info { "Resolving dependencies" }
99

10-
solver = Solver.new(spec)
10+
solver = MolinilloSolver.new(spec)
1111

1212
if lockfile? && !shards.empty?
1313
# update selected dependencies to latest possible versions, but
@@ -17,17 +17,11 @@ module Shards
1717

1818
solver.prepare(development: !Shards.production?)
1919

20-
if packages = solver.solve
21-
install(packages)
22-
23-
if generate_lockfile?(packages)
24-
write_lockfile(packages)
25-
end
26-
else
27-
solver.each_conflict do |message|
28-
Shards.logger.warn { "Conflict #{message}" }
29-
end
30-
raise Shards::Error.new("Failed to resolve dependencies")
20+
packages = handle_resolver_errors { solver.solve }
21+
install(packages)
22+
23+
if generate_lockfile?(packages)
24+
write_lockfile(packages)
3125
end
3226
end
3327

0 commit comments

Comments
 (0)