Skip to content

Commit 8da9317

Browse files
committed
migrate login to urfave/cli
1 parent b071e59 commit 8da9317

File tree

3 files changed

+51
-31
lines changed

3 files changed

+51
-31
lines changed

cmd/src/login.go

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@ package main
22

33
import (
44
"context"
5-
"flag"
65
"fmt"
76
"io"
87
"net/url"
9-
"os"
108

119
"github.com/sourcegraph/src-cli/internal/api"
10+
"github.com/sourcegraph/src-cli/internal/clicompat"
1211
"github.com/sourcegraph/src-cli/internal/cmderrors"
1312
"github.com/sourcegraph/src-cli/internal/oauth"
13+
"github.com/urfave/cli/v3"
1414
)
1515

16-
func init() {
17-
usage := `'src login' helps you authenticate 'src' to access a Sourcegraph instance with your user credentials.
16+
const loginExamples = `'src login' helps you authenticate 'src' to access a Sourcegraph instance with your user credentials.
1817
1918
Usage:
2019
@@ -35,49 +34,37 @@ Examples:
3534
$ src login https://sourcegraph.com
3635
`
3736

38-
flagSet := flag.NewFlagSet("login", flag.ExitOnError)
39-
usageFunc := func() {
40-
fmt.Fprintln(flag.CommandLine.Output(), usage)
41-
flagSet.PrintDefaults()
42-
}
43-
44-
var (
45-
apiFlags = api.NewFlags(flagSet)
46-
)
47-
48-
handler := func(args []string) error {
49-
if err := flagSet.Parse(args); err != nil {
50-
return err
51-
}
52-
37+
var loginCommand = clicompat.Wrap(&cli.Command{
38+
Name: "login",
39+
Usage: "authenticate to a Sourcegraph instance with your user credentials",
40+
UsageText: "src login [command options] [SOURCEGRAPH_URL]",
41+
Description: loginExamples,
42+
HideVersion: true,
43+
Flags: clicompat.WithAPIFlags(),
44+
Action: func(ctx context.Context, cmd *cli.Command) error {
5345
var loginEndpointURL *url.URL
54-
if flagSet.NArg() >= 1 {
55-
arg := flagSet.Arg(0)
46+
if cmd.Args().Present() {
47+
arg := cmd.Args().First()
5648
u, err := parseEndpoint(arg)
5749
if err != nil {
5850
return cmderrors.Usage(fmt.Sprintf("invalid endpoint URL: %s", arg))
5951
}
6052
loginEndpointURL = u
6153
}
6254

55+
apiFlags := clicompat.APIFlagsFromCmd(cmd)
6356
client := cfg.apiClient(apiFlags, io.Discard)
6457

65-
return loginCmd(context.Background(), loginParams{
58+
return loginCmd(ctx, loginParams{
6659
cfg: cfg,
6760
client: client,
68-
out: os.Stdout,
61+
out: cmd.Writer,
6962
apiFlags: apiFlags,
7063
oauthClient: oauth.NewClient(oauth.DefaultClientID),
7164
loginEndpointURL: loginEndpointURL,
7265
})
73-
}
74-
75-
commands = append(commands, &command{
76-
flagSet: flagSet,
77-
handler: handler,
78-
usageFunc: usageFunc,
79-
})
80-
}
66+
},
67+
})
8168

8269
type loginParams struct {
8370
cfg *config

cmd/src/login_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/sourcegraph/src-cli/internal/cmderrors"
1616
"github.com/sourcegraph/src-cli/internal/oauth"
17+
"github.com/urfave/cli/v3"
1718
)
1819

1920
func mustParseURL(t *testing.T, raw string) *url.URL {
@@ -164,6 +165,37 @@ func TestLogin(t *testing.T) {
164165
})
165166
}
166167

168+
func TestLoginCommand(t *testing.T) {
169+
prevCfg := cfg
170+
defer func() { cfg = prevCfg }()
171+
172+
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
173+
fmt.Fprintln(w, `{"data":{"currentUser":{"username":"alice"}}}`)
174+
}))
175+
defer s.Close()
176+
177+
cfg = &config{
178+
endpointURL: mustParseURL(t, s.URL),
179+
accessToken: "x",
180+
}
181+
182+
var out bytes.Buffer
183+
cmd := *loginCommand
184+
cmd.Writer = &out
185+
cmd.ErrWriter = &out
186+
cmd.ExitErrHandler = func(context.Context, *cli.Command, error) {}
187+
188+
err := cmd.Run(context.Background(), []string{"login", s.URL})
189+
if err != nil {
190+
t.Fatal(err)
191+
}
192+
193+
want := "\n✔︎ Authenticated as alice on " + s.URL + "\n\n\n💡 Tip: To use this endpoint in your shell, run:\n\n export SRC_ENDPOINT=" + s.URL + "\n\n"
194+
if out.String() != want {
195+
t.Fatalf("output = %q, want %q", out.String(), want)
196+
}
197+
}
198+
167199
type fakeOAuthClient struct {
168200
startErr error
169201
startCalled *bool

cmd/src/run_migration_compat.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
var migratedCommands = map[string]*cli.Command{
1919
"abc": abcCommand,
2020
"auth": authCommand,
21+
"login": loginCommand,
2122
"version": versionCommand,
2223
}
2324

0 commit comments

Comments
 (0)