From 24ef747fd59482e710461d4109a9d586ea85da24 Mon Sep 17 00:00:00 2001 From: William Bezuidenhout Date: Tue, 5 May 2026 18:21:21 +0200 Subject: [PATCH 1/2] migrate orgs to urfave/cli --- cmd/src/orgs.go | 25 ++++++++++- cmd/src/orgs_create.go | 57 +++++++++++++++++++++++- cmd/src/orgs_delete.go | 48 +++++++++++++++++++- cmd/src/orgs_get.go | 59 ++++++++++++++++++++++++- cmd/src/orgs_list.go | 77 ++++++++++++++++++++++++++++++++- cmd/src/orgs_members.go | 22 +++++++++- cmd/src/orgs_members_add.go | 57 +++++++++++++++++++++++- cmd/src/orgs_members_remove.go | 57 +++++++++++++++++++++++- cmd/src/run_migration_compat.go | 2 + 9 files changed, 388 insertions(+), 16 deletions(-) diff --git a/cmd/src/orgs.go b/cmd/src/orgs.go index 755fe5615c..438d749051 100644 --- a/cmd/src/orgs.go +++ b/cmd/src/orgs.go @@ -3,12 +3,30 @@ package main import ( "flag" "fmt" + + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) var orgsCommands commander -func init() { - usage := `'src orgs' is a tool that manages organizations on a Sourcegraph instance. +var orgsCommand = clicompat.Wrap(&cli.Command{ + Name: "orgs", + Aliases: []string{"org"}, + Usage: "manages organizations", + UsageText: "src orgs [command options]", + Description: orgsExamples, + HideVersion: true, + Commands: []*cli.Command{ + orgsListCommand, + orgsGetCommand, + orgsCreateCommand, + orgsDeleteCommand, + orgsMembersCommand, + }, +}) + +const orgsExamples = `'src orgs' is a tool that manages organizations on a Sourcegraph instance. Usage: @@ -25,6 +43,9 @@ The commands are: Use "src orgs [command] -h" for more information about a command. ` +func init() { + usage := orgsExamples + flagSet := flag.NewFlagSet("orgs", flag.ExitOnError) handler := func(args []string) error { orgsCommands.run(flagSet, "src orgs", usage, args) diff --git a/cmd/src/orgs_create.go b/cmd/src/orgs_create.go index af00c0fd38..54c27ff67b 100644 --- a/cmd/src/orgs_create.go +++ b/cmd/src/orgs_create.go @@ -6,10 +6,11 @@ import ( "fmt" "github.com/sourcegraph/src-cli/internal/api" + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) -func init() { - usage := ` +const orgsCreateExamples = ` Examples: Create an organization: @@ -18,6 +19,58 @@ Examples: ` +var orgsCreateCommand = clicompat.Wrap(&cli.Command{ + Name: "create", + Usage: "creates an organization", + UsageText: "src orgs create [options]", + Description: orgsCreateExamples, + HideVersion: true, + Flags: clicompat.WithAPIFlags( + &cli.StringFlag{ + Name: "name", + Usage: "The new organization's name. (required)", + }, + &cli.StringFlag{ + Name: "display-name", + Usage: "The new organization's display name. Defaults to organization name if unspecified.", + }, + ), + Action: func(ctx context.Context, cmd *cli.Command) error { + name := cmd.String("name") + displayName := cmd.String("display-name") + + client := cfg.apiClient(clicompat.APIFlagsFromCmd(cmd), cmd.Writer) + + query := `mutation CreateOrg( + $name: String!, + $displayName: String!, +) { + createOrganization( + name: $name, + displayName: $displayName, + ) { + id + } +}` + + var result struct { + CreateOrg Org + } + if ok, err := client.NewRequest(query, map[string]any{ + "name": name, + "displayName": displayName, + }).Do(ctx, &result); err != nil || !ok { + return err + } + + _, err := fmt.Fprintf(cmd.Writer, "Organization %q created.\n", name) + return err + }, +}) + +func init() { + usage := orgsCreateExamples + flagSet := flag.NewFlagSet("create", flag.ExitOnError) usageFunc := func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) diff --git a/cmd/src/orgs_delete.go b/cmd/src/orgs_delete.go index 7a00aa4478..48d764f315 100644 --- a/cmd/src/orgs_delete.go +++ b/cmd/src/orgs_delete.go @@ -6,10 +6,11 @@ import ( "fmt" "github.com/sourcegraph/src-cli/internal/api" + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) -func init() { - usage := ` +const orgsDeleteExamples = ` Examples: Delete an organization by ID: @@ -26,6 +27,49 @@ Examples: ` +var orgsDeleteCommand = clicompat.Wrap(&cli.Command{ + Name: "delete", + Usage: "deletes an organization", + UsageText: "src orgs delete [options]", + Description: orgsDeleteExamples, + HideVersion: true, + Flags: clicompat.WithAPIFlags( + &cli.StringFlag{ + Name: "id", + Usage: "The ID of the organization to delete.", + }, + ), + Action: func(ctx context.Context, cmd *cli.Command) error { + orgID := cmd.String("id") + client := cfg.apiClient(clicompat.APIFlagsFromCmd(cmd), cmd.Writer) + + query := `mutation DeleteOrganization( + $organization: ID! +) { + deleteOrganization( + organization: $organization + ) { + alwaysNil + } +}` + + var result struct { + DeleteOrganization struct{} + } + if ok, err := client.NewRequest(query, map[string]any{ + "organization": orgID, + }).Do(ctx, &result); err != nil || !ok { + return err + } + + _, err := fmt.Fprintf(cmd.Writer, "Organization with ID %q deleted.\n", orgID) + return err + }, +}) + +func init() { + usage := orgsDeleteExamples + flagSet := flag.NewFlagSet("delete", flag.ExitOnError) usageFunc := func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) diff --git a/cmd/src/orgs_get.go b/cmd/src/orgs_get.go index 39a1f508db..931e751534 100644 --- a/cmd/src/orgs_get.go +++ b/cmd/src/orgs_get.go @@ -6,10 +6,11 @@ import ( "fmt" "github.com/sourcegraph/src-cli/internal/api" + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) -func init() { - usage := ` +const orgsGetExamples = ` Examples: Get organization named abc-org: @@ -22,6 +23,60 @@ Examples: ` +var orgsGetCommand = clicompat.Wrap(&cli.Command{ + Name: "get", + Usage: "gets an organization", + UsageText: "src orgs get [options]", + Description: orgsGetExamples, + HideVersion: true, + Flags: clicompat.WithAPIFlags( + &cli.StringFlag{ + Name: "name", + Usage: `Look up organization by name. (e.g. "abc-org")`, + }, + &cli.StringFlag{ + Name: "f", + Value: "{{.|json}}", + Usage: `Format for the output, using the syntax of Go package text/template. (e.g. "{{.ID}}: {{.Name}} ({{.DisplayName}})")`, + }, + ), + Action: func(ctx context.Context, cmd *cli.Command) error { + name := cmd.String("name") + format := cmd.String("f") + + client := cfg.apiClient(clicompat.APIFlagsFromCmd(cmd), cmd.Writer) + + tmpl, err := parseTemplate(format) + if err != nil { + return err + } + + query := `query Organization( + $name: String!, +) { + organization( + name: $name + ) { + ...OrgFields + } +}` + orgFragment + + var result struct { + Organization *Org + } + if ok, err := client.NewRequest(query, map[string]any{ + "name": name, + }).Do(ctx, &result); err != nil || !ok { + return err + } + + return execTemplate(tmpl, result.Organization) + }, +}) + +func init() { + usage := orgsGetExamples + flagSet := flag.NewFlagSet("get", flag.ExitOnError) usageFunc := func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) diff --git a/cmd/src/orgs_list.go b/cmd/src/orgs_list.go index 3ad611b473..07b45090ea 100644 --- a/cmd/src/orgs_list.go +++ b/cmd/src/orgs_list.go @@ -6,10 +6,11 @@ import ( "fmt" "github.com/sourcegraph/src-cli/internal/api" + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) -func init() { - usage := ` +const orgsListExamples = ` Examples: List organizations: @@ -22,6 +23,78 @@ Examples: ` +var orgsListCommand = clicompat.Wrap(&cli.Command{ + Name: "list", + Usage: "lists organizations", + UsageText: "src orgs list [options]", + Description: orgsListExamples, + HideVersion: true, + Flags: clicompat.WithAPIFlags( + &cli.IntFlag{ + Name: "first", + Value: 1000, + Usage: "Returns the first n organizations from the list.", + }, + &cli.StringFlag{ + Name: "query", + Usage: `Returns organizations whose names match the query. (e.g. "alice")`, + }, + &cli.StringFlag{ + Name: "f", + Value: "{{.Name}}", + Usage: `Format for the output, using the syntax of Go package text/template. (e.g. "{{.ID}}: {{.Name}} ({{.DisplayName}})" or "{{.|json}}")`, + }, + ), + Action: func(ctx context.Context, cmd *cli.Command) error { + first := cmd.Int("first") + queryValue := cmd.String("query") + format := cmd.String("f") + + client := cfg.apiClient(clicompat.APIFlagsFromCmd(cmd), cmd.Writer) + + tmpl, err := parseTemplate(format) + if err != nil { + return err + } + + query := `query Organizations( + $first: Int, + $query: String, +) { + organizations( + first: $first, + query: $query, + ) { + nodes { + ...OrgFields + } + } +}` + orgFragment + + var result struct { + Organizations struct { + Nodes []Org + } + } + if ok, err := client.NewRequest(query, map[string]any{ + "first": api.NullInt(first), + "query": api.NullString(queryValue), + }).Do(ctx, &result); err != nil || !ok { + return err + } + + for _, org := range result.Organizations.Nodes { + if err := execTemplate(tmpl, org); err != nil { + return err + } + } + return nil + }, +}) + +func init() { + usage := orgsListExamples + flagSet := flag.NewFlagSet("list", flag.ExitOnError) usageFunc := func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) diff --git a/cmd/src/orgs_members.go b/cmd/src/orgs_members.go index 443c5b01ad..f04da3474d 100644 --- a/cmd/src/orgs_members.go +++ b/cmd/src/orgs_members.go @@ -3,12 +3,27 @@ package main import ( "flag" "fmt" + + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) var orgsMembersCommands commander -func init() { - usage := `'src orgs members' is a tool that manages organization members on a Sourcegraph instance. +var orgsMembersCommand = clicompat.Wrap(&cli.Command{ + Name: "members", + Aliases: []string{"member"}, + Usage: "manages organization members", + UsageText: "src orgs members [command options]", + Description: orgsMembersExamples, + HideVersion: true, + Commands: []*cli.Command{ + orgsMembersAddCommand, + orgsMembersRemoveCommand, + }, +}) + +const orgsMembersExamples = `'src orgs members' is a tool that manages organization members on a Sourcegraph instance. Usage: @@ -22,6 +37,9 @@ The commands are: Use "src orgs members [command] -h" for more information about a command. ` +func init() { + usage := orgsMembersExamples + flagSet := flag.NewFlagSet("members", flag.ExitOnError) handler := func(args []string) error { orgsMembersCommands.run(flagSet, "src orgs members", usage, args) diff --git a/cmd/src/orgs_members_add.go b/cmd/src/orgs_members_add.go index cf09f5c0d1..b0b54b91e0 100644 --- a/cmd/src/orgs_members_add.go +++ b/cmd/src/orgs_members_add.go @@ -6,10 +6,11 @@ import ( "fmt" "github.com/sourcegraph/src-cli/internal/api" + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) -func init() { - usage := ` +const orgsMembersAddExamples = ` Examples: Add a member (alice) to an organization (abc-org): @@ -18,6 +19,58 @@ Examples: ` +var orgsMembersAddCommand = clicompat.Wrap(&cli.Command{ + Name: "add", + Usage: "adds a user as a member to an organization", + UsageText: "src orgs members add [options]", + Description: orgsMembersAddExamples, + HideVersion: true, + Flags: clicompat.WithAPIFlags( + &cli.StringFlag{ + Name: "org-id", + Usage: "ID of organization to which to add member. (required)", + }, + &cli.StringFlag{ + Name: "username", + Usage: "Username of user to add as member. (required)", + }, + ), + Action: func(ctx context.Context, cmd *cli.Command) error { + orgID := cmd.String("org-id") + username := cmd.String("username") + + client := cfg.apiClient(clicompat.APIFlagsFromCmd(cmd), cmd.Writer) + + query := `mutation AddUserToOrganization( + $organization: ID!, + $username: String!, +) { + addUserToOrganization( + organization: $organization, + username: $username, + ) { + alwaysNil + } +}` + + var result struct { + AddUserToOrganization struct{} + } + if ok, err := client.NewRequest(query, map[string]any{ + "organization": orgID, + "username": username, + }).Do(ctx, &result); err != nil || !ok { + return err + } + + _, err := fmt.Fprintf(cmd.Writer, "User %q added as member to organization with ID %q.\n", username, orgID) + return err + }, +}) + +func init() { + usage := orgsMembersAddExamples + flagSet := flag.NewFlagSet("add", flag.ExitOnError) usageFunc := func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs members %s':\n", flagSet.Name()) diff --git a/cmd/src/orgs_members_remove.go b/cmd/src/orgs_members_remove.go index 6f6eb3171f..2b4e1dfd3f 100644 --- a/cmd/src/orgs_members_remove.go +++ b/cmd/src/orgs_members_remove.go @@ -6,10 +6,11 @@ import ( "fmt" "github.com/sourcegraph/src-cli/internal/api" + "github.com/sourcegraph/src-cli/internal/clicompat" + "github.com/urfave/cli/v3" ) -func init() { - usage := ` +const orgsMembersRemoveExamples = ` Examples: Remove a member (alice) from an organization (abc-org): @@ -17,6 +18,58 @@ Examples: $ src orgs members remove -org-id=$(src org get -f '{{.ID}}' -name=abc-org) -user-id=$(src users get -f '{{.ID}}' -username=alice) ` +var orgsMembersRemoveCommand = clicompat.Wrap(&cli.Command{ + Name: "remove", + Usage: "removes a user as a member from an organization", + UsageText: "src orgs members remove [options]", + Description: orgsMembersRemoveExamples, + HideVersion: true, + Flags: clicompat.WithAPIFlags( + &cli.StringFlag{ + Name: "org-id", + Usage: "ID of organization from which to remove member. (required)", + }, + &cli.StringFlag{ + Name: "user-id", + Usage: "ID of user to remove as member. (required)", + }, + ), + Action: func(ctx context.Context, cmd *cli.Command) error { + orgID := cmd.String("org-id") + userID := cmd.String("user-id") + + client := cfg.apiClient(clicompat.APIFlagsFromCmd(cmd), cmd.Writer) + + query := `mutation RemoveUserFromOrg( + $orgID: ID!, + $userID: ID!, +) { + removeUserFromOrg( + orgID: $orgID, + userID: $userID, + ) { + alwaysNil + } +}` + + var result struct { + RemoveUserFromOrg struct{} + } + if ok, err := client.NewRequest(query, map[string]any{ + "orgID": orgID, + "userID": userID, + }).Do(ctx, &result); err != nil || !ok { + return err + } + + _, err := fmt.Fprintf(cmd.Writer, "User %q removed as member from organization with ID %q.\n", userID, orgID) + return err + }, +}) + +func init() { + usage := orgsMembersRemoveExamples + flagSet := flag.NewFlagSet("remove", flag.ExitOnError) usageFunc := func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs members %s':\n", flagSet.Name()) diff --git a/cmd/src/run_migration_compat.go b/cmd/src/run_migration_compat.go index 52baca0fc5..1a6c624d40 100644 --- a/cmd/src/run_migration_compat.go +++ b/cmd/src/run_migration_compat.go @@ -20,6 +20,8 @@ var migratedCommands = map[string]*cli.Command{ "api": apiCommand, "auth": authCommand, "login": loginCommand, + "orgs": orgsCommand, + "org": orgsCommand, "version": versionCommand, } From 088c95e8544caa465fb6b315e5c0102475619aed Mon Sep 17 00:00:00 2001 From: William Bezuidenhout Date: Wed, 6 May 2026 10:29:28 +0200 Subject: [PATCH 2/2] remove legacy orgs command registrations --- cmd/src/doc.go | 16 ++++---- cmd/src/orgs.go | 25 ------------ cmd/src/orgs_create.go | 58 --------------------------- cmd/src/orgs_delete.go | 54 ------------------------- cmd/src/orgs_get.go | 60 ---------------------------- cmd/src/orgs_list.go | 72 ---------------------------------- cmd/src/orgs_members.go | 25 ------------ cmd/src/orgs_members_add.go | 58 --------------------------- cmd/src/orgs_members_remove.go | 58 --------------------------- 9 files changed, 7 insertions(+), 419 deletions(-) diff --git a/cmd/src/doc.go b/cmd/src/doc.go index 43ea72944d..d433aa24cb 100644 --- a/cmd/src/doc.go +++ b/cmd/src/doc.go @@ -57,15 +57,13 @@ Examples: } commanders := map[string]*commander{ - "": &commands, - "batch": &batchCommands, - "config": &configCommands, - "extsvc": &extsvcCommands, - "code-intel": &codeintelCommands, - "orgs": &orgsCommands, - "orgs members": &orgsMembersCommands, - "repos": &reposCommands, - "users": &usersCommands, + "": &commands, + "batch": &batchCommands, + "config": &configCommands, + "extsvc": &extsvcCommands, + "code-intel": &codeintelCommands, + "repos": &reposCommands, + "users": &usersCommands, } pending := out.Pending(output.Line("", output.StylePending, "Rendering Markdown...")) diff --git a/cmd/src/orgs.go b/cmd/src/orgs.go index 438d749051..b5c4ed473e 100644 --- a/cmd/src/orgs.go +++ b/cmd/src/orgs.go @@ -1,15 +1,10 @@ package main import ( - "flag" - "fmt" - "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) -var orgsCommands commander - var orgsCommand = clicompat.Wrap(&cli.Command{ Name: "orgs", Aliases: []string{"org"}, @@ -43,26 +38,6 @@ The commands are: Use "src orgs [command] -h" for more information about a command. ` -func init() { - usage := orgsExamples - - flagSet := flag.NewFlagSet("orgs", flag.ExitOnError) - handler := func(args []string) error { - orgsCommands.run(flagSet, "src orgs", usage, args) - return nil - } - - // Register the command. - commands = append(commands, &command{ - flagSet: flagSet, - aliases: []string{"org"}, - handler: handler, - usageFunc: func() { - fmt.Println(usage) - }, - }) -} - const orgFragment = ` fragment OrgFields on Org { id diff --git a/cmd/src/orgs_create.go b/cmd/src/orgs_create.go index 54c27ff67b..ced6e9fd92 100644 --- a/cmd/src/orgs_create.go +++ b/cmd/src/orgs_create.go @@ -2,10 +2,8 @@ package main import ( "context" - "flag" "fmt" - "github.com/sourcegraph/src-cli/internal/api" "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) @@ -67,59 +65,3 @@ var orgsCreateCommand = clicompat.Wrap(&cli.Command{ return err }, }) - -func init() { - usage := orgsCreateExamples - - flagSet := flag.NewFlagSet("create", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - nameFlag = flagSet.String("name", "", `The new organization's name. (required)`) - displayNameFlag = flagSet.String("display-name", "", `The new organization's display name. Defaults to organization name if unspecified.`) - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation CreateOrg( - $name: String!, - $displayName: String!, -) { - createOrganization( - name: $name, - displayName: $displayName, - ) { - id - } -}` - - var result struct { - CreateOrg Org - } - if ok, err := client.NewRequest(query, map[string]any{ - "name": *nameFlag, - "displayName": *displayNameFlag, - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - fmt.Printf("Organization %q created.\n", *nameFlag) - return nil - } - - // Register the command. - orgsCommands = append(orgsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/orgs_delete.go b/cmd/src/orgs_delete.go index 48d764f315..49a3d6201f 100644 --- a/cmd/src/orgs_delete.go +++ b/cmd/src/orgs_delete.go @@ -2,10 +2,8 @@ package main import ( "context" - "flag" "fmt" - "github.com/sourcegraph/src-cli/internal/api" "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) @@ -66,55 +64,3 @@ var orgsDeleteCommand = clicompat.Wrap(&cli.Command{ return err }, }) - -func init() { - usage := orgsDeleteExamples - - flagSet := flag.NewFlagSet("delete", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - orgIDFlag = flagSet.String("id", "", `The ID of the organization to delete.`) - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation DeleteOrganization( - $organization: ID! -) { - deleteOrganization( - organization: $organization - ) { - alwaysNil - } -}` - - var result struct { - DeleteOrganization struct{} - } - if ok, err := client.NewRequest(query, map[string]any{ - "organization": *orgIDFlag, - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - fmt.Printf("Organization with ID %q deleted.\n", *orgIDFlag) - return nil - } - - // Register the command. - orgsCommands = append(orgsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/orgs_get.go b/cmd/src/orgs_get.go index 931e751534..3a5a9189c2 100644 --- a/cmd/src/orgs_get.go +++ b/cmd/src/orgs_get.go @@ -2,10 +2,7 @@ package main import ( "context" - "flag" - "fmt" - "github.com/sourcegraph/src-cli/internal/api" "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) @@ -73,60 +70,3 @@ var orgsGetCommand = clicompat.Wrap(&cli.Command{ return execTemplate(tmpl, result.Organization) }, }) - -func init() { - usage := orgsGetExamples - - flagSet := flag.NewFlagSet("get", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - nameFlag = flagSet.String("name", "", `Look up organization by name. (e.g. "abc-org")`) - formatFlag = flagSet.String("f", "{{.|json}}", `Format for the output, using the syntax of Go package text/template. (e.g. "{{.ID}}: {{.Name}} ({{.DisplayName}})")`) - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - tmpl, err := parseTemplate(*formatFlag) - if err != nil { - return err - } - - query := `query Organization( - $name: String!, -) { - organization( - name: $name - ) { - ...OrgFields - } -}` + orgFragment - - var result struct { - Organization *Org - } - if ok, err := client.NewRequest(query, map[string]any{ - "name": *nameFlag, - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - return execTemplate(tmpl, result.Organization) - } - - // Register the command. - orgsCommands = append(orgsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/orgs_list.go b/cmd/src/orgs_list.go index 07b45090ea..a4b643ef8d 100644 --- a/cmd/src/orgs_list.go +++ b/cmd/src/orgs_list.go @@ -2,8 +2,6 @@ package main import ( "context" - "flag" - "fmt" "github.com/sourcegraph/src-cli/internal/api" "github.com/sourcegraph/src-cli/internal/clicompat" @@ -91,73 +89,3 @@ var orgsListCommand = clicompat.Wrap(&cli.Command{ return nil }, }) - -func init() { - usage := orgsListExamples - - flagSet := flag.NewFlagSet("list", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - firstFlag = flagSet.Int("first", 1000, "Returns the first n organizations from the list.") - queryFlag = flagSet.String("query", "", `Returns organizations whose names match the query. (e.g. "alice")`) - formatFlag = flagSet.String("f", "{{.Name}}", `Format for the output, using the syntax of Go package text/template. (e.g. "{{.ID}}: {{.Name}} ({{.DisplayName}})" or "{{.|json}}")`) - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - tmpl, err := parseTemplate(*formatFlag) - if err != nil { - return err - } - - query := `query Organizations( - $first: Int, - $query: String, -) { - organizations( - first: $first, - query: $query, - ) { - nodes { - ...OrgFields - } - } -}` + orgFragment - - var result struct { - Organizations struct { - Nodes []Org - } - } - if ok, err := client.NewRequest(query, map[string]any{ - "first": api.NullInt(*firstFlag), - "query": api.NullString(*queryFlag), - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - for _, org := range result.Organizations.Nodes { - if err := execTemplate(tmpl, org); err != nil { - return err - } - } - return nil - } - - // Register the command. - orgsCommands = append(orgsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/orgs_members.go b/cmd/src/orgs_members.go index f04da3474d..bf033644ff 100644 --- a/cmd/src/orgs_members.go +++ b/cmd/src/orgs_members.go @@ -1,15 +1,10 @@ package main import ( - "flag" - "fmt" - "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) -var orgsMembersCommands commander - var orgsMembersCommand = clicompat.Wrap(&cli.Command{ Name: "members", Aliases: []string{"member"}, @@ -36,23 +31,3 @@ The commands are: Use "src orgs members [command] -h" for more information about a command. ` - -func init() { - usage := orgsMembersExamples - - flagSet := flag.NewFlagSet("members", flag.ExitOnError) - handler := func(args []string) error { - orgsMembersCommands.run(flagSet, "src orgs members", usage, args) - return nil - } - - // Register the command. - orgsCommands = append(orgsCommands, &command{ - flagSet: flagSet, - aliases: []string{"member"}, - handler: handler, - usageFunc: func() { - fmt.Println(usage) - }, - }) -} diff --git a/cmd/src/orgs_members_add.go b/cmd/src/orgs_members_add.go index b0b54b91e0..f6fa691f87 100644 --- a/cmd/src/orgs_members_add.go +++ b/cmd/src/orgs_members_add.go @@ -2,10 +2,8 @@ package main import ( "context" - "flag" "fmt" - "github.com/sourcegraph/src-cli/internal/api" "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) @@ -67,59 +65,3 @@ var orgsMembersAddCommand = clicompat.Wrap(&cli.Command{ return err }, }) - -func init() { - usage := orgsMembersAddExamples - - flagSet := flag.NewFlagSet("add", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs members %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - orgIDFlag = flagSet.String("org-id", "", "ID of organization to which to add member. (required)") - usernameFlag = flagSet.String("username", "", "Username of user to add as member. (required)") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation AddUserToOrganization( - $organization: ID!, - $username: String!, -) { - addUserToOrganization( - organization: $organization, - username: $username, - ) { - alwaysNil - } -}` - - var result struct { - AddUserToOrganization struct{} - } - if ok, err := client.NewRequest(query, map[string]any{ - "organization": *orgIDFlag, - "username": *usernameFlag, - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - fmt.Printf("User %q added as member to organization with ID %q.\n", *usernameFlag, *orgIDFlag) - return nil - } - - // Register the command. - orgsMembersCommands = append(orgsMembersCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/orgs_members_remove.go b/cmd/src/orgs_members_remove.go index 2b4e1dfd3f..9eac9f0fd0 100644 --- a/cmd/src/orgs_members_remove.go +++ b/cmd/src/orgs_members_remove.go @@ -2,10 +2,8 @@ package main import ( "context" - "flag" "fmt" - "github.com/sourcegraph/src-cli/internal/api" "github.com/sourcegraph/src-cli/internal/clicompat" "github.com/urfave/cli/v3" ) @@ -66,59 +64,3 @@ var orgsMembersRemoveCommand = clicompat.Wrap(&cli.Command{ return err }, }) - -func init() { - usage := orgsMembersRemoveExamples - - flagSet := flag.NewFlagSet("remove", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src orgs members %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - orgIDFlag = flagSet.String("org-id", "", "ID of organization from which to remove member. (required)") - userIDFlag = flagSet.String("user-id", "", "ID of user to remove as member. (required)") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation RemoveUserFromOrg( - $orgID: ID!, - $userID: ID!, -) { - removeUserFromOrg( - orgID: $orgID, - userID: $userID, - ) { - alwaysNil - } -}` - - var result struct { - RemoveUserFromOrg struct{} - } - if ok, err := client.NewRequest(query, map[string]any{ - "orgID": *orgIDFlag, - "userID": *userIDFlag, - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - fmt.Printf("User %q removed as member from organization with ID %q.\n", *userIDFlag, *orgIDFlag) - return nil - } - - // Register the command. - orgsMembersCommands = append(orgsMembersCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -}