Files
wild-cloud/tools/create_worktree.py

91 lines
3.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Create a git worktree for parallel development with efficient data copying.
Usage:
python tools/create_worktree.py <branch-name>
This will:
1. Create a worktree in ../repo-name-branch-name/
2. Copy .data/ directory contents efficiently using rsync
3. Output a cd command to navigate to the new worktree
"""
import subprocess
import sys
from pathlib import Path
def main():
# Get branch name from arguments
if len(sys.argv) != 2:
print("Usage: python tools/create_worktree.py <branch-name>")
sys.exit(1)
branch_name = sys.argv[1]
# Get current repo path and name
current_path = Path.cwd()
repo_name = current_path.name
# Build worktree path
worktree_name = f"{repo_name}-{branch_name}"
worktree_path = current_path.parent / worktree_name
# Create the worktree
print(f"Creating worktree at {worktree_path}...")
try:
# Check if branch exists locally
result = subprocess.run(["git", "rev-parse", "--verify", branch_name], capture_output=True, text=True)
if result.returncode == 0:
# Branch exists, use it
subprocess.run(["git", "worktree", "add", str(worktree_path), branch_name], check=True)
else:
# Branch doesn't exist, create it
subprocess.run(["git", "worktree", "add", "-b", branch_name, str(worktree_path)], check=True)
print(f"Created new branch: {branch_name}")
except subprocess.CalledProcessError as e:
print(f"Failed to create worktree: {e}")
sys.exit(1)
# Copy .data directory if it exists
data_dir = current_path / ".data"
if data_dir.exists() and data_dir.is_dir():
print("\nCopying .data directory (this may take a moment)...")
target_data_dir = worktree_path / ".data"
try:
# Use rsync for efficient copying with progress
subprocess.run(
[
"rsync",
"-av", # archive mode with verbose
"--progress", # show progress
f"{data_dir}/", # trailing slash to copy contents
f"{target_data_dir}/",
],
check=True,
)
print("Data copy complete!")
except subprocess.CalledProcessError as e:
print(f"Warning: Failed to copy .data directory: {e}")
print("You may need to copy it manually or use cp instead of rsync")
except FileNotFoundError:
# rsync not available, fallback to cp
print("rsync not found, using cp instead...")
try:
subprocess.run(["cp", "-r", str(data_dir), str(worktree_path)], check=True)
print("Data copy complete!")
except subprocess.CalledProcessError as e:
print(f"Warning: Failed to copy .data directory: {e}")
# Output the cd command
print("\n✓ Worktree created successfully!")
print("\nTo navigate to your new worktree, run:")
print(f"cd {worktree_path}")
if __name__ == "__main__":
main()