Advertisement
Guest User

Untitled

a guest
May 10th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "flag"
  5. "fmt"
  6. "log"
  7. "regexp"
  8. "sort"
  9. "strconv"
  10. "strings"
  11.  
  12. "github.com/google/go-github/github"
  13. "github.com/mcuadros/go-version"
  14. )
  15.  
  16. type branchSort []github.Branch
  17.  
  18. func (a branchSort) Len() int { return len(a) }
  19. func (a branchSort) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  20. func (a branchSort) Less(i, j int) bool {
  21. left := (*a[i].Name)[8:]
  22. right := (*a[j].Name)[8:]
  23.  
  24. return version.Compare(left, right, "<")
  25. }
  26.  
  27. var (
  28. username = flag.String("user", "", "Username to authenticate with")
  29. password = flag.String("pass", "", "password or token to authenticate with")
  30.  
  31. owner = flag.String("owner", "capdig", "repo owner")
  32. repo = flag.String("repo", "myon", "repo")
  33. )
  34.  
  35. type issuePrAssoc struct {
  36. Issue *github.Issue
  37. PullRequests map[int]*github.PullRequest
  38. }
  39.  
  40. type issueMap map[int]issuePrAssoc
  41.  
  42. func init() {
  43. flag.Parse()
  44. }
  45.  
  46. func main() {
  47. tp := github.BasicAuthTransport{
  48. Username: *username,
  49. Password: *password,
  50. }
  51.  
  52. client := github.NewClient(tp.Client())
  53.  
  54. bq, err := getReleaseBranches(client, *owner, *repo)
  55. if err != nil {
  56. log.Fatal(err)
  57. }
  58.  
  59. start := bq[len(bq)-2]
  60. end := bq[len(bq)-1]
  61.  
  62. mergeCommits, err := getMergeCommitsBetween(
  63. client, *owner, *repo,
  64. end.Commit,
  65. start.Commit)
  66. if err != nil {
  67. log.Fatal(err)
  68. }
  69.  
  70. issues, err := getIssueMap(
  71. client, *owner, *repo,
  72. mergeCommits)
  73. if err != nil {
  74. log.Fatal(err)
  75. }
  76.  
  77. // output
  78.  
  79. fmt.Printf("%sā€¦%s\n", *start.Name, *end.Name)
  80.  
  81. if v, ok := issues[-1]; ok {
  82. fmt.Printf("No Issue:\n")
  83.  
  84. for _, pr := range v.PullRequests {
  85. fmt.Printf("\t#%d: %s\n", *pr.Number, *pr.Title)
  86. }
  87. }
  88.  
  89. for issueNumber, prNumbers := range issues {
  90. if issueNumber == -1 {
  91. continue
  92. } else {
  93. fmt.Printf("Issue: #%d: %s\n", issueNumber, *prNumbers.Issue.Title)
  94. }
  95.  
  96. for _, pr := range prNumbers.PullRequests {
  97. fmt.Printf("\t#%d: %s\n", *pr.Number, *pr.Title)
  98. }
  99. }
  100.  
  101. }
  102.  
  103. func getIssueMap(client *github.Client, owner, repo string, commits []github.RepositoryCommit) (issueMap, error) {
  104. issues := make(issueMap)
  105. for _, mc := range commits {
  106. m := *mc.Commit.Message
  107. r := regexp.MustCompile(`Merge pull request #(\d+)`)
  108. matches := r.FindAllStringSubmatch(m, -1)
  109. prNumber, err := strconv.Atoi(matches[0][1])
  110. if err != nil {
  111. return nil, err
  112. }
  113.  
  114. pullreq, _, err := client.PullRequests.Get(owner, repo, prNumber)
  115. if err != nil {
  116. return nil, err
  117. }
  118.  
  119. r2 := regexp.MustCompile(`connects? \\?#(\d+)`)
  120.  
  121. matches = r2.FindAllStringSubmatch(*pullreq.Body, -1)
  122. for _, match := range matches {
  123. issueNum, err := strconv.Atoi(match[1])
  124. if err != nil {
  125. return nil, err
  126. }
  127.  
  128. if _, ok := issues[issueNum]; !ok {
  129. issue, _, err := client.Issues.Get(owner, repo, issueNum)
  130. if err != nil {
  131. return nil, err
  132. }
  133.  
  134. issues[issueNum] = issuePrAssoc{
  135. Issue: issue,
  136. PullRequests: make(map[int]*github.PullRequest),
  137. }
  138. }
  139.  
  140. issues[issueNum].PullRequests[prNumber] = pullreq
  141. }
  142.  
  143. if len(matches) == 0 {
  144. if _, ok := issues[-1]; !ok {
  145. issues[-1] = issuePrAssoc{
  146. PullRequests: make(map[int]*github.PullRequest),
  147. }
  148. }
  149.  
  150. issues[-1].PullRequests[prNumber] = pullreq
  151. }
  152. }
  153.  
  154. return issues, nil
  155. }
  156.  
  157. func getMergeCommitsBetween(client *github.Client, owner, repo string, startc, endc *github.Commit) ([]github.RepositoryCommit, error) {
  158. end := *endc.SHA
  159. start := *startc.SHA
  160.  
  161. mergeCommits := []github.RepositoryCommit{}
  162.  
  163. page := 1
  164. outer:
  165. for {
  166. commits, resp, err := client.Repositories.ListCommits(owner, repo, &github.CommitsListOptions{
  167. SHA: start,
  168. ListOptions: github.ListOptions{
  169. PerPage: 100,
  170. Page: page,
  171. },
  172. })
  173.  
  174. if err != nil {
  175. return nil, err
  176. }
  177.  
  178. for _, cc := range commits {
  179. if cc.Commit != nil && cc.Commit.Message != nil && strings.Contains(*cc.Commit.Message, "Merge pull request #") {
  180. mergeCommits = append(mergeCommits, cc)
  181. }
  182. if *cc.SHA == end {
  183. break outer
  184. }
  185. }
  186.  
  187. if resp.NextPage == 0 {
  188. break
  189. }
  190.  
  191. page = resp.NextPage
  192. }
  193.  
  194. return mergeCommits, nil
  195. }
  196.  
  197. func getReleaseBranches(client *github.Client, owner, repo string) (branchSort, error) {
  198. brs := []github.Branch{}
  199.  
  200. page := 1
  201. for {
  202. branch, resp, err := client.Repositories.ListBranches(owner, repo, &github.ListOptions{PerPage: 100, Page: page})
  203. if err != nil {
  204. return nil, err
  205. }
  206.  
  207. brs = append(brs, branch...)
  208.  
  209. if resp.NextPage == 0 {
  210. break
  211. }
  212.  
  213. page = resp.NextPage
  214. }
  215.  
  216. bq := branchSort{}
  217. for _, br := range brs {
  218. if strings.HasPrefix(*br.Name, "release/") {
  219. bq = append(bq, br)
  220. }
  221. }
  222.  
  223. sort.Sort(bq)
  224.  
  225. return bq, nil
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement