2019-10-30 14:48:49 -04:00
import * as core from "@actions/core" ;
import { exec } from "@actions/exec" ;
import * as io from "@actions/io" ;
import * as path from "path" ;
import * as cacheHttpClient from "./cacheHttpClient" ;
import { Inputs , State } from "./constants" ;
import * as utils from "./utils/actionUtils" ;
async function run() {
try {
// Validate inputs, this can cause task failure
2019-11-07 14:15:44 -05:00
if ( ! utils . isValidEvent ( ) ) {
core . setFailed (
` Event Validation Error: The event type ${ process . env [ "GITHUB_EVENT_NAME" ] } is not supported. Only \` push \` and \` pull_request \` events are supported at this time. `
) ;
}
2019-10-30 14:48:49 -04:00
let cachePath = utils . resolvePath (
core . getInput ( Inputs . Path , { required : true } )
) ;
core . debug ( ` Cache Path: ${ cachePath } ` ) ;
const primaryKey = core . getInput ( Inputs . Key , { required : true } ) ;
core . saveState ( State . CacheKey , primaryKey ) ;
2019-11-05 14:33:41 -06:00
const restoreKeys = core
. getInput ( Inputs . RestoreKeys )
. split ( "\n" )
. filter ( x = > x !== "" ) ;
2019-10-30 14:48:49 -04:00
const keys = [ primaryKey , . . . restoreKeys ] ;
core . debug ( "Resolved Keys:" ) ;
core . debug ( JSON . stringify ( keys ) ) ;
if ( keys . length > 10 ) {
core . setFailed (
` Key Validation Error: Keys are limited to a maximum of 10. `
) ;
return ;
}
for ( const key of keys ) {
if ( key . length > 512 ) {
core . setFailed (
` Key Validation Error: ${ key } cannot be larger than 512 characters. `
) ;
return ;
}
const regex = /^[^,]*$/ ;
if ( ! regex . test ( key ) ) {
core . setFailed (
` Key Validation Error: ${ key } cannot contain commas. `
) ;
return ;
}
}
try {
2019-11-04 10:03:18 -06:00
const cacheEntry = await cacheHttpClient . getCacheEntry ( keys ) ;
if ( ! cacheEntry ) {
core . info (
2019-11-05 14:33:41 -06:00
` Cache not found for input keys: ${ keys . join ( ", " ) } . `
2019-11-04 10:03:18 -06:00
) ;
return ;
}
2019-10-30 14:48:49 -04:00
let archivePath = path . join (
await utils . createTempDirectory ( ) ,
"cache.tgz"
) ;
core . debug ( ` Archive Path: ${ archivePath } ` ) ;
// Store the cache result
utils . setCacheState ( cacheEntry ) ;
// Download the cache from the cache entry
await cacheHttpClient . downloadCache ( cacheEntry , archivePath ) ;
2019-11-06 13:41:45 -05:00
const archiveFileSize = utils . getArchiveFileSize ( archivePath ) ;
core . debug ( ` File Size: ${ archiveFileSize } ` ) ;
2019-10-30 14:48:49 -04:00
io . mkdirP ( cachePath ) ;
// http://man7.org/linux/man-pages/man1/tar.1.html
// tar [-options] <name of the tar archive> [files or directories which to add into archive]
const args = [ "-xz" ] ;
const IS_WINDOWS = process . platform === "win32" ;
if ( IS_WINDOWS ) {
args . push ( "--force-local" ) ;
archivePath = archivePath . replace ( /\\/g , "/" ) ;
cachePath = cachePath . replace ( /\\/g , "/" ) ;
}
args . push ( . . . [ "-f" , archivePath , "-C" , cachePath ] ) ;
const tarPath = await io . which ( "tar" , true ) ;
core . debug ( ` Tar Path: ${ tarPath } ` ) ;
await exec ( ` " ${ tarPath } " ` , args ) ;
const isExactKeyMatch = utils . isExactKeyMatch (
primaryKey ,
cacheEntry
) ;
utils . setCacheHitOutput ( isExactKeyMatch ) ;
core . info (
2019-11-04 10:03:18 -06:00
` Cache restored from key: ${ cacheEntry && cacheEntry . cacheKey } `
2019-10-30 14:48:49 -04:00
) ;
} catch ( error ) {
core . warning ( error . message ) ;
utils . setCacheHitOutput ( false ) ;
}
} catch ( error ) {
core . setFailed ( error . message ) ;
}
}
run ( ) ;
export default run ;