xref: /openbmc/u-boot/tools/patman/commit.py (revision e8f80a5a)
11a459660SWolfgang Denk# SPDX-License-Identifier: GPL-2.0+
2*83d290c5STom Rini# Copyright (c) 2011 The Chromium OS Authors.
30d24de9dSSimon Glass#
40d24de9dSSimon Glass
50d24de9dSSimon Glassimport re
60d24de9dSSimon Glass
70d24de9dSSimon Glass# Separates a tag: at the beginning of the subject from the rest of it
8ed922275SSimon Glassre_subject_tag = re.compile('([^:\s]*):\s*(.*)')
90d24de9dSSimon Glass
100d24de9dSSimon Glassclass Commit:
110d24de9dSSimon Glass    """Holds information about a single commit/patch in the series.
120d24de9dSSimon Glass
130d24de9dSSimon Glass    Args:
140d24de9dSSimon Glass        hash: Commit hash (as a string)
150d24de9dSSimon Glass
160d24de9dSSimon Glass    Variables:
170d24de9dSSimon Glass        hash: Commit hash
180d24de9dSSimon Glass        subject: Subject line
190d24de9dSSimon Glass        tags: List of maintainer tag strings
200d24de9dSSimon Glass        changes: Dict containing a list of changes (single line strings).
210d24de9dSSimon Glass            The dict is indexed by change version (an integer)
220d24de9dSSimon Glass        cc_list: List of people to aliases/emails to cc on this commit
235c8fdd91SAlbert ARIBAUD        notes: List of lines in the commit (not series) notes
240d24de9dSSimon Glass    """
250d24de9dSSimon Glass    def __init__(self, hash):
260d24de9dSSimon Glass        self.hash = hash
270d24de9dSSimon Glass        self.subject = None
280d24de9dSSimon Glass        self.tags = []
290d24de9dSSimon Glass        self.changes = {}
300d24de9dSSimon Glass        self.cc_list = []
31102061bdSSimon Glass        self.signoff_set = set()
325c8fdd91SAlbert ARIBAUD        self.notes = []
330d24de9dSSimon Glass
340d24de9dSSimon Glass    def AddChange(self, version, info):
350d24de9dSSimon Glass        """Add a new change line to the change list for a version.
360d24de9dSSimon Glass
370d24de9dSSimon Glass        Args:
380d24de9dSSimon Glass            version: Patch set version (integer: 1, 2, 3)
390d24de9dSSimon Glass            info: Description of change in this version
400d24de9dSSimon Glass        """
410d24de9dSSimon Glass        if not self.changes.get(version):
420d24de9dSSimon Glass            self.changes[version] = []
430d24de9dSSimon Glass        self.changes[version].append(info)
440d24de9dSSimon Glass
450d24de9dSSimon Glass    def CheckTags(self):
460d24de9dSSimon Glass        """Create a list of subject tags in the commit
470d24de9dSSimon Glass
480d24de9dSSimon Glass        Subject tags look like this:
490d24de9dSSimon Glass
500d99fe0fSSimon Glass            propounder: fort: Change the widget to propound correctly
510d24de9dSSimon Glass
520d99fe0fSSimon Glass        Here the tags are propounder and fort. Multiple tags are supported.
530d99fe0fSSimon Glass        The list is updated in self.tag.
540d24de9dSSimon Glass
550d24de9dSSimon Glass        Returns:
560d24de9dSSimon Glass            None if ok, else the name of a tag with no email alias
570d24de9dSSimon Glass        """
580d24de9dSSimon Glass        str = self.subject
590d24de9dSSimon Glass        m = True
600d24de9dSSimon Glass        while m:
610d24de9dSSimon Glass            m = re_subject_tag.match(str)
620d24de9dSSimon Glass            if m:
630d24de9dSSimon Glass                tag = m.group(1)
640d24de9dSSimon Glass                self.tags.append(tag)
650d24de9dSSimon Glass                str = m.group(2)
660d24de9dSSimon Glass        return None
670d24de9dSSimon Glass
680d24de9dSSimon Glass    def AddCc(self, cc_list):
690d24de9dSSimon Glass        """Add a list of people to Cc when we send this patch.
700d24de9dSSimon Glass
710d24de9dSSimon Glass        Args:
720d24de9dSSimon Glass            cc_list:    List of aliases or email addresses
730d24de9dSSimon Glass        """
740d24de9dSSimon Glass        self.cc_list += cc_list
75102061bdSSimon Glass
76102061bdSSimon Glass    def CheckDuplicateSignoff(self, signoff):
77102061bdSSimon Glass        """Check a list of signoffs we have send for this patch
78102061bdSSimon Glass
79102061bdSSimon Glass        Args:
80102061bdSSimon Glass            signoff:    Signoff line
81102061bdSSimon Glass        Returns:
82102061bdSSimon Glass            True if this signoff is new, False if we have already seen it.
83102061bdSSimon Glass        """
84102061bdSSimon Glass        if signoff in self.signoff_set:
85102061bdSSimon Glass          return False
86102061bdSSimon Glass        self.signoff_set.add(signoff)
87102061bdSSimon Glass        return True
88