diff --git a/internal/commands/project/clone/repo_clone.go b/internal/commands/project/clone/repo_clone.go index 94ad47745161b2e84d35946063b367eed332a6f5..006a30d25619c7692d0c7f0bf8cd9b69fc168762 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,9 +108,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.dir = args[0] + } else { + ctxOpts.Repo = args[0] + if nArgs > 1 && !opts.preserveNamespace { + opts.dir = args[1] + } } } dbg.Debug("Dir:", opts.dir) @@ -230,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 { diff --git a/internal/commands/project/clone/repo_clone_test.go b/internal/commands/project/clone/repo_clone_test.go index 85918afd2f3102a76d0d6efbc2fb187db35df916..87bec20a13aac208db394291f9e9ec9716478445 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) }) } }