| Index: drover.py
|
| ===================================================================
|
| --- drover.py (revision 29312)
|
| +++ drover.py (working copy)
|
| @@ -18,21 +18,16 @@
|
| Valid parameters:
|
|
|
| [Merge from trunk to branch]
|
| -<revision> --merge <branch_num>
|
| -Example: %(app)s 12345 --merge 187
|
| +--merge <revision> --branch <branch_num>
|
| +Example: %(app)s --merge 12345 --branch 187
|
|
|
| -[Merge from trunk to branch, ignoring revision history]
|
| -<revision> --mplus <branch_num>
|
| -Example: %(app)s 12345 --mplus 187
|
| -
|
| [Revert from trunk]
|
| -<revision> --revert
|
| -Example: %(app)s 12345 --revert
|
| +--revert <revision>
|
| +Example: %(app)s --revert 12345
|
|
|
| -
|
| [Revert from branch]
|
| -<revision> --revert <branch_num>
|
| -Example: %(app)s 12345 --revert 187
|
| +--revert <revision> --branch <branch_num>
|
| +Example: %(app)s --revert 12345 --branch 187
|
| """
|
|
|
| export_map_ = None
|
| @@ -249,7 +244,7 @@
|
| match.group(3).strip(),match.group(4).strip()])
|
|
|
| files_info_ = info
|
| - return rtn
|
| + return info
|
|
|
| def getBestMergePaths(url, revision):
|
| """Takes an svn url and gets the associated revision."""
|
| @@ -329,7 +324,7 @@
|
| def prompt(question):
|
| answer = None
|
|
|
| - while not p:
|
| + while not answer:
|
| print question + " [y|n]:"
|
| answer = sys.stdin.readline()
|
| if answer.lower().startswith('n'):
|
| @@ -346,7 +341,7 @@
|
| return default
|
| return answer
|
|
|
| -def main(argv=None):
|
| +def main(options, args):
|
| BASE_URL = "svn://chrome-svn/chrome"
|
| TRUNK_URL = BASE_URL + "/trunk/src"
|
| BRANCH_URL = BASE_URL + "/branches/$branch/src"
|
| @@ -363,60 +358,50 @@
|
| if FILE_PATTERN:
|
| file_pattern_ = FILE_PATTERN
|
|
|
| - if (len(sys.argv) == 1):
|
| - print USAGE % {"app": sys.argv[0]}
|
| - sys.exit(0)
|
| + revision = options.revert or options.merge
|
|
|
| - revision = int(sys.argv[1])
|
| - if ((len(sys.argv) >= 4) and (sys.argv[2] in ['--revert','-r'])):
|
| - url = BRANCH_URL.replace("$branch", sys.argv[3])
|
| + if options.revert and options.branch:
|
| + url = BRANCH_URL.replace("$branch", options.branch)
|
| else:
|
| url = TRUNK_URL
|
| - action = "Merge"
|
|
|
| working = DEFAULT_WORKING
|
|
|
| command = 'svn log ' + url + " -r "+str(revision) + " -v"
|
| os.system(command)
|
|
|
| - if not prompt("Is this the correct revision?"):
|
| + if not (options.revertbot or prompt("Is this the correct revision?")):
|
| sys.exit(0)
|
|
|
| if (os.path.exists(working)):
|
| - if not (SKIP_CHECK_WORKING or prompt("Working directory: '" + working + "' already exists, clobber?")):
|
| + if not (options.revertbot or SKIP_CHECK_WORKING or
|
| + prompt("Working directory: '%s' already exists, clobber?" % working)):
|
| sys.exit(0)
|
| deltree(working)
|
|
|
| os.makedirs(working)
|
| os.chdir(working)
|
|
|
| - if (len(sys.argv) > 1):
|
| - if sys.argv[2] in ['--merge','-m']:
|
| - if (len(sys.argv) != 4):
|
| - print "Please specify the branch # you want (i.e. 182) after --merge"
|
| - sys.exit(0)
|
| + if options.merge:
|
| + action = "Merge"
|
| + branch_url = BRANCH_URL.replace("$branch", options.branch)
|
| + # Checkout everything but stuff that got added into a new dir
|
| + checkoutRevision(url, revision, branch_url)
|
| + # Merge everything that changed
|
| + mergeRevision(url, revision)
|
| + # "Export" files that were added from the source and add them to branch
|
| + exportRevision(url, revision)
|
| + # Delete directories that were deleted (file deletes are handled in the
|
| + # merge).
|
| + deleteRevision(url, revision)
|
| + elif options.revert:
|
| + action = "Revert"
|
| + if options.branch:
|
| + url = BRANCH_URL.replace("$branch", options.branch)
|
| + checkoutRevision(url, revision, url, True)
|
| + revertRevision(url, revision)
|
| + revertExportRevision(url, revision)
|
|
|
| - branch_url = BRANCH_URL.replace("$branch", sys.argv[3])
|
| - # Checkout everything but stuff that got added into a new dir
|
| - checkoutRevision(url, revision, branch_url)
|
| - # Merge everything that changed
|
| - mergeRevision(url, revision)
|
| - # "Export" files that were added from the source and add them to branch
|
| - exportRevision(url, revision)
|
| - # Delete directories that were deleted (file deletes are handled in the
|
| - # merge).
|
| - deleteRevision(url, revision)
|
| - elif sys.argv[2] in ['--revert','-r']:
|
| - if (len(sys.argv) == 4):
|
| - url = BRANCH_URL.replace("$branch", sys.argv[3])
|
| - checkoutRevision(url, revision, url, True)
|
| - revertRevision(url, revision)
|
| - revertExportRevision(url, revision)
|
| - action = "Revert"
|
| - else:
|
| - print "Unknown parameter " + sys.argv[2]
|
| - sys.exit(0)
|
| -
|
| # Check the base url so we actually find the author who made the change
|
| author = getAuthor(TRUNK_URL, revision)
|
|
|
| @@ -428,28 +413,60 @@
|
| out.write("TBR=" + author)
|
| out.close()
|
|
|
| - os.system('gcl change ' + str(revision) + " " + filename)
|
| + change_cmd = 'gcl change ' + str(revision) + " " + filename
|
| + if options.revertbot:
|
| + change_cmd += ' --silent'
|
| + os.system(change_cmd)
|
| os.unlink(filename)
|
| print author
|
| print revision
|
| print ("gcl upload " + str(revision) +
|
| " --send_mail --no_try --no_presubmit --reviewers=" + author)
|
| - print "gcl commit " + str(revision) + " --no_presubmit --force"
|
| - print "gcl delete " + str(revision)
|
|
|
| - if prompt("Would you like to upload?"):
|
| + if options.revertbot or prompt("Would you like to upload?"):
|
| if PROMPT_FOR_AUTHOR:
|
| - author = text_prompt("Enter a new author or press enter to accept default", author)
|
| + author = text_prompt("Enter new author or press enter to accept default",
|
| + author)
|
| + if options.revertbot and options.revertbot_reviewers:
|
| + author += ","
|
| + author += options.revertbot_reviewers
|
| gclUpload(revision, author)
|
| else:
|
| print "Deleting the changelist."
|
| + print "gcl delete " + str(revision)
|
| os.system("gcl delete " + str(revision))
|
| sys.exit(0)
|
|
|
| - if prompt("Would you like to commit?"):
|
| + # We commit if the reverbot is set to commit automatically, or if this is
|
| + # not the revertbot and the user agrees.
|
| + if options.revertbot_commit or (not options.revertbot and
|
| + prompt("Would you like to commit?")):
|
| + print "gcl commit " + str(revision) + " --no_presubmit --force"
|
| os.system("gcl commit " + str(revision) + " --no_presubmit --force")
|
| else:
|
| sys.exit(0)
|
|
|
| if __name__ == "__main__":
|
| - sys.exit(main())
|
| + option_parser = optparse.OptionParser(usage=USAGE % {"app": sys.argv[0]})
|
| + option_parser.add_option('-m', '--merge', type="int",
|
| + help='Revision to merge from trunk to branch')
|
| + option_parser.add_option('-b', '--branch',
|
| + help='Branch to revert or merge from')
|
| + option_parser.add_option('-r', '--revert', type="int",
|
| + help='Revision to revert')
|
| + option_parser.add_option('', '--revertbot', action='store_true',
|
| + default=False)
|
| + option_parser.add_option('', '--revertbot-commit', action='store_true',
|
| + default=False)
|
| + option_parser.add_option('', '--revertbot-reviewers')
|
| + options, args = option_parser.parse_args()
|
| +
|
| + if not options.merge and not options.revert:
|
| + option_parser.error("You need at least --merge or --revert")
|
| + sys.exit(1)
|
| +
|
| + if options.merge and not options.branch:
|
| + option_parser.error("--merge requires a --branch")
|
| + sys.exit(1)
|
| +
|
| + sys.exit(main(options, args))
|
|
|