From 0a23079485b8f40bc86f6869a202be8be2727cc6 Mon Sep 17 00:00:00 2001 From: zeripath Date: Wed, 10 Feb 2021 07:37:25 +0000 Subject: [PATCH] Do not assume all 40 char strings are SHA1s (#14624) GetCommit() assumes that all 40 char strings are SHA1s. This leads to an error if you try to do a PR on a branch which is 40 characters long. This PR attempts the SHA first - and if it fails will switch to using rev-parse. Fix #14470 Signed-off-by: Andrew Thornton --- modules/git/repo_commit.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go index f02fdde5a..caf91e59f 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -31,19 +31,23 @@ func (repo *Repository) GetTagCommitID(name string) (string, error) { // ConvertToSHA1 returns a Hash object from a potential ID string func (repo *Repository) ConvertToSHA1(commitID string) (SHA1, error) { - if len(commitID) != 40 { - var err error - actualCommitID, err := NewCommand("rev-parse", "--verify", commitID).RunInDir(repo.Path) - if err != nil { - if strings.Contains(err.Error(), "unknown revision or path") || - strings.Contains(err.Error(), "fatal: Needed a single revision") { - return SHA1{}, ErrNotExist{commitID, ""} - } - return SHA1{}, err + if len(commitID) == 40 { + sha1, err := NewIDFromString(commitID) + if err == nil { + return sha1, nil } - commitID = actualCommitID } - return NewIDFromString(commitID) + + actualCommitID, err := NewCommand("rev-parse", "--verify", commitID).RunInDir(repo.Path) + if err != nil { + if strings.Contains(err.Error(), "unknown revision or path") || + strings.Contains(err.Error(), "fatal: Needed a single revision") { + return SHA1{}, ErrNotExist{commitID, ""} + } + return SHA1{}, err + } + + return NewIDFromString(actualCommitID) } // GetCommit returns commit object of by ID string.