aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2024-12-12 16:10:09 +0800
committerGitHub <noreply@github.com>2024-12-12 08:10:09 +0000
commit22bf2ca6ba1b89bcb88217541f31900dd606391e (patch)
tree7e2e1d97ccc0eb44e6c8fb16244f2ba1ef317e00 /modules
parent01b1896bf5eacfd7f4f64d9ebb0ad165e3e60a5c (diff)
downloadgitea-22bf2ca6ba1b89bcb88217541f31900dd606391e.tar.gz
gitea-22bf2ca6ba1b89bcb88217541f31900dd606391e.zip
Make API "compare" accept commit IDs (#32801)
Diffstat (limited to 'modules')
-rw-r--r--modules/git/commit.go14
-rw-r--r--modules/git/ref.go4
-rw-r--r--modules/git/repo_ref.go28
-rw-r--r--modules/globallock/globallock_test.go2
4 files changed, 44 insertions, 4 deletions
diff --git a/modules/git/commit.go b/modules/git/commit.go
index 010b56948e..0ed268e346 100644
--- a/modules/git/commit.go
+++ b/modules/git/commit.go
@@ -474,3 +474,17 @@ func (c *Commit) GetRepositoryDefaultPublicGPGKey(forceUpdate bool) (*GPGSetting
}
return c.repo.GetDefaultPublicGPGKey(forceUpdate)
}
+
+func IsStringLikelyCommitID(objFmt ObjectFormat, s string, minLength ...int) bool {
+ minLen := util.OptionalArg(minLength, objFmt.FullLength())
+ if len(s) < minLen || len(s) > objFmt.FullLength() {
+ return false
+ }
+ for _, c := range s {
+ isHex := (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f')
+ if !isHex {
+ return false
+ }
+ }
+ return true
+}
diff --git a/modules/git/ref.go b/modules/git/ref.go
index 2db630e2ea..aab4c5d77d 100644
--- a/modules/git/ref.go
+++ b/modules/git/ref.go
@@ -142,7 +142,6 @@ func (ref RefName) RemoteName() string {
// ShortName returns the short name of the reference name
func (ref RefName) ShortName() string {
- refName := string(ref)
if ref.IsBranch() {
return ref.BranchName()
}
@@ -158,8 +157,7 @@ func (ref RefName) ShortName() string {
if ref.IsFor() {
return ref.ForBranchName()
}
-
- return refName
+ return string(ref) // usually it is a commit ID
}
// RefGroup returns the group type of the reference
diff --git a/modules/git/repo_ref.go b/modules/git/repo_ref.go
index 8eaa17cb04..850ec65502 100644
--- a/modules/git/repo_ref.go
+++ b/modules/git/repo_ref.go
@@ -61,3 +61,31 @@ func parseTags(refs []string) []string {
}
return results
}
+
+// UnstableGuessRefByShortName does the best guess to see whether a "short name" provided by user is a branch, tag or commit.
+// It could guess wrongly if the input is already ambiguous. For example:
+// * "refs/heads/the-name" vs "refs/heads/refs/heads/the-name"
+// * "refs/tags/1234567890" vs commit "1234567890"
+// In most cases, it SHOULD AVOID using this function, unless there is an irresistible reason (eg: make API friendly to end users)
+// If the function is used, the caller SHOULD CHECK the ref type carefully.
+func (repo *Repository) UnstableGuessRefByShortName(shortName string) RefName {
+ if repo.IsBranchExist(shortName) {
+ return RefNameFromBranch(shortName)
+ }
+ if repo.IsTagExist(shortName) {
+ return RefNameFromTag(shortName)
+ }
+ if strings.HasPrefix(shortName, "refs/") {
+ if repo.IsReferenceExist(shortName) {
+ return RefName(shortName)
+ }
+ }
+ commit, err := repo.GetCommit(shortName)
+ if err == nil {
+ commitIDString := commit.ID.String()
+ if strings.HasPrefix(commitIDString, shortName) {
+ return RefName(commitIDString)
+ }
+ }
+ return ""
+}
diff --git a/modules/globallock/globallock_test.go b/modules/globallock/globallock_test.go
index 88a555c86f..f14c7d656b 100644
--- a/modules/globallock/globallock_test.go
+++ b/modules/globallock/globallock_test.go
@@ -64,7 +64,7 @@ func TestLockAndDo(t *testing.T) {
}
func testLockAndDo(t *testing.T) {
- const concurrency = 1000
+ const concurrency = 50
ctx := context.Background()
count := 0