def testCompareSeries(self): """Test operation of compare_with_series()""" commit1 = Commit('abcd') commit1.subject = 'Subject 1' commit2 = Commit('ef12') commit2.subject = 'Subject 2' commit3 = Commit('3456') commit3.subject = 'Subject 2' patch1 = status.Patch('1') patch1.subject = 'Subject 1' patch2 = status.Patch('2') patch2.subject = 'Subject 2' patch3 = status.Patch('3') patch3.subject = 'Subject 2' series = Series() series.commits = [commit1] patches = [patch1] patch_for_commit, commit_for_patch, warnings = ( status.compare_with_series(series, patches)) self.assertEqual(1, len(patch_for_commit)) self.assertEqual(patch1, patch_for_commit[0]) self.assertEqual(1, len(commit_for_patch)) self.assertEqual(commit1, commit_for_patch[0]) series.commits = [commit1] patches = [patch1, patch2] patch_for_commit, commit_for_patch, warnings = ( status.compare_with_series(series, patches)) self.assertEqual(1, len(patch_for_commit)) self.assertEqual(patch1, patch_for_commit[0]) self.assertEqual(1, len(commit_for_patch)) self.assertEqual(commit1, commit_for_patch[0]) self.assertEqual(["Cannot find commit for patch 2 ('Subject 2')"], warnings) series.commits = [commit1, commit2] patches = [patch1] patch_for_commit, commit_for_patch, warnings = ( status.compare_with_series(series, patches)) self.assertEqual(1, len(patch_for_commit)) self.assertEqual(patch1, patch_for_commit[0]) self.assertEqual(1, len(commit_for_patch)) self.assertEqual(commit1, commit_for_patch[0]) self.assertEqual(["Cannot find patch for commit 2 ('Subject 2')"], warnings) series.commits = [commit1, commit2, commit3] patches = [patch1, patch2] patch_for_commit, commit_for_patch, warnings = ( status.compare_with_series(series, patches)) self.assertEqual(2, len(patch_for_commit)) self.assertEqual(patch1, patch_for_commit[0]) self.assertEqual(patch2, patch_for_commit[1]) self.assertEqual(1, len(commit_for_patch)) self.assertEqual(commit1, commit_for_patch[0]) self.assertEqual(["Cannot find patch for commit 3 ('Subject 2')", "Multiple commits match patch 2 ('Subject 2'):\n" ' Subject 2\n Subject 2'], warnings) series.commits = [commit1, commit2] patches = [patch1, patch2, patch3] patch_for_commit, commit_for_patch, warnings = ( status.compare_with_series(series, patches)) self.assertEqual(1, len(patch_for_commit)) self.assertEqual(patch1, patch_for_commit[0]) self.assertEqual(2, len(commit_for_patch)) self.assertEqual(commit1, commit_for_patch[0]) self.assertEqual(["Multiple patches match commit 2 ('Subject 2'):\n" ' Subject 2\n Subject 2', "Cannot find commit for patch 3 ('Subject 2')"], warnings)
def testParseSubject(self): """Test parsing of the patch subject""" patch = status.Patch('1') # Simple patch not in a series patch.parse_subject('Testing') self.assertEqual('Testing', patch.raw_subject) self.assertEqual('Testing', patch.subject) self.assertEqual(1, patch.seq) self.assertEqual(1, patch.count) self.assertEqual(None, patch.prefix) self.assertEqual(None, patch.version) # First patch in a series patch.parse_subject('[1/2] Testing') self.assertEqual('[1/2] Testing', patch.raw_subject) self.assertEqual('Testing', patch.subject) self.assertEqual(1, patch.seq) self.assertEqual(2, patch.count) self.assertEqual(None, patch.prefix) self.assertEqual(None, patch.version) # Second patch in a series patch.parse_subject('[2/2] Testing') self.assertEqual('Testing', patch.subject) self.assertEqual(2, patch.seq) self.assertEqual(2, patch.count) self.assertEqual(None, patch.prefix) self.assertEqual(None, patch.version) # RFC patch patch.parse_subject('[RFC,3/7] Testing') self.assertEqual('Testing', patch.subject) self.assertEqual(3, patch.seq) self.assertEqual(7, patch.count) self.assertEqual('RFC', patch.prefix) self.assertEqual(None, patch.version) # Version patch patch.parse_subject('[v2,3/7] Testing') self.assertEqual('Testing', patch.subject) self.assertEqual(3, patch.seq) self.assertEqual(7, patch.count) self.assertEqual(None, patch.prefix) self.assertEqual('v2', patch.version) # All fields patch.parse_subject('[RESEND,v2,3/7] Testing') self.assertEqual('Testing', patch.subject) self.assertEqual(3, patch.seq) self.assertEqual(7, patch.count) self.assertEqual('RESEND', patch.prefix) self.assertEqual('v2', patch.version) # RFC only patch.parse_subject('[RESEND] Testing') self.assertEqual('Testing', patch.subject) self.assertEqual(1, patch.seq) self.assertEqual(1, patch.count) self.assertEqual('RESEND', patch.prefix) self.assertEqual(None, patch.version)
def testCreateBranch(self): """Test operation of create_branch()""" repo = self.make_git_tree() branch = 'first' dest_branch = 'first2' count = 2 gitdir = os.path.join(self.gitdir, '.git') # Set up the test git tree. We use branch 'first' which has two commits # in it series = patchstream.get_metadata_for_list(branch, gitdir, count) self.assertEqual(2, len(series.commits)) patch1 = status.Patch('1') patch1.parse_subject('[1/2] %s' % series.commits[0].subject) patch1.name = patch1.raw_subject patch1.content = 'This is my patch content' comment1a = {'content': 'Reviewed-by: %s\n' % self.joe} patch1.comments = [comment1a] patch2 = status.Patch('2') patch2.parse_subject('[2/2] %s' % series.commits[1].subject) patch2.name = patch2.raw_subject patch2.content = 'Some other patch content' comment2a = { 'content': 'Reviewed-by: %s\nTested-by: %s\n' % (self.mary, self.leb) } comment2b = {'content': 'Reviewed-by: %s' % self.fred} patch2.comments = [comment2a, comment2b] # This test works by setting up patches for use by the fake Rest API # function _fake_patchwork3(). The fake patch comments above should # result in new review tags that are collected and added to the commits # created in the destination branch. self.patches = [patch1, patch2] count = 2 # Expected output: # 1 i2c: I2C things # + Reviewed-by: Joe Bloggs <*****@*****.**> # 2 spi: SPI fixes # + Reviewed-by: Fred Bloggs <*****@*****.**> # + Reviewed-by: Mary Bloggs <*****@*****.**> # + Tested-by: Lord Edmund Blackaddër <*****@*****.**> # 4 new responses available in patchwork # 4 responses added from patchwork into new branch 'first2' # <unittest.result.TestResult run=8 errors=0 failures=0> terminal.SetPrintTestMode() status.check_patchwork_status(series, '1234', branch, dest_branch, False, False, self._fake_patchwork3, repo) lines = terminal.GetPrintTestLines() self.assertEqual(12, len(lines)) self.assertEqual( "4 responses added from patchwork into new branch 'first2'", lines[11].text) # Check that the destination branch has the new tags new_series = patchstream.get_metadata_for_list(dest_branch, gitdir, count) self.assertEqual({'Reviewed-by': {self.joe}}, new_series.commits[0].rtags) self.assertEqual( { 'Tested-by': {self.leb}, 'Reviewed-by': {self.fred, self.mary} }, new_series.commits[1].rtags) # Now check the actual test of the first commit message. We expect to # see the new tags immediately below the old ones. stdout = patchstream.get_list(dest_branch, count=count, git_dir=gitdir) lines = iter( [line.strip() for line in stdout.splitlines() if '-by:' in line]) # First patch should have the review tag self.assertEqual('Reviewed-by: %s' % self.joe, next(lines)) # Second patch should have the sign-off then the tested-by and two # reviewed-by tags self.assertEqual('Signed-off-by: %s' % self.leb, next(lines)) self.assertEqual('Reviewed-by: %s' % self.fred, next(lines)) self.assertEqual('Reviewed-by: %s' % self.mary, next(lines)) self.assertEqual('Tested-by: %s' % self.leb, next(lines))
def testReviewSnippets(self): """Test showing of review snippets""" def _to_submitter(who): m_who = re.match('(.*) <(.*)>', who) return { 'name': m_who.group(1), 'email': m_who.group(2) } commit1 = Commit('abcd') commit1.subject = 'Subject 1' commit2 = Commit('ef12') commit2.subject = 'Subject 2' patch1 = status.Patch('1') patch1.parse_subject('[1/2] Subject 1') patch1.name = patch1.raw_subject patch1.content = 'This is my patch content' comment1a = {'submitter': _to_submitter(self.joe), 'content': '''Hi Fred, On some date Fred wrote: > diff --git a/file.c b/file.c > Some code > and more code Here is my comment above the above... Reviewed-by: %s ''' % self.joe} patch1.comments = [comment1a] patch2 = status.Patch('2') patch2.parse_subject('[2/2] Subject 2') patch2.name = patch2.raw_subject patch2.content = 'Some other patch content' comment2a = { 'content': 'Reviewed-by: %s\nTested-by: %s\n' % (self.mary, self.leb)} comment2b = {'submitter': _to_submitter(self.fred), 'content': '''Hi Fred, On some date Fred wrote: > diff --git a/tools/patman/commit.py b/tools/patman/commit.py > @@ -41,6 +41,9 @@ class Commit: > self.rtags = collections.defaultdict(set) > self.warn = [] > > + def __str__(self): > + return self.subject > + > def AddChange(self, version, info): > """Add a new change line to the change list for a version. > A comment Reviewed-by: %s ''' % self.fred} patch2.comments = [comment2a, comment2b] # This test works by setting up commits and patch for use by the fake # Rest API function _fake_patchwork2(). It calls various functions in # the status module after setting up tags in the commits, checking that # things behaves as expected self.commits = [commit1, commit2] self.patches = [patch1, patch2] # Check that the output patches expectations: # 1 Subject 1 # Reviewed-by: Joe Bloggs <*****@*****.**> # 2 Subject 2 # Tested-by: Lord Edmund Blackaddër <*****@*****.**> # Reviewed-by: Fred Bloggs <*****@*****.**> # + Reviewed-by: Mary Bloggs <*****@*****.**> # 1 new response available in patchwork series = Series() series.commits = [commit1, commit2] terminal.SetPrintTestMode() status.check_patchwork_status(series, '1234', None, None, False, True, None, self._fake_patchwork2) lines = iter(terminal.GetPrintTestLines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), next(lines)) self.assertEqual(terminal.PrintLine(self.joe, col.WHITE), next(lines)) self.assertEqual(terminal.PrintLine('Review: %s' % self.joe, col.RED), next(lines)) self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(lines)) self.assertEqual(terminal.PrintLine('', None), next(lines)) self.assertEqual(terminal.PrintLine(' > File: file.c', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine(' > Some code', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine(' > and more code', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' Here is my comment above the above...', None), next(lines)) self.assertEqual(terminal.PrintLine('', None), next(lines)) self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), next(lines)) self.assertEqual(terminal.PrintLine(self.fred, col.WHITE), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), next(lines)) self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), next(lines)) self.assertEqual( terminal.PrintLine(' + Tested-by: ', col.GREEN, newline=False), next(lines)) self.assertEqual(terminal.PrintLine(self.leb, col.WHITE), next(lines)) self.assertEqual(terminal.PrintLine('Review: %s' % self.fred, col.RED), next(lines)) self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(lines)) self.assertEqual(terminal.PrintLine('', None), next(lines)) self.assertEqual(terminal.PrintLine( ' > File: tools/patman/commit.py', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' > Line: 41 / 41: class Commit:', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' > + return self.subject', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' > +', col.MAGENTA), next(lines)) self.assertEqual( terminal.PrintLine(' > def AddChange(self, version, info):', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' > """Add a new change line to the change list for a version.', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' >', col.MAGENTA), next(lines)) self.assertEqual(terminal.PrintLine( ' A comment', None), next(lines)) self.assertEqual(terminal.PrintLine('', None), next(lines)) self.assertEqual(terminal.PrintLine( '4 new responses available in patchwork (use -d to write them to a new branch)', None), next(lines))
def testFindNewResponses(self): """Test operation of find_new_responses()""" commit1 = Commit('abcd') commit1.subject = 'Subject 1' commit2 = Commit('ef12') commit2.subject = 'Subject 2' patch1 = status.Patch('1') patch1.parse_subject('[1/2] Subject 1') patch1.name = patch1.raw_subject patch1.content = 'This is my patch content' comment1a = {'content': 'Reviewed-by: %s\n' % self.joe} patch1.comments = [comment1a] patch2 = status.Patch('2') patch2.parse_subject('[2/2] Subject 2') patch2.name = patch2.raw_subject patch2.content = 'Some other patch content' comment2a = { 'content': 'Reviewed-by: %s\nTested-by: %s\n' % (self.mary, self.leb) } comment2b = {'content': 'Reviewed-by: %s' % self.fred} patch2.comments = [comment2a, comment2b] # This test works by setting up commits and patch for use by the fake # Rest API function _fake_patchwork2(). It calls various functions in # the status module after setting up tags in the commits, checking that # things behaves as expected self.commits = [commit1, commit2] self.patches = [patch1, patch2] count = 2 new_rtag_list = [None] * count review_list = [None, None] # Check that the tags are picked up on the first patch status.find_new_responses(new_rtag_list, review_list, 0, commit1, patch1, self._fake_patchwork2) self.assertEqual(new_rtag_list[0], {'Reviewed-by': {self.joe}}) # Now the second patch status.find_new_responses(new_rtag_list, review_list, 1, commit2, patch2, self._fake_patchwork2) self.assertEqual(new_rtag_list[1], { 'Reviewed-by': {self.mary, self.fred}, 'Tested-by': {self.leb} }) # Now add some tags to the commit, which means they should not appear as # 'new' tags when scanning comments new_rtag_list = [None] * count commit1.rtags = {'Reviewed-by': {self.joe}} status.find_new_responses(new_rtag_list, review_list, 0, commit1, patch1, self._fake_patchwork2) self.assertEqual(new_rtag_list[0], {}) # For the second commit, add Ed and Fred, so only Mary should be left commit2.rtags = {'Tested-by': {self.leb}, 'Reviewed-by': {self.fred}} status.find_new_responses(new_rtag_list, review_list, 1, commit2, patch2, self._fake_patchwork2) self.assertEqual(new_rtag_list[1], {'Reviewed-by': {self.mary}}) # Check that the output patches expectations: # 1 Subject 1 # Reviewed-by: Joe Bloggs <*****@*****.**> # 2 Subject 2 # Tested-by: Lord Edmund Blackaddër <*****@*****.**> # Reviewed-by: Fred Bloggs <*****@*****.**> # + Reviewed-by: Mary Bloggs <*****@*****.**> # 1 new response available in patchwork series = Series() series.commits = [commit1, commit2] terminal.SetPrintTestMode() status.check_patchwork_status(series, '1234', None, None, False, False, self._fake_patchwork2) lines = iter(terminal.GetPrintTestLines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), next(lines)) self.assertEqual( terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, bright=False), next(lines)) self.assertEqual(terminal.PrintLine(self.joe, col.WHITE, bright=False), next(lines)) self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), next(lines)) self.assertEqual( terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, bright=False), next(lines)) self.assertEqual( terminal.PrintLine(self.fred, col.WHITE, bright=False), next(lines)) self.assertEqual( terminal.PrintLine(' Tested-by: ', col.GREEN, newline=False, bright=False), next(lines)) self.assertEqual(terminal.PrintLine(self.leb, col.WHITE, bright=False), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), next(lines)) self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), next(lines)) self.assertEqual( terminal.PrintLine( '1 new response available in patchwork (use -d to write them to a new branch)', None), next(lines))