Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit b30763c

Browse files
authored
Merge pull request #706 from antham/resolve-commit-sha1
Resolve full commit sha
2 parents 46a247f + 0c7d7c6 commit b30763c

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

repository.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,8 @@ func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, err
10211021
case revision.Ref:
10221022
revisionRef := item.(revision.Ref)
10231023
var ref *plumbing.Reference
1024+
var hashCommit, refCommit *object.Commit
1025+
var rErr, hErr error
10241026

10251027
for _, rule := range append([]string{"%s"}, plumbing.RefRevParseRules...) {
10261028
ref, err = storer.ResolveReference(r.Storer, plumbing.ReferenceName(fmt.Sprintf(rule, revisionRef)))
@@ -1030,14 +1032,27 @@ func (r *Repository) ResolveRevision(rev plumbing.Revision) (*plumbing.Hash, err
10301032
}
10311033
}
10321034

1033-
if ref == nil {
1034-
return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound
1035+
if ref != nil {
1036+
refCommit, rErr = r.CommitObject(ref.Hash())
1037+
} else {
1038+
rErr = plumbing.ErrReferenceNotFound
10351039
}
10361040

1037-
commit, err = r.CommitObject(ref.Hash())
1041+
isHash := plumbing.NewHash(string(revisionRef)).String() == string(revisionRef)
10381042

1039-
if err != nil {
1040-
return &plumbing.ZeroHash, err
1043+
if isHash {
1044+
hashCommit, hErr = r.CommitObject(plumbing.NewHash(string(revisionRef)))
1045+
}
1046+
1047+
switch {
1048+
case rErr == nil && !isHash:
1049+
commit = refCommit
1050+
case rErr != nil && isHash && hErr == nil:
1051+
commit = hashCommit
1052+
case rErr == nil && isHash && hErr == nil:
1053+
return &plumbing.ZeroHash, fmt.Errorf(`refname "%s" is ambiguous`, revisionRef)
1054+
default:
1055+
return &plumbing.ZeroHash, plumbing.ErrReferenceNotFound
10411056
}
10421057
case revision.CaretPath:
10431058
depth := item.(revision.CaretPath).Depth

repository_test.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,7 @@ func (s *RepositorySuite) TestResolveRevision(c *C) {
14941494
"branch~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
14951495
"v1.0.0~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
14961496
"master~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
1497+
"918c48b83bd081e863dbe1b80f8998f058cd8294": "918c48b83bd081e863dbe1b80f8998f058cd8294",
14971498
}
14981499

14991500
for rev, hash := range datas {
@@ -1513,10 +1514,19 @@ func (s *RepositorySuite) TestResolveRevisionWithErrors(c *C) {
15131514
err := r.clone(context.Background(), &CloneOptions{URL: url})
15141515
c.Assert(err, IsNil)
15151516

1517+
headRef, err := r.Head()
1518+
c.Assert(err, IsNil)
1519+
1520+
ref := plumbing.NewHashReference("refs/heads/918c48b83bd081e863dbe1b80f8998f058cd8294", headRef.Hash())
1521+
err = r.Storer.SetReference(ref)
1522+
c.Assert(err, IsNil)
1523+
15161524
datas := map[string]string{
1517-
"efs/heads/master~": "reference not found",
1518-
"HEAD^3": `Revision invalid : "3" found must be 0, 1 or 2 after "^"`,
1519-
"HEAD^{/whatever}": `No commit message match regexp : "whatever"`,
1525+
"efs/heads/master~": "reference not found",
1526+
"HEAD^3": `Revision invalid : "3" found must be 0, 1 or 2 after "^"`,
1527+
"HEAD^{/whatever}": `No commit message match regexp : "whatever"`,
1528+
"4e1243bd22c66e76c2ba9eddc1f91394e57f9f83": "reference not found",
1529+
"918c48b83bd081e863dbe1b80f8998f058cd8294": `refname "918c48b83bd081e863dbe1b80f8998f058cd8294" is ambiguous`,
15201530
}
15211531

15221532
for rev, rerr := range datas {

0 commit comments

Comments
 (0)