Skip to content

Commit 7a95c35

Browse files
authored
Merge pull request #270 from crystal-lang/fix/git-default-head-refs
Fix: Git default HEAD refs
2 parents 2781566 + 36eede7 commit 7a95c35

File tree

11 files changed

+89
-42
lines changed

11 files changed

+89
-42
lines changed

src/commands/install.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ module Shards
3232
solver.each_conflict do |message|
3333
Shards.logger.warn { "Conflict #{message}" }
3434
end
35-
Shards.logger.error { "Failed to resolve dependencies" }
35+
raise Shards::Error.new("Failed to resolve dependencies")
3636
end
3737
end
3838

src/commands/lock.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ module Shards
3636
solver.each_conflict do |message|
3737
Shards.logger.warn { "Conflict #{message}" }
3838
end
39-
Shards.logger.error { "Failed to resolve dependencies" }
39+
raise Shards::Error.new("Failed to resolve dependencies")
4040
end
4141
end
4242

src/commands/outdated.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ module Shards
3030
solver.each_conflict do |message|
3131
Shards.logger.warn { "Conflict #{message}" }
3232
end
33-
Shards.logger.error { "Failed to resolve dependencies" }
33+
raise Shards::Error.new("Failed to resolve dependencies")
3434
end
3535
end
3636

src/commands/update.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ module Shards
2727
solver.each_conflict do |message|
2828
Shards.logger.warn { "Conflict #{message}" }
2929
end
30-
Shards.logger.error { "Failed to resolve dependencies" }
30+
raise Shards::Error.new("Failed to resolve dependencies")
3131
end
3232
end
3333

src/package.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module Shards
2525
end
2626

2727
def spec
28-
@spec ||= resolver.spec(version)
28+
@spec ||= resolver.spec(commit || version)
2929
end
3030

3131
def installed?

src/solver/graph.cr

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,25 @@ module Shards
7171
end
7272

7373
private def versions_for(dependency, resolver) : Array(String)
74-
if requirement = dependency.version?
75-
if requirement == "HEAD"
76-
versions_for_refs("HEAD", dependency, resolver)
74+
matching =
75+
if requirement = dependency.version?
76+
if requirement == "HEAD"
77+
return versions_for_refs("HEAD", dependency, resolver)
78+
else
79+
Versions.resolve(resolver.available_versions, requirement)
80+
end
81+
elsif refs = dependency.refs
82+
versions_for_refs(refs, dependency, resolver)
7783
else
78-
Versions.resolve(resolver.available_versions, requirement)
84+
resolver.available_versions
7985
end
80-
elsif refs = dependency.refs
81-
versions_for_refs(refs, dependency, resolver)
86+
87+
if matching.size == 1 && matching.first == "HEAD"
88+
# NOTE: dependency doesn't have any version number tag, and defaults
89+
# to [HEAD], we must resolve the refs to an actual version:
90+
versions_for_refs("HEAD", dependency, resolver)
8291
else
83-
resolver.available_versions
92+
matching
8493
end
8594
end
8695

test/integration/build_test.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class BuildCommandTest < Minitest::Test
6060
end
6161

6262
def test_reports_error_when_target_failed_to_compile
63-
File.write File.join(application_path, "src", "cli.cr"), "a = ..."
63+
File.write File.join(application_path, "src", "cli.cr"), "a = ......"
6464

6565
Dir.cd(application_path) do
6666
ex = assert_raises(FailedCommand) do

test/integration/install_test.cr

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ class InstallCommandTest < Minitest::Test
109109
end
110110
end
111111

112+
def test_resolves_dependency_at_head_when_no_version_tags
113+
metadata = {dependencies: {"missing": "*"}}
114+
with_shard(metadata) { run "shards install" }
115+
assert_installed "missing", "0.1.0"
116+
end
117+
112118
def test_installs_dependency_at_locked_commit_when_refs_is_a_branch
113119
metadata = {
114120
dependencies: {
@@ -312,21 +318,38 @@ class InstallCommandTest < Minitest::Test
312318
end
313319
end
314320

315-
def test_installs_executables
321+
def test_installs_executables_at_version
316322
metadata = {
317-
dependencies: {
318-
binary: {type: "path", path: rel_path(:binary)},
319-
},
323+
dependencies: {binary: "0.1.0"}
320324
}
321325
with_shard(metadata) { run("shards install --no-color") }
322326

323327
foobar = File.join(application_path, "bin", "foobar")
324328
baz = File.join(application_path, "bin", "baz")
329+
foo = File.join(application_path, "bin", "foo")
325330

326331
assert File.exists?(foobar), "Expected to have installed bin/foobar executable"
327332
assert File.exists?(baz), "Expected to have installed bin/baz executable"
333+
refute File.exists?(foo), "Expected not to have installed bin/foo executable"
328334

329335
assert_equal "OK\n", `#{foobar}`
330336
assert_equal "KO\n", `#{baz}`
331337
end
338+
339+
def test_installs_executables_at_refs
340+
metadata = {
341+
dependencies: {
342+
binary: {git: git_url(:binary), commit: git_commits(:binary)[-1]}
343+
},
344+
}
345+
with_shard(metadata) { run("shards install --no-color") }
346+
347+
foobar = File.join(application_path, "bin", "foobar")
348+
baz = File.join(application_path, "bin", "baz")
349+
foo = File.join(application_path, "bin", "foo")
350+
351+
assert File.exists?(foobar), "Expected to have installed bin/foobar executable"
352+
assert File.exists?(baz), "Expected to have installed bin/baz executable"
353+
refute File.exists?(foo), "Expected not to have installed bin/foo executable"
354+
end
332355
end

test/integration/update_test.cr

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -216,21 +216,21 @@ class UpdateCommandTest < Minitest::Test
216216
end
217217
end
218218

219-
def test_installs_executables
220-
metadata = {
221-
dependencies: {
222-
binary: {type: "path", path: rel_path(:binary)},
223-
},
224-
}
225-
with_shard(metadata) { run("shards install --no-color") }
226-
227-
create_file "binary", "bin/foo", "echo 'FOO'", perm: 0o755
228-
create_shard "binary", "name: binary\nversion: 0.2.0\nexecutables:\n - foobar\n - baz\n - foo"
229-
230-
with_shard(metadata) { run("shards update --no-color") }
219+
def test_installs_new_executables
220+
metadata = {dependencies: {binary: "0.2.0"}}
221+
lock = {binary: "0.1.0"}
222+
with_shard(metadata, lock) { run("shards update --no-color") }
231223

224+
foobar = File.join(application_path, "bin", "foobar")
225+
baz = File.join(application_path, "bin", "baz")
232226
foo = File.join(application_path, "bin", "foo")
227+
228+
assert File.exists?(foobar), "Expected to have installed bin/foobar executable"
229+
assert File.exists?(baz), "Expected to have installed bin/baz executable"
233230
assert File.exists?(foo), "Expected to have installed bin/foo executable"
231+
232+
assert_equal "OK\n", `#{foobar}`
233+
assert_equal "KO\n", `#{baz}`
234234
assert_equal "FOO\n", `#{foo}`
235235
end
236236

test/integration_helper.cr

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Minitest::Test
2727
end
2828

2929
def setup_repositories
30+
# git dependencies for testing version resolution:
3031
create_git_repository "web", "1.0.0", "1.1.0", "1.1.1", "1.1.2", "1.2.0", "2.0.0", "2.1.0"
3132
create_git_repository "pg", "0.1.0", "0.2.0", "0.2.1", "0.3.0"
3233
create_git_repository "optional", "0.2.0", "0.2.1", "0.2.2"
@@ -44,9 +45,22 @@ class Minitest::Test
4445
create_git_repository "release", "0.2.0", "0.2.1", "0.2.2"
4546
create_git_release "release", "0.3.0", "name: release\nversion: 0.3.0\ncustom_dependencies:\n pg:\n git: #{git_path("optional")}\n"
4647

47-
create_git_repository "empty"
48-
create_git_commit "empty", "initial release"
48+
# git dependencies with prereleases:
49+
create_git_repository "unstable", "0.1.0", "0.2.0", "0.3.0.alpha", "0.3.0.beta"
50+
create_git_repository "preview", "0.1.0", "0.2.0", "0.3.0.a", "0.3.0.b", "0.3.0", "0.4.0.a"
51+
52+
# path dependency:
53+
create_path_repository "foo", "0.1.0"
54+
55+
# dependency with neither a shard.yml and/or version tags:
56+
#create_git_repository "empty"
57+
#create_git_commit "empty", "initial release"
4958

59+
create_git_repository "missing"
60+
create_shard "missing", "name: missing\nversion: 0.1.0\n"
61+
create_git_commit "missing", "initial release"
62+
63+
# dependencies with postinstall scripts:
5064
create_git_repository "post"
5165
create_file "post", "Makefile", "all:\n\ttouch made.txt\n"
5266
create_git_release "post", "0.1.0", "name: post\nversion: 0.1.0\nscripts:\n postinstall: make\n"
@@ -55,17 +69,7 @@ class Minitest::Test
5569
create_file "fails", "Makefile", "all:\n\ttest -n ''\n"
5670
create_git_release "fails", "0.1.0", "name: fails\nversion: 0.1.0\nscripts:\n postinstall: make\n"
5771

58-
create_path_repository "foo", "0.1.0"
59-
60-
create_path_repository "binary"
61-
create_shard "binary", "name: binary\nversion: 0.1.0\nexecutables:\n - foobar\n - baz\n"
62-
create_file "binary", "bin/foobar", "#! /usr/bin/env sh\necho 'OK'", perm: 0o755
63-
create_file "binary", "bin/baz", "#! /usr/bin/env sh\necho 'KO'", perm: 0o755
64-
65-
create_git_repository "unstable", "0.1.0", "0.2.0", "0.3.0.alpha", "0.3.0.beta"
66-
create_git_repository "preview", "0.1.0", "0.2.0", "0.3.0.a", "0.3.0.b", "0.3.0", "0.4.0.a"
67-
68-
# postinstall script with transitive dependency:
72+
# transitive dependencies in postinstall scripts:
6973
create_git_repository "version"
7074
create_file "version", "src/version.cr", %(module Version; STRING = "version @ 0.1.0"; end)
7175
create_git_release "version", "0.1.0"
@@ -82,6 +86,14 @@ scripts:
8286
postinstall: crystal build src/version.cr
8387
YAML
8488

89+
# dependencies with executables:
90+
create_git_repository "binary"
91+
create_file "binary", "bin/foobar", "#! /usr/bin/env sh\necho 'OK'", perm: 0o755
92+
create_file "binary", "bin/baz", "#! /usr/bin/env sh\necho 'KO'", perm: 0o755
93+
create_git_release "binary", "0.1.0", "name: binary\nversion: 0.1.0\nexecutables:\n - foobar\n - baz\n"
94+
create_file "binary", "bin/foo", "echo 'FOO'", perm: 0o755
95+
create_git_release "binary", "0.2.0", "name: binary\nversion: 0.2.0\nexecutables:\n - foobar\n - baz\n - foo"
96+
8597
Minitest::Test.created_repositories!
8698
end
8799

0 commit comments

Comments
 (0)