def CreatePatches(start, count, series): """Create a series of patches from the top of the current branch. The patch files are written to the current directory using git format-patch. Args: start: Commit to start from: 0=HEAD, 1=next one, etc. count: number of commits to include Return: Filename of cover letter List of filenames of patch files """ if series.get('version'): version = '%s ' % series['version'] cmd = ['git', 'format-patch', '-M', '--signoff'] if series.get('cover'): cmd.append('--cover-letter') prefix = series.GetPatchPrefix() if prefix: cmd += ['--subject-prefix=%s' % prefix] cmd += ['HEAD~%d..HEAD~%d' % (start + count, start)] stdout = command.RunList(cmd) files = stdout.splitlines() # We have an extra file if there is a cover letter if series.get('cover'): return files[0], files[1:] else: return None, files
def EmailPatches(series, cover_fname, args, dry_run, raise_on_error, cc_fname, self_only=False, alias=None, in_reply_to=None): """Email a patch series. Args: series: Series object containing destination info cover_fname: filename of cover letter args: list of filenames of patch files dry_run: Just return the command that would be run raise_on_error: True to raise an error when an alias fails to match, False to just print a message. cc_fname: Filename of Cc file for per-commit Cc self_only: True to just email to yourself as a test in_reply_to: If set we'll pass this to git as --in-reply-to. Should be a message ID that this is in reply to. Returns: Git command that was/would be run # For the duration of this doctest pretend that we ran patman with ./patman >>> _old_argv0 = sys.argv[0] >>> sys.argv[0] = './patman' >>> alias = {} >>> alias['fred'] = ['*****@*****.**'] >>> alias['john'] = ['*****@*****.**'] >>> alias['mary'] = ['*****@*****.**'] >>> alias['boys'] = ['fred', ' john'] >>> alias['all'] = ['fred ', 'john', ' mary '] >>> alias[os.getenv('USER')] = ['*****@*****.**'] >>> series = series.Series() >>> series.to = ['fred'] >>> series.cc = ['mary'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \ False, alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, None, ['p1'], True, True, 'cc-fname', False, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" p1' >>> series.cc = ['all'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \ True, alias) 'git send-email --annotate --to "*****@*****.**" --cc-cmd "./patman \ --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \ False, alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' # Restore argv[0] since we clobbered it. >>> sys.argv[0] = _old_argv0 """ to = BuildEmailList(series.get('to'), '--to', alias, raise_on_error) if not to: git_config_to = command.Output('git', 'config', 'sendemail.to') if not git_config_to: print( "No recipient.\n" "Please add something like this to a commit\n" "Series-to: Fred Bloggs <*****@*****.**>\n" "Or do something like this\n" "git config sendemail.to [email protected]") return cc = BuildEmailList(series.get('cc'), '--cc', alias, raise_on_error) if self_only: to = BuildEmailList([os.getenv('USER')], '--to', alias, raise_on_error) cc = [] cmd = ['git', 'send-email', '--annotate'] if in_reply_to: cmd.append('--in-reply-to="%s"' % in_reply_to) cmd += to cmd += cc cmd += ['--cc-cmd', '"%s --cc-cmd %s"' % (sys.argv[0], cc_fname)] if cover_fname: cmd.append(cover_fname) cmd += args str = ' '.join(cmd) if not dry_run: os.system(str) return str
def EmailPatches(series, cover_fname, args, dry_run, raise_on_error, cc_fname, self_only=False, alias=None, in_reply_to=None): """Email a patch series. Args: series: Series object containing destination info cover_fname: filename of cover letter args: list of filenames of patch files dry_run: Just return the command that would be run raise_on_error: True to raise an error when an alias fails to match, False to just print a message. cc_fname: Filename of Cc file for per-commit Cc self_only: True to just email to yourself as a test in_reply_to: If set we'll pass this to git as --in-reply-to. Should be a message ID that this is in reply to. Returns: Git command that was/would be run # For the duration of this doctest pretend that we ran patman with ./patman >>> _old_argv0 = sys.argv[0] >>> sys.argv[0] = './patman' >>> alias = {} >>> alias['fred'] = ['*****@*****.**'] >>> alias['john'] = ['*****@*****.**'] >>> alias['mary'] = ['*****@*****.**'] >>> alias['boys'] = ['fred', ' john'] >>> alias['all'] = ['fred ', 'john', ' mary '] >>> alias[os.getenv('USER')] = ['*****@*****.**'] >>> series = series.Series() >>> series.to = ['fred'] >>> series.cc = ['mary'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \ False, alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, None, ['p1'], True, True, 'cc-fname', False, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" p1' >>> series.cc = ['all'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \ True, alias) 'git send-email --annotate --to "*****@*****.**" --cc-cmd "./patman \ --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, True, 'cc-fname', \ False, alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' # Restore argv[0] since we clobbered it. >>> sys.argv[0] = _old_argv0 """ to = BuildEmailList(series.get('to'), '--to', alias, raise_on_error) if not to: git_config_to = command.Output('git', 'config', 'sendemail.to') if not git_config_to: print ("No recipient.\n" "Please add something like this to a commit\n" "Series-to: Fred Bloggs <*****@*****.**>\n" "Or do something like this\n" "git config sendemail.to [email protected]") return cc = BuildEmailList(series.get('cc'), '--cc', alias, raise_on_error) if self_only: to = BuildEmailList([os.getenv('USER')], '--to', alias, raise_on_error) cc = [] cmd = ['git', 'send-email', '--annotate'] if in_reply_to: cmd.append('--in-reply-to="%s"' % in_reply_to) cmd += to cmd += cc cmd += ['--cc-cmd', '"%s --cc-cmd %s"' % (sys.argv[0], cc_fname)] if cover_fname: cmd.append(cover_fname) cmd += args str = ' '.join(cmd) if not dry_run: os.system(str) return str
def EmailPatches(series, cover_fname, args, dry_run, cc_fname, self_only=False, alias=None): """Email a patch series. Args: series: Series object containing destination info cover_fname: filename of cover letter args: list of filenames of patch files dry_run: Just return the command that would be run cc_fname: Filename of Cc file for per-commit Cc self_only: True to just email to yourself as a test Returns: Git command that was/would be run >>> alias = {} >>> alias['fred'] = ['*****@*****.**'] >>> alias['john'] = ['*****@*****.**'] >>> alias['mary'] = ['*****@*****.**'] >>> alias['boys'] = ['fred', ' john'] >>> alias['all'] = ['fred ', 'john', ' mary '] >>> alias[os.getenv('USER')] = ['*****@*****.**'] >>> series = series.Series() >>> series.to = ['fred'] >>> series.cc = ['mary'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', False, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, None, ['p1'], True, 'cc-fname', False, alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" p1' >>> series.cc = ['all'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', True, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc-cmd "./patman \ --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', False, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' """ to = BuildEmailList(series.get('to'), '--to', alias) if not to: print( "No recipient, please add something like this to a commit\n" "Series-to: Fred Bloggs <*****@*****.**>") return cc = BuildEmailList(series.get('cc'), '--cc', alias) if self_only: to = BuildEmailList([os.getenv('USER')], '--to', alias) cc = [] cmd = ['git', 'send-email', '--annotate'] cmd += to cmd += cc cmd += ['--cc-cmd', '"%s --cc-cmd %s"' % (sys.argv[0], cc_fname)] if cover_fname: cmd.append(cover_fname) cmd += args str = ' '.join(cmd) if not dry_run: os.system(str) return str
def EmailPatches(series, cover_fname, args, dry_run, cc_fname, self_only=False, alias=None): """Email a patch series. Args: series: Series object containing destination info cover_fname: filename of cover letter args: list of filenames of patch files dry_run: Just return the command that would be run cc_fname: Filename of Cc file for per-commit Cc self_only: True to just email to yourself as a test Returns: Git command that was/would be run >>> alias = {} >>> alias['fred'] = ['*****@*****.**'] >>> alias['john'] = ['*****@*****.**'] >>> alias['mary'] = ['*****@*****.**'] >>> alias['boys'] = ['fred', ' john'] >>> alias['all'] = ['fred ', 'john', ' mary '] >>> alias[os.getenv('USER')] = ['*****@*****.**'] >>> series = series.Series() >>> series.to = ['fred'] >>> series.cc = ['mary'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', False, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, None, ['p1'], True, 'cc-fname', False, alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" p1' >>> series.cc = ['all'] >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', True, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc-cmd "./patman \ --cc-cmd cc-fname" cover p1 p2' >>> EmailPatches(series, 'cover', ['p1', 'p2'], True, 'cc-fname', False, \ alias) 'git send-email --annotate --to "*****@*****.**" --cc \ "*****@*****.**" --cc "*****@*****.**" --cc \ "*****@*****.**" --cc-cmd "./patman --cc-cmd cc-fname" cover p1 p2' """ to = BuildEmailList(series.get('to'), '--to', alias) if not to: print ("No recipient, please add something like this to a commit\n" "Series-to: Fred Bloggs <*****@*****.**>") return cc = BuildEmailList(series.get('cc'), '--cc', alias) if self_only: to = BuildEmailList([os.getenv('USER')], '--to', alias) cc = [] cmd = ['git', 'send-email', '--annotate'] cmd += to cmd += cc cmd += ['--cc-cmd', '"%s --cc-cmd %s"' % (sys.argv[0], cc_fname)] if cover_fname: cmd.append(cover_fname) cmd += args str = ' '.join(cmd) if not dry_run: os.system(str) return str