Skip to content

Commit 9a295de

Browse files
committed
fix: memoize apt update/init via micromemoize
1 parent 0dbc7a0 commit 9a295de

File tree

13 files changed

+121
-109
lines changed

13 files changed

+121
-109
lines changed

dist/actions/setup-cpp.js

Lines changed: 28 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/actions/setup-cpp.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/legacy/setup-cpp.js

Lines changed: 28 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/legacy/setup-cpp.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/modern/setup-cpp.js

Lines changed: 28 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/modern/setup-cpp.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/setup-apt/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"which": "4.0.0",
2727
"execa": "^7.2.0",
2828
"escape-string-regexp": "^5.0.0",
29-
"node-downloader-helper": "2.1.9"
29+
"node-downloader-helper": "2.1.9",
30+
"micro-memoize": "^4.1.2"
3031
},
3132
"engines": {
3233
"node": ">=12"

packages/setup-apt/src/apt-repository.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@ import { defaultExecOptions, execRootSync } from "admina"
22
import { getAptEnv } from "./apt-env.js"
33
import { aptTimeout } from "./apt-timeout.js"
44
import { getApt } from "./get-apt.js"
5+
import { initAptMemoized } from "./init-apt.js"
56
import { isAptPackInstalled } from "./is-installed.js"
6-
import { updateAptRepos } from "./update.js"
7+
import { updateAptReposMemoized } from "./update.js"
78

89
export async function addAptRepository(repo: string, apt = getApt()) {
10+
await initAptMemoized(apt)
911
await installAddAptRepo(apt)
1012
execRootSync("add-apt-repository", ["-y", "--no-update", repo], { ...defaultExecOptions, env: getAptEnv(apt) })
11-
updateAptRepos(apt)
13+
14+
// clear the cache
15+
updateAptReposMemoized.cache.keys = []
16+
updateAptReposMemoized.cache.values = []
17+
updateAptReposMemoized(apt)
1218
}
1319

1420
export async function installAddAptRepo(apt: string) {

packages/setup-apt/src/init-apt.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { defaultExecOptions, execRootSync } from "admina"
2+
import memoize from "micro-memoize"
23
import { getAptEnv } from "./apt-env.js"
34
import { aptTimeout } from "./apt-timeout.js"
45
import { filterAndQualifyAptPackages } from "./qualify-install.js"
5-
import { updateAptRepos } from "./update.js"
6+
import { updateAptReposMemoized } from "./update.js"
67

78
/** Install gnupg and certificates (usually missing from docker containers) */
89
export async function initApt(apt: string) {
910
// Update the repos
10-
updateAptRepos(apt)
11+
updateAptReposMemoized(apt)
1112

1213
const toInstall = await filterAndQualifyAptPackages(apt, [
1314
{ name: "ca-certificates" },
@@ -22,3 +23,6 @@ export async function initApt(apt: string) {
2223
})
2324
}
2425
}
26+
27+
/** Install gnupg and certificates (usually missing from docker containers) (memoized) */
28+
export const initAptMemoized = memoize(initApt, { isPromise: true })

packages/setup-apt/src/install.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { type AddAptKeyOptions, addAptKey } from "./apt-key.js"
66
import { addAptRepository } from "./apt-repository.js"
77
import { aptTimeout } from "./apt-timeout.js"
88
import { getApt } from "./get-apt.js"
9-
import { initApt } from "./init-apt.js"
9+
import { initAptMemoized } from "./init-apt.js"
1010
import { filterAndQualifyAptPackages } from "./qualify-install.js"
11-
import { updateAptRepos } from "./update.js"
11+
import { updateAptReposMemoized } from "./update.js"
1212

1313
/**
1414
* The information about an installation result
@@ -22,10 +22,6 @@ export type InstallationInfo = {
2222
bin?: string
2323
}
2424

25-
/* eslint-disable require-atomic-updates */
26-
export let didUpdate: boolean = false
27-
let didInit: boolean = false
28-
2925
/**
3026
* The information about an apt package
3127
*/
@@ -80,8 +76,7 @@ export async function installAptPack(packages: AptPackage[], update = false): Pr
8076

8177
// Update the repos if needed
8278
if (update) {
83-
updateAptRepos(apt)
84-
didUpdate = true
79+
updateAptReposMemoized(apt)
8580
}
8681

8782
// Add the repos if needed
@@ -95,10 +90,7 @@ export async function installAptPack(packages: AptPackage[], update = false): Pr
9590
}
9691

9792
// Initialize apt if needed
98-
if (!didInit) {
99-
await initApt(apt)
100-
didInit = true
101-
}
93+
await initAptMemoized(apt)
10294

10395
try {
10496
// Add the keys if needed

0 commit comments

Comments
 (0)