@@ -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