fix: keep the command word after a leading --json

Signed-off-by: bircni <bircni@icloud.com>
This commit is contained in:
bircni committed 2026-10-18 17:20:24 +02:00
1 parent 08ba777f2b
commit 0a02cb80c5
2 files changed
+7

No files matched your search

+4
View File
@@ -424,6 +424,10 @@ func joinJSONFields(root *cobra.Command, args []string) []string {
if args[i] != "--json" || i+1 >= len(args) || !jsonFieldList.MatchString(args[i+1]) { if args[i] != "--json" || i+1 >= len(args) || !jsonFieldList.MatchString(args[i+1]) {
continue continue
} }
// A word that names a subcommand at this position is the command, as in `tea --json repo view`.
if parent, _, err := root.Find(args[:i]); err == nil && slices.ContainsFunc(parent.Commands(), func(c *cobra.Command) bool { return c.Name() == args[i+1] || c.HasAlias(args[i+1]) }) {
continue
}
cmd, _, err := root.Find(slices.Concat(args[:i+1], args[i+2:])) cmd, _, err := root.Find(slices.Concat(args[:i+1], args[i+2:]))
if err == nil && terminal.ValidateOutput(args[i+1], "", commandOutputFields(cmd)) != nil && acceptsArgs(args) { if err == nil && terminal.ValidateOutput(args[i+1], "", commandOutputFields(cmd)) != nil && acceptsArgs(args) {
continue continue
+3
View File
@@ -98,6 +98,9 @@ func TestJoinJSONFields(t *testing.T) {
{[]string{"search", "issue", "--json", "bug"}, []string{"search", "issue", "--json", "bug"}}, {[]string{"search", "issue", "--json", "bug"}, []string{"search", "issue", "--json", "bug"}},
{[]string{"repo", "clone", "--json", "project"}, []string{"repo", "clone", "--json", "project"}}, {[]string{"repo", "clone", "--json", "project"}, []string{"repo", "clone", "--json", "project"}},
{[]string{"search", "repo", "--json", "name,url", "tea"}, []string{"search", "repo", "--json=name,url", "tea"}}, {[]string{"search", "repo", "--json", "name,url", "tea"}, []string{"search", "repo", "--json=name,url", "tea"}},
// A leading --json keeps the command word that follows it.
{[]string{"--json", "repo", "view", "alice/project"}, []string{"--json", "repo", "view", "alice/project"}},
{[]string{"--json", "pr", "list"}, []string{"--json", "pr", "list"}},
{[]string{"--json", "number", "my-alias"}, []string{"--json=number", "my-alias"}}, {[]string{"--json", "number", "my-alias"}, []string{"--json=number", "my-alias"}},
// A word that cannot be an argument is a misspelled field, which then lists the available ones. // A word that cannot be an argument is a misspelled field, which then lists the available ones.
{[]string{"issue", "list", "--json", "Number"}, []string{"issue", "list", "--json=Number"}}, {[]string{"issue", "list", "--json", "Number"}, []string{"issue", "list", "--json=Number"}},