blob: 68fd27b2822ef43037a92d4790c769949ce0f417 [file] [log] [blame] [edit]
import pytest
import os
import b4
import b4.ez
import b4.mbox
import b4.command
from typing import Any, Dict, Generator, List, Optional, Tuple
@pytest.fixture(scope="function")
def prepdir(gitdir: str) -> Generator[str, None, None]:
b4.MAIN_CONFIG.update({'prep-cover-strategy': 'branch-description'})
parser = b4.command.setup_parser()
b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'prep', '-n', 'pytest']
cmdargs = parser.parse_args(b4args)
b4.ez.cmd_prep(cmdargs)
yield gitdir
@pytest.mark.parametrize('mboxf, bundlef, rep, trargs, compareargs, compareout, b4cfg', [
('trailers-thread-with-followups', None, None, [],
['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups',
{'shazam-am-flags': '--signoff'}),
('trailers-thread-with-cover-followup', None, None, [],
['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-cover-followup',
{'shazam-am-flags': '--signoff'}),
# Test matching trailer updates by subject when patch-id changes
('trailers-thread-with-followups', None, (b'vivendum', b'addendum'), [],
['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups-no-match',
{'shazam-am-flags': '--signoff'}),
# Test that we properly perserve commits with --- in them
('trailers-thread-with-followups', 'trailers-with-tripledash', None, [],
['log', '--format=%ae%n%s%n%b---', 'HEAD~4..'], 'trailers-thread-with-followups-and-tripledash',
None),
])
def test_trailers(sampledir: str, prepdir: str, mboxf: str, bundlef: Optional[str], rep: Optional[Tuple[bytes, bytes]], trargs: List[str], compareargs: List[str], compareout: str, b4cfg: Dict[str, Any]) -> None:
if b4cfg:
b4.MAIN_CONFIG.update(b4cfg)
config = b4.get_main_config()
mfile = os.path.join(sampledir, f'{mboxf}.mbox')
assert os.path.exists(mfile)
if bundlef:
bfile = os.path.join(sampledir, f'{bundlef}.bundle')
assert os.path.exists(bfile)
gitargs = ['pull', '--rebase', bfile]
out, logstr = b4.git_run_command(None, gitargs)
assert out == 0
else:
assert config.get('shazam-am-flags') == '--signoff'
if rep:
with open(mfile, 'rb') as fh:
contents = fh.read()
contents = contents.replace(rep[0], rep[1])
tfile = os.path.join(prepdir, '.git', 'modified.mbox')
with open(tfile, 'wb') as fh:
fh.write(contents)
else:
tfile = mfile
b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'shazam', '--no-add-trailers', '-m', tfile]
parser = b4.command.setup_parser()
cmdargs = parser.parse_args(b4args)
with pytest.raises(SystemExit) as e:
b4.mbox.main(cmdargs)
assert e.value.code == 0
cfile = os.path.join(sampledir, f'{compareout}.verify')
assert os.path.exists(cfile)
parser = b4.command.setup_parser()
b4args = ['--no-stdin', '--no-interactive', '--offline-mode', 'trailers', '--update', '-m', mfile] + trargs
cmdargs = parser.parse_args(b4args)
b4.ez.cmd_trailers(cmdargs)
out, logstr = b4.git_run_command(None, compareargs)
assert out == 0
with open(cfile, 'r') as fh:
cstr = fh.read()
assert logstr == cstr