jj-clone.fish

 1function jj-clone --description "Clone a repo into a jj workspace layout with a colocated main"
 2    if test (count $argv) -eq 0
 3        echo "Usage: jj-clone <url> [directory]"
 4        return 1
 5    end
 6
 7    set -l url $argv[1]
 8    set -l project_dir
 9
10    if test (count $argv) -ge 2
11        set project_dir $argv[2]
12    end
13
14    # Create a local temp directory and cd into it
15    # jj will create the repo directory inside here based on the URL
16    set -l temp_dir (mktemp -d -p . jj-clone.XXXXXX)
17
18    # Clone without destination - jj creates directory based on URL
19    # Use pushd to run in the temp directory
20    pushd "$temp_dir"
21    jj git clone "$url"
22    set -l clone_status $status
23    popd
24
25    if test $clone_status -ne 0
26        rm -rf "$temp_dir"
27        return 1
28    end
29
30    # jj creates exactly one directory inside temp_dir
31    set -l repo_dirs (ls -d $temp_dir/*/ 2>/dev/null)
32    set -l repo_dir_count (count $repo_dirs)
33
34    if test $repo_dir_count -ne 1
35        echo "error: unexpected clone result (expected 1 directory, found $repo_dir_count)"
36        rm -rf "$temp_dir"
37        return 1
38    end
39
40    # If no explicit directory name provided, use the name jj chose
41    if test -z "$project_dir"
42        set project_dir (basename "$repo_dirs")
43    end
44
45    if test -d "$project_dir"
46        echo "error: directory '$project_dir' already exists"
47        rm -rf "$temp_dir"
48        return 1
49    end
50
51    # Create workspace layout: project_dir/main/
52    mkdir -p "$project_dir"
53    mv "$repo_dirs" "$project_dir/main"
54    rmdir "$temp_dir"
55
56    cd "$project_dir/main"
57end