<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11672">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">use argparse<br><br>Change-Id: Ib2207346003ffb28432b1cd1bac6250ad8a1a060<br>---<br>M src/gits<br>1 file changed, 40 insertions(+), 48 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-dev refs/changes/72/11672/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gits b/src/gits</span><br><span>index 3528915..316fd03 100755</span><br><span>--- a/src/gits</span><br><span>+++ b/src/gits</span><br><span>@@ -26,8 +26,6 @@</span><br><span> doc = '''gits: conveniently manage several git subdirectories.</span><br><span> Instead of doing the 'cd foo; git status; cd ../bar; git status' dance, this</span><br><span> helps to save your time with: status, fetch, rebase, ...</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-See 'gits help'</span><br><span> '''</span><br><span> </span><br><span> re_status_mods = re.compile('^\t(modified|deleted):.*')</span><br><span>@@ -223,21 +221,12 @@</span><br><span>     print(format_summaries(infos))</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def cmd_status():</span><br><span style="color: hsl(0, 100%, 40%);">-    if len(sys.argv) > 2:</span><br><span style="color: hsl(0, 100%, 40%);">-        error('no arguments allowed')</span><br><span style="color: hsl(0, 100%, 40%);">-    print_status()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-def cmd_do(argv=None):</span><br><span style="color: hsl(0, 100%, 40%);">-    if argv is None:</span><br><span style="color: hsl(0, 100%, 40%);">-        argv = sys.argv[2:]</span><br><span style="color: hsl(120, 100%, 40%);">+def cmd_do(argv):</span><br><span>     for git_dir in git_dirs():</span><br><span>         git(git_dir, *argv, may_fail=True, section_marker=True)</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def cmd_sh():</span><br><span style="color: hsl(0, 100%, 40%);">-    cmd = sys.argv[2:]</span><br><span style="color: hsl(120, 100%, 40%);">+def cmd_sh(cmd):</span><br><span>     for git_dir in git_dirs():</span><br><span>         print('\n===== %s =====' % git_dir)</span><br><span>         print('+ %s' % cmd_to_str(cmd))</span><br><span>@@ -358,10 +347,6 @@</span><br><span>     return orig_branch</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-def cmd_fetch():</span><br><span style="color: hsl(0, 100%, 40%);">-    cmd_do(['fetch'] + sys.argv[2:])</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> def cmd_rebase():</span><br><span>     skipped = []</span><br><span>     for git_dir in git_dirs():</span><br><span>@@ -385,39 +370,46 @@</span><br><span>         print('\nskipped: %s' % ' '.join(skipped))</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-commands = {</span><br><span style="color: hsl(0, 100%, 40%);">-    'status': (cmd_status, 'Show a branch summary and indicate modifications.'),</span><br><span style="color: hsl(0, 100%, 40%);">-    'fetch': (cmd_fetch, "Run 'git fetch' in each clone; useful before `gits rebase`."),</span><br><span style="color: hsl(0, 100%, 40%);">-    'rebase': (cmd_rebase, 'Interactively ff-merge master and rebase current branches.'),</span><br><span style="color: hsl(0, 100%, 40%);">-    'sh': (cmd_sh, 'Run arbitrary shell command in each clone (`gits sh echo hi`).'),</span><br><span style="color: hsl(0, 100%, 40%);">-    'do': (cmd_do, 'Run arbitrary git command in each clone (`gits do clean -dxf`).'),</span><br><span style="color: hsl(0, 100%, 40%);">-    'help': (cmd_help, 'List gits commands.'),</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+def parse_args():</span><br><span style="color: hsl(120, 100%, 40%);">+    parser = argparse.ArgumentParser(description=doc)</span><br><span style="color: hsl(120, 100%, 40%);">+    sub = parser.add_subparsers(title="action", dest="action")</span><br><span style="color: hsl(120, 100%, 40%);">+    sub.required = True</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-aliases = {</span><br><span style="color: hsl(0, 100%, 40%);">-    's': 'status',</span><br><span style="color: hsl(0, 100%, 40%);">-    'st': 'status',</span><br><span style="color: hsl(0, 100%, 40%);">-    'r': 'rebase',</span><br><span style="color: hsl(0, 100%, 40%);">-    're': 'rebase',</span><br><span style="color: hsl(0, 100%, 40%);">-    'f': 'fetch',</span><br><span style="color: hsl(0, 100%, 40%);">-    '-h': 'help',</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+    sub.add_parser("status", aliases=["st", "s"],</span><br><span style="color: hsl(120, 100%, 40%);">+        help="show a branch summary and indicate modifications")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    fetch = sub.add_parser("fetch", aliases=["f"],</span><br><span style="color: hsl(120, 100%, 40%);">+                   help="run 'git fetch' in each clone; useful before `gits rebase`")</span><br><span style="color: hsl(120, 100%, 40%);">+    fetch.add_argument("remainder", nargs=argparse.REMAINDER,</span><br><span style="color: hsl(120, 100%, 40%);">+               help="additional arguments to be passed to git fetch")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    sub.add_parser("rebase", aliases=["r", "re"],</span><br><span style="color: hsl(120, 100%, 40%);">+        help="interactively ff-merge master and rebase current branches")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    sh = sub.add_parser("sh",</span><br><span style="color: hsl(120, 100%, 40%);">+        help="run arbitrary shell command in each clone (`gits sh echo hi`)")</span><br><span style="color: hsl(120, 100%, 40%);">+    sh.add_argument("remainder", nargs=argparse.REMAINDER,</span><br><span style="color: hsl(120, 100%, 40%);">+        help="command to run in each clone")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    do = sub.add_parser("do",</span><br><span style="color: hsl(120, 100%, 40%);">+        help="run arbitrary git command in each clone (`gits do clean -dxf`)")</span><br><span style="color: hsl(120, 100%, 40%);">+    do.add_argument("remainder", nargs=argparse.REMAINDER,</span><br><span style="color: hsl(120, 100%, 40%);">+        help="git command to run in each clone")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return parser.parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> if __name__ == '__main__':</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if len(sys.argv) < 2:</span><br><span style="color: hsl(0, 100%, 40%);">-        usage('Pass at least one argument to tell me what to do.')</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    command_str = sys.argv[1]</span><br><span style="color: hsl(0, 100%, 40%);">-    alias_for = aliases.get(command_str)</span><br><span style="color: hsl(0, 100%, 40%);">-    if alias_for:</span><br><span style="color: hsl(0, 100%, 40%);">-        command_str = alias_for</span><br><span style="color: hsl(0, 100%, 40%);">-    command = commands.get(command_str)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if command:</span><br><span style="color: hsl(0, 100%, 40%);">-        func, doc = command</span><br><span style="color: hsl(0, 100%, 40%);">-        func()</span><br><span style="color: hsl(0, 100%, 40%);">-    else:</span><br><span style="color: hsl(0, 100%, 40%);">-        error('unknown command: %r\n`gits help` may help' % command_str)</span><br><span style="color: hsl(120, 100%, 40%);">+    args = parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.action in ["status", "s", "st"]:</span><br><span style="color: hsl(120, 100%, 40%);">+        print_status()</span><br><span style="color: hsl(120, 100%, 40%);">+    elif args.action in ["fetch", "f"]:</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd_do(['fetch'] + args.remainder)</span><br><span style="color: hsl(120, 100%, 40%);">+    elif args.action in ["rebase", "r"]:</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd_rebase()</span><br><span style="color: hsl(120, 100%, 40%);">+    elif args.action == "sh":</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd_sh(args.remainder)</span><br><span style="color: hsl(120, 100%, 40%);">+    elif args.action == "do":</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd_do(args.remainder)</span><br><span> </span><br><span> # vim: shiftwidth=4 expandtab tabstop=4</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11672">change 11672</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/11672"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-dev </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib2207346003ffb28432b1cd1bac6250ad8a1a060 </div>
<div style="display:none"> Gerrit-Change-Number: 11672 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>