mirror of
				https://github.com/Swatinem/rust-cache.git
				synced 2025-10-31 15:53:48 +00:00 
			
		
		
		
	clean and persist the git db/checkouts
This commit is contained in:
		
							parent
							
								
									e8e3c57b3b
								
							
						
					
					
						commit
						b740ae5d3a
					
				
							
								
								
									
										9
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							| @ -54618,7 +54618,7 @@ const home = external_os_default().homedir(); | ||||
| const paths = { | ||||
|     index: external_path_default().join(home, ".cargo/registry/index"), | ||||
|     cache: external_path_default().join(home, ".cargo/registry/cache"), | ||||
|     git: external_path_default().join(home, ".cargo/git/db"), | ||||
|     git: external_path_default().join(home, ".cargo/git"), | ||||
|     target: "target", | ||||
| }; | ||||
| const RefKey = "GITHUB_REF"; | ||||
| @ -54642,12 +54642,7 @@ async function getCacheConfig() { | ||||
|     } | ||||
|     key += await getRustKey(); | ||||
|     return { | ||||
|         paths: [ | ||||
|             paths.index, | ||||
|             paths.cache, | ||||
|             // TODO: paths.git,
 | ||||
|             paths.target, | ||||
|         ], | ||||
|         paths: [paths.index, paths.cache, paths.git, paths.target], | ||||
|         key: `${key}-${lockHash}`, | ||||
|         restoreKeys: [key], | ||||
|     }; | ||||
|  | ||||
							
								
								
									
										142
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										142
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							| @ -54621,7 +54621,7 @@ const home = external_os_default().homedir(); | ||||
| const paths = { | ||||
|     index: external_path_default().join(home, ".cargo/registry/index"), | ||||
|     cache: external_path_default().join(home, ".cargo/registry/cache"), | ||||
|     git: external_path_default().join(home, ".cargo/git/db"), | ||||
|     git: external_path_default().join(home, ".cargo/git"), | ||||
|     target: "target", | ||||
| }; | ||||
| const RefKey = "GITHUB_REF"; | ||||
| @ -54645,12 +54645,7 @@ async function getCacheConfig() { | ||||
|     } | ||||
|     key += await getRustKey(); | ||||
|     return { | ||||
|         paths: [ | ||||
|             paths.index, | ||||
|             paths.cache, | ||||
|             // TODO: paths.git,
 | ||||
|             paths.target, | ||||
|         ], | ||||
|         paths: [paths.index, paths.cache, paths.git, paths.target], | ||||
|         key: `${key}-${lockHash}`, | ||||
|         restoreKeys: [key], | ||||
|     }; | ||||
| @ -54733,6 +54728,7 @@ async function run() { | ||||
|         const registryName = await getRegistryName(); | ||||
|         const packages = await getPackages(); | ||||
|         await cleanRegistry(registryName, packages); | ||||
|         await cleanGit(packages); | ||||
|         await cleanTarget(packages); | ||||
|         core.info(`Saving paths:\n    ${savePaths.join("\n    ")}.`); | ||||
|         core.info(`Using key "${key}".`); | ||||
| @ -54768,7 +54764,7 @@ async function getPackages() { | ||||
|         .filter((p) => !p.manifest_path.startsWith(cwd)) | ||||
|         .map((p) => { | ||||
|         const targets = p.targets.filter((t) => t.kind[0] === "lib").map((t) => t.name); | ||||
|         return { name: p.name, version: p.version, targets }; | ||||
|         return { name: p.name, version: p.version, targets, path: external_path_default().dirname(p.manifest_path) }; | ||||
|     }); | ||||
| } | ||||
| async function cleanRegistry(registryName, packages) { | ||||
| @ -54780,9 +54776,7 @@ async function cleanRegistry(registryName, packages) { | ||||
|         for (var dir_1 = save_asyncValues(dir), dir_1_1; dir_1_1 = await dir_1.next(), !dir_1_1.done;) { | ||||
|             const dirent = dir_1_1.value; | ||||
|             if (dirent.isFile() && !pkgSet.has(dirent.name)) { | ||||
|                 const fileName = external_path_default().join(dir.path, dirent.name); | ||||
|                 await external_fs_default().promises.unlink(fileName); | ||||
|                 core.debug(`deleting "${fileName}"`); | ||||
|                 await rm(dir.path, dirent); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -54794,20 +54788,34 @@ async function cleanRegistry(registryName, packages) { | ||||
|         finally { if (e_1) throw e_1.error; } | ||||
|     } | ||||
| } | ||||
| async function cleanTarget(packages) { | ||||
|     var e_2, _a; | ||||
|     await external_fs_default().promises.unlink("./target/.rustc_info.json"); | ||||
|     await io.rmRF("./target/debug/examples"); | ||||
|     await io.rmRF("./target/debug/incremental"); | ||||
| async function cleanGit(packages) { | ||||
|     var e_2, _a, e_3, _b, e_4, _c; | ||||
|     const coPath = external_path_default().join(paths.git, "checkouts"); | ||||
|     const dbPath = external_path_default().join(paths.git, "db"); | ||||
|     const repos = new Map(); | ||||
|     for (const p of packages) { | ||||
|         if (!p.path.startsWith(coPath)) { | ||||
|             continue; | ||||
|         } | ||||
|         const [repo, ref] = p.path.slice(coPath.length + 1).split((external_path_default()).sep); | ||||
|         const refs = repos.get(repo); | ||||
|         if (refs) { | ||||
|             refs.add(ref); | ||||
|         } | ||||
|         else { | ||||
|             repos.set(repo, new Set([ref])); | ||||
|         } | ||||
|     } | ||||
|     // we have to keep both the clone, and the checkout, removing either will
 | ||||
|     // trigger a rebuild
 | ||||
|     let dir; | ||||
|     // remove all *files* from debug
 | ||||
|     dir = await external_fs_default().promises.opendir("./target/debug"); | ||||
|     // clean the db
 | ||||
|     dir = await external_fs_default().promises.opendir(dbPath); | ||||
|     try { | ||||
|         for (var dir_2 = save_asyncValues(dir), dir_2_1; dir_2_1 = await dir_2.next(), !dir_2_1.done;) { | ||||
|             const dirent = dir_2_1.value; | ||||
|             if (dirent.isFile()) { | ||||
|                 const fileName = external_path_default().join(dir.path, dirent.name); | ||||
|                 await external_fs_default().promises.unlink(fileName); | ||||
|             if (!repos.has(dirent.name)) { | ||||
|                 await rm(dir.path, dirent); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -54818,6 +54826,68 @@ async function cleanTarget(packages) { | ||||
|         } | ||||
|         finally { if (e_2) throw e_2.error; } | ||||
|     } | ||||
|     // clean the checkouts
 | ||||
|     dir = await external_fs_default().promises.opendir(coPath); | ||||
|     try { | ||||
|         for (var dir_3 = save_asyncValues(dir), dir_3_1; dir_3_1 = await dir_3.next(), !dir_3_1.done;) { | ||||
|             const dirent = dir_3_1.value; | ||||
|             const refs = repos.get(dirent.name); | ||||
|             if (!refs) { | ||||
|                 await rm(dir.path, dirent); | ||||
|                 continue; | ||||
|             } | ||||
|             if (!dirent.isDirectory()) { | ||||
|                 continue; | ||||
|             } | ||||
|             const refsDir = await external_fs_default().promises.opendir(external_path_default().join(dir.path, dirent.name)); | ||||
|             try { | ||||
|                 for (var refsDir_1 = (e_4 = void 0, save_asyncValues(refsDir)), refsDir_1_1; refsDir_1_1 = await refsDir_1.next(), !refsDir_1_1.done;) { | ||||
|                     const dirent = refsDir_1_1.value; | ||||
|                     if (!refs.has(dirent.name)) { | ||||
|                         await rm(refsDir.path, dirent); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (e_4_1) { e_4 = { error: e_4_1 }; } | ||||
|             finally { | ||||
|                 try { | ||||
|                     if (refsDir_1_1 && !refsDir_1_1.done && (_c = refsDir_1.return)) await _c.call(refsDir_1); | ||||
|                 } | ||||
|                 finally { if (e_4) throw e_4.error; } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     catch (e_3_1) { e_3 = { error: e_3_1 }; } | ||||
|     finally { | ||||
|         try { | ||||
|             if (dir_3_1 && !dir_3_1.done && (_b = dir_3.return)) await _b.call(dir_3); | ||||
|         } | ||||
|         finally { if (e_3) throw e_3.error; } | ||||
|     } | ||||
| } | ||||
| async function cleanTarget(packages) { | ||||
|     var e_5, _a; | ||||
|     await external_fs_default().promises.unlink("./target/.rustc_info.json"); | ||||
|     await io.rmRF("./target/debug/examples"); | ||||
|     await io.rmRF("./target/debug/incremental"); | ||||
|     let dir; | ||||
|     // remove all *files* from debug
 | ||||
|     dir = await external_fs_default().promises.opendir("./target/debug"); | ||||
|     try { | ||||
|         for (var dir_4 = save_asyncValues(dir), dir_4_1; dir_4_1 = await dir_4.next(), !dir_4_1.done;) { | ||||
|             const dirent = dir_4_1.value; | ||||
|             if (dirent.isFile()) { | ||||
|                 await rm(dir.path, dirent); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     catch (e_5_1) { e_5 = { error: e_5_1 }; } | ||||
|     finally { | ||||
|         try { | ||||
|             if (dir_4_1 && !dir_4_1.done && (_a = dir_4.return)) await _a.call(dir_4); | ||||
|         } | ||||
|         finally { if (e_5) throw e_5.error; } | ||||
|     } | ||||
|     const keepPkg = new Set(packages.map((p) => p.name)); | ||||
|     await rmExcept("./target/debug/build", keepPkg); | ||||
|     await rmExcept("./target/debug/.fingerprint", keepPkg); | ||||
| @ -54833,11 +54903,11 @@ async function cleanTarget(packages) { | ||||
| } | ||||
| const oneWeek = 7 * 24 * 3600 * 1000; | ||||
| async function rmExcept(dirName, keepPrefix) { | ||||
|     var e_3, _a; | ||||
|     var e_6, _a; | ||||
|     const dir = await external_fs_default().promises.opendir(dirName); | ||||
|     try { | ||||
|         for (var dir_3 = save_asyncValues(dir), dir_3_1; dir_3_1 = await dir_3.next(), !dir_3_1.done;) { | ||||
|             const dirent = dir_3_1.value; | ||||
|         for (var dir_5 = save_asyncValues(dir), dir_5_1; dir_5_1 = await dir_5.next(), !dir_5_1.done;) { | ||||
|             const dirent = dir_5_1.value; | ||||
|             let name = dirent.name; | ||||
|             const idx = name.lastIndexOf("-"); | ||||
|             if (idx !== -1) { | ||||
| @ -54846,22 +54916,26 @@ async function rmExcept(dirName, keepPrefix) { | ||||
|             const fileName = external_path_default().join(dir.path, dirent.name); | ||||
|             const { mtime } = await external_fs_default().promises.stat(fileName); | ||||
|             if (!keepPrefix.has(name) || Date.now() - mtime.getTime() > oneWeek) { | ||||
|                 core.debug(`deleting "${fileName}"`); | ||||
|                 if (dirent.isFile()) { | ||||
|                     await external_fs_default().promises.unlink(fileName); | ||||
|                 } | ||||
|                 else if (dirent.isDirectory()) { | ||||
|                     await io.rmRF(fileName); | ||||
|                 } | ||||
|                 await rm(dir.path, dirent); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     catch (e_3_1) { e_3 = { error: e_3_1 }; } | ||||
|     catch (e_6_1) { e_6 = { error: e_6_1 }; } | ||||
|     finally { | ||||
|         try { | ||||
|             if (dir_3_1 && !dir_3_1.done && (_a = dir_3.return)) await _a.call(dir_3); | ||||
|             if (dir_5_1 && !dir_5_1.done && (_a = dir_5.return)) await _a.call(dir_5); | ||||
|         } | ||||
|         finally { if (e_3) throw e_3.error; } | ||||
|         finally { if (e_6) throw e_6.error; } | ||||
|     } | ||||
| } | ||||
| async function rm(parent, dirent) { | ||||
|     const fileName = external_path_default().join(parent, dirent.name); | ||||
|     core.debug(`deleting "${fileName}"`); | ||||
|     if (dirent.isFile()) { | ||||
|         await external_fs_default().promises.unlink(fileName); | ||||
|     } | ||||
|     else if (dirent.isDirectory()) { | ||||
|         await io.rmRF(fileName); | ||||
|     } | ||||
| } | ||||
| async function macOsWorkaround() { | ||||
|  | ||||
| @ -13,7 +13,7 @@ const home = os.homedir(); | ||||
| export const paths = { | ||||
|   index: path.join(home, ".cargo/registry/index"), | ||||
|   cache: path.join(home, ".cargo/registry/cache"), | ||||
|   git: path.join(home, ".cargo/git/db"), | ||||
|   git: path.join(home, ".cargo/git"), | ||||
|   target: "target", | ||||
| }; | ||||
| 
 | ||||
| @ -51,12 +51,7 @@ export async function getCacheConfig(): Promise<CacheConfig> { | ||||
|   key += await getRustKey(); | ||||
| 
 | ||||
|   return { | ||||
|     paths: [ | ||||
|       paths.index, | ||||
|       paths.cache, | ||||
|       // TODO: paths.git,
 | ||||
|       paths.target, | ||||
|     ], | ||||
|     paths: [paths.index, paths.cache, paths.git, paths.target], | ||||
|     key: `${key}-${lockHash}`, | ||||
|     restoreKeys: [key], | ||||
|   }; | ||||
|  | ||||
							
								
								
									
										78
									
								
								src/save.ts
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								src/save.ts
									
									
									
									
									
								
							| @ -29,6 +29,8 @@ async function run() { | ||||
| 
 | ||||
|     await cleanRegistry(registryName, packages); | ||||
| 
 | ||||
|     await cleanGit(packages); | ||||
| 
 | ||||
|     await cleanTarget(packages); | ||||
| 
 | ||||
|     core.info(`Saving paths:\n    ${savePaths.join("\n    ")}.`); | ||||
| @ -53,6 +55,7 @@ run(); | ||||
| interface PackageDefinition { | ||||
|   name: string; | ||||
|   version: string; | ||||
|   path: string; | ||||
|   targets: Array<string>; | ||||
| } | ||||
| 
 | ||||
| @ -86,7 +89,7 @@ async function getPackages(): Promise<Packages> { | ||||
|     .filter((p) => !p.manifest_path.startsWith(cwd)) | ||||
|     .map((p) => { | ||||
|       const targets = p.targets.filter((t) => t.kind[0] === "lib").map((t) => t.name); | ||||
|       return { name: p.name, version: p.version, targets }; | ||||
|       return { name: p.name, version: p.version, targets, path: path.dirname(p.manifest_path) }; | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| @ -98,9 +101,56 @@ async function cleanRegistry(registryName: string, packages: Packages) { | ||||
|   const dir = await fs.promises.opendir(path.join(paths.cache, registryName)); | ||||
|   for await (const dirent of dir) { | ||||
|     if (dirent.isFile() && !pkgSet.has(dirent.name)) { | ||||
|       const fileName = path.join(dir.path, dirent.name); | ||||
|       await fs.promises.unlink(fileName); | ||||
|       core.debug(`deleting "${fileName}"`); | ||||
|       await rm(dir.path, dirent); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| async function cleanGit(packages: Packages) { | ||||
|   const coPath = path.join(paths.git, "checkouts"); | ||||
|   const dbPath = path.join(paths.git, "db"); | ||||
|   const repos = new Map<string, Set<string>>(); | ||||
|   for (const p of packages) { | ||||
|     if (!p.path.startsWith(coPath)) { | ||||
|       continue; | ||||
|     } | ||||
|     const [repo, ref] = p.path.slice(coPath.length + 1).split(path.sep); | ||||
|     const refs = repos.get(repo); | ||||
|     if (refs) { | ||||
|       refs.add(ref); | ||||
|     } else { | ||||
|       repos.set(repo, new Set([ref])); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // we have to keep both the clone, and the checkout, removing either will
 | ||||
|   // trigger a rebuild
 | ||||
| 
 | ||||
|   let dir: fs.Dir; | ||||
|   // clean the db
 | ||||
|   dir = await fs.promises.opendir(dbPath); | ||||
|   for await (const dirent of dir) { | ||||
|     if (!repos.has(dirent.name)) { | ||||
|       await rm(dir.path, dirent); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // clean the checkouts
 | ||||
|   dir = await fs.promises.opendir(coPath); | ||||
|   for await (const dirent of dir) { | ||||
|     const refs = repos.get(dirent.name); | ||||
|     if (!refs) { | ||||
|       await rm(dir.path, dirent); | ||||
|       continue; | ||||
|     } | ||||
|     if (!dirent.isDirectory()) { | ||||
|       continue; | ||||
|     } | ||||
|     const refsDir = await fs.promises.opendir(path.join(dir.path, dirent.name)); | ||||
|     for await (const dirent of refsDir) { | ||||
|       if (!refs.has(dirent.name)) { | ||||
|         await rm(refsDir.path, dirent); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -115,8 +165,7 @@ async function cleanTarget(packages: Packages) { | ||||
|   dir = await fs.promises.opendir("./target/debug"); | ||||
|   for await (const dirent of dir) { | ||||
|     if (dirent.isFile()) { | ||||
|       const fileName = path.join(dir.path, dirent.name); | ||||
|       await fs.promises.unlink(fileName); | ||||
|       await rm(dir.path, dirent); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| @ -150,16 +199,21 @@ async function rmExcept(dirName: string, keepPrefix: Set<string>) { | ||||
|     const fileName = path.join(dir.path, dirent.name); | ||||
|     const { mtime } = await fs.promises.stat(fileName); | ||||
|     if (!keepPrefix.has(name) || Date.now() - mtime.getTime() > oneWeek) { | ||||
|       core.debug(`deleting "${fileName}"`); | ||||
|       if (dirent.isFile()) { | ||||
|         await fs.promises.unlink(fileName); | ||||
|       } else if (dirent.isDirectory()) { | ||||
|         await io.rmRF(fileName); | ||||
|       } | ||||
|       await rm(dir.path, dirent); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| async function rm(parent: string, dirent: fs.Dirent) { | ||||
|   const fileName = path.join(parent, dirent.name); | ||||
|   core.debug(`deleting "${fileName}"`); | ||||
|   if (dirent.isFile()) { | ||||
|     await fs.promises.unlink(fileName); | ||||
|   } else if (dirent.isDirectory()) { | ||||
|     await io.rmRF(fileName); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| async function macOsWorkaround() { | ||||
|   try { | ||||
|     // Workaround for https://github.com/actions/cache/issues/403
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user