Skip to content

Commit 9659ecf

Browse files
committed
Detect version mismatches between shard.yml and git tags
1 parent 5b3975d commit 9659ecf

File tree

5 files changed

+49
-2
lines changed

5 files changed

+49
-2
lines changed

spec/integration/install_spec.cr

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,31 @@ describe "install" do
376376
end
377377
end
378378

379+
it "fails when shard.yml version doesn't match git tag" do
380+
metadata = {
381+
dependencies: {
382+
version_mismatch: {git: git_url(:version_mismatch), version: "0.2.0"},
383+
},
384+
}
385+
with_shard(metadata) do
386+
ex = expect_raises(FailedCommand) { run "shards install --no-color" }
387+
ex.stdout.should contain("Error shard version (0.1.0) doesn't match tag version (0.2.0)")
388+
refute_installed "version_mismatch"
389+
end
390+
end
391+
392+
it "succeeds when version mismatch is fixed" do
393+
metadata = {
394+
dependencies: {
395+
version_mismatch: {git: git_url(:version_mismatch), version: "0.2.1"},
396+
},
397+
}
398+
with_shard(metadata) do
399+
run "shards install"
400+
assert_installed "version_mismatch", "0.2.1"
401+
end
402+
end
403+
379404
it "test install old with version when shard was renamed" do
380405
metadata = {
381406
dependencies: {

spec/integration/spec_helper.cr

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ private def setup_repositories
6666
create_git_release "renamed", "0.2.0", "name: new_name\nversion: 0.2.0"
6767
create_git_version_commit "renamed", "0.3.0", "name: another_name\nversion: 0.3.0"
6868

69+
create_git_repository "version_mismatch"
70+
create_git_release "version_mismatch", "0.1.0", "name: version_mismatch\nversion: 0.1.0"
71+
create_git_release "version_mismatch", "0.2.0", "name: version_mismatch\nversion: 0.1.0"
72+
create_git_release "version_mismatch", "0.2.1", "name: version_mismatch\nversion: 0.2.1"
73+
6974
create_git_repository "inprogress"
7075
create_git_version_commit "inprogress", "0.1.0"
7176
create_git_version_commit "inprogress", "0.1.0"

src/molinillo_solver.cr

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ module Shards
7070
unless dependency.name == spec.name
7171
raise Error.new("Error shard name (#{spec.name}) doesn't match dependency name (#{dependency.name})")
7272
end
73+
if spec.mismatched_version?
74+
raise Error.new("Error shard version (#{spec.original_version}) doesn't match tag version (#{spec.version})")
75+
end
7376
end
7477
resolver = spec.resolver || raise "BUG: returned Spec has no resolver"
7578
version = spec.version

src/resolvers/git.cr

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,19 @@ module Shards
4242
end
4343

4444
def spec(version = nil)
45-
Spec.from_yaml(read_spec(version)).tap { |spec| spec.resolver = self }
45+
spec = Spec.from_yaml(read_spec(version))
46+
spec.resolver = self
47+
48+
if version && version =~ VERSION_REFERENCE
49+
# In this case, we know that the version was looked up by git tag, so we
50+
# validate the spec version against the tag version.
51+
version = version.lstrip('v')
52+
if spec.version != version
53+
spec.mismatched_version = true
54+
end
55+
end
56+
57+
spec
4658
end
4759

4860
private def spec?(version)

src/spec.cr

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,12 @@ module Shards
7070

7171
getter! name : String?
7272
getter! version : String?
73+
getter! original_version : String?
7374
getter description : String?
7475
getter license : String?
7576
getter crystal : String?
7677
property resolver : Resolver?
78+
property? mismatched_version = false
7779

7880
# :nodoc:
7981
def initialize(pull : YAML::PullParser, validate = false)
@@ -84,7 +86,7 @@ module Shards
8486
when "name"
8587
@name = pull.read_scalar
8688
when "version"
87-
@version = pull.read_scalar
89+
@original_version = @version = pull.read_scalar
8890
when "description"
8991
@description = pull.read_scalar
9092
when "license"

0 commit comments

Comments
 (0)