summaryrefslogtreecommitdiff
path: root/tools/patman/gitutil.py
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2013-03-26 13:09:42 +0000
committerSimon Glass <sjg@chromium.org>2013-04-08 15:09:03 -0700
commita1318f7cdc2fcff3b30d39750dd07dbed8f03f21 (patch)
tree675907d3a287ebbb8e604bb4ecfd4b4a4b9bf5cd /tools/patman/gitutil.py
parentf140b5863b258120f5412ea86733f70c87837ee9 (diff)
downloadu-boot-imx-a1318f7cdc2fcff3b30d39750dd07dbed8f03f21.zip
u-boot-imx-a1318f7cdc2fcff3b30d39750dd07dbed8f03f21.tar.gz
u-boot-imx-a1318f7cdc2fcff3b30d39750dd07dbed8f03f21.tar.bz2
patman: Provide option to ignore bad aliases
Often it happens that patches include tags which don't have aliases. It is annoying that patman fails in this case, and provides no option to continue other than adding empty tags to the .patman file. Correct this by adding a '-t' option to ignore tags that don't exist. Print a warning instead. Since running the tests is not a common operation, move this to --test instead, to reserve -t for this new option. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Doug Anderson <dianders@chromium.org>
Diffstat (limited to 'tools/patman/gitutil.py')
-rw-r--r--tools/patman/gitutil.py65
1 files changed, 47 insertions, 18 deletions
diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py
index 4e21d4c..f485750 100644
--- a/tools/patman/gitutil.py
+++ b/tools/patman/gitutil.py
@@ -273,7 +273,7 @@ def ApplyPatches(verbose, args, start_point):
print stdout, stderr
return error_count == 0
-def BuildEmailList(in_list, tag=None, alias=None):
+def BuildEmailList(in_list, tag=None, alias=None, raise_on_error=True):
"""Build a list of email addresses based on an input list.
Takes a list of email addresses and aliases, and turns this into a list
@@ -286,6 +286,9 @@ def BuildEmailList(in_list, tag=None, alias=None):
Args:
in_list: List of aliases/email addresses
tag: Text to put before each address
+ alias: Alias dictionary
+ raise_on_error: True to raise an error when an alias fails to match,
+ False to just print a message.
Returns:
List of email addresses
@@ -307,7 +310,7 @@ def BuildEmailList(in_list, tag=None, alias=None):
quote = '"' if tag and tag[0] == '-' else ''
raw = []
for item in in_list:
- raw += LookupEmail(item, alias)
+ raw += LookupEmail(item, alias, raise_on_error=raise_on_error)
result = []
for item in raw:
if not item in result:
@@ -316,7 +319,7 @@ def BuildEmailList(in_list, tag=None, alias=None):
return ['%s %s%s%s' % (tag, quote, email, quote) for email in result]
return result
-def EmailPatches(series, cover_fname, args, dry_run, cc_fname,
+def EmailPatches(series, cover_fname, args, dry_run, raise_on_error, cc_fname,
self_only=False, alias=None, in_reply_to=None):
"""Email a patch series.
@@ -325,6 +328,8 @@ def EmailPatches(series, cover_fname, args, dry_run, cc_fname,
cover_fname: filename of cover letter
args: list of filenames of patch files
dry_run: Just return the command that would be run
+ raise_on_error: True to raise an error when an alias fails to match,
+ False to just print a message.
cc_fname: Filename of Cc file for per-commit Cc
self_only: True to just email to yourself as a test
in_reply_to: If set we'll pass this to git as --in-reply-to.
@@ -347,20 +352,21 @@ def EmailPatches(series, cover_fname, args, dry_run, cc_fname,
>>> series = series.Series()
>>> series.to = ['fred']
>>> series.cc = ['mary']
- >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', False, \
- alias)
+ >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \
+ False, alias)
'git send-email --annotate --to "f.bloggs@napier.co.nz" --cc \
"m.poppins@cloud.net" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2'
- >>> EmailPatches(series, None, ['p1'], True, 'cc-fname', False, alias)
+ >>> EmailPatches(series, None, ['p1'], True, True, 'cc-fname', False, \
+ alias)
'git send-email --annotate --to "f.bloggs@napier.co.nz" --cc \
"m.poppins@cloud.net" --cc-cmd "./patman --cc-cmd cc-fname" p1'
>>> series.cc = ['all']
- >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', True, \
- alias)
+ >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \
+ True, alias)
'git send-email --annotate --to "this-is-me@me.com" --cc-cmd "./patman \
--cc-cmd cc-fname" cover p1 p2'
- >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', False, \
- alias)
+ >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \
+ False, alias)
'git send-email --annotate --to "f.bloggs@napier.co.nz" --cc \
"f.bloggs@napier.co.nz" --cc "j.bloggs@napier.co.nz" --cc \
"m.poppins@cloud.net" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2'
@@ -368,14 +374,14 @@ def EmailPatches(series, cover_fname, args, dry_run, cc_fname,
# Restore argv[0] since we clobbered it.
>>> sys.argv[0] = _old_argv0
"""
- to = BuildEmailList(series.get('to'), '--to', alias)
+ to = BuildEmailList(series.get('to'), '--to', alias, raise_on_error)
if not to:
print ("No recipient, please add something like this to a commit\n"
"Series-to: Fred Bloggs <f.blogs@napier.co.nz>")
return
- cc = BuildEmailList(series.get('cc'), '--cc', alias)
+ cc = BuildEmailList(series.get('cc'), '--cc', alias, raise_on_error)
if self_only:
- to = BuildEmailList([os.getenv('USER')], '--to', alias)
+ to = BuildEmailList([os.getenv('USER')], '--to', alias, raise_on_error)
cc = []
cmd = ['git', 'send-email', '--annotate']
if in_reply_to:
@@ -393,13 +399,16 @@ def EmailPatches(series, cover_fname, args, dry_run, cc_fname,
return str
-def LookupEmail(lookup_name, alias=None, level=0):
+def LookupEmail(lookup_name, alias=None, raise_on_error=True, level=0):
"""If an email address is an alias, look it up and return the full name
TODO: Why not just use git's own alias feature?
Args:
lookup_name: Alias or email address to look up
+ alias: Dictionary containing aliases (None to use settings default)
+ raise_on_error: True to raise an error when an alias fails to match,
+ False to just print a message.
Returns:
tuple:
@@ -433,6 +442,15 @@ def LookupEmail(lookup_name, alias=None, level=0):
Traceback (most recent call last):
...
OSError: Recursive email alias at 'other'
+ >>> LookupEmail('odd', alias, raise_on_error=False)
+ \033[1;31mAlias 'odd' not found\033[0m
+ []
+ >>> # In this case the loop part will effectively be ignored.
+ >>> LookupEmail('loop', alias, raise_on_error=False)
+ \033[1;31mRecursive email alias at 'other'\033[0m
+ \033[1;31mRecursive email alias at 'john'\033[0m
+ \033[1;31mRecursive email alias at 'mary'\033[0m
+ ['j.bloggs@napier.co.nz', 'm.poppins@cloud.net']
"""
if not alias:
alias = settings.alias
@@ -441,16 +459,27 @@ def LookupEmail(lookup_name, alias=None, level=0):
return [lookup_name]
lookup_name = lookup_name.lower()
+ col = terminal.Color()
+ out_list = []
if level > 10:
- raise OSError, "Recursive email alias at '%s'" % lookup_name
+ msg = "Recursive email alias at '%s'" % lookup_name
+ if raise_on_error:
+ raise OSError, msg
+ else:
+ print col.Color(col.RED, msg)
+ return out_list
- out_list = []
if lookup_name:
if not lookup_name in alias:
- raise ValueError, "Alias '%s' not found" % lookup_name
+ msg = "Alias '%s' not found" % lookup_name
+ if raise_on_error:
+ raise ValueError, msg
+ else:
+ print col.Color(col.RED, msg)
+ return out_list
for item in alias[lookup_name]:
- todo = LookupEmail(item, alias, level + 1)
+ todo = LookupEmail(item, alias, raise_on_error, level + 1)
for new_item in todo:
if not new_item in out_list:
out_list.append(new_item)