From 9f87b60b46b2d3c6c4518d772a0fdc935d454ae0 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Wed, 15 Jun 2022 20:28:03 +0800 Subject: [PATCH] Fix cli command restore-repo: "units" should be parsed as StringSlice (#19953) * Fix cli command restore-repo: "units" should be parsed as StringSlice because after #15790 it's read by c.StringSlice("units"). Before, the "units" were processed by strings.Split * Add checking for invalid unit names Co-authored-by: 6543 <6543@obermui.de> --- cmd/restore_repo.go | 6 +++--- services/migrations/dump.go | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cmd/restore_repo.go b/cmd/restore_repo.go index f0b01e7984..c3081279df 100644 --- a/cmd/restore_repo.go +++ b/cmd/restore_repo.go @@ -37,10 +37,10 @@ var CmdRestoreRepository = cli.Command{ Value: "", Usage: "Restore destination repository name", }, - cli.StringFlag{ + cli.StringSliceFlag{ Name: "units", - Value: "", - Usage: `Which items will be restored, one or more units should be separated as comma. + Value: nil, + Usage: `Which items will be restored, one or more units should be repeated with this flag. wiki, issues, labels, releases, release_assets, milestones, pull_requests, comments are allowed. Empty means all units.`, }, cli.BoolFlag{ diff --git a/services/migrations/dump.go b/services/migrations/dump.go index 6410aa1ee0..ad04756d4b 100644 --- a/services/migrations/dump.go +++ b/services/migrations/dump.go @@ -6,6 +6,7 @@ package migrations import ( "context" + "errors" "fmt" "io" "net/http" @@ -572,7 +573,7 @@ func DumpRepository(ctx context.Context, baseDir, ownerName string, opts base.Mi return nil } -func updateOptionsUnits(opts *base.MigrateOptions, units []string) { +func updateOptionsUnits(opts *base.MigrateOptions, units []string) error { if len(units) == 0 { opts.Wiki = true opts.Issues = true @@ -585,6 +586,8 @@ func updateOptionsUnits(opts *base.MigrateOptions, units []string) { } else { for _, unit := range units { switch strings.ToLower(unit) { + case "": + continue case "wiki": opts.Wiki = true case "issues": @@ -601,9 +604,12 @@ func updateOptionsUnits(opts *base.MigrateOptions, units []string) { opts.Comments = true case "pull_requests": opts.PullRequests = true + default: + return errors.New("invalid unit: " + unit) } } } + return nil } // RestoreRepository restore a repository from the disk directory @@ -626,7 +632,9 @@ func RestoreRepository(ctx context.Context, baseDir, ownerName, repoName string, migrateOpts := base.MigrateOptions{ GitServiceType: structs.GitServiceType(tp), } - updateOptionsUnits(&migrateOpts, units) + if err := updateOptionsUnits(&migrateOpts, units); err != nil { + return err + } if err = migrateRepository(downloader, uploader, migrateOpts, nil); err != nil { if err1 := uploader.Rollback(); err1 != nil {