Prepare v2023.10
[platform/kernel/u-boot.git] / tools / patman / commit.py
1 # SPDX-License-Identifier: GPL-2.0+
2 # Copyright (c) 2011 The Chromium OS Authors.
3 #
4
5 import collections
6 import re
7
8 # Separates a tag: at the beginning of the subject from the rest of it
9 re_subject_tag = re.compile('([^:\s]*):\s*(.*)')
10
11 class 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
24         notes: List of lines in the commit (not series) notes
25         change_id: the Change-Id: tag that was stripped from this commit
26             and can be used to generate the Message-Id.
27         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
30         warn: List of warnings for this commit, each a str
31         patch (str): Filename of the patch file for this commit
32         future (concurrent.futures.Future): Future object for processing this
33             commit, or None
34     """
35     def __init__(self, hash):
36         self.hash = hash
37         self.subject = ''
38         self.tags = []
39         self.changes = {}
40         self.cc_list = []
41         self.signoff_set = set()
42         self.notes = []
43         self.change_id = None
44         self.rtags = collections.defaultdict(set)
45         self.warn = []
46         self.patch = ''
47         self.future = None
48
49     def __str__(self):
50         return self.subject
51
52     def add_change(self, version, info):
53         """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
63     def check_tags(self):
64         """Create a list of subject tags in the commit
65
66         Subject tags look like this:
67
68             propounder: fort: Change the widget to propound correctly
69
70         Here the tags are propounder and fort. Multiple tags are supported.
71         The list is updated in self.tag.
72
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
86     def add_cc(self, cc_list):
87         """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
93
94     def check_duplicate_signoff(self, signoff):
95         """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
106
107     def add_rtag(self, rtag_type, who):
108         """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)