|  | @@ -9,6 +9,7 @@ import (
 | 
	
		
			
				|  |  |  	"path"
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	"github.com/Unknwon/com"
 | 
	
		
			
				|  |  |  	"gopkg.in/macaron.v1"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"github.com/gogits/git-module"
 | 
	
	
		
			
				|  | @@ -84,6 +85,24 @@ func RetrieveBaseRepo(ctx *Context, repo *models.Repository) {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// composeGoGetImport returns go-get-import meta content.
 | 
	
		
			
				|  |  | +func composeGoGetImport(owner, repo string) string {
 | 
	
		
			
				|  |  | +	return path.Join(setting.Domain, setting.AppSubUrl, owner, repo)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// earlyResponseForGoGetMeta responses appropriate go-get meta with status 200
 | 
	
		
			
				|  |  | +// if user does not have actual access to the requested repository,
 | 
	
		
			
				|  |  | +// or the owner or repository does not exist at all.
 | 
	
		
			
				|  |  | +// This is particular a workaround for "go get" command which does not respect
 | 
	
		
			
				|  |  | +// .netrc file.
 | 
	
		
			
				|  |  | +func earlyResponseForGoGetMeta(ctx *Context) {
 | 
	
		
			
				|  |  | +	ctx.PlainText(200, []byte(com.Expand(`<meta name="go-import" content="{GoGetImport} git {CloneLink}">`,
 | 
	
		
			
				|  |  | +		map[string]string{
 | 
	
		
			
				|  |  | +			"GoGetImport": composeGoGetImport(ctx.Params(":username"), ctx.Params(":reponame")),
 | 
	
		
			
				|  |  | +			"CloneLink":   models.ComposeHTTPSCloneURL(ctx.Params(":username"), ctx.Params(":reponame")),
 | 
	
		
			
				|  |  | +		})))
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func RepoAssignment(args ...bool) macaron.Handler {
 | 
	
		
			
				|  |  |  	return func(ctx *Context) {
 | 
	
		
			
				|  |  |  		var (
 | 
	
	
		
			
				|  | @@ -112,6 +131,10 @@ func RepoAssignment(args ...bool) macaron.Handler {
 | 
	
		
			
				|  |  |  			owner, err = models.GetUserByName(userName)
 | 
	
		
			
				|  |  |  			if err != nil {
 | 
	
		
			
				|  |  |  				if models.IsErrUserNotExist(err) {
 | 
	
		
			
				|  |  | +					if ctx.Query("go-get") == "1" {
 | 
	
		
			
				|  |  | +						earlyResponseForGoGetMeta(ctx)
 | 
	
		
			
				|  |  | +						return
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  |  					ctx.Handle(404, "GetUserByName", err)
 | 
	
		
			
				|  |  |  				} else {
 | 
	
		
			
				|  |  |  					ctx.Handle(500, "GetUserByName", err)
 | 
	
	
		
			
				|  | @@ -125,6 +148,10 @@ func RepoAssignment(args ...bool) macaron.Handler {
 | 
	
		
			
				|  |  |  		repo, err := models.GetRepositoryByName(owner.ID, repoName)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  |  			if models.IsErrRepoNotExist(err) {
 | 
	
		
			
				|  |  | +				if ctx.Query("go-get") == "1" {
 | 
	
		
			
				|  |  | +					earlyResponseForGoGetMeta(ctx)
 | 
	
		
			
				|  |  | +					return
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  |  				ctx.Handle(404, "GetRepositoryByName", err)
 | 
	
		
			
				|  |  |  			} else {
 | 
	
		
			
				|  |  |  				ctx.Handle(500, "GetRepositoryByName", err)
 | 
	
	
		
			
				|  | @@ -149,6 +176,10 @@ func RepoAssignment(args ...bool) macaron.Handler {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// Check access.
 | 
	
		
			
				|  |  |  		if ctx.Repo.AccessMode == models.ACCESS_MODE_NONE {
 | 
	
		
			
				|  |  | +			if ctx.Query("go-get") == "1" {
 | 
	
		
			
				|  |  | +				earlyResponseForGoGetMeta(ctx)
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  |  			ctx.Handle(404, "no access right", err)
 | 
	
		
			
				|  |  |  			return
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -269,7 +300,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
 | 
	
		
			
				|  |  |  		ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if ctx.Query("go-get") == "1" {
 | 
	
		
			
				|  |  | -			ctx.Data["GoGetImport"] = path.Join(setting.Domain, setting.AppSubUrl, owner.Name, repo.Name)
 | 
	
		
			
				|  |  | +			ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name)
 | 
	
		
			
				|  |  |  			prefix := setting.AppUrl + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName)
 | 
	
		
			
				|  |  |  			ctx.Data["GoDocDirectory"] = prefix + "{/dir}"
 | 
	
		
			
				|  |  |  			ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}"
 |