summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames E. Blair <corvus@inaugust.com>2019-04-24 22:51:40 -0700
committerLauris BH <lauris@nix.lv>2019-04-25 08:51:40 +0300
commitdabee9b1a4347b0003c36f0f2a0548e5fa4002f7 (patch)
tree3145d39be1b48b0d64f195d62dc2787c1b3b37d3
parent0064535ad28f85fb8c84a0237ea02bd432c6a1f6 (diff)
downloadgitea-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.go3
-rw-r--r--routers/repo/http.go19
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
}