From 4bc645786bc150debc5e5881c246417178eff2ea Mon Sep 17 00:00:00 2001 From: Amolith Date: Tue, 24 Feb 2026 11:46:30 -0700 Subject: [PATCH] refactor(jj-clone): improve clone reliability --- .../private_fish/functions/jj-clone.fish | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/dot_config/private_fish/functions/jj-clone.fish b/dot_config/private_fish/functions/jj-clone.fish index 3ccddc7181ee2b49b0e29c46999d5bbaea8f911d..b30034cc67a9181692c83d8d345e56a6ad25567b 100644 --- a/dot_config/private_fish/functions/jj-clone.fish +++ b/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