Index: tools/push-to-trunk/merge_to_branch.py |
diff --git a/tools/push-to-trunk/merge_to_branch.py b/tools/push-to-trunk/merge_to_branch.py |
index 5f0b6a6e5532c9276b7dff274a011a9bbe92d40b..5f2e573bdc4e40c3bb924d3abfec21f497dd74ed 100755 |
--- a/tools/push-to-trunk/merge_to_branch.py |
+++ b/tools/push-to-trunk/merge_to_branch.py |
@@ -26,8 +26,8 @@ |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+import argparse |
from collections import OrderedDict |
-import optparse |
import sys |
from common_includes import * |
@@ -51,7 +51,7 @@ CONFIG = { |
class MergeToBranchOptions(CommonOptions): |
- def __init__(self, options, args): |
+ def __init__(self, options): |
super(MergeToBranchOptions, self).__init__(options, True) |
self.requires_editor = True |
self.wait_for_lgtm = True |
@@ -60,7 +60,8 @@ class MergeToBranchOptions(CommonOptions): |
self.revert = getattr(options, "r", False) |
self.revert_bleeding_edge = getattr(options, "revert_bleeding_edge", False) |
self.patch = getattr(options, "p", "") |
- self.args = args |
+ self.branch = options.branch |
+ self.revisions = options.revisions |
class Preparation(Step): |
@@ -77,9 +78,8 @@ class Preparation(Step): |
self.InitialEnvironmentChecks() |
if self._options.revert_bleeding_edge: |
self["merge_to_branch"] = "bleeding_edge" |
- elif self._options.args[0]: |
- self["merge_to_branch"] = self._options.args[0] |
- self._options.args = self._options.args[1:] |
+ elif self._options.branch: |
+ self["merge_to_branch"] = self._options.branch |
else: |
self.Die("Please specify a branch to merge to") |
@@ -99,7 +99,8 @@ class SearchArchitecturePorts(Step): |
MESSAGE = "Search for corresponding architecture ports." |
def RunStep(self): |
- self["full_revision_list"] = list(OrderedDict.fromkeys(self._options.args)) |
+ self["full_revision_list"] = list(OrderedDict.fromkeys( |
+ self._options.revisions)) |
port_revision_list = [] |
for revision in self["full_revision_list"]: |
# Search for commits which matches the "Port rXXX" pattern. |
@@ -310,53 +311,53 @@ def RunMergeToBranch(config, |
def BuildOptions(): |
- result = optparse.OptionParser() |
- result.set_usage("""%prog [OPTIONS]... [BRANCH] [REVISION]... |
- |
-Performs the necessary steps to merge revisions from bleeding_edge |
-to other branches, including trunk.""") |
- result.add_option("-f", |
- help="Delete sentinel file.", |
- default=False, action="store_true") |
- result.add_option("-m", "--message", |
- help="Specify a commit message for the patch.") |
- result.add_option("-r", "--revert", |
- help="Revert specified patches.", |
- default=False, action="store_true") |
- result.add_option("-R", "--revert-bleeding-edge", |
- help="Revert specified patches from bleeding edge.", |
- default=False, action="store_true") |
- result.add_option("-p", "--patch", dest="p", |
- help="Specify a patch file to apply as part of the merge.") |
- result.add_option("-s", "--step", dest="s", |
- help="Specify the step where to start work. Default: 0.", |
- default=0, type="int") |
- return result |
- |
- |
-def ProcessOptions(options, args): |
- revert_from_bleeding_edge = 1 if options.revert_bleeding_edge else 0 |
- min_exp_args = 2 - revert_from_bleeding_edge |
- if len(args) < min_exp_args: |
- if not options.p: |
+ parser = argparse.ArgumentParser( |
+ description=("Performs the necessary steps to merge revisions from " |
+ "bleeding_edge to other branches, including trunk.")) |
+ group = parser.add_mutually_exclusive_group(required=True) |
+ group.add_argument("--branch", help="The branch to merge to.") |
+ group.add_argument("-R", "--revert-bleeding-edge", |
+ help="Revert specified patches from bleeding edge.", |
+ default=False, action="store_true") |
+ parser.add_argument("revisions", nargs="*", |
+ help="The revisions to merge.") |
+ parser.add_argument("-a", "--author", default="", |
+ help="The author email used for rietveld.") |
+ parser.add_argument("-f", |
+ help="Delete sentinel file.", |
+ default=False, action="store_true") |
+ parser.add_argument("-m", "--message", |
+ help="A commit message for the patch.") |
+ parser.add_argument("-r", "--revert", |
+ help="Revert specified patches.", |
+ default=False, action="store_true") |
+ parser.add_argument("-p", "--patch", dest="p", |
+ help="A patch file to apply as part of the merge.") |
+ parser.add_argument("-s", "--step", dest="s", |
+ help="The step where to start work. Default: 0.", |
+ default=0, type=int) |
+ return parser |
+ |
+ |
+def ProcessOptions(options): |
+ # TODO(machenbach): Add a test that covers revert from bleeding_edge |
+ if len(options.revisions) < 1: |
+ if not options.patch: |
print "Either a patch file or revision numbers must be specified" |
return False |
if not options.message: |
print "You must specify a merge comment if no patches are specified" |
return False |
- if options.s < 0: |
- print "Bad step number %d" % options.s |
- return False |
return True |
def Main(): |
parser = BuildOptions() |
- (options, args) = parser.parse_args() |
- if not ProcessOptions(options, args): |
+ options = parser.parse_args() |
+ if not ProcessOptions(options): |
parser.print_help() |
return 1 |
- RunMergeToBranch(CONFIG, MergeToBranchOptions(options, args)) |
+ RunMergeToBranch(CONFIG, MergeToBranchOptions(options)) |
if __name__ == "__main__": |
sys.exit(Main()) |