pull_request.go 1.7 KB

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