From 2000c59f79267f7317a7a9822a2e72815b344b9b Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Wed, 9 Sep 2026 05:37:30 +0000 Subject: [PATCH 1/2] remove: `src teams` commands Teams were removed in Sourcegraph 7.0. Since #1257 (src-cli 7.0.0) the command has refused to run against 7.x instances, so it only works against instances that are no longer supported. Remove it and its reference page. Drops the "teams.md" entry from the doc golden list and the legacyGroupsWithoutSubcommandPages exemption added in #1375, so every remaining legacy group is now expanded into subcommand pages. Part of https://linear.app/sourcegraph/issue/FE-502 Amp-Thread-ID: https://ampcode.com/threads/T-01a08410-86ca-72be-9928-2810e837fae1 Co-authored-by: Amp --- CHANGELOG.md | 1 + cmd/src/doc_test.go | 5 +- cmd/src/main.go | 1 - cmd/src/team_members_list.go | 111 --------------------------- cmd/src/teams.go | 88 --------------------- cmd/src/teams_create.go | 96 ----------------------- cmd/src/teams_delete.go | 74 ------------------ cmd/src/teams_list.go | 130 -------------------------------- cmd/src/teams_members.go | 55 -------------- cmd/src/teams_members_add.go | 108 -------------------------- cmd/src/teams_members_remove.go | 108 -------------------------- cmd/src/teams_update.go | 92 ---------------------- 12 files changed, 2 insertions(+), 867 deletions(-) delete mode 100644 cmd/src/team_members_list.go delete mode 100644 cmd/src/teams.go delete mode 100644 cmd/src/teams_create.go delete mode 100644 cmd/src/teams_delete.go delete mode 100644 cmd/src/teams_list.go delete mode 100644 cmd/src/teams_members.go delete mode 100644 cmd/src/teams_members_add.go delete mode 100644 cmd/src/teams_members_remove.go delete mode 100644 cmd/src/teams_update.go 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..d726e1041f 100644 --- a/cmd/src/main.go +++ b/cmd/src/main.go @@ -63,7 +63,6 @@ The commands are: 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, - }) -} From 89e7de3e2a4a2a1b2683c5aaffbf53da22fffd37 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Wed, 9 Sep 2026 05:46:45 +0000 Subject: [PATCH 2/2] remove Sourcegraph70 feature flag and stale extensions/gateway help entries Sourcegraph70 was only used by the teams version gate. The `extensions` and `gateway` commands were removed in #1173 and earlier but were still listed in `src help`. Part of https://linear.app/sourcegraph/issue/FE-502 Amp-Thread-ID: https://ampcode.com/threads/T-01a08410-86ca-72be-9928-2810e837fae1 Co-authored-by: Amp --- cmd/src/main.go | 2 -- internal/features/features.go | 2 -- 2 files changed, 4 deletions(-) diff --git a/cmd/src/main.go b/cmd/src/main.go index d726e1041f..9cc205a7ec 100644 --- a/cmd/src/main.go +++ b/cmd/src/main.go @@ -58,9 +58,7 @@ 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 repos,repo manages repositories 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 {