def testBranch(self): """Test creating patches from a branch""" repo = self.make_git_tree() target = repo.lookup_reference('refs/heads/first') self.repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) control.setup() try: orig_dir = os.getcwd() os.chdir(self.gitdir) # Check that it can detect the current branch self.assertEqual(2, gitutil.CountCommitsToBranch(None)) col = terminal.Color() with capture_sys_output() as _: _, cover_fname, patch_files = control.prepare_patches( col, branch=None, count=-1, start=0, end=0, ignore_binary=False, signoff=True) self.assertIsNone(cover_fname) self.assertEqual(2, len(patch_files)) # Check that it can detect a different branch self.assertEqual(3, gitutil.CountCommitsToBranch('second')) with capture_sys_output() as _: _, cover_fname, patch_files = control.prepare_patches( col, branch='second', count=-1, start=0, end=0, ignore_binary=False, signoff=True) self.assertIsNotNone(cover_fname) self.assertEqual(3, len(patch_files)) # Check that it can skip patches at the end with capture_sys_output() as _: _, cover_fname, patch_files = control.prepare_patches( col, branch='second', count=-1, start=0, end=1, ignore_binary=False, signoff=True) self.assertIsNotNone(cover_fname) self.assertEqual(2, len(patch_files)) finally: os.chdir(orig_dir)
def patchwork_status(branch, count, start, end, dest_branch, force, show_comments, url): """Check the status of patches in patchwork This finds the series in patchwork using the Series-link tag, checks for new comments and review tags, displays then and creates a new branch with the review tags. Args: branch (str): Branch to create patches from (None = current) count (int): Number of patches to produce, or -1 to produce patches for the current branch back to the upstream commit start (int): Start partch to use (0=first / top of branch) end (int): End patch to use (0=last one in series, 1=one before that, etc.) dest_branch (str): Name of new branch to create with the updated tags (None to not create a branch) force (bool): With dest_branch, force overwriting an existing branch show_comments (bool): True to display snippets from the comments provided by reviewers url (str): URL of patchwork server, e.g. 'https://patchwork.ozlabs.org'. This is ignored if the series provides a Series-patchwork-url tag. Raises: ValueError: if the branch has no Series-link value """ if count == -1: # Work out how many patches to send if we can count = (gitutil.CountCommitsToBranch(branch) - start) series = patchstream.get_metadata(branch, start, count - end) warnings = 0 for cmt in series.commits: if cmt.warn: print('%d warnings for %s:' % (len(cmt.warn), cmt.hash)) for warn in cmt.warn: print('\t', warn) warnings += 1 print if warnings: raise ValueError('Please fix warnings before running status') links = series.get('links') if not links: raise ValueError("Branch has no Series-links value") # Find the link without a version number (we don't support versions yet) found = [link for link in links.split() if not ':' in link] if not found: raise ValueError('Series-links has no current version (without :)') # Allow the series to override the URL if 'patchwork_url' in series: url = series.patchwork_url # Import this here to avoid failing on other commands if the dependencies # are not present from patman import status status.check_patchwork_status(series, found[0], branch, dest_branch, force, show_comments, url)
def testNoUpstream(self): """Test CountCommitsToBranch when there is no upstream""" repo = self.make_git_tree() target = repo.lookup_reference('refs/heads/base') self.repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) # Check that it can detect the current branch try: orig_dir = os.getcwd() os.chdir(self.gitdir) with self.assertRaises(ValueError) as exc: gitutil.CountCommitsToBranch(None) self.assertIn( "Failed to determine upstream: fatal: no upstream configured for branch 'base'", str(exc.exception)) finally: os.chdir(orig_dir)
def prepare_patches(col, branch, count, start, end, ignore_binary, signoff): """Figure out what patches to generate, then generate them The patch files are written to the current directory, e.g. 0001_xxx.patch 0002_yyy.patch Args: col (terminal.Color): Colour output object branch (str): Branch to create patches from (None = current) count (int): Number of patches to produce, or -1 to produce patches for the current branch back to the upstream commit start (int): Start partch to use (0=first / top of branch) end (int): End patch to use (0=last one in series, 1=one before that, etc.) ignore_binary (bool): Don't generate patches for binary files Returns: Tuple: Series object for this series (set of patches) Filename of the cover letter as a string (None if none) patch_files: List of patch filenames, each a string, e.g. ['0001_xxx.patch', '0002_yyy.patch'] """ if count == -1: # Work out how many patches to send if we can count = (gitutil.CountCommitsToBranch(branch) - start) if not count: str = 'No commits found to process - please use -c flag, or run:\n' \ ' git branch --set-upstream-to remote/branch' sys.exit(col.Color(col.RED, str)) # Read the metadata from the commits to_do = count - end series = patchstream.get_metadata(branch, start, to_do) cover_fname, patch_files = gitutil.CreatePatches(branch, start, to_do, ignore_binary, series, signoff) # Fix up the patch files to our liking, and insert the cover letter patchstream.fix_patches(series, patch_files) if cover_fname and series.get('cover'): patchstream.insert_cover_letter(cover_fname, series, to_do) return series, cover_fname, patch_files
elif options.full_help: pager = os.getenv('PAGER') if not pager: pager = 'more' fname = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'README') command.Run(pager, fname) # Process commits, produce patches files, check them, email them else: gitutil.Setup() if options.count == -1: # Work out how many patches to send if we can options.count = gitutil.CountCommitsToBranch() - options.start col = terminal.Color() if not options.count: str = 'No commits found to process - please use -c flag' sys.exit(col.Color(col.RED, str)) # Read the metadata from the commits if options.count: series = patchstream.GetMetaData(options.start, options.count) cover_fname, args = gitutil.CreatePatches(options.start, options.count, series) # Fix up the patch files to our liking, and insert the cover letter patchstream.FixPatches(series, args) if cover_fname and series.get('cover'):