diff --git a/internal/app/releases.go b/internal/app/releases.go index b9dc4094..00dd02a5 100644 --- a/internal/app/releases.go +++ b/internal/app/releases.go @@ -309,6 +309,22 @@ $ tea release create v1.1.0-rc1 --target release/1.1 --draft --prerelease --titl return command } +// rejectSwitchValue refuses the old tea syntax "--draft false": a switch reads no value, so the +// word would be edited as one more release after the switch was applied as true. +func rejectSwitchValue(cmd *cobra.Command, args []string, switches ...string) error { + for _, name := range switches { + if !cmd.Flags().Changed(name) { + continue + } + for _, arg := range args { + if strings.EqualFold(arg, "true") || strings.EqualFold(arg, "false") { + return clierr.Wrap(clierr.Usage, fmt.Errorf("--%s takes no value; use --%s or --%s=false", name, name, name)) + } + } + } + return nil +} + func (a *application) releaseEditCommand() *cobra.Command { var fields releaseFields command := &cobra.Command{ @@ -320,6 +336,9 @@ $ tea release edit v1.0.0-rc1 v1.0.0-rc2 --prerelease=false`, RunE: func(cmd *cobra.Command, args []string) (runErr error) { var editorDraft terminal.Draft defer finishDraft(&editorDraft, &runErr) + if err := rejectSwitchValue(cmd, args, "draft", "prerelease"); err != nil { + return err + } if err := validateTextSources(cmd, "notes", "notes-file"); err != nil { return err } diff --git a/internal/app/validation_test.go b/internal/app/validation_test.go index 5b403c29..20ed89a1 100644 --- a/internal/app/validation_test.go +++ b/internal/app/validation_test.go @@ -145,6 +145,9 @@ func TestUsageErrorsPrecedeRequests(t *testing.T) { {[]string{"release", "create", "--body-file", "-"}, "--notes-file - requires a tag"}, {[]string{"release", "edit", "v1"}, "supply release fields to edit"}, {[]string{"release", "edit", "v1", "v2", "--tag", "v3"}, "--tag requires one release and a nonempty new tag"}, + {[]string{"release", "edit", "v1", "--draft", "false"}, "--draft takes no value; use --draft or --draft=false"}, + {[]string{"release", "edit", "v1", "-d", "false", "-p", "False"}, "--draft takes no value; use --draft or --draft=false"}, + {[]string{"release", "edit", "v1", "v2", "--prerelease", "TRUE"}, "--prerelease takes no value; use --prerelease or --prerelease=false"}, {[]string{"repo", "create"}, "missing required input: supply --name"}, {[]string{"repo", "create", "acme/bad/name"}, "repository name must be nonempty, at most 100 bytes, and contain no path separators or whitespace"}, {[]string{"repo", "create", "name", "--name", "other"}, "supply name as an argument or --name, not both"},