Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Molinillo to resolve dependencies #322

Merged
merged 14 commits into from
Feb 12, 2020
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ dry:
steps: &steps
- run: *prepare
- checkout
- run: make
- run: shards install
- run: make
- run: make test

jobs:
Expand All @@ -34,7 +34,7 @@ workflows:
nightly:
triggers:
- schedule:
cron: "0 2 * * *"
cron: '0 2 * * *'
filters:
branches:
only:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/.shards
/lib
/bin/shards
/bin/shards.dwarf
/test/.repositories
/test/.shards
/test/.lib
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

CRYSTAL = crystal
CRFLAGS =
SOURCES = src/*.cr src/**/*.cr
SOURCES = src/*.cr src/**/*.cr lib/molinillo/**/*.cr
TEMPLATES = src/templates/*.ecr

DESTDIR =
Expand Down
4 changes: 4 additions & 0 deletions shard.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,7 @@ shards:
github: ysbaddaden/minitest.cr
version: 0.5.0

molinillo:
github: crystal-lang/crystal-molinillo
commit: 00fbe6c5ef9492d56cc7ec7b9a8b9cf2fe1a36ea

4 changes: 4 additions & 0 deletions shard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ version: 0.9.0
authors:
- Julien Portalier <julien@portalier.com>

dependencies:
molinillo:
github: crystal-lang/crystal-molinillo

development_dependencies:
minitest:
github: ysbaddaden/minitest.cr
Expand Down
7 changes: 7 additions & 0 deletions src/commands/command.cr
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,12 @@ module Shards
Shards.logger.info { "Writing #{LOCK_FILENAME}" }
Shards::Lock.write(packages, LOCK_FILENAME)
end

def handle_resolver_errors
yield
rescue e : Molinillo::ResolverError
Shards.logger.error e.message
raise Shards::Error.new("Failed to resolve dependencies")
end
end
end
26 changes: 10 additions & 16 deletions src/commands/install.cr
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
require "./command"
require "../solver"
require "../molinillo_solver"

module Shards
module Commands
class Install < Command
def run
Shards.logger.info { "Resolving dependencies" }

solver = Solver.new(spec)
solver = MolinilloSolver.new(spec)

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

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

if packages = solver.solve
return if packages.empty?
packages = handle_resolver_errors { solver.solve }
return if packages.empty?

if lockfile?
validate(packages)
end
if lockfile?
validate(packages)
end

install(packages)
install(packages)

if generate_lockfile?(packages)
write_lockfile(packages)
end
else
solver.each_conflict do |message|
Shards.logger.warn { "Conflict #{message}" }
end
raise Shards::Error.new("Failed to resolve dependencies")
if generate_lockfile?(packages)
write_lockfile(packages)
end
end

Expand Down
20 changes: 7 additions & 13 deletions src/commands/lock.cr
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
require "./command"
require "../solver"
require "../molinillo_solver"

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

solver = Solver.new(spec)
solver = MolinilloSolver.new(spec)

if lockfile?
if update
Expand All @@ -24,19 +24,13 @@ module Shards

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

if packages = solver.solve
return if packages.empty?
packages = handle_resolver_errors { solver.solve }
return if packages.empty?

if print
Shards::Lock.write(packages, STDOUT)
else
write_lockfile(packages)
end
if print
Shards::Lock.write(packages, STDOUT)
else
solver.each_conflict do |message|
Shards.logger.warn { "Conflict #{message}" }
end
raise Shards::Error.new("Failed to resolve dependencies")
write_lockfile(packages)
end
end

Expand Down
22 changes: 8 additions & 14 deletions src/commands/outdated.cr
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,18 @@ module Shards

Shards.logger.info { "Resolving dependencies" }

solver = Solver.new(spec, @prereleases)
solver = MolinilloSolver.new(spec, @prereleases)
solver.prepare(development: !Shards.production?)

if packages = solver.solve
packages.each { |package| analyze(package) }
packages = handle_resolver_errors { solver.solve }
packages.each { |package| analyze(package) }

if @up_to_date
Shards.logger.info "Dependencies are up to date!"
else
@output.rewind
Shards.logger.warn "Outdated dependencies:"
puts @output.to_s
end
if @up_to_date
Shards.logger.info "Dependencies are up to date!"
else
solver.each_conflict do |message|
Shards.logger.warn { "Conflict #{message}" }
end
raise Shards::Error.new("Failed to resolve dependencies")
@output.rewind
Shards.logger.warn "Outdated dependencies:"
puts @output.to_s
end
end

Expand Down
20 changes: 7 additions & 13 deletions src/commands/update.cr
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
require "./command"
require "../solver"
require "../molinillo_solver"

module Shards
module Commands
class Update < Command
def run(shards : Array(String))
Shards.logger.info { "Resolving dependencies" }

solver = Solver.new(spec)
solver = MolinilloSolver.new(spec)

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

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

if packages = solver.solve
install(packages)

if generate_lockfile?(packages)
write_lockfile(packages)
end
else
solver.each_conflict do |message|
Shards.logger.warn { "Conflict #{message}" }
end
raise Shards::Error.new("Failed to resolve dependencies")
packages = handle_resolver_errors { solver.solve }
install(packages)

if generate_lockfile?(packages)
write_lockfile(packages)
end
end

Expand Down
8 changes: 8 additions & 0 deletions src/dependency.cr
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ module Shards
version { nil }
end

def prerelease?
Versions.prerelease? version
end

private def version
if version = self["version"]?
version
Expand Down Expand Up @@ -61,6 +65,10 @@ module Shards
end
end

def to_s(io)
io << name << " " << version
end

def inspect(io)
io << "#<" << self.class.name << " {" << name << " => "
super
Expand Down
Loading