2 Commits

Author SHA1 Message Date
github-actions[bot]
24902b7977 Update all (#137)
Some checks failed
CI / build (push) Has been cancelled
Co-authored-by: github-actions <github-actions-bot@users.noreply.github.com>
2026-04-20 12:45:16 +00:00
Aiqiao Yan
3db2cfa8d0 Add ability to cache only latest N versions and cache github/gh-aw-actions (#136)
* add ability to cache only latest N versions

* fix test
2026-04-13 16:24:07 -04:00
16 changed files with 315 additions and 34 deletions

View File

@@ -6,7 +6,7 @@
"+^v[3-9]+(\\.[0-9]+){0,2}$"
],
"branches": {
"main": "668228422ae6a00e4ad889ee87cd7109ec5666a7"
"main": "27d5ce7f107fe9357f9df03efb73ab90386fccae"
},
"defaultBranch": "main",
"tags": {
@@ -137,7 +137,7 @@
"commit": "0057852bfaa89a56745cba8c7296529d2fc39830"
},
"v5": {
"commit": "668228422ae6a00e4ad889ee87cd7109ec5666a7"
"commit": "27d5ce7f107fe9357f9df03efb73ab90386fccae"
},
"v5.0.0": {
"commit": "a7833574556fa59680c1b7cb190c1735db73ebf0"
@@ -153,6 +153,9 @@
},
"v5.0.4": {
"commit": "668228422ae6a00e4ad889ee87cd7109ec5666a7"
},
"v5.0.5": {
"commit": "27d5ce7f107fe9357f9df03efb73ab90386fccae"
}
}
}

View File

@@ -6,7 +6,7 @@
"+^v[3-9]+(\\.[0-9]+){0,2}$"
],
"branches": {
"main": "53b83947a5a98c8d113130e565377fae1a50d02f"
"main": "48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"
},
"defaultBranch": "main",
"tags": {
@@ -98,7 +98,7 @@
"commit": "a0853c24544627f65ddf259abe73b1d18a591444"
},
"v6": {
"commit": "53b83947a5a98c8d113130e565377fae1a50d02f"
"commit": "48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"
},
"v6.0.0": {
"commit": "2028fbc5c25fe9cf00d9f06a71cc4710d4507903"
@@ -111,6 +111,9 @@
},
"v6.3.0": {
"commit": "53b83947a5a98c8d113130e565377fae1a50d02f"
},
"v6.4.0": {
"commit": "48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e"
}
}
}

View File

@@ -6,7 +6,7 @@
"+^v[2-9]+(\\.[0-9]+){0,2}$"
],
"branches": {
"main": "28f2168f4d98ee0445e3c6321f6e6616c83dd5ec"
"main": "c8813ba1bc76ebf779b911ad8ffccbf2e449cb48"
},
"defaultBranch": "main",
"tags": {

View File

@@ -6,7 +6,7 @@
"+^v[4-9]+(\\.[0-9]+){0,2}$"
],
"branches": {
"main": "bbbca2ddaa5d8feaa63e36b76fdaad77386f024f"
"main": "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"
},
"defaultBranch": "main",
"tags": {
@@ -80,10 +80,13 @@
"commit": "b7c566a772e6b6bfb58ed0dc250532a479d7789f"
},
"v7": {
"commit": "bbbca2ddaa5d8feaa63e36b76fdaad77386f024f"
"commit": "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"
},
"v7.0.0": {
"commit": "bbbca2ddaa5d8feaa63e36b76fdaad77386f024f"
},
"v7.0.1": {
"commit": "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"
}
}
}

View File

@@ -0,0 +1,26 @@
{
"owner": "github",
"repo": "gh-aw-actions",
"patterns": [
"+^master$",
"+^v[0-9]+(\\.[0-9]+){0,2}$"
],
"branches": {},
"defaultBranch": "master",
"latestMajorVersions": 1,
"latestVersionsPerMajor": 3,
"tags": {
"v0.68.5": {
"commit": "ed10714fec78f6c6541822e4af6a90f373404b8b",
"tag": "b2e9ba3ee4bb2f7b123b831cc92827aa75249ee0"
},
"v0.68.6": {
"commit": "f52802884d655622f0a2dfd6d6a2250983c95523",
"tag": "7da066725fd3fdad06a44e9e8abe0cf5963c16f9"
},
"v0.68.7": {
"commit": "f52802884d655622f0a2dfd6d6a2250983c95523",
"tag": "69af89ae134d818caa7743b23ad966ce03914a27"
}
}
}

View File

@@ -1,7 +1,7 @@
mkdir actions_cache
pushd actions_cache
curl -s -S -L -o '668228422ae6a00e4ad889ee87cd7109ec5666a7.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/668228422ae6a00e4ad889ee87cd7109ec5666a7'
curl -s -S -L -o '668228422ae6a00e4ad889ee87cd7109ec5666a7.zip' 'https://api.github.com/repos/actions/cache/zipball/668228422ae6a00e4ad889ee87cd7109ec5666a7'
curl -s -S -L -o '27d5ce7f107fe9357f9df03efb73ab90386fccae.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/27d5ce7f107fe9357f9df03efb73ab90386fccae'
curl -s -S -L -o '27d5ce7f107fe9357f9df03efb73ab90386fccae.zip' 'https://api.github.com/repos/actions/cache/zipball/27d5ce7f107fe9357f9df03efb73ab90386fccae'
curl -s -S -L -o '6f8efc29b200d32929f49075959781ed54ec270c.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/6f8efc29b200d32929f49075959781ed54ec270c'
curl -s -S -L -o '6f8efc29b200d32929f49075959781ed54ec270c.zip' 'https://api.github.com/repos/actions/cache/zipball/6f8efc29b200d32929f49075959781ed54ec270c'
curl -s -S -L -o '4b0cf6cc4619e737324ddfcec08fff2413359514.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/4b0cf6cc4619e737324ddfcec08fff2413359514'
@@ -86,8 +86,8 @@ curl -s -S -L -o '0400d5f644dc74513175e3cd8d07132dd4860809.tar.gz' 'https://api.
curl -s -S -L -o '0400d5f644dc74513175e3cd8d07132dd4860809.zip' 'https://api.github.com/repos/actions/cache/zipball/0400d5f644dc74513175e3cd8d07132dd4860809'
curl -s -S -L -o '0057852bfaa89a56745cba8c7296529d2fc39830.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/0057852bfaa89a56745cba8c7296529d2fc39830'
curl -s -S -L -o '0057852bfaa89a56745cba8c7296529d2fc39830.zip' 'https://api.github.com/repos/actions/cache/zipball/0057852bfaa89a56745cba8c7296529d2fc39830'
curl -s -S -L -o '668228422ae6a00e4ad889ee87cd7109ec5666a7.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/668228422ae6a00e4ad889ee87cd7109ec5666a7'
curl -s -S -L -o '668228422ae6a00e4ad889ee87cd7109ec5666a7.zip' 'https://api.github.com/repos/actions/cache/zipball/668228422ae6a00e4ad889ee87cd7109ec5666a7'
curl -s -S -L -o '27d5ce7f107fe9357f9df03efb73ab90386fccae.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/27d5ce7f107fe9357f9df03efb73ab90386fccae'
curl -s -S -L -o '27d5ce7f107fe9357f9df03efb73ab90386fccae.zip' 'https://api.github.com/repos/actions/cache/zipball/27d5ce7f107fe9357f9df03efb73ab90386fccae'
curl -s -S -L -o 'a7833574556fa59680c1b7cb190c1735db73ebf0.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/a7833574556fa59680c1b7cb190c1735db73ebf0'
curl -s -S -L -o 'a7833574556fa59680c1b7cb190c1735db73ebf0.zip' 'https://api.github.com/repos/actions/cache/zipball/a7833574556fa59680c1b7cb190c1735db73ebf0'
curl -s -S -L -o '9255dc7a253b0ccc959486e2bca901246202afeb.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/9255dc7a253b0ccc959486e2bca901246202afeb'
@@ -98,4 +98,6 @@ curl -s -S -L -o 'cdf6c1fa76f9f475f3d7449005a359c84ca0f306.tar.gz' 'https://api.
curl -s -S -L -o 'cdf6c1fa76f9f475f3d7449005a359c84ca0f306.zip' 'https://api.github.com/repos/actions/cache/zipball/cdf6c1fa76f9f475f3d7449005a359c84ca0f306'
curl -s -S -L -o '668228422ae6a00e4ad889ee87cd7109ec5666a7.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/668228422ae6a00e4ad889ee87cd7109ec5666a7'
curl -s -S -L -o '668228422ae6a00e4ad889ee87cd7109ec5666a7.zip' 'https://api.github.com/repos/actions/cache/zipball/668228422ae6a00e4ad889ee87cd7109ec5666a7'
curl -s -S -L -o '27d5ce7f107fe9357f9df03efb73ab90386fccae.tar.gz' 'https://api.github.com/repos/actions/cache/tarball/27d5ce7f107fe9357f9df03efb73ab90386fccae'
curl -s -S -L -o '27d5ce7f107fe9357f9df03efb73ab90386fccae.zip' 'https://api.github.com/repos/actions/cache/zipball/27d5ce7f107fe9357f9df03efb73ab90386fccae'
popd

View File

@@ -1,7 +1,7 @@
mkdir actions_setup-node
pushd actions_setup-node
curl -s -S -L -o '53b83947a5a98c8d113130e565377fae1a50d02f.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/53b83947a5a98c8d113130e565377fae1a50d02f'
curl -s -S -L -o '53b83947a5a98c8d113130e565377fae1a50d02f.zip' 'https://api.github.com/repos/actions/setup-node/zipball/53b83947a5a98c8d113130e565377fae1a50d02f'
curl -s -S -L -o '48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e'
curl -s -S -L -o '48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e.zip' 'https://api.github.com/repos/actions/setup-node/zipball/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e'
curl -s -S -L -o '3235b876344d2a9aa001b8d1453c930bba69e610.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/3235b876344d2a9aa001b8d1453c930bba69e610'
curl -s -S -L -o '3235b876344d2a9aa001b8d1453c930bba69e610.zip' 'https://api.github.com/repos/actions/setup-node/zipball/3235b876344d2a9aa001b8d1453c930bba69e610'
curl -s -S -L -o '9ced9a43a244f3ac94f13bfd896db8c8f30da67a.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/9ced9a43a244f3ac94f13bfd896db8c8f30da67a'
@@ -60,8 +60,8 @@ curl -s -S -L -o 'a0853c24544627f65ddf259abe73b1d18a591444.tar.gz' 'https://api.
curl -s -S -L -o 'a0853c24544627f65ddf259abe73b1d18a591444.zip' 'https://api.github.com/repos/actions/setup-node/zipball/a0853c24544627f65ddf259abe73b1d18a591444'
curl -s -S -L -o 'a0853c24544627f65ddf259abe73b1d18a591444.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/a0853c24544627f65ddf259abe73b1d18a591444'
curl -s -S -L -o 'a0853c24544627f65ddf259abe73b1d18a591444.zip' 'https://api.github.com/repos/actions/setup-node/zipball/a0853c24544627f65ddf259abe73b1d18a591444'
curl -s -S -L -o '53b83947a5a98c8d113130e565377fae1a50d02f.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/53b83947a5a98c8d113130e565377fae1a50d02f'
curl -s -S -L -o '53b83947a5a98c8d113130e565377fae1a50d02f.zip' 'https://api.github.com/repos/actions/setup-node/zipball/53b83947a5a98c8d113130e565377fae1a50d02f'
curl -s -S -L -o '48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e'
curl -s -S -L -o '48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e.zip' 'https://api.github.com/repos/actions/setup-node/zipball/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e'
curl -s -S -L -o '2028fbc5c25fe9cf00d9f06a71cc4710d4507903.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/2028fbc5c25fe9cf00d9f06a71cc4710d4507903'
curl -s -S -L -o '2028fbc5c25fe9cf00d9f06a71cc4710d4507903.zip' 'https://api.github.com/repos/actions/setup-node/zipball/2028fbc5c25fe9cf00d9f06a71cc4710d4507903'
curl -s -S -L -o '395ad3262231945c25e8478fd5baf05154b1d79f.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/395ad3262231945c25e8478fd5baf05154b1d79f'
@@ -70,4 +70,6 @@ curl -s -S -L -o '6044e13b5dc448c55e2357c09f80417699197238.tar.gz' 'https://api.
curl -s -S -L -o '6044e13b5dc448c55e2357c09f80417699197238.zip' 'https://api.github.com/repos/actions/setup-node/zipball/6044e13b5dc448c55e2357c09f80417699197238'
curl -s -S -L -o '53b83947a5a98c8d113130e565377fae1a50d02f.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/53b83947a5a98c8d113130e565377fae1a50d02f'
curl -s -S -L -o '53b83947a5a98c8d113130e565377fae1a50d02f.zip' 'https://api.github.com/repos/actions/setup-node/zipball/53b83947a5a98c8d113130e565377fae1a50d02f'
curl -s -S -L -o '48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e.tar.gz' 'https://api.github.com/repos/actions/setup-node/tarball/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e'
curl -s -S -L -o '48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e.zip' 'https://api.github.com/repos/actions/setup-node/zipball/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e'
popd

View File

@@ -1,7 +1,7 @@
mkdir actions_setup-python
pushd actions_setup-python
curl -s -S -L -o '28f2168f4d98ee0445e3c6321f6e6616c83dd5ec.tar.gz' 'https://api.github.com/repos/actions/setup-python/tarball/28f2168f4d98ee0445e3c6321f6e6616c83dd5ec'
curl -s -S -L -o '28f2168f4d98ee0445e3c6321f6e6616c83dd5ec.zip' 'https://api.github.com/repos/actions/setup-python/zipball/28f2168f4d98ee0445e3c6321f6e6616c83dd5ec'
curl -s -S -L -o 'c8813ba1bc76ebf779b911ad8ffccbf2e449cb48.tar.gz' 'https://api.github.com/repos/actions/setup-python/tarball/c8813ba1bc76ebf779b911ad8ffccbf2e449cb48'
curl -s -S -L -o 'c8813ba1bc76ebf779b911ad8ffccbf2e449cb48.zip' 'https://api.github.com/repos/actions/setup-python/zipball/c8813ba1bc76ebf779b911ad8ffccbf2e449cb48'
curl -s -S -L -o 'e9aba2c848f5ebd159c070c61ea2c4e2b122355e.tar.gz' 'https://api.github.com/repos/actions/setup-python/tarball/e9aba2c848f5ebd159c070c61ea2c4e2b122355e'
curl -s -S -L -o 'e9aba2c848f5ebd159c070c61ea2c4e2b122355e.zip' 'https://api.github.com/repos/actions/setup-python/zipball/e9aba2c848f5ebd159c070c61ea2c4e2b122355e'
curl -s -S -L -o '6c4e46d258ee4bf9a1263c78a91ec029bbe54cf0.tar.gz' 'https://api.github.com/repos/actions/setup-python/tarball/6c4e46d258ee4bf9a1263c78a91ec029bbe54cf0'

View File

@@ -1,7 +1,7 @@
mkdir actions_upload-artifact
pushd actions_upload-artifact
curl -s -S -L -o 'bbbca2ddaa5d8feaa63e36b76fdaad77386f024f.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
curl -s -S -L -o 'bbbca2ddaa5d8feaa63e36b76fdaad77386f024f.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
curl -s -S -L -o '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
curl -s -S -L -o '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
curl -s -S -L -o 'ea165f8d65b6e75b540449e92b4886f43607fa02.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/ea165f8d65b6e75b540449e92b4886f43607fa02'
curl -s -S -L -o 'ea165f8d65b6e75b540449e92b4886f43607fa02.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/ea165f8d65b6e75b540449e92b4886f43607fa02'
curl -s -S -L -o 'c7d193f32edcb7bfad88892161225aeda64e9392.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/c7d193f32edcb7bfad88892161225aeda64e9392'
@@ -48,8 +48,10 @@ curl -s -S -L -o 'b7c566a772e6b6bfb58ed0dc250532a479d7789f.tar.gz' 'https://api.
curl -s -S -L -o 'b7c566a772e6b6bfb58ed0dc250532a479d7789f.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/b7c566a772e6b6bfb58ed0dc250532a479d7789f'
curl -s -S -L -o 'b7c566a772e6b6bfb58ed0dc250532a479d7789f.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/b7c566a772e6b6bfb58ed0dc250532a479d7789f'
curl -s -S -L -o 'b7c566a772e6b6bfb58ed0dc250532a479d7789f.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/b7c566a772e6b6bfb58ed0dc250532a479d7789f'
curl -s -S -L -o '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
curl -s -S -L -o '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
curl -s -S -L -o 'bbbca2ddaa5d8feaa63e36b76fdaad77386f024f.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
curl -s -S -L -o 'bbbca2ddaa5d8feaa63e36b76fdaad77386f024f.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
curl -s -S -L -o 'bbbca2ddaa5d8feaa63e36b76fdaad77386f024f.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
curl -s -S -L -o 'bbbca2ddaa5d8feaa63e36b76fdaad77386f024f.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
curl -s -S -L -o '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a.tar.gz' 'https://api.github.com/repos/actions/upload-artifact/tarball/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
curl -s -S -L -o '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a.zip' 'https://api.github.com/repos/actions/upload-artifact/zipball/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
popd

View File

@@ -0,0 +1,9 @@
mkdir github_gh-aw-actions
pushd github_gh-aw-actions
curl -s -S -L -o 'ed10714fec78f6c6541822e4af6a90f373404b8b.tar.gz' 'https://api.github.com/repos/github/gh-aw-actions/tarball/ed10714fec78f6c6541822e4af6a90f373404b8b'
curl -s -S -L -o 'ed10714fec78f6c6541822e4af6a90f373404b8b.zip' 'https://api.github.com/repos/github/gh-aw-actions/zipball/ed10714fec78f6c6541822e4af6a90f373404b8b'
curl -s -S -L -o 'f52802884d655622f0a2dfd6d6a2250983c95523.tar.gz' 'https://api.github.com/repos/github/gh-aw-actions/tarball/f52802884d655622f0a2dfd6d6a2250983c95523'
curl -s -S -L -o 'f52802884d655622f0a2dfd6d6a2250983c95523.zip' 'https://api.github.com/repos/github/gh-aw-actions/zipball/f52802884d655622f0a2dfd6d6a2250983c95523'
curl -s -S -L -o 'f52802884d655622f0a2dfd6d6a2250983c95523.tar.gz' 'https://api.github.com/repos/github/gh-aw-actions/tarball/f52802884d655622f0a2dfd6d6a2250983c95523'
curl -s -S -L -o 'f52802884d655622f0a2dfd6d6a2250983c95523.zip' 'https://api.github.com/repos/github/gh-aw-actions/zipball/f52802884d655622f0a2dfd6d6a2250983c95523'
popd

View File

@@ -44,6 +44,18 @@ class ActionConfig {
*/
defaultBranch = 'master'
/**
* Maximum number of latest major versions to include (default to unlimited)
* @type {number|undefined}
*/
latestMajorVersions = undefined
/**
* Maximum number of latest version tags per major version (default to unlimited)
* @type {number|undefined}
*/
latestVersionsPerMajor = undefined
/**
* Tag versions
* @type {{[ref: string]: TagVersion}}
@@ -73,9 +85,11 @@ exports.TagVersion = TagVersion
* @param {string[]} patternStrings
* @param {string} defaultBranch
* @param {string[]|undefined} ignoreTags
* @param {number|undefined} latestMajorVersions
* @param {number|undefined} latestVersionsPerMajor
* @returns {Promise}
*/
async function add(owner, repo, patternStrings, defaultBranch, ignoreTags) {
async function add(owner, repo, patternStrings, defaultBranch, ignoreTags, latestMajorVersions, latestVersionsPerMajor) {
assert.ok(owner, "Arg 'owner' must not be empty")
assert.ok(repo, "Arg 'repo' must not be empty")
assert.ok(patternStrings, "Arg 'patternStrings' must not be null")
@@ -94,6 +108,12 @@ async function add(owner, repo, patternStrings, defaultBranch, ignoreTags) {
if (ignoreTags && ignoreTags.length > 0) {
config.ignoreTags = ignoreTags
}
if (latestMajorVersions && latestMajorVersions > 0) {
config.latestMajorVersions = latestMajorVersions
}
if (latestVersionsPerMajor && latestVersionsPerMajor > 0) {
config.latestVersionsPerMajor = latestVersionsPerMajor
}
config.defaultBranch = defaultBranch
const tempDir = path.join(paths.temp, `${owner}_${repo}`)
@@ -130,6 +150,9 @@ async function add(owner, repo, patternStrings, defaultBranch, ignoreTags) {
config.tags[tag] = tagVersion
}
// Prune old tags based on version limits
pruneOldTags(config)
// Write config
await exec.exec('mkdir', ['-p', path.dirname(file)])
await fs.promises.writeFile(file, JSON.stringify(config, null, ' '))
@@ -141,6 +164,75 @@ async function add(owner, repo, patternStrings, defaultBranch, ignoreTags) {
}
exports.add = add
/**
* Prunes old tags from the config based on latestMajorVersions and latestVersionsPerMajor.
* Modifies config.tags in place.
* @param {ActionConfig} config
*/
function pruneOldTags(config) {
const maxMajors = config.latestMajorVersions || 0
const maxPerMajor = config.latestVersionsPerMajor || 0
if (!maxMajors && !maxPerMajor) {
return
}
const tagNames = Object.keys(config.tags)
const versionTags = []
const keepTags = new Set()
for (const tag of tagNames) {
const match = tag.match(/^v(\d+)(?:\.(\d+))?(?:\.(\d+))?$/)
if (!match) {
// Always keep non-version tags
keepTags.add(tag)
continue
}
const major = parseInt(match[1], 10)
const minor = match[2] !== undefined ? parseInt(match[2], 10) : -1
const patch = match[3] !== undefined ? parseInt(match[3], 10) : -1
versionTags.push({ tag, major, minor, patch, isMajorOnly: minor === -1 })
}
// Distinct major versions sorted descending (newest first)
const majorVersions = [...new Set(versionTags.map(v => v.major))].sort((a, b) => b - a)
const allowedMajors = new Set(
maxMajors > 0 ? majorVersions.slice(0, maxMajors) : majorVersions
)
for (const major of allowedMajors) {
const tagsForMajor = versionTags.filter(v => v.major === major)
// Always keep major-only pointers (e.g. "v4")
for (const v of tagsForMajor.filter(v => v.isMajorOnly)) {
keepTags.add(v.tag)
}
// Sort non-major-only tags by version descending (latest first)
const sorted = tagsForMajor
.filter(v => !v.isMajorOnly)
.sort((a, b) => {
if (a.minor !== b.minor) return b.minor - a.minor
return b.patch - a.patch
})
const kept = maxPerMajor > 0 ? sorted.slice(0, maxPerMajor) : sorted
for (const v of kept) {
keepTags.add(v.tag)
}
}
// Remove pruned tags
for (const tag of tagNames) {
if (!keepTags.has(tag)) {
console.log(`Pruning tag '${tag}' from config (version limit)`)
delete config.tags[tag]
}
}
}
exports.pruneOldTags = pruneOldTags
/**
* Returns the action config file path
* @param {string} owner

View File

@@ -15,6 +15,8 @@ async function main() {
const patterns = args.patterns
const defaultBranch = args.defaultBranch || 'master'
const ignoreTags = args.ignoreTags
const latestMajorVersions = args.latestMajorVersions
const latestVersionsPerMajor = args.latestVersionsPerMajor
// File exists?
const file = actionConfig.getFilePath(owner, repo)
@@ -24,7 +26,7 @@ async function main() {
await fsHelper.reinitTemp()
// Add the config
await actionConfig.add(owner, repo, patterns, defaultBranch, ignoreTags)
await actionConfig.add(owner, repo, patterns, defaultBranch, ignoreTags, latestMajorVersions, latestVersionsPerMajor)
}
catch (err) {
// Help
@@ -60,7 +62,7 @@ class Args {
*/
function getArgs() {
// Parse
const parsedArgs = argHelper.parse([], ['default-branch', 'ignore-tags'])
const parsedArgs = argHelper.parse([], ['default-branch', 'ignore-tags', 'latest-major-versions', 'latest-versions-per-major'])
if (parsedArgs.arguments.length < 1) {
argHelper.throwError('Expected at least one arg')
}
@@ -101,16 +103,29 @@ function getArgs() {
repo: splitNwo[1],
patterns: patterns,
defaultBranch: parsedArgs.options['default-branch'],
ignoreTags: ignoreTags
ignoreTags: ignoreTags,
latestMajorVersions: parseNonNegativeInt(parsedArgs.options['latest-major-versions'], 'latest-major-versions'),
latestVersionsPerMajor: parseNonNegativeInt(parsedArgs.options['latest-versions-per-major'], 'latest-versions-per-major')
}
}
function parseNonNegativeInt(value, name) {
if (!value) return 0
const n = Number(value)
if (!Number.isInteger(n) || n < 0) {
argHelper.throwError(`--${name} must be a non-negative integer, got '${value}'`)
}
return n
}
function printUsage() {
console.error('USAGE: add-action.sh [--default-branch branch] [--ignore-tags versions] nwo [(+|-)regexp [...]]')
console.error(` --default-branch Default branch name. For example: master`)
console.error(` --ignore-tags Comma-separated version prefixes to ignore. For example: v1,v2`)
console.error(` nwo Name with owner. For example: actions/checkout`)
console.error(` regexp Refs to include or exclude. Default: ${actionConfig.defaultPatterns.join(' ')}`)
console.error('USAGE: add-action.sh [--default-branch branch] [--ignore-tags versions] [--latest-major-versions N] [--latest-versions-per-major N] nwo [(+|-)regexp [...]]')
console.error(` --default-branch Default branch name. For example: master`)
console.error(` --ignore-tags Comma-separated version prefixes to ignore. For example: v1,v2`)
console.error(` --latest-major-versions Only cache the latest N major versions. For example: 3`)
console.error(` --latest-versions-per-major Only cache the latest N version tags per major version. For example: 5`)
console.error(` nwo Name with owner. For example: actions/checkout`)
console.error(` regexp Refs to include or exclude. Default: ${actionConfig.defaultPatterns.join(' ')}`)
}
main()

View File

@@ -0,0 +1,87 @@
// Filters tags from an action config based on latestMajorVersions and latestVersionsPerMajor.
// Reads JSON config from stdin, outputs allowed tag names (one per line).
async function main() {
let input = ''
for await (const chunk of process.stdin) {
input += chunk
}
const config = JSON.parse(input)
const tags = Object.keys(config.tags || {})
const latestMajorVersions = config.latestMajorVersions || 0 // 0 = unlimited
const latestVersionsPerMajor = config.latestVersionsPerMajor || 0 // 0 = unlimited
if (!latestMajorVersions && !latestVersionsPerMajor) {
// No filtering configured, output all tags
for (const tag of tags) {
console.log(tag)
}
return
}
// Parse version info from tag names
const versionTags = []
const nonVersionTags = []
for (const tag of tags) {
const match = tag.match(/^v(\d+)(?:\.(\d+))?(?:\.(\d+))?$/)
if (!match) {
nonVersionTags.push(tag)
continue
}
const major = parseInt(match[1], 10)
const minor = match[2] !== undefined ? parseInt(match[2], 10) : -1
const patch = match[3] !== undefined ? parseInt(match[3], 10) : -1
const isMajorOnly = minor === -1
versionTags.push({ tag, major, minor, patch, isMajorOnly })
}
// Find distinct major versions sorted descending (newest first)
const majorVersions = [...new Set(versionTags.map(v => v.major))].sort((a, b) => b - a)
// Apply latestMajorVersions filter
const allowedMajors = new Set(
latestMajorVersions > 0 ? majorVersions.slice(0, latestMajorVersions) : majorVersions
)
// Always include non-version tags
const result = [...nonVersionTags]
for (const major of allowedMajors) {
const tagsForMajor = versionTags.filter(v => v.major === major)
// Always include major-only pointers (e.g., "v4")
for (const v of tagsForMajor.filter(v => v.isMajorOnly)) {
result.push(v.tag)
}
// Sort non-major-only tags by version descending (latest first)
const sortedVersions = tagsForMajor
.filter(v => !v.isMajorOnly)
.sort((a, b) => {
if (a.minor !== b.minor) return b.minor - a.minor
return b.patch - a.patch
})
// Apply latestVersionsPerMajor filter
const kept = latestVersionsPerMajor > 0
? sortedVersions.slice(0, latestVersionsPerMajor)
: sortedVersions
for (const v of kept) {
result.push(v.tag)
}
}
for (const tag of result) {
console.log(tag)
}
}
main().catch(err => {
console.error(err.message)
process.exitCode = 1
})

View File

@@ -44,6 +44,15 @@ for json_file in $script_dir/../../config/actions/*.json; do
ignore_patterns=()
IFS=$'\n' read -r -d '' -a ignore_patterns < <( echo "$json" | jq --raw-output '.ignoreTags // [] | .[]' && printf '\0' )
# Get version-filtered tags (applies latestMajorVersions and latestVersionsPerMajor)
filtered_tags=()
IFS=$'\n' read -r -d '' -a filtered_tags < <( echo "$json" | node "$script_dir/filter-tags.js" && printf '\0' )
unset filtered_tag_set
declare -A filtered_tag_set
for t in "${filtered_tags[@]}"; do
filtered_tag_set[$t]=1
done
# Get an array of tag info. Each item contains "<tag> <commit_sha>"
tag_info=()
IFS=$'\n' read -r -d '' -a tag_info < <( echo "$json" | jq --raw-output '.tags | to_entries | .[] | .key + " " + .value.commit' && printf '\0' )
@@ -67,6 +76,12 @@ for json_file in $script_dir/../../config/actions/*.json; do
continue
fi
# Check if the tag passes version filter
if [ -z "${filtered_tag_set[$tag]+x}" ]; then
echo "Skipping tag '$tag' (filtered by version limits)"
continue
fi
# Append curl download command
curl_download_commands+=("curl -s -S -L -o '$sha.tar.gz' 'https://api.github.com/repos/$owner/$repo/tarball/$sha'")
curl_download_commands+=("curl -s -S -L -o '$sha.zip' 'https://api.github.com/repos/$owner/$repo/zipball/$sha'")

View File

@@ -23,8 +23,10 @@ async function main() {
const patterns = config.patterns
const defaultBranch = config.defaultBranch
const ignoreTags = config.ignoreTags
const latestMajorVersions = args.latestMajorVersions || config.latestMajorVersions
const latestVersionsPerMajor = args.latestVersionsPerMajor || config.latestVersionsPerMajor
assert.ok(patterns && patterns.length, 'Existing patterns must not be empty')
await actionConfig.add(owner, repo, patterns, defaultBranch, ignoreTags)
await actionConfig.add(owner, repo, patterns, defaultBranch, ignoreTags, latestMajorVersions, latestVersionsPerMajor)
}
}
catch (err) {
@@ -51,6 +53,8 @@ class Args {
all = false
owner = ''
repo = ''
latestMajorVersions = 0
latestVersionsPerMajor = 0
}
/**
@@ -58,9 +62,11 @@ class Args {
* @returns {Args}
*/
function getArgs() {
const parsedArgs = argHelper.parse(['all'])
const parsedArgs = argHelper.parse(['all'], ['latest-major-versions', 'latest-versions-per-major'])
const result = new Args()
result.all = !!parsedArgs.flags['all']
result.latestMajorVersions = parseNonNegativeInt(parsedArgs.options['latest-major-versions'], 'latest-major-versions')
result.latestVersionsPerMajor = parseNonNegativeInt(parsedArgs.options['latest-versions-per-major'], 'latest-versions-per-major')
// All
if (result.all) {
@@ -88,9 +94,21 @@ function getArgs() {
return result
}
function parseNonNegativeInt(value, name) {
if (!value) return 0
const n = Number(value)
if (!Number.isInteger(n) || n < 0) {
argHelper.throwError(`--${name} must be a non-negative integer, got '${value}'`)
}
return n
}
function printUsage() {
console.error('USAGE: update-action.sh nwo')
console.error(` nwo Name with owner. For example: actions/checkout`)
console.error('USAGE: update-action.sh [--all] [--latest-major-versions N] [--latest-versions-per-major N] [nwo]')
console.error(` --all Update all configured actions`)
console.error(` --latest-major-versions Update to only keep the latest N major versions`)
console.error(` --latest-versions-per-major Update to only keep the latest N version tags per major`)
console.error(` nwo Name with owner. For example: actions/checkout`)
}
main()

View File

@@ -46,6 +46,8 @@ function test_tar_gz ()
echo "Find action.yml under $sha_archive_full_path"
elif [[ -f "$first_dir/action.yaml" ]]; then
echo "Find action.yaml under $sha_archive_full_path"
elif find "$first_dir" -name 'action.yml' -o -name 'action.yaml' | grep -q .; then
echo "Find action.yml in subdirectory under $sha_archive_full_path"
else
echo "$sha_archive_full_path doesn't contain an action.yml or action.yaml"
exit 1
@@ -83,6 +85,8 @@ function test_zip ()
echo "Find action.yml under $sha_archive_full_path"
elif [[ -f "$first_dir/action.yaml" ]]; then
echo "Find action.yaml under $sha_archive_full_path"
elif find "$first_dir" -name 'action.yml' -o -name 'action.yaml' | grep -q .; then
echo "Find action.yml in subdirectory under $sha_archive_full_path"
else
echo "$sha_archive_full_path doesn't contain an action.yml or action.yaml"
exit 1