diff --git a/commit.go b/commit.go index 299a2381b..4e91d3c29 100644 --- a/commit.go +++ b/commit.go @@ -274,3 +274,19 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) { } return nil, nil } + +// GetFullCommitID returns full length (40) of commit ID by given short SHA in a repository. +func GetFullCommitID(repoPath, shortID string) (string, error) { + if len(shortID) >= 40 { + return shortID, nil + } + + commitID, err := NewCommand("rev-parse", shortID).RunInDir(repoPath) + if err != nil { + if strings.Contains(err.Error(), "exit status 128") { + return "", ErrNotExist{shortID, ""} + } + return "", err + } + return strings.TrimSpace(commitID), nil +} diff --git a/commit_test.go b/commit_test.go index 121ba9c64..5b0cfca3a 100644 --- a/commit_test.go +++ b/commit_test.go @@ -14,3 +14,17 @@ func TestCommitsCount(t *testing.T) { commitsCount, _ := CommitsCount(".", "d86a90f801dbe279db095437a8c7ea42c60e8d98") assert.Equal(t, int64(3), commitsCount) } + +func TestGetFullCommitID(t *testing.T) { + id, err := GetFullCommitID(".", "d86a90f8") + assert.NoError(t, err) + assert.Equal(t, "d86a90f801dbe279db095437a8c7ea42c60e8d98", id) +} + +func TestGetFullCommitIDError(t *testing.T) { + id, err := GetFullCommitID(".", "unknown") + assert.Empty(t, id) + if assert.Error(t, err) { + assert.EqualError(t, err, "object does not exist [id: unknown, rel_path: ]") + } +}