aboutsummaryrefslogtreecommitdiffstats
path: root/routers
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2021-02-22 00:51:15 +0800
committerGitHub <noreply@github.com>2021-02-22 00:51:15 +0800
commitbd9361384ab23ec3c00d36f89b94ca171cbd49bc (patch)
tree97f4a2d9a84a76359fa69833f989c18c14cba6ec /routers
parentb56c19d8197d0e706a5274d9e2ddec51e65abd61 (diff)
downloadgitea-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.go66
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() {