diff options
author | zeripath <art27@cantab.net> | 2019-05-11 16:29:17 +0100 |
---|---|---|
committer | techknowlogick <hello@techknowlogick.com> | 2019-05-11 11:29:17 -0400 |
commit | ce8de3533485eed0c56059d6334a5031a73eed67 (patch) | |
tree | 2f8e5c84441467269a98fb450ddfaca236cfc2e7 /models/pull.go | |
parent | 34eee25bd42d19287e3e33afd169cc979ab61f37 (diff) | |
download | gitea-ce8de3533485eed0c56059d6334a5031a73eed67.tar.gz gitea-ce8de3533485eed0c56059d6334a5031a73eed67.zip |
Remove local clones & make hooks run on merge/edit/upload (#6672)
* Add options to git.Clone to make it more capable
* Begin the process of removing the local copy and tidy up
* Remove Wiki LocalCopy Checkouts
* Remove the last LocalRepo helpers
* Remove WithTemporaryFile
* Enable push-hooks for these routes
* Ensure tests cope with hooks
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Remove Repository.LocalCopyPath()
* Move temporary repo to use the standard temporary path
* Fix the tests
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Remove LocalWikiPath
* Fix missing remove
Signed-off-by: Andrew Thornton <art27@cantab.net>
* Use AppURL for Oauth user link (#6894)
* Use AppURL for Oauth user link
Fix #6843
* Update oauth.go
* Update oauth.go
* internal/ssh: ignore env command totally (#6825)
* ssh: ignore env command totally
* Remove commented code
Needed fix described in issue #6889
* Escape the commit message on issues update and title in telegram hook (#6901)
* update sdk to latest (#6903)
* improve description of branch protection (fix #6886) (#6906)
The branch protection description text were not quite accurate.
* Fix logging documentation (#6904)
* ENABLE_MACARON_REDIRECT should be REDIRECT_MACARON_LOG
* Allow DISABLE_ROUTER_LOG to be set in the [log] section
* [skip ci] Updated translations via Crowdin
* Move sdk structs to modules/structs (#6905)
* move sdk structs to moduels/structs
* fix tests
* fix fmt
* fix swagger
* fix vendor
Diffstat (limited to 'models/pull.go')
-rw-r--r-- | models/pull.go | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/models/pull.go b/models/pull.go index 7382cbd126..6f37145d9b 100644 --- a/models/pull.go +++ b/models/pull.go @@ -418,22 +418,21 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false) }() - headRepoPath := RepoPath(pr.HeadUserName, pr.HeadRepo.Name) - // Clone base repo. - tmpBasePath := path.Join(LocalCopyPath(), "merge-"+com.ToStr(time.Now().Nanosecond())+".git") - - if err := os.MkdirAll(path.Dir(tmpBasePath), os.ModePerm); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", tmpBasePath, err) + tmpBasePath, err := CreateTemporaryPath("merge") + if err != nil { + return err } + defer RemoveTemporaryPath(tmpBasePath) - defer os.RemoveAll(tmpBasePath) + headRepoPath := RepoPath(pr.HeadUserName, pr.HeadRepo.Name) - var stderr string - if _, stderr, err = process.GetManager().ExecTimeout(5*time.Minute, - fmt.Sprintf("PullRequest.Merge (git clone): %s", tmpBasePath), - "git", "clone", "-s", "--no-checkout", "-b", pr.BaseBranch, baseGitRepo.Path, tmpBasePath); err != nil { - return fmt.Errorf("git clone: %s", stderr) + if err := git.Clone(baseGitRepo.Path, tmpBasePath, git.CloneRepoOptions{ + Shared: true, + NoCheckout: true, + Branch: pr.BaseBranch, + }); err != nil { + return fmt.Errorf("git clone: %v", err) } remoteRepoName := "head_repo" @@ -456,14 +455,14 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle if err := addCacheRepo(tmpBasePath, headRepoPath); err != nil { return fmt.Errorf("addCacheRepo [%s -> %s]: %v", headRepoPath, tmpBasePath, err) } - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git remote add): %s", tmpBasePath), "git", "remote", "add", remoteRepoName, headRepoPath); err != nil { return fmt.Errorf("git remote add [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) } // Fetch head branch - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git fetch): %s", tmpBasePath), "git", "fetch", remoteRepoName); err != nil { return fmt.Errorf("git fetch [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) @@ -487,14 +486,14 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle return fmt.Errorf("Writing sparse-checkout file to %s: %v", sparseCheckoutListPath, err) } - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git config): %s", tmpBasePath), "git", "config", "--local", "core.sparseCheckout", "true"); err != nil { return fmt.Errorf("git config [core.sparsecheckout -> true]: %v", stderr) } // Read base branch index - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git read-tree): %s", tmpBasePath), "git", "read-tree", "HEAD"); err != nil { return fmt.Errorf("git read-tree HEAD: %s", stderr) @@ -503,14 +502,14 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle // Merge commits. switch mergeStyle { case MergeStyleMerge: - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git merge --no-ff --no-commit): %s", tmpBasePath), "git", "merge", "--no-ff", "--no-commit", trackingBranch); err != nil { return fmt.Errorf("git merge --no-ff --no-commit [%s]: %v - %s", tmpBasePath, err, stderr) } sig := doer.NewGitSig() - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath), "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), "-m", message); err != nil { @@ -518,50 +517,50 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle } case MergeStyleRebase: // Checkout head branch - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), "git", "checkout", "-b", stagingBranch, trackingBranch); err != nil { return fmt.Errorf("git checkout: %s", stderr) } // Rebase before merging - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git rebase): %s", tmpBasePath), "git", "rebase", "-q", pr.BaseBranch); err != nil { return fmt.Errorf("git rebase [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) } // Checkout base branch again - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), "git", "checkout", pr.BaseBranch); err != nil { return fmt.Errorf("git checkout: %s", stderr) } // Merge fast forward - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git rebase): %s", tmpBasePath), "git", "merge", "--ff-only", "-q", stagingBranch); err != nil { return fmt.Errorf("git merge --ff-only [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) } case MergeStyleRebaseMerge: // Checkout head branch - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), "git", "checkout", "-b", stagingBranch, trackingBranch); err != nil { return fmt.Errorf("git checkout: %s", stderr) } // Rebase before merging - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git rebase): %s", tmpBasePath), "git", "rebase", "-q", pr.BaseBranch); err != nil { return fmt.Errorf("git rebase [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) } // Checkout base branch again - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git checkout): %s", tmpBasePath), "git", "checkout", pr.BaseBranch); err != nil { return fmt.Errorf("git checkout: %s", stderr) } // Prepare merge with commit - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git merge): %s", tmpBasePath), "git", "merge", "--no-ff", "--no-commit", "-q", stagingBranch); err != nil { return fmt.Errorf("git merge --no-ff [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) @@ -569,7 +568,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle // Set custom message and author and create merge commit sig := doer.NewGitSig() - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git commit): %s", tmpBasePath), "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), "-m", message); err != nil { @@ -578,13 +577,13 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle case MergeStyleSquash: // Merge with squash - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git squash): %s", tmpBasePath), "git", "merge", "-q", "--squash", trackingBranch); err != nil { return fmt.Errorf("git merge --squash [%s -> %s]: %s", headRepoPath, tmpBasePath, stderr) } sig := pr.Issue.Poster.NewGitSig() - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDir(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git squash): %s", tmpBasePath), "git", "commit", fmt.Sprintf("--author='%s <%s>'", sig.Name, sig.Email), "-m", message); err != nil { @@ -594,10 +593,12 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle return ErrInvalidMergeStyle{pr.BaseRepo.ID, mergeStyle} } + env := PushingEnvironment(doer, pr.BaseRepo) + // Push back to upstream. - if _, stderr, err = process.GetManager().ExecDir(-1, tmpBasePath, + if _, stderr, err := process.GetManager().ExecDirEnv(-1, tmpBasePath, fmt.Sprintf("PullRequest.Merge (git push): %s", tmpBasePath), - "git", "push", baseGitRepo.Path, pr.BaseBranch); err != nil { + env, "git", "push", baseGitRepo.Path, pr.BaseBranch); err != nil { return fmt.Errorf("git push: %s", stderr) } |