Merge branch 'master' of git://git.denx.de/u-boot-net
[platform/kernel/u-boot.git] / tools / patman / commit.py
1 # Copyright (c) 2011 The Chromium OS Authors.
2 #
3 # SPDX-License-Identifier:      GPL-2.0+
4 #
5
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     """
26     def __init__(self, hash):
27         self.hash = hash
28         self.subject = None
29         self.tags = []
30         self.changes = {}
31         self.cc_list = []
32         self.signoff_set = set()
33         self.notes = []
34
35     def AddChange(self, version, info):
36         """Add a new change line to the change list for a version.
37
38         Args:
39             version: Patch set version (integer: 1, 2, 3)
40             info: Description of change in this version
41         """
42         if not self.changes.get(version):
43             self.changes[version] = []
44         self.changes[version].append(info)
45
46     def CheckTags(self):
47         """Create a list of subject tags in the commit
48
49         Subject tags look like this:
50
51             propounder: fort: Change the widget to propound correctly
52
53         Here the tags are propounder and fort. Multiple tags are supported.
54         The list is updated in self.tag.
55
56         Returns:
57             None if ok, else the name of a tag with no email alias
58         """
59         str = self.subject
60         m = True
61         while m:
62             m = re_subject_tag.match(str)
63             if m:
64                 tag = m.group(1)
65                 self.tags.append(tag)
66                 str = m.group(2)
67         return None
68
69     def AddCc(self, cc_list):
70         """Add a list of people to Cc when we send this patch.
71
72         Args:
73             cc_list:    List of aliases or email addresses
74         """
75         self.cc_list += cc_list
76
77     def CheckDuplicateSignoff(self, signoff):
78         """Check a list of signoffs we have send for this patch
79
80         Args:
81             signoff:    Signoff line
82         Returns:
83             True if this signoff is new, False if we have already seen it.
84         """
85         if signoff in self.signoff_set:
86           return False
87         self.signoff_set.add(signoff)
88         return True