xref: /OK3568_Linux_fs/u-boot/tools/patman/commit.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Copyright (c) 2011 The Chromium OS Authors.
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# SPDX-License-Identifier:	GPL-2.0+
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun
6*4882a593Smuzhiyunimport re
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun# Separates a tag: at the beginning of the subject from the rest of it
9*4882a593Smuzhiyunre_subject_tag = re.compile('([^:\s]*):\s*(.*)')
10*4882a593Smuzhiyun
11*4882a593Smuzhiyunclass Commit:
12*4882a593Smuzhiyun    """Holds information about a single commit/patch in the series.
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun    Args:
15*4882a593Smuzhiyun        hash: Commit hash (as a string)
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun    Variables:
18*4882a593Smuzhiyun        hash: Commit hash
19*4882a593Smuzhiyun        subject: Subject line
20*4882a593Smuzhiyun        tags: List of maintainer tag strings
21*4882a593Smuzhiyun        changes: Dict containing a list of changes (single line strings).
22*4882a593Smuzhiyun            The dict is indexed by change version (an integer)
23*4882a593Smuzhiyun        cc_list: List of people to aliases/emails to cc on this commit
24*4882a593Smuzhiyun        notes: List of lines in the commit (not series) notes
25*4882a593Smuzhiyun    """
26*4882a593Smuzhiyun    def __init__(self, hash):
27*4882a593Smuzhiyun        self.hash = hash
28*4882a593Smuzhiyun        self.subject = None
29*4882a593Smuzhiyun        self.tags = []
30*4882a593Smuzhiyun        self.changes = {}
31*4882a593Smuzhiyun        self.cc_list = []
32*4882a593Smuzhiyun        self.signoff_set = set()
33*4882a593Smuzhiyun        self.notes = []
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun    def AddChange(self, version, info):
36*4882a593Smuzhiyun        """Add a new change line to the change list for a version.
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun        Args:
39*4882a593Smuzhiyun            version: Patch set version (integer: 1, 2, 3)
40*4882a593Smuzhiyun            info: Description of change in this version
41*4882a593Smuzhiyun        """
42*4882a593Smuzhiyun        if not self.changes.get(version):
43*4882a593Smuzhiyun            self.changes[version] = []
44*4882a593Smuzhiyun        self.changes[version].append(info)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun    def CheckTags(self):
47*4882a593Smuzhiyun        """Create a list of subject tags in the commit
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun        Subject tags look like this:
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun            propounder: fort: Change the widget to propound correctly
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun        Here the tags are propounder and fort. Multiple tags are supported.
54*4882a593Smuzhiyun        The list is updated in self.tag.
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun        Returns:
57*4882a593Smuzhiyun            None if ok, else the name of a tag with no email alias
58*4882a593Smuzhiyun        """
59*4882a593Smuzhiyun        str = self.subject
60*4882a593Smuzhiyun        m = True
61*4882a593Smuzhiyun        while m:
62*4882a593Smuzhiyun            m = re_subject_tag.match(str)
63*4882a593Smuzhiyun            if m:
64*4882a593Smuzhiyun                tag = m.group(1)
65*4882a593Smuzhiyun                self.tags.append(tag)
66*4882a593Smuzhiyun                str = m.group(2)
67*4882a593Smuzhiyun        return None
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun    def AddCc(self, cc_list):
70*4882a593Smuzhiyun        """Add a list of people to Cc when we send this patch.
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun        Args:
73*4882a593Smuzhiyun            cc_list:    List of aliases or email addresses
74*4882a593Smuzhiyun        """
75*4882a593Smuzhiyun        self.cc_list += cc_list
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun    def CheckDuplicateSignoff(self, signoff):
78*4882a593Smuzhiyun        """Check a list of signoffs we have send for this patch
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun        Args:
81*4882a593Smuzhiyun            signoff:    Signoff line
82*4882a593Smuzhiyun        Returns:
83*4882a593Smuzhiyun            True if this signoff is new, False if we have already seen it.
84*4882a593Smuzhiyun        """
85*4882a593Smuzhiyun        if signoff in self.signoff_set:
86*4882a593Smuzhiyun          return False
87*4882a593Smuzhiyun        self.signoff_set.add(signoff)
88*4882a593Smuzhiyun        return True
89