File size: 3,548 Bytes
51f80a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import anyio
import argparse
import shutil
import subprocess
import os
import sys
from pathlib import Path
def copy_project_resources(FOLDER_NAME):
    """
    Step 1: Copy .claude, templates, tools to the project directory.
    """
    MAIN_DIR = FOLDER_NAME or "."
    SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
    copy_targets = [
        (".claude", "01: .claude already exists or source missing"),
        ("templates", "01: templates already exists or source missing"),
        ("tools", "01: tools already exists or source missing"),
    ]

    for subdir, error_msg in copy_targets:
        src = os.path.join(SCRIPT_DIR, subdir)
        dst = os.path.join(MAIN_DIR, subdir)
        if not os.path.isdir(dst) and os.path.isdir(src):
            try:
                shutil.copytree(src, dst)
            except Exception as copy_exc:
                print(f"01: failed to copy {subdir}: {copy_exc}", file=sys.stderr)
        else:
            print(error_msg, file=sys.stderr)

def clone_github_repo(GITHUB_REPO_URL, repo_name):
    """
    Step 3: Clone the GitHub repository into the repo directory.
    """
    REPO_PARENT = os.path.join(os.getcwd(), "repo")
    REPO_DIR = os.path.join(REPO_PARENT, repo_name) if repo_name else ""
    GIT_URL = GITHUB_REPO_URL

    print(f"03: clone target={GIT_URL} into {REPO_DIR}", file=sys.stderr)

    os.makedirs(REPO_PARENT, exist_ok=True)

    if repo_name and os.path.isdir(REPO_DIR):
        print("03: repo dir already exists: {}".format(REPO_DIR), file=sys.stderr)
    elif repo_name and GIT_URL:
        clone_attempts = [
            (["git", "clone", "--recurse-submodules", GIT_URL, REPO_DIR], "02: cloned with submodules"),
            (["git", "clone", "--depth=1", GIT_URL, REPO_DIR], "02: shallow clone ok"),
            (["git", "clone", GIT_URL, REPO_DIR], None),
        ]
        for i, (cmd, success_msg) in enumerate(clone_attempts):
            if i == 0:
                print("03: starting git clone with submodules...", file=sys.stderr)
            elif i == 1:
                print("03: main clone failed, trying --depth=1", file=sys.stderr)
            elif i == 2:
                print("03: shallow clone failed, trying plain clone", file=sys.stderr)
            try:
                rc = subprocess.call(cmd)
            except Exception as e:
                print(f"03: clone exception: {e}", file=sys.stderr)
                rc = 1
            if rc == 0:
                if success_msg:
                    print(success_msg, file=sys.stderr)
                break
        else:
            print("03: failed: all clone attempts failed", file=sys.stderr)
            
def prepare_folder_structure(main_dir):
    """
    Prepare the required folder structure for the pipeline under main_dir.

    Args:
        main_dir (str): The main project directory where folders will be created.
    """
    print(f"02: preparing folder structure under {main_dir}", file=sys.stderr)
    dirs_to_make = [
        os.path.join(main_dir, "reports"),
        os.path.join(main_dir, "src", "tools"),
        os.path.join(main_dir, "tests", "code"),
        os.path.join(main_dir, "tests", "data"),
        os.path.join(main_dir, "notebooks"),
        os.path.join(main_dir, "tests", "results"),
        os.path.join(main_dir, "tests", "logs"),
        os.path.join(main_dir, "tests", "summary"),
        os.path.join(main_dir, "tmp", "inputs"),
        os.path.join(main_dir, "tmp", "outputs"),
    ]
    for d in dirs_to_make:
        os.makedirs(d, exist_ok=True)