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