74 lines
3.2 KiB
Python
74 lines
3.2 KiB
Python
"""Exercise mirror gate against disposable local Git remotes."""
|
|
import pathlib
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
|
|
CHECK = pathlib.Path(__file__).resolve().parents[1] / 'check-git-mirrors.py'
|
|
|
|
|
|
class MirrorTests(unittest.TestCase):
|
|
def test_publication_drift_and_annotated_tags(self):
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
root = pathlib.Path(tmp)
|
|
work = root / 'work'
|
|
work.mkdir()
|
|
|
|
def git(*args):
|
|
return subprocess.run(['git', *args], cwd=work, check=True,
|
|
capture_output=True, text=True).stdout
|
|
|
|
def check(*args, passes=True):
|
|
result = subprocess.run([sys.executable, str(CHECK), *args],
|
|
cwd=work, capture_output=True, text=True)
|
|
self.assertEqual(result.returncode, 0 if passes else 1,
|
|
result.stdout + result.stderr)
|
|
|
|
git('init', '-b', 'main')
|
|
git('config', 'user.name', 'Mirror test')
|
|
git('config', 'user.email', 'fixture@example.invalid')
|
|
git('config', 'commit.gpgsign', 'false')
|
|
git('config', 'tag.gpgsign', 'false')
|
|
for remote in ('origin', 'ngit'):
|
|
git('init', '--bare', str(root / remote))
|
|
git('remote', 'add', remote, str(root / remote))
|
|
git('commit', '--allow-empty', '-m', 'first')
|
|
check(passes=False) # Empty mirrors cannot pass.
|
|
git('push', 'origin', 'main')
|
|
check(passes=False) # Partial publication.
|
|
git('push', 'ngit', 'main')
|
|
check('--local')
|
|
git('commit', '--allow-empty', '-m', 'second')
|
|
check() # Remote equality alone does not imply local publication.
|
|
check('--local', passes=False)
|
|
git('push', 'origin', 'main')
|
|
check(passes=False)
|
|
git('push', 'ngit', 'main')
|
|
git('tag', '-a', 'v-test', '-m', 'original')
|
|
git('push', 'origin', 'refs/tags/v-test')
|
|
check('--ref', 'refs/tags/v-test', passes=False)
|
|
git('push', 'ngit', 'refs/tags/v-test')
|
|
check('--local', '--ref', 'refs/tags/v-test')
|
|
# Same commit, different annotation must fail too.
|
|
git('tag', '-f', '-a', 'v-test', '-m', 'different annotation')
|
|
check('--local', '--ref', 'refs/tags/v-test', passes=False)
|
|
git('push', '--force', 'ngit', 'refs/tags/v-test')
|
|
check('--all', passes=False)
|
|
git('tag', '-d', 'v-test')
|
|
git('fetch', 'origin', 'refs/tags/v-test:refs/tags/v-test')
|
|
git('push', '--force', 'ngit', 'refs/tags/v-test')
|
|
git('push', 'origin', 'HEAD:refs/heads/extra')
|
|
check('--local')
|
|
check('--all', passes=False)
|
|
git('push', 'ngit', 'HEAD:refs/heads/extra')
|
|
check('--all')
|
|
check('--ref', 'main', passes=False)
|
|
check('--remotes', 'origin', 'missing', passes=False)
|
|
git('remote', 'set-url', 'ngit', str(root / 'does-not-exist'))
|
|
check(passes=False)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|