refactor(jj-clone): improve clone reliability

Amolith created

Change summary

dot_config/private_fish/functions/jj-clone.fish | 53 ++++++++++++++++--
1 file changed, 46 insertions(+), 7 deletions(-)

Detailed changes

dot_config/private_fish/functions/jj-clone.fish 🔗

@@ -5,14 +5,53 @@ function jj-clone --description "Clone a repo into a jj workspace layout with a
     end
 
     set -l url $argv[1]
-    set -l dir
+    set -l project_dir
+
     if test (count $argv) -ge 2
-        set dir $argv[2]
-    else
-        set dir (basename "$url" .git)
+        set project_dir $argv[2]
+    end
+
+    # Create a local temp directory and cd into it
+    # jj will create the repo directory inside here based on the URL
+    set -l temp_dir (mktemp -d -p . jj-clone.XXXXXX)
+
+    # Clone without destination - jj creates directory based on URL
+    # Use pushd to run in the temp directory
+    pushd "$temp_dir"
+    jj git clone "$url"
+    set -l clone_status $status
+    popd
+
+    if test $clone_status -ne 0
+        rm -rf "$temp_dir"
+        return 1
+    end
+
+    # jj creates exactly one directory inside temp_dir
+    set -l repo_dirs (ls -d $temp_dir/*/ 2>/dev/null)
+    set -l repo_dir_count (count $repo_dirs)
+
+    if test $repo_dir_count -ne 1
+        echo "error: unexpected clone result (expected 1 directory, found $repo_dir_count)"
+        rm -rf "$temp_dir"
+        return 1
+    end
+
+    # If no explicit directory name provided, use the name jj chose
+    if test -z "$project_dir"
+        set project_dir (basename "$repo_dirs")
     end
 
-    mkdir -p "$dir"
-    jj git clone "$url" "$dir/main"
-    cd "$dir/main"
+    if test -d "$project_dir"
+        echo "error: directory '$project_dir' already exists"
+        rm -rf "$temp_dir"
+        return 1
+    end
+
+    # Create workspace layout: project_dir/main/
+    mkdir -p "$project_dir"
+    mv "$repo_dirs" "$project_dir/main"
+    rmdir "$temp_dir"
+
+    cd "$project_dir/main"
 end