| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2009 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 # Wrapper script around Rietveld's upload.py that groups files into | 6 # Wrapper script around Rietveld's upload.py that groups files into |
| 7 # changelists. | 7 # changelists. |
| 8 | 8 |
| 9 import getpass | 9 import getpass |
| 10 import os | 10 import os |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 return result | 238 return result |
| 239 | 239 |
| 240 | 240 |
| 241 def WriteFile(filename, contents): | 241 def WriteFile(filename, contents): |
| 242 """Overwrites the file with the given contents.""" | 242 """Overwrites the file with the given contents.""" |
| 243 file = open(filename, 'w') | 243 file = open(filename, 'w') |
| 244 file.write(contents) | 244 file.write(contents) |
| 245 file.close() | 245 file.close() |
| 246 | 246 |
| 247 | 247 |
| 248 def FilterFlag(args, flag): |
| 249 """Returns True if the flag is present in args list. |
| 250 |
| 251 The flag is removed from args if present. |
| 252 """ |
| 253 if flag in args: |
| 254 args.remove(flag) |
| 255 return True |
| 256 return False |
| 257 |
| 258 |
| 248 class ChangeInfo(object): | 259 class ChangeInfo(object): |
| 249 """Holds information about a changelist. | 260 """Holds information about a changelist. |
| 250 | 261 |
| 251 name: change name. | 262 name: change name. |
| 252 issue: the Rietveld issue number or 0 if it hasn't been uploaded yet. | 263 issue: the Rietveld issue number or 0 if it hasn't been uploaded yet. |
| 253 patchset: the Rietveld latest patchset number or 0. | 264 patchset: the Rietveld latest patchset number or 0. |
| 254 description: the description. | 265 description: the description. |
| 255 files: a list of 2 tuple containing (status, filename) of changed files, | 266 files: a list of 2 tuple containing (status, filename) of changed files, |
| 256 with paths being relative to the top repository directory. | 267 with paths being relative to the top repository directory. |
| 257 """ | 268 """ |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 # svn diff on a mv/cp'd file outputs nothing. | 717 # svn diff on a mv/cp'd file outputs nothing. |
| 707 # We put in an empty Index entry so upload.py knows about them. | 718 # We put in an empty Index entry so upload.py knows about them. |
| 708 diff.append("\nIndex: %s\n" % file) | 719 diff.append("\nIndex: %s\n" % file) |
| 709 else: | 720 else: |
| 710 # The file is not modified anymore. It should be removed from the set. | 721 # The file is not modified anymore. It should be removed from the set. |
| 711 pass | 722 pass |
| 712 os.chdir(previous_cwd) | 723 os.chdir(previous_cwd) |
| 713 return "".join(diff) | 724 return "".join(diff) |
| 714 | 725 |
| 715 | 726 |
| 727 |
| 728 def OptionallyDoPresubmitChecks(change_info, committing, args): |
| 729 if FilterFlag(args, "--no_presubmit") or FilterFlag(args, "--force"): |
| 730 return True |
| 731 return DoPresubmitChecks(change_info, committing=committing) |
| 732 |
| 733 |
| 716 def UploadCL(change_info, args): | 734 def UploadCL(change_info, args): |
| 717 if not change_info.FileList(): | 735 if not change_info.FileList(): |
| 718 print "Nothing to upload, changelist is empty." | 736 print "Nothing to upload, changelist is empty." |
| 719 return | 737 return |
| 720 | 738 if not OptionallyDoPresubmitChecks(change_info, False, args): |
| 721 if not "--no_presubmit" in args: | 739 return |
| 722 if not DoPresubmitChecks(change_info, committing=False): | 740 no_try = FilterFlag(args, "--no_try") or FilterFlag(args, "--no-try") |
| 723 return | |
| 724 else: | |
| 725 args.remove("--no_presubmit") | |
| 726 | |
| 727 no_try = "--no_try" in args | |
| 728 if no_try: | |
| 729 args.remove("--no_try") | |
| 730 else: | |
| 731 # Support --no-try as --no_try | |
| 732 no_try = "--no-try" in args | |
| 733 if no_try: | |
| 734 args.remove("--no-try") | |
| 735 | 741 |
| 736 # Map --send-mail to --send_mail | 742 # Map --send-mail to --send_mail |
| 737 if "--send-mail" in args: | 743 if FilterFlag(args, "--send-mail"): |
| 738 args.remove("--send-mail") | |
| 739 args.append("--send_mail") | 744 args.append("--send_mail") |
| 740 | 745 |
| 741 # Supports --clobber for the try server. | 746 # Supports --clobber for the try server. |
| 742 clobber = False | 747 clobber = FilterFlag(args, "--clobber") |
| 743 if "--clobber" in args: | |
| 744 args.remove("--clobber") | |
| 745 clobber = True | |
| 746 | 748 |
| 747 # Disable try when the server is overridden. | 749 # Disable try when the server is overridden. |
| 748 server_1 = re.compile(r"^-s\b.*") | 750 server_1 = re.compile(r"^-s\b.*") |
| 749 server_2 = re.compile(r"^--server\b.*") | 751 server_2 = re.compile(r"^--server\b.*") |
| 750 for arg in args: | 752 for arg in args: |
| 751 if server_1.match(arg) or server_2.match(arg): | 753 if server_1.match(arg) or server_2.match(arg): |
| 752 no_try = True | 754 no_try = True |
| 753 break | 755 break |
| 754 | 756 |
| 755 upload_arg = ["upload.py", "-y"] | 757 upload_arg = ["upload.py", "-y"] |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 trychange.TryChange(args, | 861 trychange.TryChange(args, |
| 860 file_list=None, | 862 file_list=None, |
| 861 swallow_exception=swallow_exception, | 863 swallow_exception=swallow_exception, |
| 862 prog='gcl try') | 864 prog='gcl try') |
| 863 | 865 |
| 864 | 866 |
| 865 def Commit(change_info, args): | 867 def Commit(change_info, args): |
| 866 if not change_info.FileList(): | 868 if not change_info.FileList(): |
| 867 print "Nothing to commit, changelist is empty." | 869 print "Nothing to commit, changelist is empty." |
| 868 return | 870 return |
| 869 | 871 if not OptionallyDoPresubmitChecks(change_info, True, args): |
| 870 if not "--no_presubmit" in args: | 872 return |
| 871 if not DoPresubmitChecks(change_info, committing=True): | |
| 872 return | |
| 873 else: | |
| 874 args.remove("--no_presubmit") | |
| 875 | 873 |
| 876 # We face a problem with svn here: Let's say change 'bleh' modifies | 874 # We face a problem with svn here: Let's say change 'bleh' modifies |
| 877 # svn:ignore on dir1\. but another unrelated change 'pouet' modifies | 875 # svn:ignore on dir1\. but another unrelated change 'pouet' modifies |
| 878 # dir1\foo.cc. When the user `gcl commit bleh`, foo.cc is *also committed*. | 876 # dir1\foo.cc. When the user `gcl commit bleh`, foo.cc is *also committed*. |
| 879 # The only fix is to use --non-recursive but that has its issues too: | 877 # The only fix is to use --non-recursive but that has its issues too: |
| 880 # Let's say if dir1 is deleted, --non-recursive must *not* be used otherwise | 878 # Let's say if dir1 is deleted, --non-recursive must *not* be used otherwise |
| 881 # you'll get "svn: Cannot non-recursively commit a directory deletion of a | 879 # you'll get "svn: Cannot non-recursively commit a directory deletion of a |
| 882 # directory with child nodes". Yay... | 880 # directory with child nodes". Yay... |
| 883 commit_cmd = ["svn", "commit"] | 881 commit_cmd = ["svn", "commit"] |
| 884 filename = '' | 882 filename = '' |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 # the files. This allows commands such as 'gcl diff xxx' to work. | 1156 # the files. This allows commands such as 'gcl diff xxx' to work. |
| 1159 args =["svn", command] | 1157 args =["svn", command] |
| 1160 root = GetRepositoryRoot() | 1158 root = GetRepositoryRoot() |
| 1161 args.extend([os.path.join(root, x) for x in change_info.FileList()]) | 1159 args.extend([os.path.join(root, x) for x in change_info.FileList()]) |
| 1162 RunShell(args, True) | 1160 RunShell(args, True) |
| 1163 return 0 | 1161 return 0 |
| 1164 | 1162 |
| 1165 | 1163 |
| 1166 if __name__ == "__main__": | 1164 if __name__ == "__main__": |
| 1167 sys.exit(main()) | 1165 sys.exit(main()) |
| OLD | NEW |