• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# SPDX-License-Identifier: GPL-2.0+
2# Copyright (c) 2011 The Chromium OS Authors.
3#
4
5import re
6
7# Separates a tag: at the beginning of the subject from the rest of it
8re_subject_tag = re.compile('([^:\s]*):\s*(.*)')
9
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
23        notes: List of lines in the commit (not series) notes
24        change_id: the Change-Id: tag that was stripped from this commit
25            and can be used to generate the Message-Id.
26    """
27    def __init__(self, hash):
28        self.hash = hash
29        self.subject = None
30        self.tags = []
31        self.changes = {}
32        self.cc_list = []
33        self.signoff_set = set()
34        self.notes = []
35        self.change_id = None
36
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
53            propounder: fort: Change the widget to propound correctly
54
55        Here the tags are propounder and fort. Multiple tags are supported.
56        The list is updated in self.tag.
57
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
78
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
91