diff --git a/cli/gitssh.go b/cli/gitssh.go index 1591a14a6ac6b..e88c24747c7fa 100644 --- a/cli/gitssh.go +++ b/cli/gitssh.go @@ -1,14 +1,16 @@ package cli import ( + "fmt" "net/url" "os" "os/exec" + "strings" + "github.com/coder/coder/cli/cliui" + "github.com/coder/coder/codersdk" "github.com/spf13/cobra" "golang.org/x/xerrors" - - "github.com/coder/coder/codersdk" ) func gitssh() *cobra.Command { @@ -55,12 +57,25 @@ func gitssh() *cobra.Command { return xerrors.Errorf("close temp gitsshkey file: %w", err) } - a := append([]string{"-i", privateKeyFile.Name()}, args...) - c := exec.CommandContext(cmd.Context(), "ssh", a...) + args = append([]string{"-i", privateKeyFile.Name()}, args...) + c := exec.CommandContext(cmd.Context(), "ssh", args...) + c.Stderr = cmd.ErrOrStderr() c.Stdout = cmd.OutOrStdout() c.Stdin = cmd.InOrStdin() err = c.Run() if err != nil { + exitErr := &exec.ExitError{} + if xerrors.As(err, &exitErr) && exitErr.ExitCode() == 255 { + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), + "\n"+cliui.Styles.Wrap.Render("Coder authenticates with "+cliui.Styles.Field.Render("git")+ + " using the public key below. All clones with SSH are authenticated automatically 🪄.")+"\n") + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), cliui.Styles.Code.Render(strings.TrimSpace(key.PublicKey))+"\n") + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), "Add to GitHub and GitLab:") + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), cliui.Styles.Prompt.String()+"https://github.com/settings/ssh/new") + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), cliui.Styles.Prompt.String()+"https://gitlab.com/-/profile/keys") + _, _ = fmt.Fprintln(cmd.ErrOrStderr()) + return err + } return xerrors.Errorf("run ssh command: %w", err) } diff --git a/cli/publickey.go b/cli/publickey.go index 3d61a8d7df8e5..d8d59a292cc71 100644 --- a/cli/publickey.go +++ b/cli/publickey.go @@ -30,11 +30,11 @@ func publickey() *cobra.Command { "Coder. All clones with SSH will be authenticated automatically 🪄.", )) cmd.Println() + cmd.Println(cliui.Styles.Code.Render(strings.TrimSpace(key.PublicKey))) + cmd.Println() cmd.Println("Add to GitHub and GitLab:") cmd.Println(cliui.Styles.Prompt.String() + "https://github.com/settings/ssh/new") cmd.Println(cliui.Styles.Prompt.String() + "https://gitlab.com/-/profile/keys") - cmd.Println() - cmd.Println(cliui.Styles.Code.Render(strings.TrimSpace(key.PublicKey))) return nil }, diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 0bc1657b883b8..1543980ab6eb2 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -105,6 +105,7 @@ func (api *api) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { } httpapi.Write(rw, http.StatusOK, codersdk.AgentGitSSHKey{ + PublicKey: gitSSHKey.PublicKey, PrivateKey: gitSSHKey.PrivateKey, }) } diff --git a/codersdk/gitsshkey.go b/codersdk/gitsshkey.go index bae8a4c343ce6..3cc4333e735e3 100644 --- a/codersdk/gitsshkey.go +++ b/codersdk/gitsshkey.go @@ -19,6 +19,7 @@ type GitSSHKey struct { } type AgentGitSSHKey struct { + PublicKey string `json:"public_key"` PrivateKey string `json:"private_key"` } diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 9c2815b6efa79..230e600eeeb18 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -16,6 +16,7 @@ export interface GitSSHKey { // From codersdk/gitsshkey.go:21:6. export interface AgentGitSSHKey { + readonly public_key: string readonly private_key: string }