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