Skip to content

Commit f0f5daf

Browse files
committed
fix(ci): satisfy lib lint after merge
1 parent 741afb3 commit f0f5daf

3 files changed

Lines changed: 102 additions & 31 deletions

File tree

packages/lib/src/core/templates-entrypoint.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ import {
1212
renderEntrypointZshShell,
1313
renderEntrypointZshUserRc
1414
} from "./templates-entrypoint/base.js"
15-
import { renderEntrypointDnsRepair } from "./templates-entrypoint/dns-repair.js"
1615
import { renderEntrypointClaudeConfig } from "./templates-entrypoint/claude.js"
1716
import {
1817
renderEntrypointCodexHome,
1918
renderEntrypointCodexResumeHint,
2019
renderEntrypointCodexSharedAuth,
2120
renderEntrypointMcpPlaywright
2221
} from "./templates-entrypoint/codex.js"
22+
import { renderEntrypointDnsRepair } from "./templates-entrypoint/dns-repair.js"
2323
import { renderEntrypointGeminiConfig } from "./templates-entrypoint/gemini.js"
2424
import { renderEntrypointGitConfig, renderEntrypointGitHooks } from "./templates-entrypoint/git.js"
2525
import { renderEntrypointDockerGitBootstrap } from "./templates-entrypoint/nested-docker-git.js"

packages/lib/src/core/templates-entrypoint/dns-repair.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
// INVARIANT: after execution, at least one nameserver in /etc/resolv.conf resolves external domains
1111
// COMPLEXITY: O(1) per probe attempt, O(max_attempts) worst case
1212
export const renderEntrypointDnsRepair = (): string =>
13-
`# 0) Ensure DNS resolution works; repair /etc/resolv.conf if Docker DNS is broken
13+
String.raw`# 0) Ensure DNS resolution works; repair /etc/resolv.conf if Docker DNS is broken
1414
docker_git_repair_dns() {
1515
local test_domain="github.com"
1616
local resolv="/etc/resolv.conf"
@@ -32,7 +32,7 @@ docker_git_repair_dns() {
3232
3333
if [[ "$has_external" -eq 0 ]]; then
3434
for ns in $fallback_dns; do
35-
printf "nameserver %s\\n" "$ns" >> "$resolv"
35+
printf "nameserver %s\n" "$ns" >> "$resolv"
3636
done
3737
echo "[dns-repair] appended fallback nameservers to $resolv"
3838
fi

packages/lib/src/usecases/actions/prepare-files.ts

Lines changed: 99 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,88 @@ const resolveAuthorizedKeysSource = (
8585
: matchingPublicKey
8686
})
8787

88+
const resolveManagedAuthorizedKeysSource = (
89+
fs: FileSystem.FileSystem,
90+
path: Path.Path,
91+
baseDir: string,
92+
preferredSource: string,
93+
resolved: string
94+
): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>
95+
Effect.gen(function*(_) {
96+
const preferred = resolvePathFromBase(path, baseDir, preferredSource)
97+
const preferredExists = yield* _(fs.exists(preferred))
98+
if (preferredExists && preferred !== resolved) {
99+
return preferred
100+
}
101+
102+
return yield* _(resolveAuthorizedKeysSource(fs, path, process.cwd()))
103+
})
104+
105+
const ensureMissingAuthorizedKeysPlaceholder = (
106+
fs: FileSystem.FileSystem,
107+
path: Path.Path,
108+
resolved: string,
109+
state: ExistingFileState
110+
): Effect.Effect<void, PlatformError> =>
111+
Effect.gen(function*(_) {
112+
if (state === "missing") {
113+
yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))
114+
yield* _(fs.writeFileString(resolved, ""))
115+
}
116+
117+
yield* _(
118+
Effect.logError(
119+
`Authorized keys not found. Create ${resolved} with your public key to enable SSH.`
120+
)
121+
)
122+
})
123+
124+
const readAuthorizedKeysContents = (
125+
fs: FileSystem.FileSystem,
126+
source: string
127+
): Effect.Effect<string | null, PlatformError> =>
128+
Effect.gen(function*(_) {
129+
const desiredContents = (yield* _(fs.readFileString(source))).trim()
130+
if (desiredContents.length === 0) {
131+
yield* _(Effect.logWarning(`Authorized keys source ${source} is empty. Skipping SSH key sync.`))
132+
return null
133+
}
134+
135+
return desiredContents
136+
})
137+
138+
type AuthorizedKeysSyncTarget = {
139+
readonly fs: FileSystem.FileSystem
140+
readonly path: Path.Path
141+
readonly state: ExistingFileState
142+
readonly resolved: string
143+
readonly managedDefaultAuthorizedKeys: string
144+
readonly source: string
145+
readonly desiredContents: string
146+
}
147+
148+
const syncAuthorizedKeysTarget = ({
149+
desiredContents,
150+
fs,
151+
managedDefaultAuthorizedKeys,
152+
path,
153+
resolved,
154+
source,
155+
state
156+
}: AuthorizedKeysSyncTarget): Effect.Effect<void, PlatformError> =>
157+
Effect.gen(function*(_) {
158+
if (state === "exists") {
159+
if (resolved === managedDefaultAuthorizedKeys) {
160+
yield* _(appendKeyIfMissing(fs, resolved, source, desiredContents))
161+
}
162+
return
163+
}
164+
165+
yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))
166+
yield* _(fs.copyFile(source, resolved))
167+
yield* _(Effect.log(`Authorized keys copied from ${source} to ${resolved}`))
168+
})
169+
88170
const ensureAuthorizedKeys = (
89171
baseDir: string,
90172
authorizedKeysPath: string,
@@ -107,41 +189,30 @@ const ensureAuthorizedKeys = (
107189
return
108190
}
109191

110-
const preferred = resolvePathFromBase(path, baseDir, preferredSource)
111-
const preferredExists = yield* _(fs.exists(preferred))
112-
const preferredManagedSource = preferredExists && preferred !== resolved ? preferred : null
113-
const source = preferredManagedSource === null
114-
? yield* _(resolveAuthorizedKeysSource(fs, path, process.cwd()))
115-
: preferredManagedSource
192+
const source = yield* _(
193+
resolveManagedAuthorizedKeysSource(fs, path, baseDir, preferredSource, resolved)
194+
)
116195
if (source === null) {
117-
if (state === "missing") {
118-
yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))
119-
yield* _(fs.writeFileString(resolved, ""))
120-
}
121-
yield* _(
122-
Effect.logError(
123-
`Authorized keys not found. Create ${resolved} with your public key to enable SSH.`
124-
)
125-
)
126-
return
127-
}
128-
129-
const desiredContents = (yield* _(fs.readFileString(source))).trim()
130-
if (desiredContents.length === 0) {
131-
yield* _(Effect.logWarning(`Authorized keys source ${source} is empty. Skipping SSH key sync.`))
196+
yield* _(ensureMissingAuthorizedKeysPlaceholder(fs, path, resolved, state))
132197
return
133198
}
134199

135-
if (state === "exists") {
136-
if (resolved === managedDefaultAuthorizedKeys) {
137-
yield* _(appendKeyIfMissing(fs, resolved, source, desiredContents))
138-
}
200+
const desiredContents = yield* _(readAuthorizedKeysContents(fs, source))
201+
if (desiredContents === null) {
139202
return
140203
}
141204

142-
yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))
143-
yield* _(fs.copyFile(source, resolved))
144-
yield* _(Effect.log(`Authorized keys copied from ${source} to ${resolved}`))
205+
yield* _(
206+
syncAuthorizedKeysTarget({
207+
fs,
208+
path,
209+
state,
210+
resolved,
211+
managedDefaultAuthorizedKeys,
212+
source,
213+
desiredContents
214+
})
215+
)
145216
})
146217
)
147218

0 commit comments

Comments
 (0)