--- /dev/null
+"""Utility functions for command-line option parsing."""
+
+import optparse, sys
+from stgit import utils
+from stgit.config import config
+
+def sign_options():
+ def callback(option, opt_str, value, parser, sign_str):
+ if parser.values.sign_str not in [None, sign_str]:
+ raise optparse.OptionValueError(
+ '--ack and --sign were both specified')
+ parser.values.sign_str = sign_str
+ return [optparse.make_option('--sign', action = 'callback',
+ callback = callback, dest = 'sign_str',
+ callback_args = ('Signed-off-by',),
+ help = 'add Signed-off-by line'),
+ optparse.make_option('--ack', action = 'callback',
+ callback = callback, dest = 'sign_str',
+ callback_args = ('Acked-by',),
+ help = 'add Acked-by line')]
+
+def message_options():
+ def no_dup(parser):
+ if parser.values.message != None:
+ raise optparse.OptionValueError(
+ 'Cannot give more than one --message or --file')
+ def no_combine(parser):
+ if (parser.values.message != None
+ and parser.values.save_template != None):
+ raise optparse.OptionValueError(
+ 'Cannot give both --message/--file and --save-template')
+ def msg_callback(option, opt_str, value, parser):
+ no_dup(parser)
+ parser.values.message = value
+ no_combine(parser)
+ def file_callback(option, opt_str, value, parser):
+ no_dup(parser)
+ if value == '-':
+ parser.values.message = sys.stdin.read()
+ else:
+ f = file(value)
+ parser.values.message = f.read()
+ f.close()
+ no_combine(parser)
+ def templ_callback(option, opt_str, value, parser):
+ if value == '-':
+ def w(s):
+ sys.stdout.write(s)
+ else:
+ def w(s):
+ f = file(value, 'w+')
+ f.write(s)
+ f.close()
+ parser.values.save_template = w
+ no_combine(parser)
+ m = optparse.make_option
+ return [m('-m', '--message', action = 'callback', callback = msg_callback,
+ dest = 'message', type = 'string',
+ help = 'use MESSAGE instead of invoking the editor'),
+ m('-f', '--file', action = 'callback', callback = file_callback,
+ dest = 'message', type = 'string', metavar = 'FILE',
+ help = 'use FILE instead of invoking the editor'),
+ m('--save-template', action = 'callback', callback = templ_callback,
+ metavar = 'FILE', dest = 'save_template', type = 'string',
+ help = 'save the message template to FILE and exit')]
+
+def diff_opts_option():
+ def diff_opts_callback(option, opt_str, value, parser):
+ if value:
+ parser.values.diff_flags.extend(value.split())
+ else:
+ parser.values.diff_flags = []
+ return [optparse.make_option(
+ '-O', '--diff-opts', dest = 'diff_flags',
+ default = (config.get('stgit.diff-opts') or '').split(),
+ action = 'callback', callback = diff_opts_callback,
+ type = 'string', metavar = 'OPTIONS',
+ help = 'extra options to pass to "git diff"')]
+
+def person_opts(person, short):
+ """Sets options.<person> to a function that modifies a Person
+ according to the commandline options."""
+ def short_callback(option, opt_str, value, parser, field):
+ f = getattr(parser.values, person)
+ setattr(parser.values, person,
+ lambda p: getattr(f(p), 'set_' + field)(value))
+ def full_callback(option, opt_str, value, parser):
+ ne = utils.parse_name_email(value)
+ if not ne:
+ raise optparse.OptionValueError(
+ 'Bad %s specification: %r' % (opt_str, value))
+ name, email = ne
+ short_callback(option, opt_str, name, parser, 'name')
+ short_callback(option, opt_str, email, parser, 'email')
+ return ([optparse.make_option(
+ '--%s' % person, metavar = '"NAME <EMAIL>"', type = 'string',
+ action = 'callback', callback = full_callback, dest = person,
+ default = lambda p: p, help = 'set the %s details' % person)]
+ + [optparse.make_option(
+ '--%s%s' % (short, f), metavar = f.upper(), type = 'string',
+ action = 'callback', callback = short_callback, dest = person,
+ callback_args = (f,), help = 'set the %s %s' % (person, f))
+ for f in ['name', 'email', 'date']])
+
+def author_committer_options():
+ return person_opts('author', 'auth') + person_opts('committer', 'comm')
from optparse import make_option
from stgit.out import *
-from stgit import utils
+from stgit import argparse, utils
from stgit.commands import common
from stgit.lib import git, transaction
directory = common.DirectoryHasRepositoryLib()
options = [make_option('-n', '--name', help = 'name of coalesced patch')
- ] + utils.make_message_options()
+ ] + argparse.message_options()
class SaveTemplateDone(Exception):
pass
from stgit.commands.common import *
from stgit.utils import *
from stgit.out import *
-from stgit import stack, git
-
+from stgit import argparse, stack, git
help = 'show the tree diff'
usage = """%prog [options] [<files or dirs>]
make_option('-s', '--stat',
help = 'show the stat instead of the diff',
action = 'store_true')
- ] + make_diff_opts_option()
+ ] + argparse.diff_opts_option()
def func(parser, options, args):
"""Show the tree diff
from optparse import make_option
-from stgit import git, utils
+from stgit import argparse, git, utils
from stgit.commands import common
from stgit.lib import git as gitlib, transaction
from stgit.out import *
action = 'store_true'),
make_option('-e', '--edit', action = 'store_true',
help = 'invoke interactive editor'),
- ] + (utils.make_sign_options() + utils.make_message_options()
- + utils.make_author_committer_options()
- + utils.make_diff_opts_option())
+ ] + (argparse.sign_options() + argparse.message_options()
+ + argparse.author_committer_options()
+ + argparse.diff_opts_option())
def patch_diff(repository, cd, diff, diff_flags):
if diff:
from optparse import make_option
from stgit.commands import common
-from stgit import git, utils, templates
+from stgit import argparse, git, templates
from stgit.out import out
from stgit.lib import git as gitlib
make_option('-s', '--stdout',
help = 'dump the patches to the standard output',
action = 'store_true')
- ] + utils.make_diff_opts_option()
+ ] + argparse.diff_opts_option()
def func(parser, options, args):
"""Export a range of patches.
from stgit.commands.common import *
from stgit.utils import *
from stgit.out import *
-from stgit import stack, git
-
+from stgit import argparse, stack, git
help = 'show the files modified by a patch (or the current patch)'
usage = """%prog [options] [[<branch>:]<patch>]
make_option('--bare',
help = 'bare file names (useful for scripting)',
action = 'store_true')
- ] + make_diff_opts_option()
-
+ ] + argparse.diff_opts_option()
def func(parser, options, args):
"""Show the files modified by a patch (or the current patch)
from stgit.commands.common import *
from stgit.utils import *
from stgit.out import *
-from stgit import stack, git
-
+from stgit import argparse, stack, git
help = 'import a GNU diff file as a new patch'
usage = """%prog [options] [<file>|<url>]
help = 'use COMMNAME as the committer name'),
make_option('--commemail',
help = 'use COMMEMAIL as the committer e-mail')
- ] + make_sign_options()
+ ] + argparse.sign_options()
def __strip_patch_name(name):
from stgit.commands.common import *
from stgit.utils import *
from stgit.out import *
-from stgit import stack, git, version, templates
+from stgit import argparse, stack, git, version, templates
from stgit.config import config
from stgit.run import Run
make_option('-m', '--mbox',
help = 'generate an mbox file instead of sending',
action = 'store_true')
- ] + make_diff_opts_option()
-
+ ] + argparse.diff_opts_option()
def __get_sender():
"""Return the 'authname <authemail>' string as read from the
from optparse import make_option
-from stgit import utils
+from stgit import argparse, utils
from stgit.commands import common
from stgit.lib import git as gitlib, transaction
line of the commit message."""
directory = common.DirectoryHasRepositoryLib()
-options = (utils.make_author_committer_options()
- + utils.make_message_options() + utils.make_sign_options())
+options = (argparse.author_committer_options()
+ + argparse.message_options() + argparse.sign_options())
def func(parser, options, args):
"""Create a new patch."""
from pydoc import pager
from stgit.commands.common import *
-from stgit import git
-
+from stgit import argparse, git
help = 'show the commit corresponding to a patch (or the current patch)'
usage = """%prog [options] [<patch1>] [<patch2>] [<patch3>..<patch4>]
make_option('-u', '--unapplied',
help = 'show the unapplied patches',
action = 'store_true')
- ] + make_diff_opts_option()
-
+ ] + argparse.diff_opts_option()
def func(parser, options, args):
"""Show commit log and diff
"""Common utility functions
"""
-import errno, optparse, os, os.path, re, sys
+import errno, os, os.path, re, sys
from stgit.exception import *
from stgit.config import config
from stgit.out import *
return False
return True
-def make_sign_options():
- def callback(option, opt_str, value, parser, sign_str):
- if parser.values.sign_str not in [None, sign_str]:
- raise optparse.OptionValueError(
- '--ack and --sign were both specified')
- parser.values.sign_str = sign_str
- return [optparse.make_option('--sign', action = 'callback',
- callback = callback, dest = 'sign_str',
- callback_args = ('Signed-off-by',),
- help = 'add Signed-off-by line'),
- optparse.make_option('--ack', action = 'callback',
- callback = callback, dest = 'sign_str',
- callback_args = ('Acked-by',),
- help = 'add Acked-by line')]
-
def add_sign_line(desc, sign_str, name, email):
if not sign_str:
return desc
desc = desc + '\n'
return '%s\n%s\n' % (desc, sign_str)
-def make_message_options():
- def no_dup(parser):
- if parser.values.message != None:
- raise optparse.OptionValueError(
- 'Cannot give more than one --message or --file')
- def no_combine(parser):
- if (parser.values.message != None
- and parser.values.save_template != None):
- raise optparse.OptionValueError(
- 'Cannot give both --message/--file and --save-template')
- def msg_callback(option, opt_str, value, parser):
- no_dup(parser)
- parser.values.message = value
- no_combine(parser)
- def file_callback(option, opt_str, value, parser):
- no_dup(parser)
- if value == '-':
- parser.values.message = sys.stdin.read()
- else:
- f = file(value)
- parser.values.message = f.read()
- f.close()
- no_combine(parser)
- def templ_callback(option, opt_str, value, parser):
- if value == '-':
- def w(s):
- sys.stdout.write(s)
- else:
- def w(s):
- f = file(value, 'w+')
- f.write(s)
- f.close()
- parser.values.save_template = w
- no_combine(parser)
- m = optparse.make_option
- return [m('-m', '--message', action = 'callback', callback = msg_callback,
- dest = 'message', type = 'string',
- help = 'use MESSAGE instead of invoking the editor'),
- m('-f', '--file', action = 'callback', callback = file_callback,
- dest = 'message', type = 'string', metavar = 'FILE',
- help = 'use FILE instead of invoking the editor'),
- m('--save-template', action = 'callback', callback = templ_callback,
- metavar = 'FILE', dest = 'save_template', type = 'string',
- help = 'save the message template to FILE and exit')]
-
-def make_diff_opts_option():
- def diff_opts_callback(option, opt_str, value, parser):
- if value:
- parser.values.diff_flags.extend(value.split())
- else:
- parser.values.diff_flags = []
- return [optparse.make_option(
- '-O', '--diff-opts', dest = 'diff_flags',
- default = (config.get('stgit.diff-opts') or '').split(),
- action = 'callback', callback = diff_opts_callback,
- type = 'string', metavar = 'OPTIONS',
- help = 'extra options to pass to "git diff"')]
-
def parse_name_email(address):
"""Return a tuple consisting of the name and email parsed from a
standard 'name <email>' or 'email (name)' string."""
return None
return str_list[0]
-def make_person_options(person, short):
- """Sets options.<person> to a function that modifies a Person
- according to the commandline options."""
- def short_callback(option, opt_str, value, parser, field):
- f = getattr(parser.values, person)
- setattr(parser.values, person,
- lambda p: getattr(f(p), 'set_' + field)(value))
- def full_callback(option, opt_str, value, parser):
- ne = parse_name_email(value)
- if not ne:
- raise optparse.OptionValueError(
- 'Bad %s specification: %r' % (opt_str, value))
- name, email = ne
- short_callback(option, opt_str, name, parser, 'name')
- short_callback(option, opt_str, email, parser, 'email')
- return ([optparse.make_option(
- '--%s' % person, metavar = '"NAME <EMAIL>"', type = 'string',
- action = 'callback', callback = full_callback, dest = person,
- default = lambda p: p, help = 'set the %s details' % person)]
- + [optparse.make_option(
- '--%s%s' % (short, f), metavar = f.upper(), type = 'string',
- action = 'callback', callback = short_callback, dest = person,
- callback_args = (f,), help = 'set the %s %s' % (person, f))
- for f in ['name', 'email', 'date']])
-
-def make_author_committer_options():
- return (make_person_options('author', 'auth')
- + make_person_options('committer', 'comm'))
-
# Exit codes.
STGIT_SUCCESS = 0 # everything's OK
STGIT_GENERAL_ERROR = 1 # seems to be non-command-specific error