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)) |