##// END OF EJS Templates
fix mpr...
Matthias BUSSONNIER -
Show More
@@ -1,127 +1,117 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
2 # -*- coding: utf-8 -*-
3 """
3 """
4 Usage:
4 Usage:
5 python git-mpr.py -m 1657
5 python git-mpr.py -m 1657
6 """
6 """
7 from __future__ import print_function
7 from __future__ import print_function
8
8
9 import argparse
9 import argparse
10 from subprocess import check_call, CalledProcessError
10 from subprocess import check_call, CalledProcessError
11
11
12 import gh_api
12 import gh_api
13
13
14 ipy_repository = 'git://github.com/ipython/ipython.git'
14 ipy_repository = 'git://github.com/ipython/ipython.git'
15 gh_project = "ipython/ipython"
15 gh_project = "ipython/ipython"
16 not_merged = {}
16 not_merged = {}
17
17
18 def merge_branch(repo, branch ):
18 def merge_branch(repo, branch ):
19 """try to merge the givent branch into the current one
19 """try to merge the givent branch into the current one
20
20
21 If something does not goes smoothly, merge is aborted
21 If something does not goes smoothly, merge is aborted
22
22
23 Returns True if merge sucessfull, False otherwise
23 Returns True if merge sucessfull, False otherwise
24 """
24 """
25 # Delete the branch first
25 # Delete the branch first
26 try :
26 try :
27 check_call(['git', 'pull', '--no-edit', repo, branch])
27 check_call(['git', 'pull', '--no-edit', repo, branch])
28 except CalledProcessError :
28 except CalledProcessError :
29 check_call(['git', 'merge', '--abort'])
29 check_call(['git', 'merge', '--abort'])
30 return False
30 return False
31 return True
31 return True
32
32
33
33
34 def merge_pr(num, github_api=3):
34 def merge_pr(num):
35 """ try to merge the branch of PR `num` into current branch
35 """ try to merge the branch of PR `num` into current branch
36
37 github_api : use github api v2 (to bypass https and issues with proxy) to find the
38 remote branch that should be merged by it's number
39 """
36 """
40 # Get Github authorisation first, so that the user is prompted straight away
37 # Get Github authorisation first, so that the user is prompted straight away
41 # if their login is needed.
38 # if their login is needed.
42
39
43 pr = gh_api.get_pull_request(gh_project, num, github_api)
40 pr = gh_api.get_pull_request(gh_project, num)
44 if github_api == 2:
41 repo = pr['head']['repo']['clone_url']
45 repo = pr['head']['repository']['url']
46 elif github_api == 3 :
47 repo = pr['head']['repo']['clone_url']
48
42
49
43
50 branch = pr['head']['ref']
44 branch = pr['head']['ref']
51 mergeable = merge_branch(repo=repo,
45 mergeable = merge_branch(repo=repo,
52 branch=branch,
46 branch=branch,
53 )
47 )
54 if not mergeable :
48 if not mergeable :
55 cmd = "git pull "+repo+" "+branch
49 cmd = "git pull "+repo+" "+branch
56 not_merged[str(num)] = cmd
50 not_merged[str(num)] = cmd
57 print("==============================================================================")
51 print("==============================================================================")
58 print("Something went wrong merging this branch, you can try it manually by runngin :")
52 print("Something went wrong merging this branch, you can try it manually by runngin :")
59 print(cmd)
53 print(cmd)
60 print("==============================================================================")
54 print("==============================================================================")
61
55
62
56
63 def main(*args):
57 def main(*args):
64 parser = argparse.ArgumentParser(
58 parser = argparse.ArgumentParser(
65 description="""
59 description="""
66 Merge (one|many) github pull request by their number.\
60 Merge (one|many) github pull request by their number.\
67
61
68 If pull request can't be merge as is, cancel merge,
62 If pull request can't be merge as is, cancel merge,
69 and continue to the next if any.
63 and continue to the next if any.
70 """
64 """
71 )
65 )
72 parser.add_argument('-v2', '--githubapiv2', action='store_const', const=2)
66 parser.add_argument('-v2', '--githubapiv2', action='store_const', const=2)
73
67
74 grp = parser.add_mutually_exclusive_group()
68 grp = parser.add_mutually_exclusive_group()
75 grp.add_argument(
69 grp.add_argument(
76 '-l',
70 '-l',
77 '--list',
71 '--list',
78 action='store_const',
72 action='store_const',
79 const=True,
73 const=True,
80 help='list PR, their number and their mergeability')
74 help='list PR, their number and their mergeability')
81 grp.add_argument('-a',
75 grp.add_argument('-a',
82 '--merge-all',
76 '--merge-all',
83 action='store_const',
77 action='store_const',
84 const=True ,
78 const=True ,
85 help='try to merge as many PR as possible, one by one')
79 help='try to merge as many PR as possible, one by one')
86 grp.add_argument('-m',
80 grp.add_argument('-m',
87 '--merge',
81 '--merge',
88 type=int,
82 type=int,
89 help="The pull request numbers",
83 help="The pull request numbers",
90 nargs='*',
84 nargs='*',
91 metavar='pr-number')
85 metavar='pr-number')
92 args = parser.parse_args()
86 args = parser.parse_args()
93 if args.githubapiv2 == 2 :
94 github_api = 2
95 else :
96 github_api = 3
97
87
98 if(args.list):
88 if(args.list):
99 pr_list = gh_api.get_pulls_list(gh_project, github_api)
89 pr_list = gh_api.get_pulls_list(gh_project)
100 for pr in pr_list :
90 for pr in pr_list :
101 mergeable = gh_api.get_pull_request(gh_project, pr['number'], github_api=github_api)['mergeable']
91 mergeable = gh_api.get_pull_request(gh_project, pr['number'])['mergeable']
102
92
103 ismgb = u"√" if mergeable else " "
93 ismgb = u"√" if mergeable else " "
104 print(u"* #{number} [{ismgb}]: {title}".format(
94 print(u"* #{number} [{ismgb}]: {title}".format(
105 number=pr['number'],
95 number=pr['number'],
106 title=pr['title'],
96 title=pr['title'],
107 ismgb=ismgb))
97 ismgb=ismgb))
108
98
109 if(args.merge_all):
99 if(args.merge_all):
110 pr_list = gh_api.get_pulls_list(gh_project)
100 pr_list = gh_api.get_pulls_list(gh_project)
111 for pr in pr_list :
101 for pr in pr_list :
112 merge_pr(pr['number'])
102 merge_pr(pr['number'])
113
103
114
104
115 elif args.merge:
105 elif args.merge:
116 for num in args.merge :
106 for num in args.merge :
117 merge_pr(num, github_api=github_api)
107 merge_pr(num)
118
108
119 if not_merged :
109 if not_merged :
120 print('*************************************************************************************')
110 print('*************************************************************************************')
121 print('the following branch have not been merged automatically, considere doing it by hand :')
111 print('the following branch have not been merged automatically, considere doing it by hand :')
122 for num, cmd in not_merged.items() :
112 for num, cmd in not_merged.items() :
123 print( "PR {num}: {cmd}".format(num=num, cmd=cmd))
113 print( "PR {num}: {cmd}".format(num=num, cmd=cmd))
124 print('*************************************************************************************')
114 print('*************************************************************************************')
125
115
126 if __name__ == '__main__':
116 if __name__ == '__main__':
127 main()
117 main()
General Comments 0
You need to be logged in to leave comments. Login now