Skip to content

Commit d30f114

Browse files
authored
Only key by Cargo.toml and Cargo.lock files of workspace members (#180)
1 parent b1db5f9 commit d30f114

File tree

7 files changed

+88
-62
lines changed

7 files changed

+88
-62
lines changed

dist/restore/index.js

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86960,6 +86960,7 @@ var cache_lib_cache = __nccwpck_require__(7799);
8696086960

8696186961

8696286962

86963+
8696386964
function reportError(e) {
8696486965
const { commandFailed } = e;
8696586966
if (commandFailed) {
@@ -87007,6 +87008,15 @@ function getCacheProvider() {
8700787008
cache: cache,
8700887009
};
8700987010
}
87011+
async function utils_exists(path) {
87012+
try {
87013+
await external_fs_default().promises.access(path);
87014+
return true;
87015+
}
87016+
catch {
87017+
return false;
87018+
}
87019+
}
8701087020

8701187021
;// CONCATENATED MODULE: ./src/workspace.ts
8701287022

@@ -87018,25 +87028,30 @@ class Workspace {
8701887028
this.root = root;
8701987029
this.target = target;
8702087030
}
87021-
async getPackages() {
87031+
async getPackages(filter, ...extraArgs) {
8702287032
let packages = [];
8702387033
try {
8702487034
lib_core.debug(`collecting metadata for "${this.root}"`);
87025-
const meta = JSON.parse(await getCmdOutput("cargo", ["metadata", "--all-features", "--format-version", "1"], {
87035+
const meta = JSON.parse(await getCmdOutput("cargo", ["metadata", "--all-features", "--format-version", "1", ...extraArgs], {
8702687036
cwd: this.root,
8702787037
}));
8702887038
lib_core.debug(`workspace "${this.root}" has ${meta.packages.length} packages`);
87029-
for (const pkg of meta.packages) {
87030-
if (pkg.manifest_path.startsWith(this.root)) {
87031-
continue;
87032-
}
87039+
for (const pkg of meta.packages.filter(filter)) {
8703387040
const targets = pkg.targets.filter((t) => t.kind.some((kind) => SAVE_TARGETS.has(kind))).map((t) => t.name);
8703487041
packages.push({ name: pkg.name, version: pkg.version, targets, path: external_path_default().dirname(pkg.manifest_path) });
8703587042
}
8703687043
}
87037-
catch { }
87044+
catch (err) {
87045+
console.error(err);
87046+
}
8703887047
return packages;
8703987048
}
87049+
async getPackagesOutsideWorkspaceRoot() {
87050+
return await this.getPackages(pkg => !pkg.manifest_path.startsWith(this.root));
87051+
}
87052+
async getWorkspaceMembers() {
87053+
return await this.getPackages(_ => true, "--no-deps");
87054+
}
8704087055
}
8704187056

8704287057
;// CONCATENATED MODULE: ./src/config.ts
@@ -87152,7 +87167,8 @@ class CacheConfig {
8715287167
for (const workspace of workspaces) {
8715387168
const root = workspace.root;
8715487169
keyFiles.push(...(await globFiles(`${root}/**/.cargo/config.toml\n${root}/**/rust-toolchain\n${root}/**/rust-toolchain.toml`)));
87155-
const cargo_manifests = sort_and_uniq(await globFiles(`${root}/**/Cargo.toml`));
87170+
const workspaceMembers = await workspace.getWorkspaceMembers();
87171+
const cargo_manifests = sort_and_uniq(workspaceMembers.map(member => external_path_default().join(member.path, "Cargo.toml")));
8715687172
for (const cargo_manifest of cargo_manifests) {
8715787173
try {
8715887174
const content = await promises_default().readFile(cargo_manifest, { encoding: "utf8" });
@@ -87193,8 +87209,8 @@ class CacheConfig {
8719387209
keyFiles.push(cargo_manifest);
8719487210
}
8719587211
}
87196-
const cargo_locks = sort_and_uniq(await globFiles(`${root}/**/Cargo.lock`));
87197-
for (const cargo_lock of cargo_locks) {
87212+
const cargo_lock = external_path_default().join(workspace.root, "Cargo.lock");
87213+
if (await utils_exists(cargo_lock)) {
8719887214
try {
8719987215
const content = await promises_default().readFile(cargo_lock, { encoding: "utf8" });
8720087216
const parsed = parse(content);
@@ -87357,6 +87373,7 @@ function sort_and_uniq(a) {
8735787373

8735887374

8735987375

87376+
8736087377
async function cleanTargetDir(targetDir, packages, checkTimestamp = false) {
8736187378
lib_core.debug(`cleaning target directory "${targetDir}"`);
8736287379
// remove all *files* from the profile directory
@@ -87365,7 +87382,7 @@ async function cleanTargetDir(targetDir, packages, checkTimestamp = false) {
8736587382
if (dirent.isDirectory()) {
8736687383
let dirName = external_path_default().join(dir.path, dirent.name);
8736787384
// is it a profile dir, or a nested target dir?
87368-
let isNestedTarget = (await exists(external_path_default().join(dirName, "CACHEDIR.TAG"))) || (await exists(external_path_default().join(dirName, ".rustc_info.json")));
87385+
let isNestedTarget = (await utils_exists(external_path_default().join(dirName, "CACHEDIR.TAG"))) || (await utils_exists(external_path_default().join(dirName, ".rustc_info.json")));
8736987386
try {
8737087387
if (isNestedTarget) {
8737187388
await cleanTargetDir(dirName, packages, checkTimestamp);
@@ -87638,15 +87655,6 @@ async function rmRF(dirName) {
8763887655
core.debug(`deleting "${dirName}"`);
8763987656
await io.rmRF(dirName);
8764087657
}
87641-
async function exists(path) {
87642-
try {
87643-
await external_fs_default().promises.access(path);
87644-
return true;
87645-
}
87646-
catch {
87647-
return false;
87648-
}
87649-
}
8765087658

8765187659
;// CONCATENATED MODULE: ./src/restore.ts
8765287660

dist/save/index.js

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86960,6 +86960,7 @@ var cache_lib_cache = __nccwpck_require__(7799);
8696086960

8696186961

8696286962

86963+
8696386964
function reportError(e) {
8696486965
const { commandFailed } = e;
8696586966
if (commandFailed) {
@@ -87007,6 +87008,15 @@ function getCacheProvider() {
8700787008
cache: cache,
8700887009
};
8700987010
}
87011+
async function exists(path) {
87012+
try {
87013+
await external_fs_default().promises.access(path);
87014+
return true;
87015+
}
87016+
catch {
87017+
return false;
87018+
}
87019+
}
8701087020

8701187021
;// CONCATENATED MODULE: ./src/workspace.ts
8701287022

@@ -87018,25 +87028,30 @@ class Workspace {
8701887028
this.root = root;
8701987029
this.target = target;
8702087030
}
87021-
async getPackages() {
87031+
async getPackages(filter, ...extraArgs) {
8702287032
let packages = [];
8702387033
try {
8702487034
core.debug(`collecting metadata for "${this.root}"`);
87025-
const meta = JSON.parse(await getCmdOutput("cargo", ["metadata", "--all-features", "--format-version", "1"], {
87035+
const meta = JSON.parse(await getCmdOutput("cargo", ["metadata", "--all-features", "--format-version", "1", ...extraArgs], {
8702687036
cwd: this.root,
8702787037
}));
8702887038
core.debug(`workspace "${this.root}" has ${meta.packages.length} packages`);
87029-
for (const pkg of meta.packages) {
87030-
if (pkg.manifest_path.startsWith(this.root)) {
87031-
continue;
87032-
}
87039+
for (const pkg of meta.packages.filter(filter)) {
8703387040
const targets = pkg.targets.filter((t) => t.kind.some((kind) => SAVE_TARGETS.has(kind))).map((t) => t.name);
8703487041
packages.push({ name: pkg.name, version: pkg.version, targets, path: external_path_default().dirname(pkg.manifest_path) });
8703587042
}
8703687043
}
87037-
catch { }
87044+
catch (err) {
87045+
console.error(err);
87046+
}
8703887047
return packages;
8703987048
}
87049+
async getPackagesOutsideWorkspaceRoot() {
87050+
return await this.getPackages(pkg => !pkg.manifest_path.startsWith(this.root));
87051+
}
87052+
async getWorkspaceMembers() {
87053+
return await this.getPackages(_ => true, "--no-deps");
87054+
}
8704087055
}
8704187056

8704287057
;// CONCATENATED MODULE: ./src/config.ts
@@ -87152,7 +87167,8 @@ class CacheConfig {
8715287167
for (const workspace of workspaces) {
8715387168
const root = workspace.root;
8715487169
keyFiles.push(...(await globFiles(`${root}/**/.cargo/config.toml\n${root}/**/rust-toolchain\n${root}/**/rust-toolchain.toml`)));
87155-
const cargo_manifests = sort_and_uniq(await globFiles(`${root}/**/Cargo.toml`));
87170+
const workspaceMembers = await workspace.getWorkspaceMembers();
87171+
const cargo_manifests = sort_and_uniq(workspaceMembers.map(member => external_path_default().join(member.path, "Cargo.toml")));
8715687172
for (const cargo_manifest of cargo_manifests) {
8715787173
try {
8715887174
const content = await promises_default().readFile(cargo_manifest, { encoding: "utf8" });
@@ -87193,8 +87209,8 @@ class CacheConfig {
8719387209
keyFiles.push(cargo_manifest);
8719487210
}
8719587211
}
87196-
const cargo_locks = sort_and_uniq(await globFiles(`${root}/**/Cargo.lock`));
87197-
for (const cargo_lock of cargo_locks) {
87212+
const cargo_lock = external_path_default().join(workspace.root, "Cargo.lock");
87213+
if (await exists(cargo_lock)) {
8719887214
try {
8719987215
const content = await promises_default().readFile(cargo_lock, { encoding: "utf8" });
8720087216
const parsed = parse(content);
@@ -87357,6 +87373,7 @@ function sort_and_uniq(a) {
8735787373

8735887374

8735987375

87376+
8736087377
async function cleanTargetDir(targetDir, packages, checkTimestamp = false) {
8736187378
core.debug(`cleaning target directory "${targetDir}"`);
8736287379
// remove all *files* from the profile directory
@@ -87638,15 +87655,6 @@ async function rmRF(dirName) {
8763887655
core.debug(`deleting "${dirName}"`);
8763987656
await io.rmRF(dirName);
8764087657
}
87641-
async function exists(path) {
87642-
try {
87643-
await external_fs_default().promises.access(path);
87644-
return true;
87645-
}
87646-
catch {
87647-
return false;
87648-
}
87649-
}
8765087658

8765187659
;// CONCATENATED MODULE: ./src/save.ts
8765287660

@@ -87678,7 +87686,7 @@ async function run() {
8767887686
await macOsWorkaround();
8767987687
const allPackages = [];
8768087688
for (const workspace of config.workspaces) {
87681-
const packages = await workspace.getPackages();
87689+
const packages = await workspace.getPackagesOutsideWorkspaceRoot();
8768287690
allPackages.push(...packages);
8768387691
try {
8768487692
core.info(`... Cleaning ${workspace.target} ...`);

src/cleanup.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import fs from "fs";
44
import path from "path";
55

66
import { CARGO_HOME } from "./config";
7+
import { exists } from "./utils";
78
import { Packages } from "./workspace";
89

910
export async function cleanTargetDir(targetDir: string, packages: Packages, checkTimestamp = false) {
@@ -308,12 +309,3 @@ async function rmRF(dirName: string) {
308309
core.debug(`deleting "${dirName}"`);
309310
await io.rmRF(dirName);
310311
}
311-
312-
async function exists(path: string) {
313-
try {
314-
await fs.promises.access(path);
315-
return true;
316-
} catch {
317-
return false;
318-
}
319-
}

src/config.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import path from "path";
88
import * as toml from "smol-toml";
99

1010
import { getCargoBins } from "./cleanup";
11-
import { CacheProvider, getCmdOutput } from "./utils";
11+
import { CacheProvider, exists, getCmdOutput } from "./utils";
1212
import { Workspace } from "./workspace";
1313

1414
const HOME = os.homedir();
@@ -142,7 +142,9 @@ export class CacheConfig {
142142
)),
143143
);
144144

145-
const cargo_manifests = sort_and_uniq(await globFiles(`${root}/**/Cargo.toml`));
145+
const workspaceMembers = await workspace.getWorkspaceMembers();
146+
147+
const cargo_manifests = sort_and_uniq(workspaceMembers.map(member => path.join(member.path, "Cargo.toml")));
146148

147149
for (const cargo_manifest of cargo_manifests) {
148150
try {
@@ -189,9 +191,8 @@ export class CacheConfig {
189191
}
190192
}
191193

192-
const cargo_locks = sort_and_uniq(await globFiles(`${root}/**/Cargo.lock`));
193-
194-
for (const cargo_lock of cargo_locks) {
194+
const cargo_lock = path.join(workspace.root, "Cargo.lock");
195+
if (await exists(cargo_lock)) {
195196
try {
196197
const content = await fs_promises.readFile(cargo_lock, { encoding: "utf8" });
197198
const parsed = toml.parse(content);

src/save.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ async function run() {
3636

3737
const allPackages = [];
3838
for (const workspace of config.workspaces) {
39-
const packages = await workspace.getPackages();
39+
const packages = await workspace.getPackagesOutsideWorkspaceRoot();
4040
allPackages.push(...packages);
4141
try {
4242
core.info(`... Cleaning ${workspace.target} ...`);

src/utils.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as core from "@actions/core";
22
import * as exec from "@actions/exec";
33
import * as buildjetCache from "@actions/buildjet-cache";
44
import * as ghCache from "@actions/cache";
5+
import fs from "fs";
56

67
export function reportError(e: any) {
78
const { commandFailed } = e;
@@ -61,3 +62,12 @@ export function getCacheProvider(): CacheProvider {
6162
cache: cache,
6263
};
6364
}
65+
66+
export async function exists(path: string) {
67+
try {
68+
await fs.promises.access(path);
69+
return true;
70+
} catch {
71+
return false;
72+
}
73+
}

src/workspace.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,33 @@ const SAVE_TARGETS = new Set(["lib", "proc-macro"]);
88
export class Workspace {
99
constructor(public root: string, public target: string) {}
1010

11-
public async getPackages(): Promise<Packages> {
11+
async getPackages(filter: ((p: Meta['packages'][0]) => boolean), ...extraArgs: string[]): Promise<Packages> {
1212
let packages: Packages = [];
1313
try {
1414
core.debug(`collecting metadata for "${this.root}"`);
1515
const meta: Meta = JSON.parse(
16-
await getCmdOutput("cargo", ["metadata", "--all-features", "--format-version", "1"], {
16+
await getCmdOutput("cargo", ["metadata", "--all-features", "--format-version", "1", ...extraArgs], {
1717
cwd: this.root,
1818
}),
1919
);
2020
core.debug(`workspace "${this.root}" has ${meta.packages.length} packages`);
21-
for (const pkg of meta.packages) {
22-
if (pkg.manifest_path.startsWith(this.root)) {
23-
continue;
24-
}
21+
for (const pkg of meta.packages.filter(filter)) {
2522
const targets = pkg.targets.filter((t) => t.kind.some((kind) => SAVE_TARGETS.has(kind))).map((t) => t.name);
2623
packages.push({ name: pkg.name, version: pkg.version, targets, path: path.dirname(pkg.manifest_path) });
2724
}
28-
} catch {}
25+
} catch (err) {
26+
console.error(err);
27+
}
2928
return packages;
3029
}
30+
31+
public async getPackagesOutsideWorkspaceRoot(): Promise<Packages> {
32+
return await this.getPackages(pkg => !pkg.manifest_path.startsWith(this.root));
33+
}
34+
35+
public async getWorkspaceMembers(): Promise<Packages> {
36+
return await this.getPackages(_ => true, "--no-deps");
37+
}
3138
}
3239

3340
export interface PackageDefinition {

0 commit comments

Comments
 (0)