@ -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