aboutsummaryrefslogtreecommitdiff
path: root/b4
diff options
context:
space:
mode:
authorKonstantin Ryabitsev <konstantin@linuxfoundation.org>2022-06-16 16:22:55 -0400
committerKonstantin Ryabitsev <konstantin@linuxfoundation.org>2022-06-16 16:22:55 -0400
commit797fc250c7dd64550f2283bdc749eda7555e3fa3 (patch)
tree24293cea445b68bd4a03e7906ff649a7f7c63781 /b4
parent70bf7e4c8563576241e15fcea9380d491d7e5cd7 (diff)
downloadb4-797fc250c7dd64550f2283bdc749eda7555e3fa3.tar.gz
Implement "b4 shazam -M" that execs git-merge
In addition to just being able to fetch a series into FETCH_HEAD, also add an option to exec git-merge automatically so that people don't have to cut-and-paste the merge command to use with paths to the cover letter. Signed-off-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Diffstat (limited to 'b4')
-rw-r--r--b4/command.py11
-rw-r--r--b4/mbox.py87
2 files changed, 59 insertions, 39 deletions
diff --git a/b4/command.py b/b4/command.py
index aa307da..4f69231 100644
--- a/b4/command.py
+++ b/b4/command.py
@@ -152,15 +152,18 @@ def cmd():
sp_sh = subparsers.add_parser('shazam', help='Like b4 am, but applies the series to your tree')
cmd_retrieval_common_opts(sp_sh)
cmd_am_common_opts(sp_sh)
- sp_sh.add_argument('-H', '--make-fetch-head', dest='makefetchhead', action='store_true', default=False,
- help='Attempt to treat series as a pull request and fetch it into FETCH_HEAD')
+ sh_g = sp_sh.add_mutually_exclusive_group()
+ sh_g.add_argument('-H', '--make-fetch-head', dest='makefetchhead', action='store_true', default=False,
+ help='Attempt to treat series as a pull request and fetch it into FETCH_HEAD')
+ sh_g.add_argument('-M', '--merge', dest='merge', action='store_true', default=False,
+ help='Attempt to merge series as if it were a pull request (execs git-merge)')
sp_sh.add_argument('--guess-lookback', dest='guessdays', type=int, default=21,
- help=('(use with -H) When guessing base, go back this many days from the patch date '
+ help=('(use with -H or -M) When guessing base, go back this many days from the patch date '
'(default: 3 weeks)'))
sp_sh.set_defaults(func=cmd_shazam)
# b4 attest
- sp_att = subparsers.add_parser('attest', help='Create cryptographic attestation for a set of patches')
+ sp_att = subparsers.add_parser('attest', help='(DEPRECATED) Create cryptographic attestation for a set of patches')
sp_att.add_argument('-f', '--from', dest='sender', default=None,
help='OBSOLETE: this option does nothing and will be removed')
sp_att.add_argument('-n', '--no-submit', dest='nosubmit', action='store_true', default=False,
diff --git a/b4/mbox.py b/b4/mbox.py
index 4ac2c29..277df89 100644
--- a/b4/mbox.py
+++ b/b4/mbox.py
@@ -34,9 +34,9 @@ logger = b4.logger
DEFAULT_MERGE_TEMPLATE = """Merge ${patch_or_series} "${seriestitle}"
${authorname} <${authoremail}> says:
-====================
-${coverletter}
-====================
+
+${covermessage}
+
Link: ${midurl}
"""
@@ -263,7 +263,7 @@ def make_am(msgs, cmdargs, msgid):
b4.save_git_am_mbox(am_msgs, ifh)
ambytes = ifh.getvalue().encode()
if not cmdargs.makefetchhead:
- amflags = config.get('git-am-flags', '')
+ amflags = config.get('shazam-am-flags', '')
sp = shlex.shlex(amflags, posix=True)
sp.whitespace_split = True
amargs = list(sp)
@@ -332,44 +332,59 @@ def make_am(msgs, cmdargs, msgid):
logger.critical(out.strip())
sys.exit(ecode)
mmf = os.path.join(fhf.rstrip(), 'b4-cover')
+ merge_template = DEFAULT_MERGE_TEMPLATE
+ if config.get('shazam-merge-template'):
+ # Try to load this template instead
+ try:
+ merge_template = b4.read_template(config['shazam-merge-template'])
+ except FileNotFoundError:
+ logger.critical('ERROR: shazam-merge-template says to use %s, but it does not exist',
+ config['shazam-merge-template'])
+ sys.exit(2)
+
+ # Write out a sample merge message using the cover letter
+ if os.path.exists(mmf):
+ # Make sure any old cover letters don't confuse anyone
+ os.unlink(mmf)
+
if lser.has_cover:
- merge_template = DEFAULT_MERGE_TEMPLATE
- if config.get('shazam-merge-template'):
- # Try to load this template instead
- try:
- merge_template = b4.read_template(config['shazam-merge-template'])
- except FileNotFoundError:
- logger.critical('ERROR: shazam-merge-template says to use %s, but it does not exist',
- config['shazam-merge-template'])
- sys.exit(2)
-
- # Write out a sample merge message using the cover letter
cmsg = lser.patches[0]
parts = b4.LoreMessage.get_body_parts(cmsg.body)
- tptvals = {
- 'seriestitle': cmsg.subject,
- 'authorname': cmsg.fromname,
- 'authoremail': cmsg.fromemail,
- 'coverletter': parts[1],
- 'midurl': linkurl,
- }
- if len(am_msgs) > 1:
- tptvals['patch_or_series'] = 'patch series'
- else:
- tptvals['patch_or_series'] = 'patch'
+ covermessage = parts[1]
+ else:
+ cmsg = lser.patches[1]
+ covermessage = ('NOTE: No cover letter provided by the author.\n'
+ ' Add merge commit message here.')
+ tptvals = {
+ 'seriestitle': cmsg.subject,
+ 'authorname': cmsg.fromname,
+ 'authoremail': cmsg.fromemail,
+ 'covermessage': covermessage,
+ 'midurl': linkurl,
+ }
+ if len(am_msgs) > 1:
+ tptvals['patch_or_series'] = 'patch series'
+ else:
+ tptvals['patch_or_series'] = 'patch'
- body = Template(merge_template).safe_substitute(tptvals)
- with open(mmf, 'w') as mmh:
- mmh.write(body)
+ body = Template(merge_template).safe_substitute(tptvals)
+ with open(mmf, 'w') as mmh:
+ mmh.write(body)
- elif os.path.exists(mmf):
- # Make sure any old cover letters don't confuse anyone
- os.unlink(mmf)
+ mergeflags = config.get('shazam-merge-flags', '--signoff')
+ sp = shlex.shlex(mergeflags, posix=True)
+ sp.whitespace_split = True
+ mergeargs = ['merge', '--no-ff', '-F', mmf, '--edit', 'FETCH_HEAD'] + list(sp)
+ mergecmd = ['git'] + mergeargs
- logger.info('You can now merge or checkout FETCH_HEAD')
- if lser.has_cover:
- logger.info(' e.g.: git merge -F $(git rev-parse --git-dir)/b4-cover --signoff --edit FETCH_HEAD')
thanks_record_am(lser, cherrypick=cherrypick)
+ if cmdargs.merge:
+ # We exec git-merge and let it take over
+ logger.info('Invoking: %s', ' '.join(mergecmd))
+ os.execvp(mergecmd[0], mergecmd)
+
+ logger.info('You can now merge or checkout FETCH_HEAD')
+ logger.info(' e.g.: %s', ' '.join(mergecmd))
return
if not base_commit:
@@ -711,6 +726,8 @@ def main(cmdargs):
cmdargs.nopartialreroll = False
cmdargs.outdir = '-'
cmdargs.guessbranch = None
+ if cmdargs.merge:
+ cmdargs.makefetchhead = True
if cmdargs.makefetchhead:
cmdargs.guessbase = True
else: