def GetMetaDataForList(commit_range, git_dir=None, count=None, series=None, allow_overwrite=False): """Reads out patch series metadata from the commits This does a 'git log' on the relevant commits and pulls out the tags we are interested in. Args: commit_range: Range of commits to count (e.g. 'HEAD..base') git_dir: Path to git repositiory (None to use default) count: Number of commits to list, or None for no limit series: Series object to add information into. By default a new series is started. allow_overwrite: Allow tags to overwrite an existing tag Returns: A Series object containing information about the commits. """ if not series: series = Series() series.allow_overwrite = allow_overwrite params = gitutil.LogCmd(commit_range, reverse=True, count=count, git_dir=git_dir) stdout = command.RunPipe([params], capture=True).stdout ps = PatchStream(series, is_log=True) for line in stdout.splitlines(): ps.ProcessLine(line) ps.Finalize() return series
def get_metadata_for_list(commit_range, git_dir=None, count=None, series=None, allow_overwrite=False): """Reads out patch series metadata from the commits This does a 'git log' on the relevant commits and pulls out the tags we are interested in. Args: commit_range (str): Range of commits to count (e.g. 'HEAD..base') git_dir (str): Path to git repositiory (None to use default) count (int): Number of commits to list, or None for no limit series (Series): Object to add information into. By default a new series is started. allow_overwrite (bool): Allow tags to overwrite an existing tag Returns: Series: Object containing information about the commits. """ if not series: series = Series() series.allow_overwrite = allow_overwrite stdout = get_list(commit_range, git_dir, count) pst = PatchStream(series, is_log=True) for line in stdout.splitlines(): pst.process_line(line) pst.finalise() return series
def testStatusReadPatch(self): """Test handling a single patch in Patchwork""" series = Series() series.commits = [Commit('abcd')] patches = status.collect_patches(series, 1234, self._fake_patchwork) self.assertEqual(1, len(patches)) patch = patches[0] self.assertEqual('1', patch.id) self.assertEqual('Some patch', patch.raw_subject)
def test_status_mismatch(self): """Test Patchwork patches not matching the series""" series = Series() with capture_sys_output() as (_, err): status.collect_patches(series, 1234, None, self._fake_patchwork) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue())
def GetMetaDataForTest(text): """Process metadata from a file containing a git log. Used for tests Args: text: """ series = Series() ps = PatchStream(series, is_log=True) for line in text.splitlines(): ps.ProcessLine(line) ps.Finalize() return series
def get_metadata_for_test(text): """Process metadata from a file containing a git log. Used for tests Args: text: Returns: Series: Object containing information about the commits. """ series = Series() pst = PatchStream(series, is_log=True) for line in text.splitlines(): pst.process_line(line) pst.finalise() return series
def process_text(text, is_comment=False): """Process some text through this class using a default Commit/Series Args: text (str): Text to parse is_comment (bool): True if this is a comment rather than a patch. If True, PatchStream doesn't expect a patch subject at the start, but jumps straight into the body Returns: PatchStream: object with results """ pstrm = PatchStream(Series()) pstrm.commit = commit.Commit(None) infd = io.StringIO(text) outfd = io.StringIO() if is_comment: pstrm.state = STATE_PATCH_HEADER pstrm.process_stream(infd, outfd) return pstrm
def test_find_new_responses(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, None, 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, None, 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, None, 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, None, 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.set_print_test_mode() status.check_patchwork_status(series, '1234', None, None, False, False, None, self._fake_patchwork2) lines = iter(terminal.get_print_test_lines()) 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))
def test_compare_series(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 test_review_snippets(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 add_change(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.set_print_test_mode() status.check_patchwork_status(series, '1234', None, None, False, True, None, self._fake_patchwork2) lines = iter(terminal.get_print_test_lines()) 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 add_change(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))