2021-05-10 00:50:06 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-05-10 00:50:06 +03:00
2021-06-09 02:33:54 +03:00
package web
2021-05-10 00:50:06 +03:00
import (
2022-04-01 11:47:50 +03:00
"fmt"
"html"
2021-05-10 00:50:06 +03:00
"net/http"
"net/url"
"path"
"strings"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-05-10 00:50:06 +03:00
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/util"
)
func goGet ( ctx * context . Context ) {
2021-08-11 18:08:52 +03:00
if ctx . Req . Method != "GET" || len ( ctx . Req . URL . RawQuery ) < 8 || ctx . FormString ( "go-get" ) != "1" {
2021-05-10 00:50:06 +03:00
return
}
parts := strings . SplitN ( ctx . Req . URL . EscapedPath ( ) , "/" , 4 )
if len ( parts ) < 3 {
return
}
ownerName := parts [ 1 ]
repoName := parts [ 2 ]
// 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.
trimmedRepoName := strings . TrimSuffix ( repoName , ".git" )
if ownerName == "" || trimmedRepoName == "" {
_ , _ = ctx . Write ( [ ] byte ( ` < ! doctype html >
< html >
< body >
invalid import path
< / body >
< / html >
` ) )
2022-03-23 07:54:07 +03:00
ctx . Status ( http . StatusBadRequest )
2021-05-10 00:50:06 +03:00
return
}
branchName := setting . Repository . DefaultBranch
2022-12-03 05:48:26 +03:00
repo , err := repo_model . GetRepositoryByOwnerAndName ( ctx , ownerName , repoName )
2021-05-10 00:50:06 +03:00
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 "
}
2022-04-01 11:47:50 +03:00
goGetImport := context . ComposeGoGetImport ( ownerName , trimmedRepoName )
2023-05-12 12:44:37 +03:00
var cloneURL string
if setting . Repository . GoGetCloneURLProtocol == "ssh" {
cloneURL = repo_model . ComposeSSHCloneURL ( ownerName , repoName )
} else {
cloneURL = repo_model . ComposeHTTPSCloneURL ( ownerName , repoName )
}
goImportContent := fmt . Sprintf ( "%s git %s" , goGetImport , cloneURL /*CloneLink*/ )
2022-04-01 11:47:50 +03:00
goSourceContent := fmt . Sprintf ( "%s _ %s %s" , goGetImport , prefix + "{/dir}" /*GoDocDirectory*/ , prefix + "{/dir}/{file}#L{line}" /*GoDocFile*/ )
goGetCli := fmt . Sprintf ( "go get %s%s" , insecure , goGetImport )
res := fmt . Sprintf ( ` < ! doctype html >
2021-05-10 00:50:06 +03:00
< html >
< head >
2022-04-01 11:47:50 +03:00
< meta name = "go-import" content = "%s" >
< meta name = "go-source" content = "%s" >
2021-05-10 00:50:06 +03:00
< / head >
< body >
2022-04-01 11:47:50 +03:00
% s
2021-05-10 00:50:06 +03:00
< / body >
2022-04-01 11:47:50 +03:00
< / html > ` , html . EscapeString ( goImportContent ) , html . EscapeString ( goSourceContent ) , html . EscapeString ( goGetCli ) )
ctx . RespHeader ( ) . Set ( "Content-Type" , "text/html" )
_ , _ = ctx . Write ( [ ] byte ( res ) )
2021-05-10 00:50:06 +03:00
}