Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Side by Side Diff: git_cl/git_cl.py

Issue 5972005: Add support for post-dcommit hooks (Closed) Base URL: http://git.chromium.org/git/git-cl.git@master
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | git_cl/test/post-dcommit-hook-test.sh » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # git-cl -- a git-command for integrating reviews on Rietveld 2 # git-cl -- a git-command for integrating reviews on Rietveld
3 # Copyright (C) 2008 Evan Martin <martine@danga.com> 3 # Copyright (C) 2008 Evan Martin <martine@danga.com>
4 4
5 import errno 5 import errno
6 import logging 6 import logging
7 import optparse 7 import optparse
8 import os 8 import os
9 import re 9 import re
10 import subprocess 10 import subprocess
(...skipping 11 matching lines...) Expand all
22 try: 22 try:
23 # Add the parent directory in case it's a depot_tools checkout. 23 # Add the parent directory in case it's a depot_tools checkout.
24 depot_tools_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 24 depot_tools_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
25 sys.path.append(depot_tools_path) 25 sys.path.append(depot_tools_path)
26 import breakpad 26 import breakpad
27 except ImportError: 27 except ImportError:
28 pass 28 pass
29 29
30 DEFAULT_SERVER = 'http://codereview.appspot.com' 30 DEFAULT_SERVER = 'http://codereview.appspot.com'
31 PREDCOMMIT_HOOK = '.git/hooks/pre-cl-dcommit' 31 PREDCOMMIT_HOOK = '.git/hooks/pre-cl-dcommit'
32 POSTUPSTREAM_HOOK_PATTERN = '.git/hooks/post-cl-%s'
32 PREUPLOAD_HOOK = '.git/hooks/pre-cl-upload' 33 PREUPLOAD_HOOK = '.git/hooks/pre-cl-upload'
33 DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup' 34 DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup'
34 35
35 def DieWithError(message): 36 def DieWithError(message):
36 print >>sys.stderr, message 37 print >>sys.stderr, message
37 sys.exit(1) 38 sys.exit(1)
38 39
39 40
40 def Popen(cmd, **kwargs): 41 def Popen(cmd, **kwargs):
41 """Wrapper for subprocess.Popen() that logs and watch for cygwin issues""" 42 """Wrapper for subprocess.Popen() that logs and watch for cygwin issues"""
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 # We might be in a directory that's present in this branch but not in the 967 # We might be in a directory that's present in this branch but not in the
967 # trunk. Move up to the top of the tree so that git commands that expect a 968 # trunk. Move up to the top of the tree so that git commands that expect a
968 # valid CWD won't fail after we check out the merge branch. 969 # valid CWD won't fail after we check out the merge branch.
969 rel_base_path = RunGit(['rev-parse', '--show-cdup']).strip() 970 rel_base_path = RunGit(['rev-parse', '--show-cdup']).strip()
970 if rel_base_path: 971 if rel_base_path:
971 os.chdir(rel_base_path) 972 os.chdir(rel_base_path)
972 973
973 # Stuff our change into the merge branch. 974 # Stuff our change into the merge branch.
974 # We wrap in a try...finally block so if anything goes wrong, 975 # We wrap in a try...finally block so if anything goes wrong,
975 # we clean up the branches. 976 # we clean up the branches.
977 retcode = -1
976 try: 978 try:
977 RunGit(['checkout', '-q', '-b', MERGE_BRANCH, base_branch]) 979 RunGit(['checkout', '-q', '-b', MERGE_BRANCH, base_branch])
978 RunGit(['merge', '--squash', cl.GetBranchRef()]) 980 RunGit(['merge', '--squash', cl.GetBranchRef()])
979 if options.contributor: 981 if options.contributor:
980 RunGit(['commit', '--author', options.contributor, '-m', description]) 982 RunGit(['commit', '--author', options.contributor, '-m', description])
981 else: 983 else:
982 RunGit(['commit', '-m', description]) 984 RunGit(['commit', '-m', description])
983 if cmd == 'push': 985 if cmd == 'push':
984 # push the merge branch. 986 # push the merge branch.
985 remote, branch = cl.FetchUpstreamTuple() 987 remote, branch = cl.FetchUpstreamTuple()
986 retcode, output = RunGitWithCode( 988 retcode, output = RunGitWithCode(
987 ['push', '--porcelain', remote, 'HEAD:%s' % branch]) 989 ['push', '--porcelain', remote, 'HEAD:%s' % branch])
988 logging.debug(output) 990 logging.debug(output)
989 else: 991 else:
990 # dcommit the merge branch. 992 # dcommit the merge branch.
991 output = RunGit(['svn', 'dcommit', '--no-rebase']) 993 retcode, output = RunGitWithCode(['svn', 'dcommit', '--no-rebase'])
992 finally: 994 finally:
993 # And then swap back to the original branch and clean up. 995 # And then swap back to the original branch and clean up.
994 RunGit(['checkout', '-q', cl.GetBranch()]) 996 RunGit(['checkout', '-q', cl.GetBranch()])
995 RunGit(['branch', '-D', MERGE_BRANCH]) 997 RunGit(['branch', '-D', MERGE_BRANCH])
996 998
997 if cl.GetIssue(): 999 if cl.GetIssue():
998 if cmd == 'dcommit' and 'Committed r' in output: 1000 if cmd == 'dcommit' and 'Committed r' in output:
999 revision = re.match('.*?\nCommitted r(\\d+)', output, re.DOTALL).group(1) 1001 revision = re.match('.*?\nCommitted r(\\d+)', output, re.DOTALL).group(1)
1000 elif cmd == 'push' and retcode == 0: 1002 elif cmd == 'push' and retcode == 0:
1001 revision = output.splitlines()[1].split('\t')[2].split('..')[1] 1003 revision = output.splitlines()[1].split('\t')[2].split('..')[1]
1002 else: 1004 else:
1003 return 1 1005 return 1
1004 viewvc_url = settings.GetViewVCUrl() 1006 viewvc_url = settings.GetViewVCUrl()
1005 if viewvc_url and revision: 1007 if viewvc_url and revision:
1006 cl.description += ('\n\nCommitted: ' + viewvc_url + revision) 1008 cl.description += ('\n\nCommitted: ' + viewvc_url + revision)
1007 print ('Closing issue ' 1009 print ('Closing issue '
1008 '(you may be prompted for your codereview password)...') 1010 '(you may be prompted for your codereview password)...')
1009 cl.CloseIssue() 1011 cl.CloseIssue()
1010 cl.SetIssue(0) 1012 cl.SetIssue(0)
1013
1014 if retcode == 0:
1015 hook = POSTUPSTREAM_HOOK_PATTERN % cmd
1016 RunHook(hook, upstream_branch=base_branch, error_ok=True)
1017
1011 return 0 1018 return 0
1012 1019
1013 1020
1014 @usage('[upstream branch to apply against]') 1021 @usage('[upstream branch to apply against]')
1015 def CMDdcommit(parser, args): 1022 def CMDdcommit(parser, args):
1016 """commit the current changelist via git-svn""" 1023 """commit the current changelist via git-svn"""
1017 if not settings.GetIsGitSvn(): 1024 if not settings.GetIsGitSvn():
1018 print('This doesn\'t appear to be an SVN repository.') 1025 print('This doesn\'t appear to be an SVN repository.')
1019 print('Are you sure you didn\'t mean \'git cl push\'?') 1026 print('Are you sure you didn\'t mean \'git cl push\'?')
1020 raw_input('[Press enter to dcommit or ctrl-C to quit]') 1027 raw_input('[Press enter to dcommit or ctrl-C to quit]')
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' 1254 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith '
1248 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) 1255 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)))
1249 1256
1250 # Not a known command. Default to help. 1257 # Not a known command. Default to help.
1251 GenUsage(parser, 'help') 1258 GenUsage(parser, 'help')
1252 return CMDhelp(parser, argv) 1259 return CMDhelp(parser, argv)
1253 1260
1254 1261
1255 if __name__ == '__main__': 1262 if __name__ == '__main__':
1256 sys.exit(main(sys.argv[1:])) 1263 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | git_cl/test/post-dcommit-hook-test.sh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698