76 lines
2.2 KiB
Python
Executable File
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())
|