mirror of
				https://github.com/Swatinem/rust-cache.git
				synced 2025-10-31 23:33:48 +00:00 
			
		
		
		
	initial commit
This commit is contained in:
		
						commit
						99970e092c
					
				
							
								
								
									
										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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user