mirror of
				https://github.com/Swatinem/rust-cache
				synced 2025-10-31 12:52:28 +00:00 
			
		
		
		
	initial commit
This commit is contained in:
		
						commit
						99970e092c
					
				
					 12 changed files with 111031 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.github/FUNDING.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.github/FUNDING.yml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| github: [Swatinem] | ||||
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| node_modules | ||||
							
								
								
									
										51
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| # Rust Cache Action | ||||
| 
 | ||||
| A GitHub Action that implements smart caching for rust/cargo projects | ||||
| 
 | ||||
| ## Inputs | ||||
| 
 | ||||
| - `key` - An optional key for the `target` cache. This is useful in case you | ||||
|   have different jobs for test / check / clippy, etc | ||||
| 
 | ||||
| ## Example usage | ||||
| 
 | ||||
| ```yaml | ||||
| - uses: Swatinem/rust-cache@v1 | ||||
|   with: | ||||
|     key: test | ||||
| ``` | ||||
| 
 | ||||
| ## Specifics | ||||
| 
 | ||||
| This action tries to be better than just caching the following directories: | ||||
| 
 | ||||
| ``` | ||||
| ~/.cargo/registry | ||||
| ~/.cargo/git | ||||
| target | ||||
| ``` | ||||
| 
 | ||||
| It disables incremental compilation and only caches dependencies. The | ||||
| assumption is that we will likely recompile the own crate(s) anyway. | ||||
| 
 | ||||
| It also separates the cache into 4 groups, each treated differently: | ||||
| 
 | ||||
| - Index: `~/.cargo/registry/index/<registry>`: | ||||
| 
 | ||||
|   This is always restored from its latest snapshot, and persisted based on the | ||||
|   most recent revision. | ||||
| 
 | ||||
| - Registry / Cache: `~/.cargo/registry/cache/<registry>`: | ||||
| 
 | ||||
|   Automatically keyed by the lockfile/toml hash, and is being pruned to only | ||||
|   persist the dependencies that are being used. | ||||
| 
 | ||||
| - Registry / Git: `~/.cargo/registry/git/<registry>`: | ||||
| 
 | ||||
|   Automatically keyed by the lockfile/toml hash. Pruning is still TODO. | ||||
| 
 | ||||
| - target: `./target` | ||||
| 
 | ||||
|   Automatically keyed by the lockfile/toml hash, and is being pruned to only | ||||
|   persist the dependencies that are being used. This is especially throwing | ||||
|   away any intermediate artifacts. | ||||
							
								
								
									
										15
									
								
								action.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								action.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| name: "Rust Cache" | ||||
| description: "A GitHub Action that implements smart caching for rust/cargo projects" | ||||
| author: "Arpad Borsos <arpad.borsos@googlemail.com>" | ||||
| inputs: | ||||
|   key: | ||||
|     description: "An explicit key for restoring and saving the target cache" | ||||
|     required: false | ||||
| runs: | ||||
|   using: "node12" | ||||
|   main: "dist/restore/index.js" | ||||
|   post: "dist/save/index.js" | ||||
|   post-if: "success()" | ||||
| branding: | ||||
|   icon: "archive" | ||||
|   color: "gray-dark" | ||||
							
								
								
									
										55002
									
								
								dist/restore/index.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55002
									
								
								dist/restore/index.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										55123
									
								
								dist/save/index.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55123
									
								
								dist/save/index.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										489
									
								
								package-lock.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										489
									
								
								package-lock.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,489 @@ | |||
| { | ||||
|   "name": "rust-cache", | ||||
|   "version": "1.0.0", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
|     "@actions/cache": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-1.0.2.tgz", | ||||
|       "integrity": "sha512-CzAseaJ4cKmOI58EIWUb/LfeYdM7Y25s39OEMtWAhEPrPPzrbSEjGHCLaYjJ0V8C4iojo8vBYh5B3OIJ37EiJw==", | ||||
|       "requires": { | ||||
|         "@actions/core": "^1.2.4", | ||||
|         "@actions/exec": "^1.0.1", | ||||
|         "@actions/glob": "^0.1.0", | ||||
|         "@actions/http-client": "^1.0.8", | ||||
|         "@actions/io": "^1.0.1", | ||||
|         "@azure/ms-rest-js": "^2.0.7", | ||||
|         "@azure/storage-blob": "^12.1.2", | ||||
|         "semver": "^6.1.0", | ||||
|         "uuid": "^3.3.3" | ||||
|       } | ||||
|     }, | ||||
|     "@actions/core": { | ||||
|       "version": "1.2.6", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", | ||||
|       "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" | ||||
|     }, | ||||
|     "@actions/exec": { | ||||
|       "version": "1.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.4.tgz", | ||||
|       "integrity": "sha512-4DPChWow9yc9W3WqEbUj8Nr86xkpyE29ZzWjXucHItclLbEW6jr80Zx4nqv18QL6KK65+cifiQZXvnqgTV6oHw==", | ||||
|       "requires": { | ||||
|         "@actions/io": "^1.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "@actions/glob": { | ||||
|       "version": "0.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/glob/-/glob-0.1.0.tgz", | ||||
|       "integrity": "sha512-lx8SzyQ2FE9+UUvjqY1f28QbTJv+w8qP7kHHbfQRhphrlcx0Mdmm1tZdGJzfxv1jxREa/sLW4Oy8CbGQKCJySA==", | ||||
|       "requires": { | ||||
|         "@actions/core": "^1.2.0", | ||||
|         "minimatch": "^3.0.4" | ||||
|       } | ||||
|     }, | ||||
|     "@actions/http-client": { | ||||
|       "version": "1.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", | ||||
|       "integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", | ||||
|       "requires": { | ||||
|         "tunnel": "0.0.6" | ||||
|       } | ||||
|     }, | ||||
|     "@actions/io": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.0.2.tgz", | ||||
|       "integrity": "sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg==" | ||||
|     }, | ||||
|     "@azure/abort-controller": { | ||||
|       "version": "1.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", | ||||
|       "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", | ||||
|       "requires": { | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@azure/core-asynciterator-polyfill": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz", | ||||
|       "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==" | ||||
|     }, | ||||
|     "@azure/core-auth": { | ||||
|       "version": "1.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.1.3.tgz", | ||||
|       "integrity": "sha512-A4xigW0YZZpkj1zK7dKuzbBpGwnhEcRk6WWuIshdHC32raR3EQ1j6VA9XZqE+RFsUgH6OAmIK5BWIz+mZjnd6Q==", | ||||
|       "requires": { | ||||
|         "@azure/abort-controller": "^1.0.0", | ||||
|         "@azure/core-tracing": "1.0.0-preview.8", | ||||
|         "@opentelemetry/api": "^0.6.1", | ||||
|         "tslib": "^2.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "@azure/core-tracing": { | ||||
|           "version": "1.0.0-preview.8", | ||||
|           "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.8.tgz", | ||||
|           "integrity": "sha512-ZKUpCd7Dlyfn7bdc+/zC/sf0aRIaNQMDuSj2RhYRFe3p70hVAnYGp3TX4cnG2yoEALp/LTj/XnZGQ8Xzf6Ja/Q==", | ||||
|           "requires": { | ||||
|             "@opencensus/web-types": "0.0.7", | ||||
|             "@opentelemetry/api": "^0.6.1", | ||||
|             "tslib": "^1.10.0" | ||||
|           }, | ||||
|           "dependencies": { | ||||
|             "tslib": { | ||||
|               "version": "1.13.0", | ||||
|               "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", | ||||
|               "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         "@opentelemetry/api": { | ||||
|           "version": "0.6.1", | ||||
|           "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.6.1.tgz", | ||||
|           "integrity": "sha512-wpufGZa7tTxw7eAsjXJtiyIQ42IWQdX9iUQp7ACJcKo1hCtuhLU+K2Nv1U6oRwT1oAlZTE6m4CgWKZBhOiau3Q==", | ||||
|           "requires": { | ||||
|             "@opentelemetry/context-base": "^0.6.1" | ||||
|           } | ||||
|         }, | ||||
|         "tslib": { | ||||
|           "version": "2.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", | ||||
|           "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@azure/core-http": { | ||||
|       "version": "1.1.8", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.1.8.tgz", | ||||
|       "integrity": "sha512-hJ9ZblU99sY2dTD6U5EqZ5zjd0QmwwvSp8RYp2zS9s5mhsNobLQFI09bIE6yo891bOySCEepNCE5tL15dLYhIA==", | ||||
|       "requires": { | ||||
|         "@azure/abort-controller": "^1.0.0", | ||||
|         "@azure/core-auth": "^1.1.3", | ||||
|         "@azure/core-tracing": "1.0.0-preview.9", | ||||
|         "@azure/logger": "^1.0.0", | ||||
|         "@opentelemetry/api": "^0.10.2", | ||||
|         "@types/node-fetch": "^2.5.0", | ||||
|         "@types/tunnel": "^0.0.1", | ||||
|         "form-data": "^3.0.0", | ||||
|         "node-fetch": "^2.6.0", | ||||
|         "process": "^0.11.10", | ||||
|         "tough-cookie": "^4.0.0", | ||||
|         "tslib": "^2.0.0", | ||||
|         "tunnel": "^0.0.6", | ||||
|         "uuid": "^8.1.0", | ||||
|         "xml2js": "^0.4.19" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "form-data": { | ||||
|           "version": "3.0.0", | ||||
|           "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", | ||||
|           "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", | ||||
|           "requires": { | ||||
|             "asynckit": "^0.4.0", | ||||
|             "combined-stream": "^1.0.8", | ||||
|             "mime-types": "^2.1.12" | ||||
|           } | ||||
|         }, | ||||
|         "tough-cookie": { | ||||
|           "version": "4.0.0", | ||||
|           "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", | ||||
|           "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", | ||||
|           "requires": { | ||||
|             "psl": "^1.1.33", | ||||
|             "punycode": "^2.1.1", | ||||
|             "universalify": "^0.1.2" | ||||
|           } | ||||
|         }, | ||||
|         "tslib": { | ||||
|           "version": "2.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", | ||||
|           "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" | ||||
|         }, | ||||
|         "uuid": { | ||||
|           "version": "8.3.0", | ||||
|           "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", | ||||
|           "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@azure/core-lro": { | ||||
|       "version": "1.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-1.0.2.tgz", | ||||
|       "integrity": "sha512-Yr0JD7GKryOmbcb5wHCQoQ4KCcH5QJWRNorofid+UvudLaxnbCfvKh/cUfQsGUqRjO9L/Bw4X7FP824DcHdMxw==", | ||||
|       "requires": { | ||||
|         "@azure/abort-controller": "^1.0.0", | ||||
|         "@azure/core-http": "^1.1.1", | ||||
|         "events": "^3.0.0", | ||||
|         "tslib": "^1.10.0" | ||||
|       } | ||||
|     }, | ||||
|     "@azure/core-paging": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.2.tgz", | ||||
|       "integrity": "sha512-6wZ+LrF8zwAuukvYsiff+uMNkVu9HZt8gRs/1o5377Cz9354y23QI7eZM0iwTfO38c8LZUSvzLJSqdM4T1QXxA==", | ||||
|       "requires": { | ||||
|         "@azure/core-asynciterator-polyfill": "^1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "@azure/core-tracing": { | ||||
|       "version": "1.0.0-preview.9", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.9.tgz", | ||||
|       "integrity": "sha512-zczolCLJ5QG42AEPQ+Qg9SRYNUyB+yZ5dzof4YEc+dyWczO9G2sBqbAjLB7IqrsdHN2apkiB2oXeDKCsq48jug==", | ||||
|       "requires": { | ||||
|         "@opencensus/web-types": "0.0.7", | ||||
|         "@opentelemetry/api": "^0.10.2", | ||||
|         "tslib": "^2.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "tslib": { | ||||
|           "version": "2.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", | ||||
|           "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@azure/logger": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", | ||||
|       "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", | ||||
|       "requires": { | ||||
|         "tslib": "^1.9.3" | ||||
|       } | ||||
|     }, | ||||
|     "@azure/ms-rest-js": { | ||||
|       "version": "2.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-2.0.8.tgz", | ||||
|       "integrity": "sha512-PO4pnYaF66IAB/RWbhrTprGyhOzDzsgcbT7z8k3O38JKlwifbrhW+8M0fzx0ScZnaacP8rZyBazYMUF9P12c0g==", | ||||
|       "requires": { | ||||
|         "@types/node-fetch": "^2.3.7", | ||||
|         "@types/tunnel": "0.0.1", | ||||
|         "abort-controller": "^3.0.0", | ||||
|         "form-data": "^2.5.0", | ||||
|         "node-fetch": "^2.6.0", | ||||
|         "tough-cookie": "^3.0.1", | ||||
|         "tslib": "^1.10.0", | ||||
|         "tunnel": "0.0.6", | ||||
|         "uuid": "^3.3.2", | ||||
|         "xml2js": "^0.4.19" | ||||
|       } | ||||
|     }, | ||||
|     "@azure/storage-blob": { | ||||
|       "version": "12.2.1", | ||||
|       "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.2.1.tgz", | ||||
|       "integrity": "sha512-erqCSmDL8b/AHZi94nq+nCE+2whQmvBDkAv4N9uic0MRac/gRyZqnsqkfrun/gr2rZo+qVtnMenwkkE3roXn8Q==", | ||||
|       "requires": { | ||||
|         "@azure/abort-controller": "^1.0.0", | ||||
|         "@azure/core-http": "^1.1.6", | ||||
|         "@azure/core-lro": "^1.0.2", | ||||
|         "@azure/core-paging": "^1.1.1", | ||||
|         "@azure/core-tracing": "1.0.0-preview.9", | ||||
|         "@azure/logger": "^1.0.0", | ||||
|         "@opentelemetry/api": "^0.10.2", | ||||
|         "events": "^3.0.0", | ||||
|         "tslib": "^2.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "tslib": { | ||||
|           "version": "2.0.1", | ||||
|           "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", | ||||
|           "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@opencensus/web-types": { | ||||
|       "version": "0.0.7", | ||||
|       "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", | ||||
|       "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==" | ||||
|     }, | ||||
|     "@opentelemetry/api": { | ||||
|       "version": "0.10.2", | ||||
|       "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.10.2.tgz", | ||||
|       "integrity": "sha512-GtpMGd6vkzDMYcpu2t9LlhEgMy/SzBwRnz48EejlRArYqZzqSzAsKmegUK7zHgl+EOIaK9mKHhnRaQu3qw20cA==", | ||||
|       "requires": { | ||||
|         "@opentelemetry/context-base": "^0.10.2" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "@opentelemetry/context-base": { | ||||
|           "version": "0.10.2", | ||||
|           "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.10.2.tgz", | ||||
|           "integrity": "sha512-hZNKjKOYsckoOEgBziGMnBcX0M7EtstnCmwz5jZUOUYwlZ+/xxX6z3jPu1XVO2Jivk0eLfuP9GP+vFD49CMetw==" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@opentelemetry/context-base": { | ||||
|       "version": "0.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.6.1.tgz", | ||||
|       "integrity": "sha512-5bHhlTBBq82ti3qPT15TRxkYTFPPQWbnkkQkmHPtqiS1XcTB69cEKd3Jm7Cfi/vkPoyxapmePE9tyA7EzLt8SQ==" | ||||
|     }, | ||||
|     "@types/node": { | ||||
|       "version": "14.11.2", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", | ||||
|       "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==" | ||||
|     }, | ||||
|     "@types/node-fetch": { | ||||
|       "version": "2.5.7", | ||||
|       "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", | ||||
|       "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", | ||||
|       "requires": { | ||||
|         "@types/node": "*", | ||||
|         "form-data": "^3.0.0" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "form-data": { | ||||
|           "version": "3.0.0", | ||||
|           "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", | ||||
|           "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", | ||||
|           "requires": { | ||||
|             "asynckit": "^0.4.0", | ||||
|             "combined-stream": "^1.0.8", | ||||
|             "mime-types": "^2.1.12" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "@types/tunnel": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", | ||||
|       "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==", | ||||
|       "requires": { | ||||
|         "@types/node": "*" | ||||
|       } | ||||
|     }, | ||||
|     "@vercel/ncc": { | ||||
|       "version": "0.24.1", | ||||
|       "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.24.1.tgz", | ||||
|       "integrity": "sha512-r9m7brz2hNmq5TF3sxrK4qR/FhXn44XIMglQUir4sT7Sh5GOaYXlMYikHFwJStf8rmQGTlvOoBXt4yHVonRG8A==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "abort-controller": { | ||||
|       "version": "3.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", | ||||
|       "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", | ||||
|       "requires": { | ||||
|         "event-target-shim": "^5.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "asynckit": { | ||||
|       "version": "0.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | ||||
|       "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" | ||||
|     }, | ||||
|     "balanced-match": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | ||||
|       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" | ||||
|     }, | ||||
|     "brace-expansion": { | ||||
|       "version": "1.1.11", | ||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||
|       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||
|       "requires": { | ||||
|         "balanced-match": "^1.0.0", | ||||
|         "concat-map": "0.0.1" | ||||
|       } | ||||
|     }, | ||||
|     "combined-stream": { | ||||
|       "version": "1.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | ||||
|       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | ||||
|       "requires": { | ||||
|         "delayed-stream": "~1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
|       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" | ||||
|     }, | ||||
|     "delayed-stream": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | ||||
|       "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" | ||||
|     }, | ||||
|     "event-target-shim": { | ||||
|       "version": "5.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", | ||||
|       "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" | ||||
|     }, | ||||
|     "events": { | ||||
|       "version": "3.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", | ||||
|       "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" | ||||
|     }, | ||||
|     "form-data": { | ||||
|       "version": "2.5.1", | ||||
|       "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", | ||||
|       "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", | ||||
|       "requires": { | ||||
|         "asynckit": "^0.4.0", | ||||
|         "combined-stream": "^1.0.6", | ||||
|         "mime-types": "^2.1.12" | ||||
|       } | ||||
|     }, | ||||
|     "ip-regex": { | ||||
|       "version": "2.1.0", | ||||
|       "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", | ||||
|       "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" | ||||
|     }, | ||||
|     "mime-db": { | ||||
|       "version": "1.44.0", | ||||
|       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", | ||||
|       "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" | ||||
|     }, | ||||
|     "mime-types": { | ||||
|       "version": "2.1.27", | ||||
|       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", | ||||
|       "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", | ||||
|       "requires": { | ||||
|         "mime-db": "1.44.0" | ||||
|       } | ||||
|     }, | ||||
|     "minimatch": { | ||||
|       "version": "3.0.4", | ||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | ||||
|       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||
|       "requires": { | ||||
|         "brace-expansion": "^1.1.7" | ||||
|       } | ||||
|     }, | ||||
|     "node-fetch": { | ||||
|       "version": "2.6.1", | ||||
|       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", | ||||
|       "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" | ||||
|     }, | ||||
|     "process": { | ||||
|       "version": "0.11.10", | ||||
|       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", | ||||
|       "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" | ||||
|     }, | ||||
|     "psl": { | ||||
|       "version": "1.8.0", | ||||
|       "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", | ||||
|       "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" | ||||
|     }, | ||||
|     "punycode": { | ||||
|       "version": "2.1.1", | ||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
|       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" | ||||
|     }, | ||||
|     "sax": { | ||||
|       "version": "1.2.4", | ||||
|       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", | ||||
|       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" | ||||
|     }, | ||||
|     "semver": { | ||||
|       "version": "6.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", | ||||
|       "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" | ||||
|     }, | ||||
|     "tough-cookie": { | ||||
|       "version": "3.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", | ||||
|       "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", | ||||
|       "requires": { | ||||
|         "ip-regex": "^2.1.0", | ||||
|         "psl": "^1.1.28", | ||||
|         "punycode": "^2.1.1" | ||||
|       } | ||||
|     }, | ||||
|     "tslib": { | ||||
|       "version": "1.13.0", | ||||
|       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", | ||||
|       "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" | ||||
|     }, | ||||
|     "tunnel": { | ||||
|       "version": "0.0.6", | ||||
|       "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", | ||||
|       "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" | ||||
|     }, | ||||
|     "typescript": { | ||||
|       "version": "4.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", | ||||
|       "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "universalify": { | ||||
|       "version": "0.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", | ||||
|       "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" | ||||
|     }, | ||||
|     "uuid": { | ||||
|       "version": "3.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", | ||||
|       "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" | ||||
|     }, | ||||
|     "xml2js": { | ||||
|       "version": "0.4.23", | ||||
|       "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", | ||||
|       "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", | ||||
|       "requires": { | ||||
|         "sax": ">=0.6.0", | ||||
|         "xmlbuilder": "~11.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "xmlbuilder": { | ||||
|       "version": "11.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", | ||||
|       "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										36
									
								
								package.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								package.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | |||
| { | ||||
|   "private": true, | ||||
|   "name": "rust-cache", | ||||
|   "version": "1.0.0", | ||||
|   "description": "A GitHub Action that implements smart caching for rust/cargo projects", | ||||
|   "keywords": [ | ||||
|     "actions", | ||||
|     "rust", | ||||
|     "cache" | ||||
|   ], | ||||
|   "author": "Arpad Borsos <arpad.borsos@googlemail.com>", | ||||
|   "license": "LGPL-3.0", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git+https://github.com/Swatinem/rust-cache.git" | ||||
|   }, | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/Swatinem/rust-cache/issues" | ||||
|   }, | ||||
|   "funding": "https://github.com/sponsors/Swatinem", | ||||
|   "homepage": "https://github.com/Swatinem/rust-cache#readme", | ||||
|   "dependencies": { | ||||
|     "@actions/cache": "^1.0.2", | ||||
|     "@actions/core": "^1.2.6", | ||||
|     "@actions/exec": "^1.0.4", | ||||
|     "@actions/glob": "^0.1.0", | ||||
|     "@actions/io": "^1.0.2" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@vercel/ncc": "^0.24.1", | ||||
|     "typescript": "^4.0.3" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "prepare": "ncc build -o dist/restore src/restore.ts && ncc build -o dist/save src/save.ts" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										124
									
								
								src/common.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/common.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,124 @@ | |||
| import * as core from "@actions/core"; | ||||
| import * as exec from "@actions/exec"; | ||||
| import * as glob from "@actions/glob"; | ||||
| import crypto from "crypto"; | ||||
| import fs from "fs"; | ||||
| import os from "os"; | ||||
| import path from "path"; | ||||
| 
 | ||||
| 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"), | ||||
|   target: "target", | ||||
| }; | ||||
| 
 | ||||
| export interface CacheConfig { | ||||
|   path: string; | ||||
|   key: string; | ||||
|   restoreKeys?: Array<string>; | ||||
| } | ||||
| 
 | ||||
| export interface Caches { | ||||
|   index: CacheConfig; | ||||
|   cache: CacheConfig; | ||||
|   git: CacheConfig; | ||||
|   target: CacheConfig; | ||||
| } | ||||
| 
 | ||||
| const RefKey = "GITHUB_REF"; | ||||
| 
 | ||||
| export function isValidEvent(): boolean { | ||||
|   return RefKey in process.env && Boolean(process.env[RefKey]); | ||||
| } | ||||
| 
 | ||||
| export async function getCaches(): Promise<Caches> { | ||||
|   const rustKey = await getRustKey(); | ||||
|   let lockHash = core.getState("lockHash"); | ||||
|   if (!lockHash) { | ||||
|     lockHash = await getLockfileHash(); | ||||
|     core.saveState("lockHash", lockHash); | ||||
|   } | ||||
|   let targetKey = core.getInput("key"); | ||||
|   if (targetKey) { | ||||
|     targetKey = `${targetKey}-`; | ||||
|   } | ||||
|   return { | ||||
|     index: { path: paths.index, key: "registry-index-XXX", restoreKeys: ["registry-index"] }, | ||||
|     cache: { path: paths.cache, key: `registry-cache-${lockHash}`, restoreKeys: ["registry-cache"] }, | ||||
|     git: { path: paths.git, key: "git-db" }, | ||||
|     target: { | ||||
|       path: paths.target, | ||||
|       key: `target-${targetKey}${rustKey}-${lockHash}`, | ||||
|       restoreKeys: [`target-${targetKey}${rustKey}`], | ||||
|     }, | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| export async function getRustKey(): Promise<string> { | ||||
|   const rustc = await getRustVersion(); | ||||
|   return `${rustc.release}-${rustc.host}-${rustc["commit-hash"]}`; | ||||
| } | ||||
| 
 | ||||
| interface RustVersion { | ||||
|   host: string; | ||||
|   release: string; | ||||
|   "commit-hash": string; | ||||
| } | ||||
| 
 | ||||
| export async function getRustVersion(): Promise<RustVersion> { | ||||
|   const stdout = await getCmdOutput("rustc", ["-vV"]); | ||||
|   let splits = stdout | ||||
|     .split(/[\n\r]+/) | ||||
|     .filter(Boolean) | ||||
|     .map((s) => s.split(":").map((s) => s.trim())) | ||||
|     .filter((s) => s.length === 2); | ||||
|   return Object.fromEntries(splits); | ||||
| } | ||||
| 
 | ||||
| export async function getCmdOutput( | ||||
|   cmd: string, | ||||
|   args: Array<string> = [], | ||||
|   options: exec.ExecOptions = {}, | ||||
| ): Promise<string> { | ||||
|   let stdout = ""; | ||||
|   await exec.exec(cmd, args, { | ||||
|     silent: true, | ||||
|     listeners: { | ||||
|       stdout(data) { | ||||
|         stdout += data.toString(); | ||||
|       }, | ||||
|     }, | ||||
|     ...options, | ||||
|   }); | ||||
|   return stdout; | ||||
| } | ||||
| 
 | ||||
| export async function getRegistryName() { | ||||
|   const globber = await glob.create(`${paths.index}/**/.last-updated`, { followSymbolicLinks: false }); | ||||
|   const files = await globber.glob(); | ||||
|   if (files.length > 1) { | ||||
|     core.debug(`got multiple registries: "${files.join('", "')}"`); | ||||
|   } | ||||
| 
 | ||||
|   const first = files.shift(); | ||||
|   if (!first) { | ||||
|     return; | ||||
|   } | ||||
|   return path.basename(path.dirname(first)); | ||||
| } | ||||
| 
 | ||||
| export async function getLockfileHash() { | ||||
|   const globber = await glob.create("**/Cargo.toml\n**/Cargo.lock", { followSymbolicLinks: false }); | ||||
|   const files = await globber.glob(); | ||||
|   files.sort((a, b) => a.localeCompare(b)); | ||||
| 
 | ||||
|   const hasher = crypto.createHash("sha1"); | ||||
|   for (const file of files) { | ||||
|     for await (const chunk of fs.createReadStream(file)) { | ||||
|       hasher.update(chunk); | ||||
|     } | ||||
|   } | ||||
|   return hasher.digest("hex"); | ||||
| } | ||||
							
								
								
									
										35
									
								
								src/restore.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/restore.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| import * as cache from "@actions/cache"; | ||||
| import * as core from "@actions/core"; | ||||
| import { getCaches, isValidEvent } from "./common"; | ||||
| 
 | ||||
| async function run() { | ||||
|   if (!isValidEvent()) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     core.exportVariable("CARGO_INCREMENTAL", 0); | ||||
| 
 | ||||
|     const caches = await getCaches(); | ||||
|     for (const [name, { path, key, restoreKeys }] of Object.entries(caches)) { | ||||
|       try { | ||||
|         core.startGroup(`Restoring "${path}" from "${key}"…`); | ||||
|         const restoreKey = await cache.restoreCache([path], key, restoreKeys); | ||||
|         if (restoreKey) { | ||||
|           core.info(`Restored "${path}" from cache key "${restoreKey}".`); | ||||
|           core.saveState(name, restoreKey); | ||||
|         } else { | ||||
|           core.info("No cache found."); | ||||
|         } | ||||
|       } catch (e) { | ||||
|         core.info(`[warning] ${e.message}`); | ||||
|       } finally { | ||||
|         core.endGroup(); | ||||
|       } | ||||
|     } | ||||
|   } catch (e) { | ||||
|     core.info(`[warning] ${e.message}`); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| run(); | ||||
							
								
								
									
										133
									
								
								src/save.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								src/save.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,133 @@ | |||
| import * as cache from "@actions/cache"; | ||||
| import * as core from "@actions/core"; | ||||
| import * as io from "@actions/io"; | ||||
| import fs from "fs"; | ||||
| import path from "path"; | ||||
| import { getCaches, getCmdOutput, getRegistryName, isValidEvent, paths } from "./common"; | ||||
| 
 | ||||
| async function run() { | ||||
|   if (!isValidEvent()) { | ||||
|     //return;
 | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     const caches = await getCaches(); | ||||
|     const registryName = await getRegistryName(); | ||||
|     const packages = await getPackages(); | ||||
| 
 | ||||
|     await pruneTarget(packages); | ||||
|     if (registryName) { | ||||
|       // save the index based on its revision
 | ||||
|       const indexRef = await getIndexRef(registryName); | ||||
|       caches.index.key = `registry-index-${indexRef}`; | ||||
|       await io.rmRF(path.join(paths.index, registryName, ".cache")); | ||||
| 
 | ||||
|       await pruneRegistryCache(registryName, packages); | ||||
|     } else { | ||||
|       delete (caches as any).index; | ||||
|       delete (caches as any).cache; | ||||
|     } | ||||
| 
 | ||||
|     for (const [name, { path, key }] of Object.entries(caches)) { | ||||
|       if (core.getState(name) === key) { | ||||
|         core.info(`Cache for "${path}" up-to-date.`); | ||||
|         continue; | ||||
|       } | ||||
|       try { | ||||
|         core.startGroup(`Saving "${path}" to cache key "${key}"…`); | ||||
|         if (await cache.saveCache([path], key)) { | ||||
|           core.info(`Saved "${path}" to cache key "${key}".`); | ||||
|         } | ||||
|       } catch (e) { | ||||
|         core.info(`[warning] ${e.message}`); | ||||
|       } finally { | ||||
|         core.endGroup(); | ||||
|       } | ||||
|     } | ||||
|   } catch (e) { | ||||
|     core.info(`[warning] ${e.message}`); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| run(); | ||||
| 
 | ||||
| async function getIndexRef(registryName: string) { | ||||
|   const cwd = path.join(paths.index, registryName); | ||||
|   return (await getCmdOutput("git", ["rev-parse", "--short", "origin/master"], { cwd })).trim(); | ||||
| } | ||||
| 
 | ||||
| interface PackageDefinition { | ||||
|   name: string; | ||||
|   version: string; | ||||
| } | ||||
| 
 | ||||
| type Packages = Array<PackageDefinition>; | ||||
| 
 | ||||
| async function getPackages(): Promise<Packages> { | ||||
|   const meta = JSON.parse(await getCmdOutput("cargo", ["metadata", "--format-version", "1"])); | ||||
|   return meta.packages.map(({ name, version }: any) => ({ name, version })); | ||||
| } | ||||
| 
 | ||||
| async function pruneRegistryCache(registryName: string, packages: Packages) { | ||||
|   const pkgSet = new Set(packages.map((p) => `${p.name}-${p.version}.crate`)); | ||||
| 
 | ||||
|   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}"`); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| async function pruneTarget(packages: Packages) { | ||||
|   await fs.promises.unlink("./target/.rustc_info.json"); | ||||
|   await io.rmRF("./target/debug/examples"); | ||||
|   await io.rmRF("./target/debug/incremental"); | ||||
|   let dir: fs.Dir; | ||||
| 
 | ||||
|   // remove all *files* from debug
 | ||||
|   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); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   const keepPkg = new Set(packages.map((p) => p.name)); | ||||
|   await rmExcept("./target/debug/build", keepPkg); | ||||
|   await rmExcept("./target/debug/.fingerprint", keepPkg); | ||||
| 
 | ||||
|   const keepDeps = new Set( | ||||
|     packages.flatMap((p) => { | ||||
|       const name = p.name.replace(/-/g, "_"); | ||||
|       return [name, `lib${name}`]; | ||||
|     }), | ||||
|   ); | ||||
|   await rmExcept("./target/debug/deps", keepDeps); | ||||
| } | ||||
| 
 | ||||
| const twoWeeks = 14 * 24 * 3600 * 1000; | ||||
| 
 | ||||
| async function rmExcept(dirName: string, keepPrefix: Set<string>) { | ||||
|   const dir = await fs.promises.opendir(dirName); | ||||
|   for await (const dirent of dir) { | ||||
|     let name = dirent.name; | ||||
|     const idx = name.lastIndexOf("-"); | ||||
|     if (idx !== -1) { | ||||
|       name = name.slice(0, idx); | ||||
|     } | ||||
|     const fileName = path.join(dir.path, dirent.name); | ||||
|     const { mtime } = await fs.promises.stat(fileName); | ||||
|     if (!keepPrefix.has(name) || Date.now() - mtime.getTime() > twoWeeks) { | ||||
|       core.debug(`deleting "${fileName}"`); | ||||
|       if (dirent.isFile()) { | ||||
|         await fs.promises.unlink(fileName); | ||||
|       } else if (dirent.isDirectory()) { | ||||
|         await io.rmRF(fileName); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										21
									
								
								tsconfig.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tsconfig.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| { | ||||
|   "compilerOptions": { | ||||
|     "noEmitOnError": false, | ||||
|     "diagnostics": true, | ||||
|     "lib": ["esnext"], | ||||
| 
 | ||||
|     "target": "es2017", | ||||
| 
 | ||||
|     "resolveJsonModule": true, | ||||
|     "moduleResolution": "node", | ||||
|     "module": "esnext", | ||||
|     "esModuleInterop": true, | ||||
| 
 | ||||
|     "strict": true, | ||||
|     "skipLibCheck": true, | ||||
|     "noUnusedLocals": true, | ||||
|     "noUnusedParameters": true, | ||||
|     "noImplicitReturns": true | ||||
|   }, | ||||
|   "exclude": ["dist"] | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue