#!/usr/bin/env python3 import sys import argparse import subprocess import os from glob import glob def site_update(args): print('update site') if not os.path.isdir(args.src): print(f'directory {args.src} does not exist', file=sys.stderr) return 1 p = subprocess.run(['git', 'fetch', 'origin'], cwd=args.src) if p.returncode != 0: return 1 p = subprocess.run(['git', 'status'], cwd=args.src, capture_output=True) if p.returncode != 0: return 1 if 'behind' in str(p.stdout): if args.b: p = subprocess.run(['git', 'merge', f'origin/{args.b}'], cwd=args.src) if p.returncode != 0: return 1 p = subprocess.run(['git', 'merge', 'origin/master'], cwd=args.src) if p.returncode != 0: p = subprocess.run(['git', 'merge', 'origin/main'], cwd=args.src) if p.returncode != 0: return 1 if args.build: args.dest = args.build site_build(args) else: print('up to date') return 0 def site_build(args): if not os.path.isdir(args.src): print(f'directory {args.src} does not exist', file=sys.stderr) return 1 if not os.path.isdir(args.dest): try: os.mkdir(args.dest) except Exception as e: print(e, file=sys.stderr) return 1 print('building site') p = subprocess.run('hugo', cwd=args.src) if p.returncode != 0: return 1 new_files = glob('public/*', root_dir=args.src) p = subprocess.run(['which', 'rsync'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if p.returncode == 0: print('copying new files') p = subprocess.run(['rsync', '-r', *new_files, args.dest], cwd=args.src) if p.returncode != 0: return 1 else: print('rsync not found, using basic rm and cp') old_files = glob('*', root_dir=args.dest) print('cleaning up old files') p = subprocess.run(['rm','-rf', *old_files], cwd=args.dest) if p.returncode != 0: return 1 print('copying new files') p = subprocess.run(['cp', '-r', *new_files, args.dest], cwd=args.src) if p.returncode != 0: return 1 return 0 if __name__ == '__main__': parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help='sub-command help') parser_update = subparsers.add_parser('update', help='update help') parser_update.set_defaults(func=site_update) parser_build = subparsers.add_parser('build', help='build help') parser_build.set_defaults(func=site_build) parser_update.add_argument('--src', required=True) parser_update.add_argument('--build', required=False, help='build after updating from remote repository, takes destination directory as an argument') parser_update.add_argument('-b', required=False, help='remote git branch to pull from') parser_build.add_argument('--src', required=False, default='.') parser_build.add_argument('dest') args = parser.parse_args() rc = args.func(args) exit(rc)