# HG changeset patch # User Idan Kamara # Date 1312839565 -10800 # Node ID d7903b92321793197843ba78f06af4d8d285bae4 # Parent 5fa34c3ac9a0ffb4a5a2ee06403d811675e071f0 util: add cmdbuilder, a helper function to generate the command to run diff -r 5fa34c3ac9a0 -r d7903b923217 hglib/util.py --- a/hglib/util.py Sat Jul 23 22:55:36 2011 +0300 +++ b/hglib/util.py Tue Aug 09 00:39:25 2011 +0300 @@ -4,3 +4,57 @@ ''' list(grouper(2, range(4))) -> [(0, 1), (2, 3)] ''' args = [iter(iterable)] * n return itertools.izip(*args) + +def cmdbuilder(name, *args, **kwargs): + """ + A helper for building the command arguments + + args are the positional arguments + + kwargs are the options + keys that are single lettered are prepended with '-', others with '--', + underscores are replaced with dashes + + keys with False boolean values are ignored, lists add the key multiple times + + None arguments are skipped + + >>> cmdbuilder('cmd', a=True, b=False, c=None) + ['cmd', '-a'] + >>> cmdbuilder('cmd', long=True) + ['cmd', '--long'] + >>> cmdbuilder('cmd', str='s') + ['cmd', '--str', 's'] + >>> cmdbuilder('cmd', d_ash=True) + ['cmd', '--d-ash'] + >>> cmdbuilder('cmd', _=True) + ['cmd', '-'] + >>> cmdbuilder('cmd', list=[1, 2]) + ['cmd', '--list', '1', '--list', '2'] + >>> cmdbuilder('cmd', None) + ['cmd'] + """ + cmd = [name] + for arg, val in kwargs.items(): + if val is None: + continue + + arg = arg.replace('_', '-') + if arg != '-': + arg = '-' + arg if len(arg) == 1 else '--' + arg + if isinstance(val, bool): + if val: + cmd.append(arg) + elif isinstance(val, list): + for v in val: + cmd.append(arg) + cmd.append(str(v)) + else: + cmd.append(arg) + cmd.append(str(val)) + + for a in args: + if a is not None: + cmd.append(a) + + return cmd