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