Handle redirects in git clone commands (#6688)

Add support for repo_redirect objects in the git smart http
handler so that when a user clones a repo that has been moved
or renamed, they are redirected to the new location.

This requires that the query string be included in the redirect
as well, so that is added.

Signed-off-by: James E. Blair <jeblair@redhat.com>
This commit is contained in:
James E. Blair 2019-04-24 22:51:40 -07:00 committed by Lauris BH
parent 0064535ad2
commit dabee9b1a4
2 changed files with 20 additions and 2 deletions

View File

@ -223,6 +223,9 @@ func RedirectToRepo(ctx *Context, redirectRepoID int64) {
fmt.Sprintf("%s/%s", repo.MustOwnerName(), repo.Name), fmt.Sprintf("%s/%s", repo.MustOwnerName(), repo.Name),
1, 1,
) )
if ctx.Req.URL.RawQuery != "" {
redirectPath += "?" + ctx.Req.URL.RawQuery
}
ctx.Redirect(redirectPath) ctx.Redirect(redirectPath)
} }

View File

@ -89,9 +89,24 @@ func HTTP(ctx *context.Context) {
reponame = reponame[:len(reponame)-5] reponame = reponame[:len(reponame)-5]
} }
repo, err := models.GetRepositoryByOwnerAndName(username, reponame) owner, err := models.GetUserByName(username)
if err != nil { if err != nil {
ctx.NotFoundOrServerError("GetRepositoryByOwnerAndName", models.IsErrRepoNotExist, err) ctx.NotFoundOrServerError("GetUserByName", models.IsErrUserNotExist, err)
return
}
repo, err := models.GetRepositoryByName(owner.ID, reponame)
if err != nil {
if models.IsErrRepoNotExist(err) {
redirectRepoID, err := models.LookupRepoRedirect(owner.ID, reponame)
if err == nil {
context.RedirectToRepo(ctx, redirectRepoID)
} else {
ctx.NotFoundOrServerError("GetRepositoryByName", models.IsErrRepoRedirectNotExist, err)
}
} else {
ctx.ServerError("GetRepositoryByName", err)
}
return return
} }