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

Side by Side Diff: git_cl.py

Issue 8826015: Add minimal Gerrit support to 'git cl config' and 'git cl upload' (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools/
Patch Set: Created 9 years 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 | no next file » | 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/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 # Copyright (C) 2008 Evan Martin <martine@danga.com> 6 # Copyright (C) 2008 Evan Martin <martine@danga.com>
7 7
8 """A git-command for integrating reviews on Rietveld.""" 8 """A git-command for integrating reviews on Rietveld."""
9 9
10 import logging 10 import logging
(...skipping 29 matching lines...) Expand all
40 import rietveld 40 import rietveld
41 import scm 41 import scm
42 import subprocess2 42 import subprocess2
43 import watchlists 43 import watchlists
44 44
45 45
46 DEFAULT_SERVER = 'http://codereview.appspot.com' 46 DEFAULT_SERVER = 'http://codereview.appspot.com'
47 POSTUPSTREAM_HOOK_PATTERN = '.git/hooks/post-cl-%s' 47 POSTUPSTREAM_HOOK_PATTERN = '.git/hooks/post-cl-%s'
48 DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup' 48 DESCRIPTION_BACKUP_FILE = '~/.git_cl_description_backup'
49 49
50 GERRIT_FETCH_URL = 'http://git.chromium.org'
M-A Ruel 2011/12/07 19:21:28 No, don't hard code them. If you look again, there
51 # Note these are assuming users have set up ~/.ssh/config stanzas
52 # as recommended so that no port numbers are required.
53 GERRIT_PUSH_URL = 'ssh://gerrit.chromium.org'
54 GERRIT_COMMIT_HOOK = 'gerrit.chromium.org:hooks/commit-msg'
55
50 56
51 # Initialized in main() 57 # Initialized in main()
52 settings = None 58 settings = None
53 59
54 60
55 def DieWithError(message): 61 def DieWithError(message):
56 print >> sys.stderr, message 62 print >> sys.stderr, message
57 sys.exit(1) 63 sys.exit(1)
58 64
59 65
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 SetProperty('viewvc-url', 'VIEW_VC', unset_error_ok=True) 730 SetProperty('viewvc-url', 'VIEW_VC', unset_error_ok=True)
725 731
726 if 'PUSH_URL_CONFIG' in keyvals and 'ORIGIN_URL_CONFIG' in keyvals: 732 if 'PUSH_URL_CONFIG' in keyvals and 'ORIGIN_URL_CONFIG' in keyvals:
727 #should be of the form 733 #should be of the form
728 #PUSH_URL_CONFIG: url.ssh://gitrw.chromium.org.pushinsteadof 734 #PUSH_URL_CONFIG: url.ssh://gitrw.chromium.org.pushinsteadof
729 #ORIGIN_URL_CONFIG: http://src.chromium.org/git 735 #ORIGIN_URL_CONFIG: http://src.chromium.org/git
730 RunGit(['config', keyvals['PUSH_URL_CONFIG'], 736 RunGit(['config', keyvals['PUSH_URL_CONFIG'],
731 keyvals['ORIGIN_URL_CONFIG']]) 737 keyvals['ORIGIN_URL_CONFIG']])
732 738
733 739
740 def GerritConfig(options, args):
741 """Set up git config for use with Gerrit."""
742
743 # Install the standard commit-msg hook.
744 RunCommand(['scp', '-p', GERRIT_COMMIT_HOOK,
745 os.path.join('.git', 'hooks', 'commit-msg')])
746
747 # Set the standard URL mapping.
748 RunGit(['config',
749 'url.' + GERRIT_PUSH_URL + '.pushinsteadof', GERRIT_FETCH_URL])
750
751
734 @usage('[repo root containing codereview.settings]') 752 @usage('[repo root containing codereview.settings]')
735 def CMDconfig(parser, args): 753 def CMDconfig(parser, args):
736 """edit configuration for this tree""" 754 """edit configuration for this tree"""
755 parser.add_option('-g', '--gerrit', action='store_true',
M-A Ruel 2011/12/07 19:21:28 It should be automatic, no need for flags.
756 help='Configure for Gerrit rather than Rietveld')
757 options, args = parser.parse_args(args)
737 758
738 _, args = parser.parse_args(args) 759 if options.gerrit:
760 return GerritConfig(options, args)
761
739 if len(args) == 0: 762 if len(args) == 0:
740 GetCodereviewSettingsInteractively() 763 GetCodereviewSettingsInteractively()
741 return 0 764 return 0
742 765
743 url = args[0] 766 url = args[0]
744 if not url.endswith('codereview.settings'): 767 if not url.endswith('codereview.settings'):
745 url = os.path.join(url, 'codereview.settings') 768 url = os.path.join(url, 'codereview.settings')
746 769
747 # Load code review settings and download hooks (if available). 770 # Load code review settings and download hooks (if available).
748 LoadCodereviewSettingsFromFile(urllib2.urlopen(url)) 771 LoadCodereviewSettingsFromFile(urllib2.urlopen(url))
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 else: 879 else:
857 # Default to diffing against the "upstream" branch. 880 # Default to diffing against the "upstream" branch.
858 base_branch = cl.GetUpstreamBranch() 881 base_branch = cl.GetUpstreamBranch()
859 882
860 cl.RunHook(committing=not options.upload, upstream_branch=base_branch, 883 cl.RunHook(committing=not options.upload, upstream_branch=base_branch,
861 may_prompt=False, verbose=options.verbose, 884 may_prompt=False, verbose=options.verbose,
862 author=None) 885 author=None)
863 return 0 886 return 0
864 887
865 888
889 def GerritUpload(options, args):
890 # We assume the remote called "origin" is the one we want.
891 # It's probably not worthwhile to support different workflows.
M-A Ruel 2011/12/07 19:21:28 It is.
892 remote = 'origin'
893
894 branch = 'master'
895 if options.for_branch is not None:
896 branch = options.for_branch
897
898 receive_options = []
899
900 if options.cc is not None:
901 receive_options += ['--cc=' + email for email in
902 options.cc.split(',')]
903 if options.reviewers is not None:
904 receive_options += ['--reviewer=' + email for email in
905 options.reviewers.split(',')]
906
907 git_command = ['push']
908 if receive_options:
909 git_command.append('--receive-pack=git receive-pack ' +
910 ' '.join(receive_options))
911 git_command += [remote, 'HEAD:refs/for/' + branch]
912
913 RunGit(git_command)
914 return 0
915
916
866 @usage('[args to "git diff"]') 917 @usage('[args to "git diff"]')
867 def CMDupload(parser, args): 918 def CMDupload(parser, args):
868 """upload the current changelist to codereview""" 919 """upload the current changelist to codereview"""
869 parser.add_option('--bypass-hooks', action='store_true', dest='bypass_hooks', 920 parser.add_option('--bypass-hooks', action='store_true', dest='bypass_hooks',
870 help='bypass upload presubmit hook') 921 help='bypass upload presubmit hook')
871 parser.add_option('-f', action='store_true', dest='force', 922 parser.add_option('-f', action='store_true', dest='force',
872 help="force yes to questions (don't prompt)") 923 help="force yes to questions (don't prompt)")
873 parser.add_option('-m', dest='message', help='message for patch') 924 parser.add_option('-m', dest='message', help='message for patch')
874 parser.add_option('-r', '--reviewers', 925 parser.add_option('-r', '--reviewers',
875 help='reviewer email addresses') 926 help='reviewer email addresses')
876 parser.add_option('--cc', 927 parser.add_option('--cc',
877 help='cc email addresses') 928 help='cc email addresses')
878 parser.add_option('--send-mail', action='store_true', 929 parser.add_option('--send-mail', action='store_true',
879 help='send email to reviewer immediately') 930 help='send email to reviewer immediately')
880 parser.add_option("--emulate_svn_auto_props", action="store_true", 931 parser.add_option("--emulate_svn_auto_props", action="store_true",
881 dest="emulate_svn_auto_props", 932 dest="emulate_svn_auto_props",
882 help="Emulate Subversion's auto properties feature.") 933 help="Emulate Subversion's auto properties feature.")
883 parser.add_option("--desc_from_logs", action="store_true", 934 parser.add_option("--desc_from_logs", action="store_true",
884 dest="from_logs", 935 dest="from_logs",
885 help="""Squashes git commit logs into change description and 936 help="""Squashes git commit logs into change description and
886 uses message as subject""") 937 uses message as subject""")
887 parser.add_option('-c', '--use-commit-queue', action='store_true', 938 parser.add_option('-c', '--use-commit-queue', action='store_true',
888 help='tell the commit queue to commit this patchset') 939 help='tell the commit queue to commit this patchset')
940 parser.add_option('-g', '--gerrit', action='store_true',
941 help='Send change to Gerrit rather than Rietveld')
942 parser.add_option('-b', '--for-branch',
943 help='Gerrit branch to send change to')
889 (options, args) = parser.parse_args(args) 944 (options, args) = parser.parse_args(args)
890 945
946 # TODO(mcgrathr): Perhaps look at some git-config variable stored
947 # by GerritConfig to default to gerrit mode?
948 if options.gerrit and (options.bypass_hooks or
949 options.message or
950 options.from_logs or
951 options.use_commit_queue):
952 print 'The --gerrit (-g) option is incompatible with most other options.'
953 return 1
954
891 # Make sure index is up-to-date before running diff-index. 955 # Make sure index is up-to-date before running diff-index.
892 RunGit(['update-index', '--refresh', '-q'], error_ok=True) 956 RunGit(['update-index', '--refresh', '-q'], error_ok=True)
893 if RunGit(['diff-index', 'HEAD']): 957 if RunGit(['diff-index', 'HEAD']):
894 print 'Cannot upload with a dirty tree. You must commit locally first.' 958 print 'Cannot upload with a dirty tree. You must commit locally first.'
895 return 1 959 return 1
896 960
961 if options.gerrit:
962 return GerritUpload(options, args)
963
897 cl = Changelist() 964 cl = Changelist()
898 if args: 965 if args:
899 base_branch = args[0] 966 base_branch = args[0]
900 else: 967 else:
901 # Default to diffing against the "upstream" branch. 968 # Default to diffing against the "upstream" branch.
902 base_branch = cl.GetUpstreamBranch() 969 base_branch = cl.GetUpstreamBranch()
903 args = [base_branch + "..."] 970 args = [base_branch + "..."]
904 971
905 if not options.bypass_hooks and not options.force: 972 if not options.bypass_hooks and not options.force:
906 hook_results = cl.RunHook(committing=False, upstream_branch=base_branch, 973 hook_results = cl.RunHook(committing=False, upstream_branch=base_branch,
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) 1483 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e)))
1417 1484
1418 # Not a known command. Default to help. 1485 # Not a known command. Default to help.
1419 GenUsage(parser, 'help') 1486 GenUsage(parser, 'help')
1420 return CMDhelp(parser, argv) 1487 return CMDhelp(parser, argv)
1421 1488
1422 1489
1423 if __name__ == '__main__': 1490 if __name__ == '__main__':
1424 fix_encoding.fix_encoding() 1491 fix_encoding.fix_encoding()
1425 sys.exit(main(sys.argv[1:])) 1492 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698