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