@@ -4,7 +4,10 @@ import (
4
4
"bufio"
5
5
"context"
6
6
"fmt"
7
+ "io/ioutil"
7
8
"net/url"
9
+ "os/exec"
10
+ "runtime"
8
11
"strings"
9
12
10
13
"github.com/pkg/browser"
@@ -66,7 +69,8 @@ func login(cmd *cobra.Command, workspaceURL *url.URL) error {
66
69
q .Add ("show_token" , "true" )
67
70
authURL .RawQuery = q .Encode ()
68
71
69
- if err := browser .OpenURL (authURL .String ()); err != nil {
72
+ if err := openURL (authURL .String ()); err != nil {
73
+ clog .LogWarn (err .Error ())
70
74
fmt .Printf ("Open the following in your browser:\n \n \t %s\n \n " , authURL .String ())
71
75
} else {
72
76
fmt .Printf ("Your browser has been opened to visit:\n \n \t %s\n \n " , authURL .String ())
@@ -113,3 +117,36 @@ func pingAPI(ctx context.Context, workspaceURL *url.URL, token string) error {
113
117
}
114
118
return nil
115
119
}
120
+
121
+ // isWSL determines if coder-cli is running within Windows Subsystem for Linux
122
+ func isWSL () (bool , error ) {
123
+ if runtime .GOOS == goosDarwin || runtime .GOOS == goosWindows {
124
+ return false , nil
125
+ }
126
+ data , err := ioutil .ReadFile ("/proc/version" )
127
+ if err != nil {
128
+ return false , xerrors .Errorf ("read /proc/version: %w" , err )
129
+ }
130
+ return strings .Contains (strings .ToLower (string (data )), "microsoft" ), nil
131
+ }
132
+
133
+ // openURL opens the provided URL via user's default browser
134
+ func openURL (url string ) error {
135
+ var cmd string
136
+ var args []string
137
+
138
+ wsl , err := isWSL ()
139
+ if err != nil {
140
+ return xerrors .Errorf ("test running Windows Subsystem for Linux: %w" , err )
141
+ }
142
+
143
+ if wsl {
144
+ cmd = "cmd.exe"
145
+ args = []string {"/c" , "start" }
146
+ url = strings .ReplaceAll (url , "&" , "^&" )
147
+ args = append (args , url )
148
+ return exec .Command (cmd , args ... ).Start ()
149
+ }
150
+
151
+ return browser .OpenURL (url )
152
+ }
0 commit comments