1
0

pull_request.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package gitutil
  2. import (
  3. "strconv"
  4. "time"
  5. "github.com/cockroachdb/errors"
  6. "github.com/gogs/git-module"
  7. log "unknwon.dev/clog/v2"
  8. )
  9. // PullRequestMeta contains metadata for a pull request.
  10. type PullRequestMeta struct {
  11. // The merge base of the pull request.
  12. MergeBase string
  13. // The commits that are requested to be merged.
  14. Commits []*git.Commit
  15. // The number of files changed.
  16. NumFiles int
  17. }
  18. func (module) PullRequestMeta(headPath, basePath, headBranch, baseBranch string) (*PullRequestMeta, error) {
  19. tmpRemoteBranch := baseBranch
  20. // We need to create a temporary remote when the pull request is sent from a forked repository.
  21. if headPath != basePath {
  22. tmpRemote := strconv.FormatInt(time.Now().UnixNano(), 10)
  23. err := Module.RemoteAdd(headPath, tmpRemote, basePath, git.RemoteAddOptions{Fetch: true})
  24. if err != nil {
  25. return nil, errors.Newf("add remote: %v", err)
  26. }
  27. defer func() {
  28. err := Module.RemoteRemove(headPath, tmpRemote)
  29. if err != nil {
  30. log.Error("Failed to remove remote %q [path: %s]: %v", tmpRemote, headPath, err)
  31. return
  32. }
  33. }()
  34. tmpRemoteBranch = "remotes/" + tmpRemote + "/" + baseBranch
  35. }
  36. mergeBase, err := Module.MergeBase(headPath, tmpRemoteBranch, headBranch)
  37. if err != nil {
  38. return nil, errors.Wrap(err, "get merge base")
  39. }
  40. commits, err := Module.Log(headPath, mergeBase+"..."+headBranch)
  41. if err != nil {
  42. return nil, errors.Wrap(err, "get commits")
  43. }
  44. // Count number of changed files
  45. names, err := Module.DiffNameOnly(headPath, tmpRemoteBranch, headBranch, git.DiffNameOnlyOptions{NeedsMergeBase: true})
  46. if err != nil {
  47. return nil, errors.Wrap(err, "get changed files")
  48. }
  49. return &PullRequestMeta{
  50. MergeBase: mergeBase,
  51. Commits: commits,
  52. NumFiles: len(names),
  53. }, nil
  54. }