mirror of
https://github.com/elliotnunn/supermario.git
synced 2025-02-20 10:28:57 +00:00
They no longer try and fail to work with existing git repositories. If an existing one gets in the way, it gets trashed and reinitialized.
69 lines
2.3 KiB
Python
Executable File
69 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
from os import path, makedirs, walk, listdir, remove
|
|
from shutil import copy, rmtree
|
|
from subprocess import run
|
|
|
|
|
|
def folder(default_search, user_input):
|
|
if path.sep in user_input:
|
|
return user_input
|
|
else:
|
|
the_path = path.dirname(path.dirname(path.abspath(__file__)))
|
|
the_path = path.join(the_path, default_search, user_input)
|
|
return the_path
|
|
|
|
|
|
parser = argparse.ArgumentParser(description='''
|
|
Expand a patchset into a git repository (based on git-am)
|
|
''')
|
|
|
|
parser.add_argument('patchset', metavar='PATCHSET', action='store', type=lambda x: folder('patchset', x), help='Patchset (assumed in ../patchset/)')
|
|
parser.add_argument('worktree', metavar='WORKTREE', action='store', type=lambda x: folder('worktree', x), help='Destination worktree (assumed in ../worktree/)')
|
|
group = parser.add_mutually_exclusive_group()
|
|
group.add_argument('--base', metavar='SRC', action='store', default='SuperMarioProj.1994-02-09', type=lambda x: folder('base', x), help='Base source tree (default=SuperMarioProj.1994-02-09, assumed in ../base/)')
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
assert path.exists(args.patchset)
|
|
assert not path.exists(path.join(args.patchset, '.git')) # protect against argument swap
|
|
|
|
|
|
horst = ['-c', 'user.name=Horst Beepmanh', '-c', 'user.email=<>']
|
|
def git(*gitargs):
|
|
run(['git', *horst, *gitargs], cwd=args.worktree, check=True)
|
|
|
|
|
|
try:
|
|
rmtree(args.worktree)
|
|
except FileNotFoundError:
|
|
pass
|
|
makedirs(args.worktree)
|
|
|
|
with open(path.join(args.worktree, '.gitignore'), 'a') as f:
|
|
f.write('.*\n*.dmg\nBuild*/\n')
|
|
|
|
git('init')
|
|
git('add', '-f', '.gitignore')
|
|
git('commit', '-m', 'Useful non-source things')
|
|
|
|
for walk_base, walk_dirs, walk_files in walk(args.base):
|
|
walk_dirs[:] = [x for x in walk_dirs if not x.startswith('.')]
|
|
walk_files[:] = [x for x in walk_files if not x.startswith('.')]
|
|
|
|
other_dir = path.join(args.worktree, path.relpath(walk_base, args.base))
|
|
|
|
makedirs(other_dir, exist_ok=True)
|
|
|
|
for this_file in walk_files:
|
|
copy(path.join(walk_base, this_file), other_dir)
|
|
|
|
git('add', '.')
|
|
git('commit', '-m', path.basename(args.base))
|
|
git('tag', 'patchset-base')
|
|
|
|
patchfiles = [path.join(args.patchset, x) for x in sorted(listdir(args.patchset)) if path.splitext(x)[1].lower() == '.patch']
|
|
git('am', *patchfiles)
|