From 6158899606b45f808f610d65f6c51a0f04c14ff0 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Wed, 24 Apr 2019 22:51:40 -0700 Subject: [PATCH] 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 --- modules/context/repo.go | 3 +++ routers/repo/http.go | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/modules/context/repo.go b/modules/context/repo.go index 4670e0156..770296b39 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -223,6 +223,9 @@ func RedirectToRepo(ctx *Context, redirectRepoID int64) { fmt.Sprintf("%s/%s", repo.MustOwnerName(), repo.Name), 1, ) + if ctx.Req.URL.RawQuery != "" { + redirectPath += "?" + ctx.Req.URL.RawQuery + } ctx.Redirect(redirectPath) } diff --git a/routers/repo/http.go b/routers/repo/http.go index 9475c2589..2bc50efd8 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -89,9 +89,24 @@ func HTTP(ctx *context.Context) { reponame = reponame[:len(reponame)-5] } - repo, err := models.GetRepositoryByOwnerAndName(username, reponame) + owner, err := models.GetUserByName(username) 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 }