Skip to content

Commit

Permalink
Refactor Resolver#revision_info to use GitHeadRef
Browse files Browse the repository at this point in the history
  • Loading branch information
straight-shoota committed May 7, 2020
1 parent 7c4060c commit 2e693fe
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 15 deletions.
8 changes: 4 additions & 4 deletions spec/ext/shards/git_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ describe Shards::GitResolver do
create_git_tag("repo1", "v0.2", "bar\"foo")
resolver = Shards::GitResolver.find_resolver("git", "repo1", git_url("repo1")).as(Shards::GitResolver)

revision_info = resolver.revision_info("0.1")
revision_info = resolver.revision_info(Shards::Version.new("0.1"))
revision_info.commit.message.should eq "foo\nbar"
revision_info.tag.not_nil!.message.should eq "bar\nfoo"

revision_info = resolver.revision_info("0.2")
revision_info = resolver.revision_info(Shards::Version.new("0.2"))
revision_info.commit.message.should eq "foo\"bar"
revision_info.tag.not_nil!.message.should eq "bar\"foo"
ensure
Expand All @@ -40,7 +40,7 @@ describe Shards::GitResolver do
create_git_commit("repo2", "foo bar")
resolver = Shards::GitResolver.find_resolver("git", "repo2", git_url("repo2")).as(Shards::GitResolver)

revision_info = resolver.revision_info("HEAD")
revision_info = resolver.revision_info(Shards::GitHeadRef.new)
revision_info.commit.message.should eq "foo bar"
revision_info.tag.should be_nil
ensure
Expand All @@ -56,7 +56,7 @@ describe Shards::GitResolver do
end
resolver = Shards::GitResolver.find_resolver("git", "repo3", git_url("repo3")).as(Shards::GitResolver)

revision_info = resolver.revision_info("0.2")
revision_info = resolver.revision_info(Shards::Version.new("0.2"))
revision_info.commit.message.should eq "foo bar"
revision_info.tag.not_nil!.message.should eq "bar foo"
ensure
Expand Down
4 changes: 4 additions & 0 deletions spec/support/mock_resolver.cr
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ class MockResolver
@versions[version].revision_info
end

def revision_info(version : Shards::GitHeadRef)
revision_info(Shards::Version.new("HEAD"))
end

def latest_version_for_ref(ref)
raise Repo::Resolver::RepoUnresolvableError.new unless resolvable?
@versions.keys.last?
Expand Down
28 changes: 19 additions & 9 deletions src/ext/shards/resolvers/git.cr
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@ require "../../../release"
require "../../git/repo"

class Shards::GitResolver
def revision_info(version)
def revision_info(version : Shards::GitHeadRef | Shards::Version)
update_local_cache

repo = Git::Repo.open(local_path)

if version == "HEAD"
ref = repo.ref("HEAD")
else
ref = repo.ref?("refs/tags/v#{version}")

# Try without `v` prefix
ref ||= repo.ref?("refs/tags/#{version}")
case version
when GitHeadRef
ref = repo.ref(version.to_git_ref)
when Version
ref = git_ref(version)
ref = repo.ref?(ref.to_git_ref)

raise "Can't find tag #{version}" unless ref
else
raise "unreachable"
end

# Resolve symbolic references
Expand Down Expand Up @@ -51,13 +52,22 @@ class Shards::GitResolver
end

def read_spec!(version)
if version.value == "HEAD"
version = latest_version_for_ref(nil)
raise Shards::Error.new("No version for HEAD") unless version
end

read_spec(version)
end

def fetch_file(version, path)
# Tree#path is not yet implemented in libgit2.cr, falling back to CLI
update_local_cache
ref = git_ref(version)
if version.value == "HEAD"
ref = Shards::GitHeadRef.new
else
ref = git_ref(version)
end

if file_exists?(ref, path)
capture("git show #{ref.to_git_ref}:#{path}")
Expand Down
9 changes: 7 additions & 2 deletions src/repo/resolver.cr
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,13 @@ class Repo
@resolver.fetch_file(Shards::Version.new(version), path)
end

def revision_info(version : String? = nil) : Release::RevisionInfo
@resolver.revision_info(Shards::Version.new(version))
def revision_info(version : String = "HEAD") : Release::RevisionInfo
if version == "HEAD"
version = Shards::GitHeadRef.new
else
version = Shards::Version.new(version)
end
@resolver.revision_info(version)
end

def latest_version_for_ref(ref) : String?
Expand Down

0 comments on commit 2e693fe

Please sign in to comment.