Files
agiledancers/git-tools/test-prune-local-branches.py
Wanja Krah 8546f222fe
All checks were successful
Build, test and publish / verify (push) Successful in 6m57s
git helper tool added and improved coding-standards
2026-11-08 10:25:37 +01:00

53 lines
2.7 KiB
Python

import os, pathlib, subprocess, tempfile
script = str(pathlib.Path(__file__).resolve().with_name('pruneLocalBranches'))
root = pathlib.Path(tempfile.mkdtemp(prefix='git-tools-test-'))
env = dict(os.environ, GIT_AUTHOR_NAME='Test', GIT_AUTHOR_EMAIL='test@example.com', GIT_COMMITTER_NAME='Test', GIT_COMMITTER_EMAIL='test@example.com', GIT_CONFIG_NOSYSTEM='1')
def cmd(*args, cwd=None, expected=0, data=None):
p = subprocess.run(args, cwd=cwd or root, env=env, input=data, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
assert p.returncode == expected, (args, p.returncode, p.stdout)
return p.stdout
cmd('git','init','--bare','origin.git')
cmd('git','init','-b','main','repo')
repo=root/'repo'
def git(*args): return cmd('git',*args,cwd=repo)
def run(*args,expected=0,data=None): return cmd(script,*args,cwd=repo,expected=expected,data=data)
git('commit','--allow-empty','-m','initial')
git('remote','add','origin',str(root/'origin.git'))
git('push','-u','origin','main')
git('branch','merged')
git('push','origin','merged')
run('--check')
git('push','origin','--delete','merged')
git('branch','S6-deployment')
git('branch','--set-upstream-to=origin/main','S6-deployment')
git('branch','protected')
git('push','origin','protected')
git('checkout','-b','unique')
git('commit','--allow-empty','-m','unpublished')
git('checkout','main')
git('branch','in-worktree')
git('worktree','add',str(root/'linked'),'in-worktree')
out=run('--check')
for value in ['ELIGIBLE merged','ELIGIBLE S6-deployment','KEEP protected: same-name','KEEP main: same-name','KEEP unique: commits absent','unpublished','KEEP in-worktree: checked out']:
assert value in out, (value,out)
assert 'Cancelled' in run('-d','merged',data='no\n')
git('show-ref','--verify','refs/heads/merged')
assert 'Cancelled' in run('-d','merged',data='')
run('-d','protected',expected=1)
run('-d','unique',expected=1)
run('-d','missing',expected=1)
run('-d','merged',data='DELETE\n')
cmd('git','show-ref','--verify','--quiet','refs/heads/merged',cwd=repo,expected=1)
run('-d','*',data='DELETE\n')
cmd('git','show-ref','--verify','--quiet','refs/heads/S6-deployment',cwd=repo,expected=1)
assert 'unique' in git('branch','--list')
assert 'protected' in git('branch','--list')
assert 'in-worktree' in git('branch','--list')
remote=git('ls-remote','--heads','origin')
assert 'refs/heads/main' in remote and 'refs/heads/protected' in remote
run('--bad',expected=2)
git('remote','set-url','origin',str(root/'does-not-exist'))
run('--check',expected=1)
print('PASS: fetch/prune, same-name protection, upstream-name independence, unique commits, worktree protection, cancellation/EOF, single/bulk deletion, remote preservation, invalid arguments, fetch failure')
print('Temporary fixtures:',root)