1
ewconfig/scripts/basejump-init
2023-11-09 11:47:47 -05:00

76 lines
2.2 KiB
Python
Executable File

#! /usr/bin/env python
import argparse
import sys
import logging
import json
import subprocess
import os
from pathlib import Path
logger = logging.getLogger(__name__)
def main() -> int:
# Handle program arguments
ap = argparse.ArgumentParser(
prog="basejump init", description="Creates a new basejump codebase"
)
ap.add_argument("name", help="The name of the codebase")
ap.add_argument(
"-v", "--verbose", help="Enable verbose logging", action="store_true"
)
args = ap.parse_args()
# Configure logging
logging.basicConfig(
level=logging.DEBUG if args.verbose else logging.INFO,
format="%(levelname)s: %(message)s",
)
# Ensure that the basejump config dir exists
bj_config_dir = Path.home() / ".config" / "basejump"
bj_config_dir.mkdir(parents=True, exist_ok=True)
# Create a new codebase definition
codebase_config_path = bj_config_dir / f"{args.name}.codebase.json"
# If the path already exists, abort
if codebase_config_path.exists():
logger.error(f"Codebase `{args.name}` already exists")
logger.info(f"Config file at: {codebase_config_path}")
return 1
# Create a template codebase config
template_config = {
"name": args.name,
"repos": [
{
"path": "/tmp/example",
"upstream": "https://github.com/octocat/Hello-World",
}
],
}
# Write the template config to disk
codebase_config_path.write_text(json.dumps(template_config, indent=4))
# Open $EDITOR (or vim) to edit the config
subprocess.run([os.environ.get("EDITOR", "vim"), str(codebase_config_path)])
# Iterate through every repo and clone it
config = json.loads(codebase_config_path.read_text())
for repo in config["repos"]:
if Path(repo["path"]).exists():
logger.info(f"Skipping {repo['path']}, already exists")
continue
# Do a clone
logger.info(f"Cloning {repo['upstream']} into {repo['path']}")
subprocess.run(["git", "clone", repo["upstream"], repo["path"]])
return 0
if __name__ == "__main__":
sys.exit(main())