diff --git a/CHANGELOG.md b/CHANGELOG.md index d46f8fc6da..762e438f52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ All notable changes to `src-cli` are documented in this file. ### Removed - Removed `src sbom` and `src signature` commands. SBOMs and container signatures are no longer published as of Sourcegraph 7.1.0. +- Removed the `src teams` (`src team`) commands. Teams were removed in Sourcegraph 7.0 and the commands have refused to run against 7.x instances since src-cli 7.0.0. ## 6.7.1104 diff --git a/cmd/src/doc_test.go b/cmd/src/doc_test.go index f99fea6e18..10d5b0189e 100644 --- a/cmd/src/doc_test.go +++ b/cmd/src/doc_test.go @@ -16,9 +16,7 @@ import ( // deliberately left out of the commanders map in doc.go, so they render as a // single page instead of a directory of subcommand pages. Every entry needs a // reason. -var legacyGroupsWithoutSubcommandPages = map[string]string{ - "teams.md": "teams were removed in Sourcegraph 7.0 (see checkTeamsAvailability); don't expand docs for a removed feature", -} +var legacyGroupsWithoutSubcommandPages = map[string]string{} // expectedDocFiles is the full set of files 'src doc' is expected to write, // relative to the output directory. Update it deliberately when adding or @@ -94,7 +92,6 @@ var expectedDocFiles = []string{ "snapshot/summary.md", "snapshot/test.md", "snapshot/upload.md", - "teams.md", "users/create.md", "users/delete.md", "users/get.md", diff --git a/cmd/src/main.go b/cmd/src/main.go index 7bb75e6211..9cc205a7ec 100644 --- a/cmd/src/main.go +++ b/cmd/src/main.go @@ -58,12 +58,9 @@ The commands are: batch manages batch changes code-intel manages code intelligence data config manages global, org, and user settings - extensions,ext manages extensions (experimental) extsvc manages external services - gateway interacts with Cody Gateway login authenticate to a Sourcegraph instance with your user credentials orgs,org manages organizations - teams,team manages teams repos,repo manages repositories search search for results on Sourcegraph search-jobs manages search jobs diff --git a/cmd/src/team_members_list.go b/cmd/src/team_members_list.go deleted file mode 100644 index eb69d57719..0000000000 --- a/cmd/src/team_members_list.go +++ /dev/null @@ -1,111 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "os" - - "github.com/sourcegraph/sourcegraph/lib/errors" - - "github.com/sourcegraph/src-cli/internal/api" -) - -func init() { - usage := ` -Examples: - - List team members: - - $ src team members list -name= - - List team members whose names match the query: - - $ src team members list -name= -query='myquery' -` - - flagSet := flag.NewFlagSet("list", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src team members %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - nameFlag = flagSet.String("name", "", "The team of which to return members") - firstFlag = flagSet.Int("first", 1000, "Returns the first n teams from the list") - queryFlag = flagSet.String("query", "", `Returns teams whose name or displayname match the query. (e.g. "engineering")`) - formatFlag = flagSet.String("f", "{{.Username}}", `Format for the output, using the syntax of Go package text/template. (e.g. "{{.Name}}: {{.DisplayName}}" or "{{.|json}}")`) - jsonFlag = flagSet.Bool("json", false, `Format for the output as json`) - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - if *nameFlag == "" { - return errors.New("must provide -name") - } - - tmpl, err := parseTemplate(*formatFlag) - if err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `query TeamMembers( - $name: String!, - $first: Int, - $search: String -) { - team(name: $name) { - members ( - first: $first, - search: $search - ) { - nodes { - ...TeamMemberFields - } - } - } -} -` + teamMemberFragment - - var result struct { - Team struct { - Members struct { - Nodes []TeamMember - } - } - } - if ok, err := client.NewRequest(query, map[string]any{ - "name": *nameFlag, - "first": api.NullInt(*firstFlag), - "search": api.NullString(*queryFlag), - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - if jsonFlag != nil && *jsonFlag { - json.NewEncoder(os.Stdout).Encode(result.Team.Members.Nodes) - return nil - } - - for _, t := range result.Team.Members.Nodes { - if err := execTemplate(tmpl, t); err != nil { - return err - } - } - return nil - } - - // Register the command. - teamMembersCommands = append(teamMembersCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/teams.go b/cmd/src/teams.go deleted file mode 100644 index 1f3f5b2622..0000000000 --- a/cmd/src/teams.go +++ /dev/null @@ -1,88 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "os" - - "github.com/sourcegraph/src-cli/internal/api" - "github.com/sourcegraph/src-cli/internal/features" -) - -var teamsCommands commander - -func init() { - usage := `'src teams' is a tool that manages teams in a Sourcegraph instance. - -Usage: - - src teams command [command options] - -The commands are: - - list lists teams - create create a team - update update a team - delete delete a team - members manage team members, use "src teams members [command] -h" for more information. - -Use "src teams [command] -h" for more information about a command. -` - - flagSet := flag.NewFlagSet("teams", flag.ExitOnError) - handler := func(args []string) error { - if err := checkTeamsAvailability(); err != nil { - return err - } - teamsCommands.run(flagSet, "src teams", usage, args) - return nil - } - - // Register the command. - commands = append(commands, &command{ - flagSet: flagSet, - aliases: []string{"team"}, - handler: handler, - usageFunc: func() { - fmt.Println(usage) - }, - }) -} - -// checkTeamsAvailability verifies that the connected Sourcegraph instance -// supports teams. Teams were removed in Sourcegraph 7.0. -func checkTeamsAvailability() error { - client := cfg.apiClient(api.NewFlags(flag.NewFlagSet("", flag.ContinueOnError)), os.Stderr) - - version, err := api.GetSourcegraphVersion(context.Background(), client) - if err != nil || version == "" { - // If we can't determine the version, let the command proceed. - return nil - } - - var ffs features.FeatureFlags - if err := ffs.SetFromVersion(version, true); err != nil { - return nil - } - if ffs.Sourcegraph70 { - return fmt.Errorf("the 'src teams' commands are not available for Sourcegraph versions 7.0 and later (detected version: %s). Teams have been removed", version) - } - return nil -} - -const teamFragment = ` -fragment TeamFields on Team { - id - name - displayName - readonly -} -` - -type Team struct { - ID string `json:"id"` - Name string `json:"name"` - DisplayName string `json:"displayName"` - Readonly bool `json:"readonly"` -} diff --git a/cmd/src/teams_create.go b/cmd/src/teams_create.go deleted file mode 100644 index fd64fded4e..0000000000 --- a/cmd/src/teams_create.go +++ /dev/null @@ -1,96 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "strings" - - "github.com/sourcegraph/sourcegraph/lib/errors" - - "github.com/sourcegraph/src-cli/internal/api" - "github.com/sourcegraph/src-cli/internal/cmderrors" -) - -func init() { - usage := ` -Examples: - - Create a team "engineering": - - $ src teams create -name='engineering' [-display-name='Engineering Team'] [-parent-team='engineering-leadership'] [-read-only] - -` - - flagSet := flag.NewFlagSet("create", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src teams %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - nameFlag = flagSet.String("name", "", "The team name") - displayNameFlag = flagSet.String("display-name", "", "Optional additional display name for a more human-readable UI") - parentTeamFlag = flagSet.String("parent-team", "", "Optional name or ID of the parent team") - readonlyFlag = flagSet.Bool("read-only", false, "Optionally create the team as read-only marking it as externally managed in this UI") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - if *nameFlag == "" { - return errors.New("provide a name") - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation CreateTeam( - $name: String!, - $displayName: String, - $parentTeam: String, - $readonly: Boolean -) { - createTeam( - name: $name, - displayName: $displayName, - parentTeamName: $parentTeam, - readonly: $readonly, - ) { - ...TeamFields - } -} -` + teamFragment - - var result struct { - CreateTeam Team - } - if ok, err := client.NewRequest(query, map[string]any{ - "name": *nameFlag, - "displayName": api.NullString(*displayNameFlag), - "parentTeam": api.NullString(*parentTeamFlag), - "readonly": *readonlyFlag, - }).Do(context.Background(), &result); err != nil || !ok { - var gqlErr api.GraphQlErrors - if errors.As(err, &gqlErr) { - for _, e := range gqlErr { - if strings.Contains(e.Error(), "team name is already taken") { - return cmderrors.ExitCode(3, err) - } - } - } - return err - } - - return nil - } - - // Register the command. - teamsCommands = append(teamsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/teams_delete.go b/cmd/src/teams_delete.go deleted file mode 100644 index ce89f19b9f..0000000000 --- a/cmd/src/teams_delete.go +++ /dev/null @@ -1,74 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - - "github.com/sourcegraph/sourcegraph/lib/errors" - - "github.com/sourcegraph/src-cli/internal/api" -) - -func init() { - usage := ` -Examples: - - Delete the team "engineering": - - $ src teams delete -name='engineering' - -` - - flagSet := flag.NewFlagSet("delete", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src teams %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - nameFlag = flagSet.String("name", "", "The team name") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - if *nameFlag == "" { - return errors.New("provide a name") - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation DeleteTeam( - $name: String!, -) { - deleteTeam( - name: $name, - ) { - alwaysNil - } -} -` - - var result struct { - DeleteTeam any - } - if ok, err := client.NewRequest(query, map[string]any{ - "name": *nameFlag, - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - return nil - } - - // Register the command. - teamsCommands = append(teamsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/teams_list.go b/cmd/src/teams_list.go deleted file mode 100644 index 37efd25bfc..0000000000 --- a/cmd/src/teams_list.go +++ /dev/null @@ -1,130 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "os" - - "github.com/sourcegraph/src-cli/internal/api" -) - -func init() { - usage := ` -Examples: - - List teams: - - $ src teams list - - List teams whose names match the query: - - $ src teams list -query='myquery' -` - - flagSet := flag.NewFlagSet("list", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src teams %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - firstFlag = flagSet.Int("first", 1000, "Returns the first n teams from the list") - parentTeamFlag = flagSet.String("parent-team", "", "Get child teams of the given team") - queryFlag = flagSet.String("query", "", `Returns teams whose name or displayname match the query. (e.g. "engineering")`) - formatFlag = flagSet.String("f", "{{.Name}} {{if .DisplayName}}({{.DisplayName}}){{end}}", `Format for the output, using the syntax of Go package text/template. (e.g. "{{.Name}}: {{.DisplayName}}" or "{{.|json}}")`) - jsonFlag = flagSet.Bool("json", false, `Format for the output as json`) - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - tmpl, err := parseTemplate(*formatFlag) - if err != nil { - return err - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `query Teams( - $first: Int, - $search: String -) { - teams( - first: $first, - search: $search - ) { - nodes { - ...TeamFields - } - - } -}` + teamFragment - - if *parentTeamFlag != "" { - query = `query ChildTeams( - $first: Int, - $search: String, - $parentTeamName: String! - ) { - team(name: $parentTeamName) { - childTeams( - first: $first, - search: $search - ) { - nodes { - ...TeamFields - } - - } - } - }` + teamFragment - } - - var result struct { - Teams struct { - Nodes []Team - } - Team struct { - ChildTeams struct { - Nodes []Team - } - } - } - if ok, err := client.NewRequest(query, map[string]any{ - "first": api.NullInt(*firstFlag), - "search": api.NullString(*queryFlag), - "parentTeamName": api.NullString(*parentTeamFlag), - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - nodes := result.Teams.Nodes - if *parentTeamFlag != "" { - nodes = result.Team.ChildTeams.Nodes - } - - if jsonFlag != nil && *jsonFlag { - json.NewEncoder(os.Stdout).Encode(nodes) - return nil - } - - for _, t := range nodes { - if err := execTemplate(tmpl, t); err != nil { - return err - } - } - return nil - } - - // Register the command. - teamsCommands = append(teamsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/teams_members.go b/cmd/src/teams_members.go deleted file mode 100644 index 15be1b5331..0000000000 --- a/cmd/src/teams_members.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "flag" - "fmt" -) - -var teamMembersCommands commander - -func init() { - usage := `'src teams members' is a tool that manages team membership in a Sourcegraph instance. - -Usage: - - src team members command [command options] - -The commands are: - - list lists team members - add add team members - remove remove team members - -Use "src team members [command] -h" for more information about a command. -` - - flagSet := flag.NewFlagSet("members", flag.ExitOnError) - handler := func(args []string) error { - teamMembersCommands.run(flagSet, "src teams members", usage, args) - return nil - } - - // Register the command. - teamsCommands = append(teamsCommands, &command{ - flagSet: flagSet, - aliases: []string{"member"}, - handler: handler, - usageFunc: func() { - fmt.Println(usage) - }, - }) -} - -const teamMemberFragment = ` -fragment TeamMemberFields on TeamMember { - ... on User { - id - username - } -} -` - -type TeamMember struct { - ID string `json:"id"` - Username string `json:"username"` -} diff --git a/cmd/src/teams_members_add.go b/cmd/src/teams_members_add.go deleted file mode 100644 index ebc530cb4a..0000000000 --- a/cmd/src/teams_members_add.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - - "github.com/sourcegraph/sourcegraph/lib/errors" - - "github.com/sourcegraph/src-cli/internal/api" -) - -func init() { - usage := ` -Examples: - - Add a team member: - - $ src teams members add -team-name='engineering' [-email='alice@sourcegraph.com'] [-username='alice'] [-id='VXNlcjox'] [-external-account-service-id='https://github.com/' -external-account-service-type='github' [-external-account-account-id='123123123'] [-external-account-login='alice']] - -` - - flagSet := flag.NewFlagSet("add", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src teams %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - teamNameFlag = flagSet.String("team-name", "", "The team name") - skipUnmatchedMembersFlag = flagSet.Bool("skip-unmatched-members", false, "If true, members that don't match a Sourcegraph user or team will be silently skipped") - emailFlag = flagSet.String("email", "", "Email to match the user by") - usernameFlag = flagSet.String("username", "", "Username to match the user by") - idFlag = flagSet.String("id", "", "Sourcegraph user ID to match the user by") - externalAccountServiceIDFlag = flagSet.String("external-account-service-id", "", "External account service ID to match the user by, must specify all of externalAccount*") - externalAccountServiceTypeFlag = flagSet.String("external-account-service-type", "", "External account service type to match the user by, must specify all of externalAccount*") - externalAccountAccountIDFlag = flagSet.String("external-account-account-id", "", "External account account ID to match the user by, must specify all of externalAccount*") - externalAccountLoginFlag = flagSet.String("external-account-login", "", "External account login ID to match the user by, must specify all of externalAccount*") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - if *teamNameFlag == "" { - return errors.New("provide a team name") - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation AddTeamMember( - $teamName: String! - $id: ID, - $email: String, - $username: String, - $externalAccountServiceID: String, - $externalAccountServiceType: String, - $externalAccountAccountID: String, - $externalAccountLogin: String, - $skipUnmatchedMembers: Boolean, -) { - addTeamMembers( - teamName: $teamName, - members: [{ - userID: $id, - email: $email, - username: $username, - externalAccountServiceID: $externalAccountServiceID, - externalAccountServiceType: $externalAccountServiceType, - externalAccountAccountID: $externalAccountAccountID, - externalAccountLogin: $externalAccountLogin, - }], - skipUnmatchedMembers: $skipUnmatchedMembers, - ) { - ...TeamFields - } -} -` + teamFragment - - var result struct { - AddTeamMembers Team - } - if ok, err := client.NewRequest(query, map[string]any{ - "teamName": *teamNameFlag, - "skipUnmatchedMembers": *skipUnmatchedMembersFlag, - "id": api.NullString(*idFlag), - "email": api.NullString(*emailFlag), - "username": api.NullString(*usernameFlag), - "externalAccountServiceID": api.NullString(*externalAccountServiceIDFlag), - "externalAccountServiceType": api.NullString(*externalAccountServiceTypeFlag), - "externalAccountAccountID": api.NullString(*externalAccountAccountIDFlag), - "externalAccountLogin": api.NullString(*externalAccountLoginFlag), - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - return nil - } - - // Register the command. - teamMembersCommands = append(teamMembersCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/teams_members_remove.go b/cmd/src/teams_members_remove.go deleted file mode 100644 index fc52c32c34..0000000000 --- a/cmd/src/teams_members_remove.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - - "github.com/sourcegraph/sourcegraph/lib/errors" - - "github.com/sourcegraph/src-cli/internal/api" -) - -func init() { - usage := ` -Examples: - - Remove a team member: - - $ src teams members remove -team-name='engineering' [-email='alice@sourcegraph.com'] [-username='alice'] [-id='VXNlcjox'] [-external-account-service-id='https://github.com/' -external-account-service-type='github' [-external-account-account-id='123123123'] [-external-account-login='alice']] - -` - - flagSet := flag.NewFlagSet("remove", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src teams %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - teamNameFlag = flagSet.String("team-name", "", "The team name") - skipUnmatchedMembersFlag = flagSet.Bool("skip-unmatched-members", false, "If true, members that don't match a Sourcegraph user or team will be silently skipped") - emailFlag = flagSet.String("email", "", "Email to match the user by") - usernameFlag = flagSet.String("username", "", "Username to match the user by") - idFlag = flagSet.String("id", "", "Sourcegraph user ID to match the user by") - externalAccountServiceIDFlag = flagSet.String("external-account-service-id", "", "External account service ID to match the user by, must specify all of externalAccount*") - externalAccountServiceTypeFlag = flagSet.String("external-account-service-type", "", "External account service type to match the user by, must specify all of externalAccount*") - externalAccountAccountIDFlag = flagSet.String("external-account-account-id", "", "External account account ID to match the user by, must specify all of externalAccount*") - externalAccountLoginFlag = flagSet.String("external-account-login", "", "External account login ID to match the user by, must specify all of externalAccount*") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - if *teamNameFlag == "" { - return errors.New("provide a team name") - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation RemoveTeamMember( - $teamName: String! - $id: ID, - $email: String, - $username: String, - $externalAccountServiceID: String, - $externalAccountServiceType: String, - $externalAccountAccountID: String, - $externalAccountLogin: String, - $skipUnmatchedMembers: Boolean, -) { - removeTeamMembers( - teamName: $teamName, - members: [{ - userID: $id, - email: $email, - username: $username, - externalAccountServiceID: $externalAccountServiceID, - externalAccountServiceType: $externalAccountServiceType, - externalAccountAccountID: $externalAccountAccountID, - externalAccountLogin: $externalAccountLogin, - }], - skipUnmatchedMembers: $skipUnmatchedMembers, - ) { - ...TeamFields - } -} -` + teamFragment - - var result struct { - RemoveTeamMembers Team - } - if ok, err := client.NewRequest(query, map[string]any{ - "teamName": *teamNameFlag, - "skipUnmatchedMembers": *skipUnmatchedMembersFlag, - "id": api.NullString(*idFlag), - "email": api.NullString(*emailFlag), - "username": api.NullString(*usernameFlag), - "externalAccountServiceID": api.NullString(*externalAccountServiceIDFlag), - "externalAccountServiceType": api.NullString(*externalAccountServiceTypeFlag), - "externalAccountAccountID": api.NullString(*externalAccountAccountIDFlag), - "externalAccountLogin": api.NullString(*externalAccountLoginFlag), - }).Do(context.Background(), &result); err != nil || !ok { - return err - } - - return nil - } - - // Register the command. - teamMembersCommands = append(teamMembersCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/cmd/src/teams_update.go b/cmd/src/teams_update.go deleted file mode 100644 index ae5bdb2331..0000000000 --- a/cmd/src/teams_update.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "strings" - - "github.com/sourcegraph/sourcegraph/lib/errors" - - "github.com/sourcegraph/src-cli/internal/api" - "github.com/sourcegraph/src-cli/internal/cmderrors" -) - -func init() { - usage := ` -Examples: - - Update the team "engineering": - - $ src teams update -name='engineering' [-display-name='Engineering Team'] [-parent-team='engineering-leadership'] - -` - - flagSet := flag.NewFlagSet("update", flag.ExitOnError) - usageFunc := func() { - fmt.Fprintf(flag.CommandLine.Output(), "Usage of 'src teams %s':\n", flagSet.Name()) - flagSet.PrintDefaults() - fmt.Println(usage) - } - var ( - nameFlag = flagSet.String("name", "", "The team name") - displayNameFlag = flagSet.String("display-name", "", "Optional additional display name for a more human-readable UI") - parentTeamFlag = flagSet.String("parent-team", "", "Optional name or ID of the parent team") - apiFlags = api.NewFlags(flagSet) - ) - - handler := func(args []string) error { - if err := flagSet.Parse(args); err != nil { - return err - } - - if *nameFlag == "" { - return errors.New("provide a name") - } - - client := cfg.apiClient(apiFlags, flagSet.Output()) - - query := `mutation UpdateTeam( - $name: String!, - $displayName: String, - $parentTeam: String -) { - updateTeam( - name: $name, - displayName: $displayName, - parentTeamName: $parentTeam, - ) { - ...TeamFields - } -} -` + teamFragment - - var result struct { - UpdateTeam Team - } - if ok, err := client.NewRequest(query, map[string]any{ - "name": *nameFlag, - "displayName": api.NullString(*displayNameFlag), - "parentTeam": api.NullString(*parentTeamFlag), - }).Do(context.Background(), &result); err != nil || !ok { - var gqlErr api.GraphQlErrors - if errors.As(err, &gqlErr) { - for _, e := range gqlErr { - if strings.Contains(e.Error(), "team name is already taken") { - return cmderrors.ExitCode(3, err) - } - } - } - return err - } - - return nil - } - - // Register the command. - teamsCommands = append(teamsCommands, &command{ - flagSet: flagSet, - handler: handler, - usageFunc: usageFunc, - }) -} diff --git a/internal/features/features.go b/internal/features/features.go index 657ece2f14..52fcd1d5c9 100644 --- a/internal/features/features.go +++ b/internal/features/features.go @@ -13,7 +13,6 @@ import ( type FeatureFlags struct { Sourcegraph40 bool BinaryDiffs bool - Sourcegraph70 bool } func (ff *FeatureFlags) SetFromVersion(version string, skipErrors bool) error { @@ -33,7 +32,6 @@ func (ff *FeatureFlags) SetFromVersion(version string, skipErrors bool) error { // {&ff.FlagName, ">= 3.23.0-0", "2020-11-24"}, {&ff.Sourcegraph40, ">= 4.0.0-0", "2022-08-24"}, {&ff.BinaryDiffs, ">= 4.3.0-0", "2022-11-29"}, - {&ff.Sourcegraph70, ">= 7.0.0-0", "2026-02-25"}, } { value, err := api.CheckSourcegraphVersion(version, feature.constraint, feature.minDate) if err != nil {