diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2021-02-22 00:51:15 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-22 00:51:15 +0800 |
commit | bd9361384ab23ec3c00d36f89b94ca171cbd49bc (patch) | |
tree | 97f4a2d9a84a76359fa69833f989c18c14cba6ec /routers | |
parent | b56c19d8197d0e706a5274d9e2ddec51e65abd61 (diff) | |
download | gitea-bd9361384ab23ec3c00d36f89b94ca171cbd49bc.tar.gz gitea-bd9361384ab23ec3c00d36f89b94ca171cbd49bc.zip |
Fix go get (#14758)
* Fix go get
* Fix default branch
Co-authored-by: 6543 <6543@obermui.de>
Diffstat (limited to 'routers')
-rw-r--r-- | routers/routes/web.go | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/routers/routes/web.go b/routers/routes/web.go index dd43663e35..9a1945ce01 100644 --- a/routers/routes/web.go +++ b/routers/routes/web.go @@ -8,6 +8,7 @@ import ( "encoding/gob" "fmt" "net/http" + "net/url" "os" "path" "strings" @@ -23,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/storage" "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers" @@ -47,6 +49,7 @@ import ( "github.com/go-chi/chi/middleware" "github.com/prometheus/client_golang/prometheus" "github.com/tstranex/u2f" + "github.com/unknwon/com" ) const ( @@ -216,6 +219,67 @@ func WebRoutes() *web.Route { return r } +func goGet(ctx *context.Context) { + if ctx.Query("go-get") != "1" { + return + } + + // Quick responses appropriate go-get meta with status 200 + // regardless of if user have access to the repository, + // or the repository does not exist at all. + // This is particular a workaround for "go get" command which does not respect + // .netrc file. + + ownerName := ctx.Params(":username") + repoName := ctx.Params(":reponame") + trimmedRepoName := strings.TrimSuffix(repoName, ".git") + + if ownerName == "" || trimmedRepoName == "" { + _, _ = ctx.Write([]byte(`<!doctype html> +<html> + <body> + invalid import path + </body> +</html> +`)) + ctx.Status(400) + return + } + branchName := setting.Repository.DefaultBranch + + repo, err := models.GetRepositoryByOwnerAndName(ownerName, repoName) + if err == nil && len(repo.DefaultBranch) > 0 { + branchName = repo.DefaultBranch + } + prefix := setting.AppURL + path.Join(url.PathEscape(ownerName), url.PathEscape(repoName), "src", "branch", util.PathEscapeSegments(branchName)) + + appURL, _ := url.Parse(setting.AppURL) + + insecure := "" + if appURL.Scheme == string(setting.HTTP) { + insecure = "--insecure " + } + ctx.Header().Set("Content-Type", "text/html") + ctx.Status(http.StatusOK) + _, _ = ctx.Write([]byte(com.Expand(`<!doctype html> +<html> + <head> + <meta name="go-import" content="{GoGetImport} git {CloneLink}"> + <meta name="go-source" content="{GoGetImport} _ {GoDocDirectory} {GoDocFile}"> + </head> + <body> + go get {Insecure}{GoGetImport} + </body> +</html> +`, map[string]string{ + "GoGetImport": context.ComposeGoGetImport(ownerName, trimmedRepoName), + "CloneLink": models.ComposeHTTPSCloneURL(ownerName, repoName), + "GoDocDirectory": prefix + "{/dir}", + "GoDocFile": prefix + "{/dir}/{file}#L{line}", + "Insecure": insecure, + }))) +} + // RegisterRoutes register routes func RegisterRoutes(m *web.Route) { reqSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: true}) @@ -1004,7 +1068,7 @@ func RegisterRoutes(m *web.Route) { m.Group("/{username}", func() { m.Group("/{reponame}", func() { m.Get("", repo.SetEditorconfigIfExists, repo.Home) - }, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes()) + }, goGet, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes()) m.Group("/{reponame}", func() { m.Group("/info/lfs", func() { |