Skip to content

Commit aadf806

Browse files
committed
Merge branch 'main' into contributing
2 parents 747cdf4 + 13cef7d commit aadf806

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1493
-921
lines changed

.github/workflows/coder-test-stability.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ on:
1414
workflow_dispatch:
1515
inputs:
1616
iterationCount:
17-
description: 'Iteration Count'
17+
description: "Iteration Count"
1818
required: false
19-
default: '10'
19+
default: "10"
2020

2121
# Cancel in-progress runs for pull requests when developers push
2222
# additional changes, and serialize builds in branches.
@@ -43,7 +43,7 @@ jobs:
4343

4444
- uses: actions/setup-go@v2
4545
with:
46-
go-version: "^1.17"
46+
go-version: "~1.18"
4747

4848
- uses: actions/cache@v3
4949
with:

.github/workflows/coder.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
- name: golangci-lint
4545
uses: golangci/golangci-lint-action@v3.1.0
4646
with:
47-
version: v1.43.0
47+
version: v1.45.2
4848

4949
style-lint-typescript:
5050
name: "style/lint/typescript"
@@ -201,7 +201,7 @@ jobs:
201201

202202
- uses: actions/setup-go@v2
203203
with:
204-
go-version: "~1.17"
204+
go-version: "~1.18"
205205

206206
- name: Echo Go Cache Paths
207207
id: go-cache-paths
@@ -299,7 +299,7 @@ jobs:
299299

300300
- uses: actions/setup-go@v2
301301
with:
302-
go-version: "~1.17"
302+
go-version: "~1.18"
303303

304304
- name: Echo Go Cache Paths
305305
id: go-cache-paths
@@ -362,7 +362,7 @@ jobs:
362362
# Go is required for uploading the test results to datadog
363363
- uses: actions/setup-go@v2
364364
with:
365-
go-version: "~1.17"
365+
go-version: "~1.18"
366366

367367
- uses: actions/setup-node@v3
368368
with:

.github/workflows/release.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
fetch-depth: 0
1313
- uses: actions/setup-go@v2
1414
with:
15-
go-version: "^1.17"
15+
go-version: "~1.18"
1616

1717
- name: Run GoReleaser
1818
uses: goreleaser/goreleaser-action@v2.9.1

.golangci.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ linters-settings:
154154
- name: import-shadowing
155155
- name: increment-decrement
156156
- name: indent-error-flow
157-
- name: modifies-parameter
157+
# - name: modifies-parameter
158158
- name: modifies-value-receiver
159159
- name: package-comments
160160
- name: range
@@ -185,6 +185,8 @@ linters-settings:
185185
- i
186186
- db
187187
- t
188+
- id
189+
- wg
188190
# Optional list of variable declarations that should be ignored completely. (defaults to empty list)
189191
# Entries must be in the form of "<variable name> <type>" or "<variable name> *<type>" for
190192
# variables, or "const <name>" for constants.
@@ -193,6 +195,8 @@ linters-settings:
193195
- r *http.Request
194196
- t testing.T
195197
- t testing.TB
198+
- ok bool
199+
- wg sync.WaitGroup
196200

197201
issues:
198202
# Rules listed here: https://github.com/securego/gosec#available-rules

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ install: bin
5050
@echo "-- CLI available at $(shell ls $(INSTALL_DIR)/coder*)"
5151
.PHONY: install
5252

53+
lint:
54+
golangci-lint run
55+
.PHONY: lint
56+
5357
peerbroker/proto: peerbroker/proto/peerbroker.proto
5458
protoc \
5559
--go_out=. \
@@ -91,3 +95,4 @@ site/out:
9195

9296
test:
9397
gotestsum -- -v -short ./...
98+

cli/cliflag/cliflag.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Package cliflag extends flagset with environment variable defaults.
2+
//
3+
// Usage:
4+
//
5+
// cliflag.String(root.Flags(), &address, "address", "a", "CODER_ADDRESS", "127.0.0.1:3000", "The address to serve the API and dashboard")
6+
//
7+
// Will produce the following usage docs:
8+
//
9+
// -a, --address string The address to serve the API and dashboard (uses $CODER_ADDRESS). (default "127.0.0.1:3000")
10+
//
11+
package cliflag
12+
13+
import (
14+
"fmt"
15+
"os"
16+
"strconv"
17+
18+
"github.com/spf13/pflag"
19+
)
20+
21+
// StringVarP sets a string flag on the given flag set.
22+
func StringVarP(flagset *pflag.FlagSet, p *string, name string, shorthand string, env string, def string, usage string) {
23+
v, ok := os.LookupEnv(env)
24+
if !ok || v == "" {
25+
v = def
26+
}
27+
flagset.StringVarP(p, name, shorthand, v, fmtUsage(usage, env))
28+
}
29+
30+
// Uint8VarP sets a uint8 flag on the given flag set.
31+
func Uint8VarP(flagset *pflag.FlagSet, ptr *uint8, name string, shorthand string, env string, def uint8, usage string) {
32+
val, ok := os.LookupEnv(env)
33+
if !ok || val == "" {
34+
flagset.Uint8VarP(ptr, name, shorthand, def, fmtUsage(usage, env))
35+
return
36+
}
37+
38+
vi64, err := strconv.ParseUint(val, 10, 8)
39+
if err != nil {
40+
flagset.Uint8VarP(ptr, name, shorthand, def, fmtUsage(usage, env))
41+
return
42+
}
43+
44+
flagset.Uint8VarP(ptr, name, shorthand, uint8(vi64), fmtUsage(usage, env))
45+
}
46+
47+
// BoolVarP sets a bool flag on the given flag set.
48+
func BoolVarP(flagset *pflag.FlagSet, ptr *bool, name string, shorthand string, env string, def bool, usage string) {
49+
val, ok := os.LookupEnv(env)
50+
if !ok || val == "" {
51+
flagset.BoolVarP(ptr, name, shorthand, def, fmtUsage(usage, env))
52+
return
53+
}
54+
55+
valb, err := strconv.ParseBool(val)
56+
if err != nil {
57+
flagset.BoolVarP(ptr, name, shorthand, def, fmtUsage(usage, env))
58+
return
59+
}
60+
61+
flagset.BoolVarP(ptr, name, shorthand, valb, fmtUsage(usage, env))
62+
}
63+
64+
func fmtUsage(u string, env string) string {
65+
if env == "" {
66+
return fmt.Sprintf("%s.", u)
67+
}
68+
69+
return fmt.Sprintf("%s - consumes $%s.", u, env)
70+
}

cli/cliflag/cliflag_test.go

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package cliflag_test
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"testing"
7+
8+
"github.com/spf13/pflag"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/coder/coder/cli/cliflag"
12+
"github.com/coder/coder/cryptorand"
13+
)
14+
15+
// Testcliflag cannot run in parallel because it uses t.Setenv.
16+
//nolint:paralleltest
17+
func TestCliflag(t *testing.T) {
18+
t.Run("StringDefault", func(t *testing.T) {
19+
var ptr string
20+
flagset, name, shorthand, env, usage := randomFlag()
21+
def, _ := cryptorand.String(10)
22+
23+
cliflag.StringVarP(flagset, &ptr, name, shorthand, env, def, usage)
24+
got, err := flagset.GetString(name)
25+
require.NoError(t, err)
26+
require.Equal(t, def, got)
27+
require.Contains(t, flagset.FlagUsages(), usage)
28+
require.Contains(t, flagset.FlagUsages(), fmt.Sprintf(" - consumes $%s", env))
29+
})
30+
31+
t.Run("StringEnvVar", func(t *testing.T) {
32+
var ptr string
33+
flagset, name, shorthand, env, usage := randomFlag()
34+
envValue, _ := cryptorand.String(10)
35+
t.Setenv(env, envValue)
36+
def, _ := cryptorand.String(10)
37+
38+
cliflag.StringVarP(flagset, &ptr, name, shorthand, env, def, usage)
39+
got, err := flagset.GetString(name)
40+
require.NoError(t, err)
41+
require.Equal(t, envValue, got)
42+
})
43+
44+
t.Run("EmptyEnvVar", func(t *testing.T) {
45+
var ptr string
46+
flagset, name, shorthand, _, usage := randomFlag()
47+
def, _ := cryptorand.String(10)
48+
49+
cliflag.StringVarP(flagset, &ptr, name, shorthand, "", def, usage)
50+
got, err := flagset.GetString(name)
51+
require.NoError(t, err)
52+
require.Equal(t, def, got)
53+
require.Contains(t, flagset.FlagUsages(), usage)
54+
require.NotContains(t, flagset.FlagUsages(), " - consumes")
55+
})
56+
57+
t.Run("IntDefault", func(t *testing.T) {
58+
var ptr uint8
59+
flagset, name, shorthand, env, usage := randomFlag()
60+
def, _ := cryptorand.Int63n(10)
61+
62+
cliflag.Uint8VarP(flagset, &ptr, name, shorthand, env, uint8(def), usage)
63+
got, err := flagset.GetUint8(name)
64+
require.NoError(t, err)
65+
require.Equal(t, uint8(def), got)
66+
require.Contains(t, flagset.FlagUsages(), usage)
67+
require.Contains(t, flagset.FlagUsages(), fmt.Sprintf(" - consumes $%s", env))
68+
})
69+
70+
t.Run("IntEnvVar", func(t *testing.T) {
71+
var ptr uint8
72+
flagset, name, shorthand, env, usage := randomFlag()
73+
envValue, _ := cryptorand.Int63n(10)
74+
t.Setenv(env, strconv.FormatUint(uint64(envValue), 10))
75+
def, _ := cryptorand.Int()
76+
77+
cliflag.Uint8VarP(flagset, &ptr, name, shorthand, env, uint8(def), usage)
78+
got, err := flagset.GetUint8(name)
79+
require.NoError(t, err)
80+
require.Equal(t, uint8(envValue), got)
81+
})
82+
83+
t.Run("IntFailParse", func(t *testing.T) {
84+
var ptr uint8
85+
flagset, name, shorthand, env, usage := randomFlag()
86+
envValue, _ := cryptorand.String(10)
87+
t.Setenv(env, envValue)
88+
def, _ := cryptorand.Int63n(10)
89+
90+
cliflag.Uint8VarP(flagset, &ptr, name, shorthand, env, uint8(def), usage)
91+
got, err := flagset.GetUint8(name)
92+
require.NoError(t, err)
93+
require.Equal(t, uint8(def), got)
94+
})
95+
96+
t.Run("BoolDefault", func(t *testing.T) {
97+
var ptr bool
98+
flagset, name, shorthand, env, usage := randomFlag()
99+
def, _ := cryptorand.Bool()
100+
101+
cliflag.BoolVarP(flagset, &ptr, name, shorthand, env, def, usage)
102+
got, err := flagset.GetBool(name)
103+
require.NoError(t, err)
104+
require.Equal(t, def, got)
105+
require.Contains(t, flagset.FlagUsages(), usage)
106+
require.Contains(t, flagset.FlagUsages(), fmt.Sprintf(" - consumes $%s", env))
107+
})
108+
109+
t.Run("BoolEnvVar", func(t *testing.T) {
110+
var ptr bool
111+
flagset, name, shorthand, env, usage := randomFlag()
112+
envValue, _ := cryptorand.Bool()
113+
t.Setenv(env, strconv.FormatBool(envValue))
114+
def, _ := cryptorand.Bool()
115+
116+
cliflag.BoolVarP(flagset, &ptr, name, shorthand, env, def, usage)
117+
got, err := flagset.GetBool(name)
118+
require.NoError(t, err)
119+
require.Equal(t, envValue, got)
120+
})
121+
122+
t.Run("BoolFailParse", func(t *testing.T) {
123+
var ptr bool
124+
flagset, name, shorthand, env, usage := randomFlag()
125+
envValue, _ := cryptorand.String(10)
126+
t.Setenv(env, envValue)
127+
def, _ := cryptorand.Bool()
128+
129+
cliflag.BoolVarP(flagset, &ptr, name, shorthand, env, def, usage)
130+
got, err := flagset.GetBool(name)
131+
require.NoError(t, err)
132+
require.Equal(t, def, got)
133+
})
134+
}
135+
136+
func randomFlag() (*pflag.FlagSet, string, string, string, string) {
137+
fsname, _ := cryptorand.String(10)
138+
flagset := pflag.NewFlagSet(fsname, pflag.PanicOnError)
139+
name, _ := cryptorand.String(10)
140+
shorthand, _ := cryptorand.String(1)
141+
env, _ := cryptorand.String(10)
142+
usage, _ := cryptorand.String(10)
143+
144+
return flagset, name, shorthand, env, usage
145+
}

cli/cliui/cliui.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ func ValidateNotEmpty(s string) error {
2323
// Styles compose visual elements of the UI!
2424
var Styles = struct {
2525
Bold,
26+
Checkmark,
2627
Code,
28+
Crossmark,
2729
Field,
2830
Keyword,
2931
Paragraph,
@@ -36,7 +38,9 @@ var Styles = struct {
3638
Wrap lipgloss.Style
3739
}{
3840
Bold: lipgloss.NewStyle().Bold(true),
41+
Checkmark: defaultStyles.Checkmark,
3942
Code: defaultStyles.Code,
43+
Crossmark: defaultStyles.Error.Copy().SetString("✘"),
4044
Field: defaultStyles.Code.Copy().Foreground(lipgloss.AdaptiveColor{Light: "#000000", Dark: "#FFFFFF"}),
4145
Keyword: defaultStyles.Keyword,
4246
Paragraph: defaultStyles.Paragraph,

0 commit comments

Comments
 (0)