patman: Avoid duplicate sign-offs

Keep track of all Signed-off-by tags in a commit and silently suppress any
duplicates.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2014-04-20 10:50:14 -06:00
parent 757f64a89b
commit 102061bd8b
3 changed files with 23 additions and 2 deletions

View File

@ -192,6 +192,7 @@ END
A sign-off is added automatically to your patches (this is A sign-off is added automatically to your patches (this is
probably a bug). If you put this tag in your patches, it will probably a bug). If you put this tag in your patches, it will
override the default signoff that patman automatically adds. override the default signoff that patman automatically adds.
Multiple duplicate signoffs will be removed.
Tested-by: Their Name <email> Tested-by: Their Name <email>
Reviewed-by: Their Name <email> Reviewed-by: Their Name <email>

View File

@ -29,6 +29,7 @@ class Commit:
self.tags = [] self.tags = []
self.changes = {} self.changes = {}
self.cc_list = [] self.cc_list = []
self.signoff_set = set()
self.notes = [] self.notes = []
def AddChange(self, version, info): def AddChange(self, version, info):
@ -72,3 +73,16 @@ class Commit:
cc_list: List of aliases or email addresses cc_list: List of aliases or email addresses
""" """
self.cc_list += cc_list self.cc_list += cc_list
def CheckDuplicateSignoff(self, signoff):
"""Check a list of signoffs we have send for this patch
Args:
signoff: Signoff line
Returns:
True if this signoff is new, False if we have already seen it.
"""
if signoff in self.signoff_set:
return False
self.signoff_set.add(signoff)
return True

View File

@ -21,7 +21,7 @@ re_remove = re.compile('^BUG=|^TEST=|^BRANCH=|^Change-Id:|^Review URL:'
re_allowed_after_test = re.compile('^Signed-off-by:') re_allowed_after_test = re.compile('^Signed-off-by:')
# Signoffs # Signoffs
re_signoff = re.compile('^Signed-off-by:') re_signoff = re.compile('^Signed-off-by: *(.*)')
# The start of the cover letter # The start of the cover letter
re_cover = re.compile('^Cover-letter:') re_cover = re.compile('^Cover-letter:')
@ -159,6 +159,7 @@ class PatchStream:
commit_tag_match = re_commit_tag.match(line) commit_tag_match = re_commit_tag.match(line)
commit_match = re_commit.match(line) if self.is_log else None commit_match = re_commit.match(line) if self.is_log else None
cover_cc_match = re_cover_cc.match(line) cover_cc_match = re_cover_cc.match(line)
signoff_match = re_signoff.match(line)
tag_match = None tag_match = None
if self.state == STATE_PATCH_HEADER: if self.state == STATE_PATCH_HEADER:
tag_match = re_tag.match(line) tag_match = re_tag.match(line)
@ -223,7 +224,7 @@ class PatchStream:
if is_blank: if is_blank:
# Blank line ends this change list # Blank line ends this change list
self.in_change = 0 self.in_change = 0
elif line == '---' or re_signoff.match(line): elif line == '---':
self.in_change = 0 self.in_change = 0
out = self.ProcessLine(line) out = self.ProcessLine(line)
else: else:
@ -272,6 +273,11 @@ class PatchStream:
else: else:
self.tags.append(line); self.tags.append(line);
# Suppress duplicate signoffs
elif signoff_match:
if self.commit.CheckDuplicateSignoff(signoff_match.group(1)):
out = [line]
# Well that means this is an ordinary line # Well that means this is an ordinary line
else: else:
pos = 1 pos = 1