Skip to content

Commit 124c31a

Browse files
authored
Merge pull request #327 from waj/feature/renamed-shards
Support shard renames
2 parents 134850e + 3e9ce40 commit 124c31a

File tree

4 files changed

+81
-6
lines changed

4 files changed

+81
-6
lines changed

spec/integration/install_spec.cr

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,66 @@ describe "install" do
341341
end
342342
end
343343

344+
it "test install old with version when shard was renamed" do
345+
metadata = {
346+
dependencies: {
347+
old_name: {git: git_url(:renamed), version: "0.1.0"},
348+
},
349+
}
350+
with_shard(metadata) do
351+
run "shards install"
352+
assert_installed "old_name", "0.1.0"
353+
end
354+
end
355+
356+
it "test install new when shard was renamed" do
357+
metadata = {
358+
dependencies: {
359+
new_name: {git: git_url(:renamed)},
360+
},
361+
}
362+
with_shard(metadata) do
363+
run "shards install"
364+
assert_installed "new_name", "0.2.0"
365+
end
366+
end
367+
368+
it "fail install old version when shard was renamed" do
369+
metadata = {
370+
dependencies: {
371+
new_name: {git: git_url(:renamed), version: "0.1.0"},
372+
},
373+
}
374+
with_shard(metadata) do
375+
ex = expect_raises(FailedCommand) { run "shards install --no-color" }
376+
ex.stdout.should contain("Error shard name (old_name) doesn't match dependency name (new_name)")
377+
end
378+
end
379+
380+
it "fail install new version when shard was renamed" do
381+
metadata = {
382+
dependencies: {
383+
old_name: {git: git_url(:renamed), version: "0.2.0"},
384+
},
385+
}
386+
with_shard(metadata) do
387+
ex = expect_raises(FailedCommand) { run "shards install --no-color" }
388+
ex.stdout.should contain("Error shard name (new_name) doesn't match dependency name (old_name)")
389+
end
390+
end
391+
392+
it "install untagged version when shard was renamed" do
393+
metadata = {
394+
dependencies: {
395+
another_name: {git: git_url(:renamed), branch: "master"},
396+
},
397+
}
398+
with_shard(metadata) do
399+
run "shards install"
400+
assert_installed "another_name", "0.3.0"
401+
end
402+
end
403+
344404
it "installs executables at version" do
345405
metadata = {
346406
dependencies: {binary: "0.1.0"},

spec/integration/spec_helper.cr

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ private def setup_repositories
6161
create_file "version", "src/version.cr", %(module Version; STRING = "version @ 0.1.0"; end)
6262
create_git_release "version", "0.1.0"
6363

64+
create_git_repository "renamed"
65+
create_git_release "renamed", "0.1.0", "name: old_name\nversion: 0.1.0"
66+
create_git_release "renamed", "0.2.0", "name: new_name\nversion: 0.2.0"
67+
create_git_version_commit "renamed", "0.3.0", "name: another_name\nversion: 0.3.0"
68+
6469
create_git_repository "transitive"
6570
create_file "transitive", "src/version.cr", %(require "version"; puts Version::STRING)
6671
create_git_release "transitive", "0.2.0", <<-YAML

spec/support/factories.cr

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def create_git_repository(project, *versions)
2828
versions.each { |version| create_git_release project, version }
2929
end
3030

31-
def create_git_release(project, version, shard = true)
31+
def create_git_version_commit(project, version, shard = true)
3232
Dir.cd(git_path(project)) do
3333
if shard
3434
contents = shard.is_a?(String) ? shard : "name: #{project}\nversion: #{version}\n"
@@ -39,6 +39,10 @@ def create_git_release(project, version, shard = true)
3939
end
4040
create_git_commit project, "release: v#{version}"
4141
end
42+
end
43+
44+
def create_git_release(project, version, shard = true)
45+
create_git_version_commit(project, version, shard)
4246
create_git_tag(project, "v#{version}")
4347
end
4448

src/molinillo_solver.cr

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ module Shards
4545

4646
packages = [] of Package
4747
result.each do |v|
48-
spec = v.payload.as(Spec) || raise "BUG: returned graph payload was not a Spec"
48+
spec = v.payload.as?(Spec) || raise "BUG: returned graph payload was not a Spec"
49+
v.requirements.each do |dependency|
50+
unless dependency.name == spec.name
51+
raise Error.new("Error shard name (#{spec.name}) doesn't match dependency name (#{dependency.name})")
52+
end
53+
end
4954
resolver = spec.resolver || raise "BUG: returned Spec has no resolver"
5055
version = spec.version
5156

@@ -60,7 +65,11 @@ module Shards
6065
packages
6166
end
6267

63-
def name_for(dependency)
68+
def name_for(spec : Shards::Spec)
69+
spec.resolver.not_nil!.dependency.name
70+
end
71+
72+
def name_for(dependency : Shards::Dependency)
6473
dependency.name
6574
end
6675

@@ -74,9 +83,6 @@ module Shards
7483
result = versions.map do |version|
7584
@specs[{dependency.name, version}] ||= begin
7685
resolver.spec(version).tap do |spec|
77-
unless dependency.name == spec.name
78-
raise Error.new("Error shard name (#{spec.name}) doesn't match dependency name (#{dependency.name})")
79-
end
8086
spec.version = version
8187
end
8288
end

0 commit comments

Comments
 (0)