mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Support shortened commit SHAs in URLs (#13686)
* Support shortened commit SHAs in URLs and API * Add test case for short sha * Fix format * Revert API support * Add canonical link headers for short commit ID URLs
This commit is contained in:
		@@ -19,6 +19,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/markup/markdown"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
 | 
			
		||||
	"gitea.com/macaron/macaron"
 | 
			
		||||
	"github.com/editorconfig/editorconfig-core-go/v2"
 | 
			
		||||
@@ -672,8 +673,11 @@ func getRefName(ctx *Context, pathType RepoRefType) string {
 | 
			
		||||
		if refName := getRefName(ctx, RepoRefTag); len(refName) > 0 {
 | 
			
		||||
			return refName
 | 
			
		||||
		}
 | 
			
		||||
		if refName := getRefName(ctx, RepoRefCommit); len(refName) > 0 {
 | 
			
		||||
			return refName
 | 
			
		||||
		// For legacy and API support only full commit sha
 | 
			
		||||
		parts := strings.Split(path, "/")
 | 
			
		||||
		if len(parts) > 0 && len(parts[0]) == 40 {
 | 
			
		||||
			ctx.Repo.TreePath = strings.Join(parts[1:], "/")
 | 
			
		||||
			return parts[0]
 | 
			
		||||
		}
 | 
			
		||||
		if refName := getRefName(ctx, RepoRefBlob); len(refName) > 0 {
 | 
			
		||||
			return refName
 | 
			
		||||
@@ -686,7 +690,7 @@ func getRefName(ctx *Context, pathType RepoRefType) string {
 | 
			
		||||
		return getRefNameFromPath(ctx, path, ctx.Repo.GitRepo.IsTagExist)
 | 
			
		||||
	case RepoRefCommit:
 | 
			
		||||
		parts := strings.Split(path, "/")
 | 
			
		||||
		if len(parts) > 0 && len(parts[0]) == 40 {
 | 
			
		||||
		if len(parts) > 0 && len(parts[0]) >= 7 && len(parts[0]) <= 40 {
 | 
			
		||||
			ctx.Repo.TreePath = strings.Join(parts[1:], "/")
 | 
			
		||||
			return parts[0]
 | 
			
		||||
		}
 | 
			
		||||
@@ -778,7 +782,7 @@ func RepoRefByType(refType RepoRefType) macaron.Handler {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
 | 
			
		||||
			} else if len(refName) == 40 {
 | 
			
		||||
			} else if len(refName) >= 7 && len(refName) <= 40 {
 | 
			
		||||
				ctx.Repo.IsViewCommit = true
 | 
			
		||||
				ctx.Repo.CommitID = refName
 | 
			
		||||
 | 
			
		||||
@@ -787,6 +791,11 @@ func RepoRefByType(refType RepoRefType) macaron.Handler {
 | 
			
		||||
					ctx.NotFound("GetCommit", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				// If short commit ID add canonical link header
 | 
			
		||||
				if len(refName) < 40 {
 | 
			
		||||
					ctx.Header().Set("Link", fmt.Sprintf("<%s>; rel=\"canonical\"",
 | 
			
		||||
						util.URLJoin(setting.AppURL, strings.Replace(ctx.Req.URL.RequestURI(), refName, ctx.Repo.Commit.ID.String(), 1))))
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
			
		||||
				return
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user