diff options
author | James E. Blair <corvus@inaugust.com> | 2019-04-24 22:51:40 -0700 |
---|---|---|
committer | Lauris BH <lauris@nix.lv> | 2019-04-25 08:51:40 +0300 |
commit | dabee9b1a4347b0003c36f0f2a0548e5fa4002f7 (patch) | |
tree | 3145d39be1b48b0d64f195d62dc2787c1b3b37d3 | |
parent | 0064535ad28f85fb8c84a0237ea02bd432c6a1f6 (diff) | |
download | gitea-dabee9b1a4347b0003c36f0f2a0548e5fa4002f7.tar.gz gitea-dabee9b1a4347b0003c36f0f2a0548e5fa4002f7.zip |
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>
-rw-r--r-- | modules/context/repo.go | 3 | ||||
-rw-r--r-- | 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 4670e01564..770296b390 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 9475c25893..2bc50efd83 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 } |