blob: 684225c0e60d41552742a49da4c268db360bbb43 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001# SPDX-License-Identifier: GPL-2.0+
Simon Glass26132882012-01-14 15:12:45 +00002# Copyright (c) 2011 The Chromium OS Authors.
3#
Simon Glass26132882012-01-14 15:12:45 +00004
Simon Glass08e91be2020-07-05 21:41:57 -06005import collections
Simon Glass26132882012-01-14 15:12:45 +00006import re
7
8# Separates a tag: at the beginning of the subject from the rest of it
Simon Glass4e774682013-03-26 13:09:40 +00009re_subject_tag = re.compile('([^:\s]*):\s*(.*)')
Simon Glass26132882012-01-14 15:12:45 +000010
11class Commit:
12 """Holds information about a single commit/patch in the series.
13
14 Args:
15 hash: Commit hash (as a string)
16
17 Variables:
18 hash: Commit hash
19 subject: Subject line
20 tags: List of maintainer tag strings
21 changes: Dict containing a list of changes (single line strings).
22 The dict is indexed by change version (an integer)
23 cc_list: List of people to aliases/emails to cc on this commit
Albert ARIBAUDd880efd2013-11-12 11:14:41 +010024 notes: List of lines in the commit (not series) notes
Douglas Anderson52b5ee82019-09-27 09:23:56 -070025 change_id: the Change-Id: tag that was stripped from this commit
26 and can be used to generate the Message-Id.
Simon Glass08e91be2020-07-05 21:41:57 -060027 rtags: Response tags (e.g. Reviewed-by) collected by the commit, dict:
28 key: rtag type (e.g. 'Reviewed-by')
29 value: Set of people who gave that rtag, each a name/email string
Simon Glass6d00f6c2020-10-29 21:46:24 -060030 warn: List of warnings for this commit, each a str
Simon Glass259b64f2022-03-02 19:12:24 -070031 patch (str): Filename of the patch file for this commit
Simon Glass61521ca2023-04-24 06:16:00 +120032 future (concurrent.futures.Future): Future object for processing this
33 commit, or None
Simon Glass26132882012-01-14 15:12:45 +000034 """
35 def __init__(self, hash):
36 self.hash = hash
Simon Glass547cba62022-02-11 13:23:18 -070037 self.subject = ''
Simon Glass26132882012-01-14 15:12:45 +000038 self.tags = []
39 self.changes = {}
40 self.cc_list = []
Simon Glass46b34212014-04-20 10:50:14 -060041 self.signoff_set = set()
Albert ARIBAUDd880efd2013-11-12 11:14:41 +010042 self.notes = []
Douglas Anderson52b5ee82019-09-27 09:23:56 -070043 self.change_id = None
Simon Glass08e91be2020-07-05 21:41:57 -060044 self.rtags = collections.defaultdict(set)
Simon Glass6d00f6c2020-10-29 21:46:24 -060045 self.warn = []
Simon Glass259b64f2022-03-02 19:12:24 -070046 self.patch = ''
Simon Glass61521ca2023-04-24 06:16:00 +120047 self.future = None
Simon Glass26132882012-01-14 15:12:45 +000048
Simon Glass5387de32020-10-29 21:46:32 -060049 def __str__(self):
50 return self.subject
51
Simon Glass530ac272022-01-29 14:14:07 -070052 def add_change(self, version, info):
Simon Glass26132882012-01-14 15:12:45 +000053 """Add a new change line to the change list for a version.
54
55 Args:
56 version: Patch set version (integer: 1, 2, 3)
57 info: Description of change in this version
58 """
59 if not self.changes.get(version):
60 self.changes[version] = []
61 self.changes[version].append(info)
62
Simon Glass530ac272022-01-29 14:14:07 -070063 def check_tags(self):
Simon Glass26132882012-01-14 15:12:45 +000064 """Create a list of subject tags in the commit
65
66 Subject tags look like this:
67
Simon Glass14ab6aa2013-03-26 13:09:41 +000068 propounder: fort: Change the widget to propound correctly
Simon Glass26132882012-01-14 15:12:45 +000069
Simon Glass14ab6aa2013-03-26 13:09:41 +000070 Here the tags are propounder and fort. Multiple tags are supported.
71 The list is updated in self.tag.
Simon Glass26132882012-01-14 15:12:45 +000072
73 Returns:
74 None if ok, else the name of a tag with no email alias
75 """
76 str = self.subject
77 m = True
78 while m:
79 m = re_subject_tag.match(str)
80 if m:
81 tag = m.group(1)
82 self.tags.append(tag)
83 str = m.group(2)
84 return None
85
Simon Glass530ac272022-01-29 14:14:07 -070086 def add_cc(self, cc_list):
Simon Glass26132882012-01-14 15:12:45 +000087 """Add a list of people to Cc when we send this patch.
88
89 Args:
90 cc_list: List of aliases or email addresses
91 """
92 self.cc_list += cc_list
Simon Glass46b34212014-04-20 10:50:14 -060093
Simon Glass530ac272022-01-29 14:14:07 -070094 def check_duplicate_signoff(self, signoff):
Simon Glass46b34212014-04-20 10:50:14 -060095 """Check a list of signoffs we have send for this patch
96
97 Args:
98 signoff: Signoff line
99 Returns:
100 True if this signoff is new, False if we have already seen it.
101 """
102 if signoff in self.signoff_set:
103 return False
104 self.signoff_set.add(signoff)
105 return True
Simon Glass08e91be2020-07-05 21:41:57 -0600106
Simon Glass530ac272022-01-29 14:14:07 -0700107 def add_rtag(self, rtag_type, who):
Simon Glass08e91be2020-07-05 21:41:57 -0600108 """Add a response tag to a commit
109
110 Args:
111 key: rtag type (e.g. 'Reviewed-by')
112 who: Person who gave that rtag, e.g. 'Fred Bloggs <fred@bloggs.org>'
113 """
114 self.rtags[rtag_type].add(who)