Skip to content

Commit a2b69c8

Browse files
committed
Fix inconsistencies in log flags and env var
- Fix priority to match the commented behavior. - Ignore bogus LOG_LEVEL values.
1 parent 4cfd7c5 commit a2b69c8

File tree

2 files changed

+67
-38
lines changed

2 files changed

+67
-38
lines changed

src/node/cli.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ export const parse = (argv: string[]): Args => {
213213
;(args[key] as OptionalString) = new OptionalString(value)
214214
break
215215
default: {
216-
if (!Object.values(option.type).find((v) => v === value)) {
216+
if (!Object.values(option.type).includes(value)) {
217217
throw new Error(`--${key} valid values: [${Object.values(option.type).join(", ")}]`)
218218
}
219219
;(args[key] as string) = value
@@ -230,20 +230,26 @@ export const parse = (argv: string[]): Args => {
230230

231231
logger.debug("parsed command line", field("args", args))
232232

233-
// Ensure the environment variable and the flag are synced up. The flag takes
234-
// priority over the environment variable.
235-
if (args.log === LogLevel.Trace || process.env.LOG_LEVEL === LogLevel.Trace || args.verbose) {
236-
args.log = process.env.LOG_LEVEL = LogLevel.Trace
237-
args.verbose = true
238-
} else if (!args.log && process.env.LOG_LEVEL) {
233+
// --verbose takes priority over --log and --log takes priority over the
234+
// environment variable.
235+
if (args.verbose) {
236+
args.log = LogLevel.Trace
237+
} else if (
238+
!args.log &&
239+
process.env.LOG_LEVEL &&
240+
Object.values(LogLevel).includes(process.env.LOG_LEVEL as LogLevel)
241+
) {
239242
args.log = process.env.LOG_LEVEL as LogLevel
240-
} else if (args.log) {
241-
process.env.LOG_LEVEL = args.log
242243
}
243244

245+
// Sync --log, --verbose, the environment variable, and logger level.
246+
if (args.log) {
247+
process.env.LOG_LEVEL = args.log
248+
}
244249
switch (args.log) {
245250
case LogLevel.Trace:
246251
logger.level = Level.Trace
252+
args.verbose = true
247253
break
248254
case LogLevel.Debug:
249255
logger.level = Level.Debug

test/cli.test.ts

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { logger, Level } from "@coder/logger"
12
import * as assert from "assert"
23
import * as path from "path"
34
import { parse } from "../src/node/cli"
@@ -8,12 +9,15 @@ describe("cli", () => {
89
delete process.env.LOG_LEVEL
910
})
1011

12+
// The parser will always fill these out.
13+
const defaults = {
14+
_: [],
15+
"extensions-dir": path.join(xdgLocalDir, "extensions"),
16+
"user-data-dir": xdgLocalDir,
17+
}
18+
1119
it("should set defaults", () => {
12-
assert.deepEqual(parse([]), {
13-
_: [],
14-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
15-
"user-data-dir": xdgLocalDir,
16-
})
20+
assert.deepEqual(parse([]), defaults)
1721
})
1822

1923
it("should parse all available options", () => {
@@ -82,36 +86,64 @@ describe("cli", () => {
8286

8387
it("should work with short options", () => {
8488
assert.deepEqual(parse(["-vvv", "-v"]), {
85-
_: [],
86-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
87-
"user-data-dir": xdgLocalDir,
89+
...defaults,
8890
log: "trace",
8991
verbose: true,
9092
version: true,
9193
})
9294
assert.equal(process.env.LOG_LEVEL, "trace")
95+
assert.equal(logger.level, Level.Trace)
9396
})
9497

9598
it("should use log level env var", () => {
9699
process.env.LOG_LEVEL = "debug"
97100
assert.deepEqual(parse([]), {
98-
_: [],
99-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
100-
"user-data-dir": xdgLocalDir,
101+
...defaults,
101102
log: "debug",
102103
})
103104
assert.equal(process.env.LOG_LEVEL, "debug")
105+
assert.equal(logger.level, Level.Debug)
106+
107+
process.env.LOG_LEVEL = "trace"
108+
assert.deepEqual(parse([]), {
109+
...defaults,
110+
log: "trace",
111+
verbose: true,
112+
})
113+
assert.equal(process.env.LOG_LEVEL, "trace")
114+
assert.equal(logger.level, Level.Trace)
104115
})
105116

106-
it("should prefer --log to env var", () => {
117+
it("should prefer --log to env var and --verbose to --log", () => {
107118
process.env.LOG_LEVEL = "debug"
108119
assert.deepEqual(parse(["--log", "info"]), {
109-
_: [],
110-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
111-
"user-data-dir": xdgLocalDir,
120+
...defaults,
112121
log: "info",
113122
})
114123
assert.equal(process.env.LOG_LEVEL, "info")
124+
assert.equal(logger.level, Level.Info)
125+
126+
process.env.LOG_LEVEL = "trace"
127+
assert.deepEqual(parse(["--log", "info"]), {
128+
...defaults,
129+
log: "info",
130+
})
131+
assert.equal(process.env.LOG_LEVEL, "info")
132+
assert.equal(logger.level, Level.Info)
133+
134+
process.env.LOG_LEVEL = "warn"
135+
assert.deepEqual(parse(["--log", "info", "--verbose"]), {
136+
...defaults,
137+
log: "trace",
138+
verbose: true,
139+
})
140+
assert.equal(process.env.LOG_LEVEL, "trace")
141+
assert.equal(logger.level, Level.Trace)
142+
})
143+
144+
it("should ignore invalid log level env var", () => {
145+
process.env.LOG_LEVEL = "bogus"
146+
assert.deepEqual(parse([]), defaults)
115147
})
116148

117149
it("should error if value isn't provided", () => {
@@ -134,9 +166,7 @@ describe("cli", () => {
134166

135167
it("should not error if the value is optional", () => {
136168
assert.deepEqual(parse(["--cert"]), {
137-
_: [],
138-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
139-
"user-data-dir": xdgLocalDir,
169+
...defaults,
140170
cert: {
141171
value: undefined,
142172
},
@@ -147,34 +177,27 @@ describe("cli", () => {
147177
assert.throws(() => parse(["--socket", "--socket-path-value"]), /--socket requires a value/)
148178
// If you actually had a path like this you would do this instead:
149179
assert.deepEqual(parse(["--socket", "./--socket-path-value"]), {
150-
_: [],
151-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
152-
"user-data-dir": xdgLocalDir,
180+
...defaults,
153181
socket: path.resolve("--socket-path-value"),
154182
})
155183
assert.throws(() => parse(["--cert", "--socket-path-value"]), /Unknown option --socket-path-value/)
156184
})
157185

158186
it("should allow positional arguments before options", () => {
159187
assert.deepEqual(parse(["foo", "test", "--auth", "none"]), {
188+
...defaults,
160189
_: ["foo", "test"],
161-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
162-
"user-data-dir": xdgLocalDir,
163190
auth: "none",
164191
})
165192
})
166193

167194
it("should support repeatable flags", () => {
168195
assert.deepEqual(parse(["--proxy-domain", "*.coder.com"]), {
169-
_: [],
170-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
171-
"user-data-dir": xdgLocalDir,
196+
...defaults,
172197
"proxy-domain": ["*.coder.com"],
173198
})
174199
assert.deepEqual(parse(["--proxy-domain", "*.coder.com", "--proxy-domain", "test.com"]), {
175-
_: [],
176-
"extensions-dir": path.join(xdgLocalDir, "extensions"),
177-
"user-data-dir": xdgLocalDir,
200+
...defaults,
178201
"proxy-domain": ["*.coder.com", "test.com"],
179202
})
180203
})

0 commit comments

Comments
 (0)