diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/hook.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/cmd/hook.go b/cmd/hook.go index 02eb30a13b..70849f5142 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -8,6 +8,7 @@ import ( "bufio" "bytes" "fmt" + "net/url" "os" "path/filepath" "strconv" @@ -174,6 +175,7 @@ func runHookPostReceive(c *cli.Context) error { hookSetup("hooks/post-receive.log") // the environment setted on serv command + repoID, _ := strconv.ParseInt(os.Getenv(models.ProtectedBranchRepoID), 10, 64) repoUser := os.Getenv(models.EnvRepoUsername) isWiki := (os.Getenv(models.EnvRepoIsWiki) == "true") repoName := os.Getenv(models.EnvRepoName) @@ -211,6 +213,47 @@ func runHookPostReceive(c *cli.Context) error { }); err != nil { log.GitLogger.Error(2, "Update: %v", err) } + + if strings.HasPrefix(refFullName, git.BranchPrefix) { + branch := strings.TrimPrefix(refFullName, git.BranchPrefix) + repo, pullRequestAllowed, err := private.GetRepository(repoID) + if err != nil { + log.GitLogger.Error(2, "get repo: %v", err) + break + } + if !pullRequestAllowed { + break + } + + baseRepo := repo + if repo.IsFork { + baseRepo = repo.BaseRepo + } + + if !repo.IsFork && branch == baseRepo.DefaultBranch { + break + } + + pr, err := private.ActivePullRequest(baseRepo.ID, repo.ID, baseRepo.DefaultBranch, branch) + if err != nil { + log.GitLogger.Error(2, "get active pr: %v", err) + break + } + + fmt.Fprintln(os.Stderr, "") + if pr == nil { + if repo.IsFork { + branch = fmt.Sprintf("%s:%s", repo.OwnerName, branch) + } + fmt.Fprintf(os.Stderr, "Create a new pull request for '%s':\n", branch) + fmt.Fprintf(os.Stderr, " %s/compare/%s...%s\n", baseRepo.HTMLURL(), url.QueryEscape(baseRepo.DefaultBranch), url.QueryEscape(branch)) + } else { + fmt.Fprint(os.Stderr, "Visit the existing pull request:\n") + fmt.Fprintf(os.Stderr, " %s/pulls/%d\n", baseRepo.HTMLURL(), pr.Index) + } + fmt.Fprintln(os.Stderr, "") + } + } return nil |