File tree Expand file tree Collapse file tree 5 files changed +49
-2
lines changed Expand file tree Collapse file tree 5 files changed +49
-2
lines changed Original file line number Diff line number Diff 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: {
Original file line number Diff line number Diff line change @@ -66,6 +66,11 @@ private def setup_repositories
6666 create_git_release " renamed" , " 0.2.0" , " name: new_name\n version: 0.2.0"
6767 create_git_version_commit " renamed" , " 0.3.0" , " name: another_name\n version: 0.3.0"
6868
69+ create_git_repository " version_mismatch"
70+ create_git_release " version_mismatch" , " 0.1.0" , " name: version_mismatch\n version: 0.1.0"
71+ create_git_release " version_mismatch" , " 0.2.0" , " name: version_mismatch\n version: 0.1.0"
72+ create_git_release " version_mismatch" , " 0.2.1" , " name: version_mismatch\n version: 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"
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 )
Original file line number Diff line number Diff 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"
You can’t perform that action at this time.
0 commit comments