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:
		
							parent
							
								
									72e62ac12b
								
							
						
					
					
						commit
						57fa9b0f25
					
				
					 1 changed files with 13 additions and 4 deletions
				
			
		|  | @ -19,6 +19,7 @@ import ( | ||||||
| 	"code.gitea.io/gitea/modules/markup/markdown" | 	"code.gitea.io/gitea/modules/markup/markdown" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	"code.gitea.io/gitea/modules/util" | ||||||
| 
 | 
 | ||||||
| 	"gitea.com/macaron/macaron" | 	"gitea.com/macaron/macaron" | ||||||
| 	"github.com/editorconfig/editorconfig-core-go/v2" | 	"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 { | 		if refName := getRefName(ctx, RepoRefTag); len(refName) > 0 { | ||||||
| 			return refName | 			return refName | ||||||
| 		} | 		} | ||||||
| 		if refName := getRefName(ctx, RepoRefCommit); len(refName) > 0 { | 		// For legacy and API support only full commit sha
 | ||||||
| 			return refName | 		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 { | 		if refName := getRefName(ctx, RepoRefBlob); len(refName) > 0 { | ||||||
| 			return refName | 			return refName | ||||||
|  | @ -686,7 +690,7 @@ func getRefName(ctx *Context, pathType RepoRefType) string { | ||||||
| 		return getRefNameFromPath(ctx, path, ctx.Repo.GitRepo.IsTagExist) | 		return getRefNameFromPath(ctx, path, ctx.Repo.GitRepo.IsTagExist) | ||||||
| 	case RepoRefCommit: | 	case RepoRefCommit: | ||||||
| 		parts := strings.Split(path, "/") | 		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:], "/") | 			ctx.Repo.TreePath = strings.Join(parts[1:], "/") | ||||||
| 			return parts[0] | 			return parts[0] | ||||||
| 		} | 		} | ||||||
|  | @ -778,7 +782,7 @@ func RepoRefByType(refType RepoRefType) macaron.Handler { | ||||||
| 					return | 					return | ||||||
| 				} | 				} | ||||||
| 				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() | 				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.IsViewCommit = true | ||||||
| 				ctx.Repo.CommitID = refName | 				ctx.Repo.CommitID = refName | ||||||
| 
 | 
 | ||||||
|  | @ -787,6 +791,11 @@ func RepoRefByType(refType RepoRefType) macaron.Handler { | ||||||
| 					ctx.NotFound("GetCommit", err) | 					ctx.NotFound("GetCommit", err) | ||||||
| 					return | 					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 { | 			} else { | ||||||
| 				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) | 				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName)) | ||||||
| 				return | 				return | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue