| Index: gcl.py
|
| diff --git a/gcl.py b/gcl.py
|
| index 8d72c830a7a548a91bd877c66e8325ccf5cfb9d0..cc1fb6704fd075f59994371503eadc0e1f3b1986 100755
|
| --- a/gcl.py
|
| +++ b/gcl.py
|
| @@ -27,7 +27,7 @@ __pychecker__ = ''
|
| from scm import SVN
|
| import gclient_utils
|
|
|
| -__version__ = '1.1.3'
|
| +__version__ = '1.1.4'
|
|
|
|
|
| CODEREVIEW_SETTINGS = {
|
| @@ -81,6 +81,7 @@ def CheckHomeForFile(filename):
|
| return full_path
|
| return None
|
|
|
| +
|
| def UnknownFiles(extra_args):
|
| """Runs svn status and returns unknown files.
|
|
|
| @@ -622,25 +623,26 @@ def ListFiles(show_unknown_files):
|
| return 0
|
|
|
|
|
| -def CMDopened(argv):
|
| +def CMDopened(args):
|
| """Lists modified files in the current directory down."""
|
| - __pychecker__ = 'unusednames=argv'
|
| + if args:
|
| + ErrorExit("Doesn't support arguments")
|
| return ListFiles(False)
|
|
|
|
|
| -def CMDstatus(argv):
|
| +def CMDstatus(args):
|
| """Lists modified and unknown files in the current directory down."""
|
| - __pychecker__ = 'unusednames=argv'
|
| + if args:
|
| + ErrorExit("Doesn't support arguments")
|
| return ListFiles(True)
|
|
|
|
|
| -def CMDhelp(argv=None):
|
| +def CMDhelp(args):
|
| """Prints this help or help for the given command."""
|
| - if argv and len(argv) > 2:
|
| - if argv[2] == 'try':
|
| - TryChange(None, ['--help'], swallow_exception=False)
|
| - return 0
|
| - if argv[2] == 'upload':
|
| + if args and len(args) > 2:
|
| + if args[2] == 'try':
|
| + return TryChange(None, ['--help'], swallow_exception=False)
|
| + if args[2] == 'upload':
|
| upload.RealMain(['upload.py', '--help'])
|
| return 0
|
|
|
| @@ -744,12 +746,25 @@ def OptionallyDoPresubmitChecks(change_info, committing, args):
|
| return DoPresubmitChecks(change_info, committing, True)
|
|
|
|
|
| -def CMDupload(change_info, args):
|
| +def need_change(function):
|
| + """Converts args -> change_info."""
|
| + def hook(args):
|
| + if not len(args) == 1:
|
| + ErrorExit("You need to pass a change list name")
|
| + change_info = ChangeInfo.Load(args[0], GetRepositoryRoot(), True, True)
|
| + return function(change_info)
|
| + return hook
|
| +
|
| +
|
| +def CMDupload(args):
|
| + if not args:
|
| + ErrorExit("You need to pass a change list name")
|
| + change_info = ChangeInfo.Load(args.pop(0), GetRepositoryRoot(), True, True)
|
| if not change_info.GetFiles():
|
| print "Nothing to upload, changelist is empty."
|
| - return
|
| + return 0
|
| if not OptionallyDoPresubmitChecks(change_info, False, args):
|
| - return
|
| + return 1
|
| # Might want to support GetInfoDir()/GetRepositoryRoot() like
|
| # CheckHomeForFile() so the skip of tries can be per tree basis instead
|
| # of user global.
|
| @@ -856,13 +871,13 @@ def CMDupload(change_info, args):
|
| trychange_args = []
|
| if clobber:
|
| trychange_args.append('--clobber')
|
| - TryChange(change_info, trychange_args, swallow_exception=True)
|
| -
|
| + return TryChange(change_info, trychange_args, swallow_exception=True)
|
| + return 0
|
|
|
|
|
| -def CMDpresubmit(change_info, argv):
|
| +@need_change
|
| +def CMDpresubmit(change_info):
|
| """Runs presubmit checks on the change."""
|
| - __pychecker__ = 'unusednames=argv'
|
| if not change_info.GetFiles():
|
| print "Nothing to presubmit check, changelist is empty."
|
| return 0
|
| @@ -881,7 +896,7 @@ def TryChange(change_info, args, swallow_exception):
|
| import trychange
|
| except ImportError:
|
| if swallow_exception:
|
| - return
|
| + return 1
|
| ErrorExit("You need to install trychange.py to use the try server.")
|
|
|
| trychange_args = []
|
| @@ -896,13 +911,14 @@ def TryChange(change_info, args, swallow_exception):
|
| else:
|
| trychange_args.extend(args)
|
| file_list = None
|
| - trychange.TryChange(trychange_args,
|
| - file_list=file_list,
|
| - swallow_exception=swallow_exception,
|
| - prog='gcl try')
|
| + return trychange.TryChange(trychange_args,
|
| + file_list=file_list,
|
| + swallow_exception=swallow_exception,
|
| + prog='gcl try')
|
|
|
|
|
| -def CMDcommit(change_info, args):
|
| +@need_change
|
| +def CMDcommit(change_info):
|
| if not change_info.GetFiles():
|
| print "Nothing to commit, changelist is empty."
|
| return 1
|
| @@ -959,8 +975,16 @@ def CMDcommit(change_info, args):
|
| return 0
|
|
|
|
|
| -def CMDchange(change_info, args):
|
| +def CMDchange(args):
|
| """Creates/edits a changelist."""
|
| + if len(args) == 0:
|
| + # Generate a random changelist name.
|
| + changename = GenerateChangeName()
|
| + elif args[0] == '--force':
|
| + changename = GenerateChangeName()
|
| + else:
|
| + changename = args[0]
|
| + change_info = ChangeInfo.Load(changename, GetRepositoryRoot(), False, True)
|
| silent = FilterFlag(args, "--silent")
|
|
|
| # Verify the user is running the change command from a read-write checkout.
|
| @@ -969,9 +993,8 @@ def CMDchange(change_info, args):
|
| ErrorExit("Current checkout is unversioned. Please retry with a versioned "
|
| "directory.")
|
|
|
| - if (len(args) == 1):
|
| - filename = args[0]
|
| - f = open(filename, 'rU')
|
| + if len(args) == 2:
|
| + f = open(args[1], 'rU')
|
| override_description = f.read()
|
| f.close()
|
| else:
|
| @@ -1073,13 +1096,13 @@ def CMDchange(change_info, args):
|
| return 0
|
|
|
|
|
| -def CMDlint(change_info, args):
|
| +@need_change
|
| +def CMDlint(change_info):
|
| """Runs cpplint.py on all the files in |change_info|"""
|
| try:
|
| import cpplint
|
| except ImportError:
|
| ErrorExit("You need to install cpplint.py to lint C++ files.")
|
| -
|
| # Change the current working directory before calling lint so that it
|
| # shows the correct base.
|
| previous_cwd = os.getcwd()
|
| @@ -1133,9 +1156,10 @@ def DoPresubmitChecks(change_info, committing, may_prompt):
|
| return result
|
|
|
|
|
| -def CMDchanges(argv):
|
| +def CMDchanges(args):
|
| """Lists all the changelists and their files."""
|
| - __pychecker__ = 'unusednames=argv'
|
| + if args:
|
| + ErrorExit("Doesn't support arguments")
|
| for cl in GetCLs():
|
| change_info = ChangeInfo.Load(cl, GetRepositoryRoot(), True, True)
|
| print "\n--- Changelist " + change_info.name + ":"
|
| @@ -1144,9 +1168,10 @@ def CMDchanges(argv):
|
| return 0
|
|
|
|
|
| -def CMDdeleteempties(argv):
|
| +def CMDdeleteempties(args):
|
| """Delete all changelists that have no files."""
|
| - __pychecker__ = 'unusednames=argv'
|
| + if args:
|
| + ErrorExit("Doesn't support arguments")
|
| print "\n--- Deleting:"
|
| for cl in GetCLs():
|
| change_info = ChangeInfo.Load(cl, GetRepositoryRoot(), True, True)
|
| @@ -1156,25 +1181,31 @@ def CMDdeleteempties(argv):
|
| return 0
|
|
|
|
|
| -def CMDnothave(argv):
|
| +def CMDnothave(args):
|
| """Lists files unknown to Subversion."""
|
| - __pychecker__ = 'unusednames=argv'
|
| - for filename in UnknownFiles(argv[2:]):
|
| + if args:
|
| + ErrorExit("Doesn't support arguments")
|
| + for filename in UnknownFiles(args):
|
| print "? " + "".join(filename)
|
| return 0
|
|
|
|
|
| -def CMDdiff(argv):
|
| +def CMDdiff(args):
|
| """Diffs all files in the changelist."""
|
| - __pychecker__ = 'unusednames=argv'
|
| - files = GetFilesNotInCL()
|
| - print GenerateDiff([x[1] for x in files])
|
| - return 0
|
| + files = None
|
| + if args:
|
| + change_info = ChangeInfo.Load(args[0], GetRepositoryRoot(), True, True)
|
| + args.pop(0)
|
| + files = change_info.GetFileNames()
|
| + else:
|
| + files = GetFilesNotInCL()
|
| + return RunShellWithReturnCode(['svn', 'diff'] + files + args,
|
| + print_output=True)[1]
|
|
|
|
|
| -def CMDsettings(argv):
|
| +def CMDsettings(args):
|
| """Prints code review settings."""
|
| - __pychecker__ = 'unusednames=argv'
|
| + __pychecker__ = 'unusednames=args'
|
| # Force load settings
|
| GetCodeReviewSetting("UNKNOWN");
|
| del CODEREVIEW_SETTINGS['__just_initialized']
|
| @@ -1183,21 +1214,21 @@ def CMDsettings(argv):
|
| return 0
|
|
|
|
|
| -def CMDdescription(change_info, argv):
|
| +@need_change
|
| +def CMDdescription(change_info):
|
| """Prints the description of the specified change to stdout."""
|
| - __pychecker__ = 'unusednames=argv'
|
| print change_info.description
|
| return 0
|
|
|
|
|
| -def CMDdelete(change_info, argv):
|
| +@need_change
|
| +def CMDdelete(change_info):
|
| """Deletes a changelist."""
|
| - __pychecker__ = 'unusednames=argv'
|
| change_info.Delete()
|
| return 0
|
|
|
|
|
| -def CMDtry(change_info, argv):
|
| +def CMDtry(args):
|
| """Sends the change to the tryserver so a trybot can do a test run on your
|
| code.
|
|
|
| @@ -1205,21 +1236,28 @@ def CMDtry(change_info, argv):
|
| changenames. Use 'gcl help try' for more information!"""
|
| # When the change contains no file, send the "changename" positional
|
| # argument to trychange.py.
|
| - __pychecker__ = 'unusednames=argv'
|
| + # When the command is 'try' and --patchset is used, the patch to try
|
| + # is on the Rietveld server.
|
| + if not args:
|
| + ErrorExit("You need to pass a change list name")
|
| + if args[0].find(',') != -1:
|
| + change_info = LoadChangelistInfoForMultiple(args[0], GetRepositoryRoot(),
|
| + True, True)
|
| + else:
|
| + change_info = ChangeInfo.Load(args[0], GetRepositoryRoot(),
|
| + False, True)
|
| if change_info.GetFiles():
|
| - args = argv[3:]
|
| + args = args[1:]
|
| else:
|
| change_info = None
|
| - args = argv[2:]
|
| - TryChange(change_info, args, swallow_exception=False)
|
| - return 0
|
| + return TryChange(change_info, args, swallow_exception=False)
|
|
|
|
|
| -def CMDrename(argv):
|
| +def CMDrename(args):
|
| """Renames an existing change."""
|
| - if len(argv) != 4:
|
| + if len(args) != 2:
|
| ErrorExit("Usage: gcl rename <old-name> <new-name>.")
|
| - src, dst = argv[2:4]
|
| + src, dst = args
|
| src_file = GetChangelistInfoFile(src)
|
| if not os.path.isfile(src_file):
|
| ErrorExit("Change '%s' does not exist." % src)
|
| @@ -1231,14 +1269,20 @@ def CMDrename(argv):
|
| return 0
|
|
|
|
|
| -def main(argv=None):
|
| - __pychecker__ = 'maxreturns=0'
|
| - if argv is None:
|
| - argv = sys.argv
|
| +def CMDpassthru(args):
|
| + # Everything else that is passed into gcl we redirect to svn, after adding
|
| + # the files.
|
| + # args is guaranteed to be len(args) >= 1
|
| + args = ["svn", args[0]]
|
| + if len(args) > 1:
|
| + root = GetRepositoryRoot()
|
| + change_info = ChangeInfo.Load(args[1], root, True, True)
|
| + args.extend([os.path.join(root, x) for x in change_info.GetFileNames()])
|
| + return RunShellWithReturnCode(args, print_output=True)[1]
|
|
|
| - if len(argv) == 1:
|
| - return CMDhelp()
|
|
|
| +def main(argv):
|
| + __pychecker__ = 'maxreturns=0'
|
| try:
|
| # Create the directories where we store information about changelists if it
|
| # doesn't exist.
|
| @@ -1252,80 +1296,47 @@ def main(argv=None):
|
| # Will throw an exception if not run in a svn checkout.
|
| pass
|
|
|
| + if not argv:
|
| + argv = ['help']
|
| # Commands that don't require an argument.
|
| - command = argv[1]
|
| + command = argv[0]
|
| if command == "opened":
|
| - return CMDopened(argv)
|
| + return CMDopened(argv[1:])
|
| if command == "status":
|
| - return CMDstatus(argv)
|
| + return CMDstatus(argv[1:])
|
| if command == "nothave":
|
| - return CMDnothave(argv)
|
| + return CMDnothave(argv[1:])
|
| if command == "changes":
|
| - return CMDchanges(argv)
|
| + return CMDchanges(argv[1:])
|
| if command == "help":
|
| - return CMDhelp(argv)
|
| - if command == "diff" and len(argv) == 2:
|
| - return CMDdiff(argv)
|
| + return CMDhelp(argv[1:])
|
| + if command == "diff":
|
| + return CMDdiff(argv[1:])
|
| if command == "settings":
|
| - return CMDsettings(argv)
|
| + return CMDsettings(argv[1:])
|
| if command == "deleteempties":
|
| - return CMDdeleteempties(argv)
|
| + return CMDdeleteempties(argv[1:])
|
| if command == "rename":
|
| - return CMDrename(argv)
|
| - if command == "change":
|
| - if len(argv) == 2:
|
| - # Generate a random changelist name.
|
| - changename = GenerateChangeName()
|
| - elif argv[2] == '--force':
|
| - changename = GenerateChangeName()
|
| - # argv[3:] is passed to Change() as |args| later. Change() should receive
|
| - # |args| which includes '--force'.
|
| - argv.insert(2, changename)
|
| - else:
|
| - changename = argv[2]
|
| - elif len(argv) == 2:
|
| - ErrorExit("Need a changelist name.")
|
| - else:
|
| - changename = argv[2]
|
| -
|
| - # When the command is 'try' and --patchset is used, the patch to try
|
| - # is on the Rietveld server. 'change' creates a change so it's fine if the
|
| - # change didn't exist. All other commands require an existing change.
|
| - fail_on_not_found = command != "try" and command != "change"
|
| - if command == "try" and changename.find(',') != -1:
|
| - change_info = LoadChangelistInfoForMultiple(changename, GetRepositoryRoot(),
|
| - True, True)
|
| - else:
|
| - change_info = ChangeInfo.Load(changename, GetRepositoryRoot(),
|
| - fail_on_not_found, True)
|
| -
|
| - if command == "change":
|
| - return CMDchange(change_info, argv[3:])
|
| + return CMDrename(argv[1:])
|
| + elif command == "change":
|
| + return CMDchange(argv[1:])
|
| elif command == "description":
|
| - return CMDdescription(change_info, argv[3:])
|
| + return CMDdescription(argv[1:])
|
| elif command == "lint":
|
| - return CMDlint(change_info, argv[3:])
|
| + return CMDlint(argv[1:])
|
| elif command == "upload":
|
| - return CMDupload(change_info, argv[3:])
|
| + return CMDupload(argv[1:])
|
| elif command == "presubmit":
|
| - return CMDpresubmit(change_info, argv[3:])
|
| + return CMDpresubmit(argv[1:])
|
| elif command in ("commit", "submit"):
|
| - return CMDcommit(change_info, argv[3:])
|
| + return CMDcommit(argv[1:])
|
| elif command == "delete":
|
| - return CMDdelete(change_info, argv[3:])
|
| + return CMDdelete(argv[1:])
|
| elif command == "try":
|
| - return CMDtry(change_info, argv)
|
| + return CMDtry(argv[1:])
|
| else:
|
| - # Everything else that is passed into gcl we redirect to svn, after adding
|
| - # the files. This allows commands such as 'gcl diff xxx' to work.
|
| - if command == "diff" and not change_info.GetFileNames():
|
| - return 0
|
| - args =["svn", command]
|
| - root = GetRepositoryRoot()
|
| - args.extend([os.path.join(root, x) for x in change_info.GetFileNames()])
|
| - RunShell(args, True)
|
| - return 0
|
| + return CMDpassthru(argv)
|
|
|
|
|
| if __name__ == "__main__":
|
| - sys.exit(main())
|
| + sys.exit(main(sys.argv[1:]))
|
|
|