diff --git a/internal/run/run.go b/internal/run/run.go index da2333f..5512cba 100644 --- a/internal/run/run.go +++ b/internal/run/run.go @@ -344,6 +344,7 @@ func resolveCredentials( resolved := make([]credential.Resolved, 0, len(entries)) failures := make(map[string]error) entryByEnvVar := make(map[string]credential.Entry, len(entries)) + connectableByEnvVar := make(map[string]credential.Entry) for _, entry := range entries { entryByEnvVar[entry.EnvVar] = entry @@ -352,13 +353,19 @@ func resolveCredentials( if err != nil { printCredentialFailure(entry, err, diagnostics) failures[entry.EnvVar] = err + if resolutionErr, ok := err.(*credentialResolutionError); ok && resolutionErr.Reason == failureDisconnected { + connectableByEnvVar[entry.EnvVar] = entry + } else { + delete(connectableByEnvVar, entry.EnvVar) + } continue } fmt.Fprintln(os.Stderr, "✓") + delete(connectableByEnvVar, entry.EnvVar) resolved = append(resolved, resolvedCredential) } - connectable := unresolvedConnectableEntries(entryByEnvVar, failures) + connectable := sortedConnectableEntries(connectableByEnvVar) if len(connectable) == 0 { printLaunchWarnings(entryByEnvVar, failures, diagnostics) return resolved, nil @@ -435,17 +442,9 @@ func printHostedConnectInstructions(out io.Writer, providerList, connectURL stri return true } -func unresolvedConnectableEntries(entryByEnvVar map[string]credential.Entry, failures map[string]error) []credential.Entry { - var entries []credential.Entry - for envVar, err := range failures { - resolutionErr, ok := err.(*credentialResolutionError) - if !ok || resolutionErr.Reason != failureDisconnected { - continue - } - entry, ok := entryByEnvVar[envVar] - if !ok { - continue - } +func sortedConnectableEntries(entriesByEnvVar map[string]credential.Entry) []credential.Entry { + entries := make([]credential.Entry, 0, len(entriesByEnvVar)) + for _, entry := range entriesByEnvVar { entries = append(entries, entry) } slices.SortFunc(entries, func(a, b credential.Entry) int { diff --git a/internal/run/run_test.go b/internal/run/run_test.go index 31530fe..a37e805 100644 --- a/internal/run/run_test.go +++ b/internal/run/run_test.go @@ -673,6 +673,30 @@ func TestResolveCredentialsUsesInjectedProvider(t *testing.T) { } } +func TestSortedConnectableEntriesOrdersByEnvVar(t *testing.T) { + t.Parallel() + + got := sortedConnectableEntries(map[string]credential.Entry{ + "LINEAR_API_KEY": { + EnvVar: "LINEAR_API_KEY", + Provider: "linear", + }, + "GITHUB_TOKEN": { + EnvVar: "GITHUB_TOKEN", + Provider: "github", + }, + }) + if len(got) != 2 { + t.Fatalf("len(sortedConnectableEntries()) = %d, want 2", len(got)) + } + if got[0].EnvVar != "GITHUB_TOKEN" { + t.Fatalf("got[0].EnvVar = %q, want %q", got[0].EnvVar, "GITHUB_TOKEN") + } + if got[1].EnvVar != "LINEAR_API_KEY" { + t.Fatalf("got[1].EnvVar = %q, want %q", got[1].EnvVar, "LINEAR_API_KEY") + } +} + func TestHostedCredentialProviderConnectURLUsesOwnSessionAndClientID(t *testing.T) { t.Parallel()