From 54b4c679120fdb135a8c8b8dc3996a30148f10ba Mon Sep 17 00:00:00 2001 From: Martin Schurz Date: Tue, 28 Oct 2025 23:20:55 +0100 Subject: [PATCH 1/2] fix(clone): "glab repo clone" with custom directory When cloning a group the command did not recognize the user supplied directory. Additionally the tests did not verify, that the directory variable was correctly set, even in the single repo case. Signed-off-by: Martin Schurz --- internal/commands/project/clone/repo_clone.go | 10 +++++++--- internal/commands/project/clone/repo_clone_test.go | 12 ++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/commands/project/clone/repo_clone.go b/internal/commands/project/clone/repo_clone.go index 94ad47745..92a210528 100644 --- a/internal/commands/project/clone/repo_clone.go +++ b/internal/commands/project/clone/repo_clone.go @@ -107,9 +107,13 @@ glab repo clone -g [flags] [] [-- ...]`, dbg.Debug("Args:", strings.Join(args, " ")) dbg.Debug("GitFlags:", strings.Join(opts.gitFlags, " ")) if nArgs := len(args); nArgs > 0 { - ctxOpts.Repo = args[0] - if nArgs > 1 && !opts.preserveNamespace { - opts.dir = args[1] + if opts.groupName != "" && !opts.preserveNamespace { + opts.dir = args[0] + } else { + ctxOpts.Repo = args[0] + if nArgs > 1 && !opts.preserveNamespace { + opts.dir = args[1] + } } } dbg.Debug("Dir:", opts.dir) diff --git a/internal/commands/project/clone/repo_clone_test.go b/internal/commands/project/clone/repo_clone_test.go index 85918afd2..87bec20a1 100644 --- a/internal/commands/project/clone/repo_clone_test.go +++ b/internal/commands/project/clone/repo_clone_test.go @@ -107,6 +107,17 @@ func TestNewCmdClone(t *testing.T) { Repo: "", }, }, + { + name: "group clone with directory argument", + args: "-g NAMESPACE/REPO mydir", + wantOpts: options{ + gitFlags: []string{}, + dir: "mydir", + }, + wantCtxOpts: ContextOpts{ + Repo: "", + }, + }, { name: "unknown argument", args: "NAMESPACE/REPO --depth 1", @@ -147,6 +158,7 @@ func TestNewCmdClone(t *testing.T) { assert.Equal(t, tt.wantCtxOpts.Repo, ctxOpts.Repo) assert.Equal(t, tt.wantOpts.gitFlags, opts.gitFlags) + assert.Equal(t, tt.wantOpts.dir, opts.dir) }) } } -- GitLab From 39fc835809959c0412700c64e829babd3dd1aa1b Mon Sep 17 00:00:00 2001 From: Martin Schurz Date: Wed, 29 Oct 2025 00:14:05 +0100 Subject: [PATCH 2/2] fix(clone): actually use changed directory in execution --- internal/commands/project/clone/repo_clone.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/internal/commands/project/clone/repo_clone.go b/internal/commands/project/clone/repo_clone.go index 92a210528..006a30d25 100644 --- a/internal/commands/project/clone/repo_clone.go +++ b/internal/commands/project/clone/repo_clone.go @@ -3,6 +3,7 @@ package clone import ( "errors" "fmt" + "path" "strconv" "strings" @@ -107,7 +108,7 @@ glab repo clone -g [flags] [] [-- ...]`, dbg.Debug("Args:", strings.Join(args, " ")) dbg.Debug("GitFlags:", strings.Join(opts.gitFlags, " ")) if nArgs := len(args); nArgs > 0 { - if opts.groupName != "" && !opts.preserveNamespace { + if opts.groupName != "" { opts.dir = args[0] } else { ctxOpts.Repo = args[0] @@ -234,7 +235,17 @@ func groupClone(opts *options, ctxOpts *ContextOpts) error { ctxOpt := *ctxOpts ctxOpt.Project = project ctxOpt.Repo = project.PathWithNamespace - err = cloneRun(opts, &ctxOpt) + opt := *opts + if opts.dir != "" { + if opts.preserveNamespace { + namespacedDir := project.PathWithNamespace + opt.dir = opts.dir + "/" + namespacedDir + opt.preserveNamespace = false + } else { + opt.dir = opts.dir + "/" + path.Base(project.PathWithNamespace) + } + } + err = cloneRun(&opt, &ctxOpt) if err != nil { finalOutput = append(finalOutput, fmt.Sprintf("%s %s - Error: %q", c.RedCheck(), project.PathWithNamespace, err.Error())) } else { -- GitLab