aboutsummaryrefslogtreecommitdiff
path: root/internal/context/go_get.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/context/go_get.go')
-rw-r--r--internal/context/go_get.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/context/go_get.go b/internal/context/go_get.go
new file mode 100644
index 00000000..2851b5db
--- /dev/null
+++ b/internal/context/go_get.go
@@ -0,0 +1,62 @@
+package context
+
+import (
+ "net/http"
+ "path"
+ "strings"
+
+ "github.com/unknwon/com"
+ "gopkg.in/macaron.v1"
+
+ "gogs.io/gogs/internal/conf"
+ "gogs.io/gogs/internal/db"
+)
+
+// ServeGoGet does quick responses for appropriate go-get meta with status OK
+// regardless of whether the user has access to the repository, or the repository
+// does exist at all. This is particular a workaround for "go get" command which
+// does not respect .netrc file.
+func ServeGoGet() macaron.Handler {
+ return func(c *macaron.Context) {
+ if c.Query("go-get") != "1" {
+ return
+ }
+
+ ownerName := c.Params(":username")
+ repoName := c.Params(":reponame")
+ branchName := "master"
+
+ owner, err := db.Users.GetByUsername(ownerName)
+ if err == nil {
+ repo, err := db.Repos.GetByName(owner.ID, repoName)
+ if err == nil && repo.DefaultBranch != "" {
+ branchName = repo.DefaultBranch
+ }
+ }
+
+ prefix := conf.Server.ExternalURL + path.Join(ownerName, repoName, "src", branchName)
+ insecureFlag := ""
+ if !strings.HasPrefix(conf.Server.ExternalURL, "https://") {
+ insecureFlag = "--insecure "
+ }
+ c.PlainText(http.StatusOK, []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 {InsecureFlag}{GoGetImport}
+ </body>
+</html>
+`,
+ map[string]string{
+ "GoGetImport": path.Join(conf.Server.URL.Host, conf.Server.Subpath, ownerName, repoName),
+ "CloneLink": db.ComposeHTTPSCloneURL(ownerName, repoName),
+ "GoDocDirectory": prefix + "{/dir}",
+ "GoDocFile": prefix + "{/dir}/{file}#L{line}",
+ "InsecureFlag": insecureFlag,
+ },
+ )))
+ }
+}