blob: 48d0529c536520cad1fc50f103b96a6fb93abfd7 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001# SPDX-License-Identifier: GPL-2.0+
Simon Glass0d24de92012-01-14 15:12:45 +00002# Copyright (c) 2011 The Chromium OS Authors.
3#
Simon Glass0d24de92012-01-14 15:12:45 +00004
5import re
6
7# Separates a tag: at the beginning of the subject from the rest of it
Simon Glassed922272013-03-26 13:09:40 +00008re_subject_tag = re.compile('([^:\s]*):\s*(.*)')
Simon Glass0d24de92012-01-14 15:12:45 +00009
10class Commit:
11 """Holds information about a single commit/patch in the series.
12
13 Args:
14 hash: Commit hash (as a string)
15
16 Variables:
17 hash: Commit hash
18 subject: Subject line
19 tags: List of maintainer tag strings
20 changes: Dict containing a list of changes (single line strings).
21 The dict is indexed by change version (an integer)
22 cc_list: List of people to aliases/emails to cc on this commit
Albert ARIBAUD5c8fdd92013-11-12 11:14:41 +010023 notes: List of lines in the commit (not series) notes
Douglas Anderson833e4192019-09-27 09:23:56 -070024 change_id: the Change-Id: tag that was stripped from this commit
25 and can be used to generate the Message-Id.
Simon Glass0d24de92012-01-14 15:12:45 +000026 """
27 def __init__(self, hash):
28 self.hash = hash
29 self.subject = None
30 self.tags = []
31 self.changes = {}
32 self.cc_list = []
Simon Glass102061b2014-04-20 10:50:14 -060033 self.signoff_set = set()
Albert ARIBAUD5c8fdd92013-11-12 11:14:41 +010034 self.notes = []
Douglas Anderson833e4192019-09-27 09:23:56 -070035 self.change_id = None
Simon Glass0d24de92012-01-14 15:12:45 +000036
37 def AddChange(self, version, info):
38 """Add a new change line to the change list for a version.
39
40 Args:
41 version: Patch set version (integer: 1, 2, 3)
42 info: Description of change in this version
43 """
44 if not self.changes.get(version):
45 self.changes[version] = []
46 self.changes[version].append(info)
47
48 def CheckTags(self):
49 """Create a list of subject tags in the commit
50
51 Subject tags look like this:
52
Simon Glass0d99fe02013-03-26 13:09:41 +000053 propounder: fort: Change the widget to propound correctly
Simon Glass0d24de92012-01-14 15:12:45 +000054
Simon Glass0d99fe02013-03-26 13:09:41 +000055 Here the tags are propounder and fort. Multiple tags are supported.
56 The list is updated in self.tag.
Simon Glass0d24de92012-01-14 15:12:45 +000057
58 Returns:
59 None if ok, else the name of a tag with no email alias
60 """
61 str = self.subject
62 m = True
63 while m:
64 m = re_subject_tag.match(str)
65 if m:
66 tag = m.group(1)
67 self.tags.append(tag)
68 str = m.group(2)
69 return None
70
71 def AddCc(self, cc_list):
72 """Add a list of people to Cc when we send this patch.
73
74 Args:
75 cc_list: List of aliases or email addresses
76 """
77 self.cc_list += cc_list
Simon Glass102061b2014-04-20 10:50:14 -060078
79 def CheckDuplicateSignoff(self, signoff):
80 """Check a list of signoffs we have send for this patch
81
82 Args:
83 signoff: Signoff line
84 Returns:
85 True if this signoff is new, False if we have already seen it.
86 """
87 if signoff in self.signoff_set:
88 return False
89 self.signoff_set.add(signoff)
90 return True