Skip to content

Commit

Permalink
Merge pull request #27 from smallprogram/master
Browse files Browse the repository at this point in the history
* Adds new logic to obtain ALL releases. Previously only handled 100 releases at a time.

* Adds Download Count removal parameter (keep_min_download_counts).

* Adds the release parameter that deletes more than the number of days (delete_expired_data).
  • Loading branch information
thadguidry authored Sep 27, 2023
2 parents 78f811a + ce480fc commit 12d87c8
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 12 deletions.
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ This action deletes older releases of given repo
Add following step to your workflow:

```yaml
- uses: dev-drprasad/delete-older-releases@v0.2
- uses: dev-drprasad/delete-older-releases@v0.3.0
with:
repo: <owner>/<repoName> # defaults to current repo
keep_latest: 3
keep_min_download_counts: 1 # Optional parameters
delete_expired_data: 10 # Optional parameters
delete_tag_pattern: beta # defaults to ""
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -24,6 +26,22 @@ Add following step to your workflow:

Specifies number of latest releases (sorted by `created_at`) to keep. Pass `0` if you want to delete all releases

#### `keep_min_download_counts`

| required | default |
| -------- | ------- |
| false | 0 |

Specifies the number of downloads that versions must have at minimum, otherwise they will be removed ....

#### `delete_expired_data`

| required | default |
| -------- | ------- |
| false | 0 |

To delete data that exceeds the specified number of days, please enter the number of overdue days. For example, setting the value to 10 will delete release data created more than 10 days ago. Note that this parameter is based on keep latest.

#### `delete_tags`

| required | default |
Expand Down
8 changes: 8 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ inputs:
keep_latest:
description: how many latest releases to keep
required: true
keep_min_download_counts:
description: keep old releases with downloads greater than this parameter <
required: false
default: 0
delete_expired_data:
description: Delete releases older than a specified number of days
required: false
default: 0
repo:
description: repo name in the form of <owner>/<repoName>
required: false
Expand Down
99 changes: 88 additions & 11 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,53 @@ const commonOpts = {
},
};

async function deleteOlderReleases(keepLatest) {
let keepMinDownloadCount = Number(process.env.INPUT_KEEP_MIN_DOWNLOAD_COUNTS);

if (Number.isNaN(keepMinDownloadCount) || keepMinDownloadCount < 0) {
keepMinDownloadCount = 0
}

if (keepMinDownloadCount === 0) {
console.error("🌶 given `keep_min_download_counts` is 0, this will not enable the download count removal rule");
}else {
console.log("🌶 given `keep_min_download_counts` is ",keepMinDownloadCount,", this will continue to add the download count deletion rule to the original deletion rule");
}


let deleteExpiredData = Number(process.env.INPUT_DELETE_EXPIRED_DATA);

if (Number.isNaN(deleteExpiredData) || deleteExpiredData < 0) {
deleteExpiredData = 0
}

console.log("🌶 given `delete_expired_data` is ",deleteExpiredData);



async function deleteOlderReleases(keepLatest, keepMinDownloadCount, deleteExpiredData) {
let releaseIdsAndTags = [];
try {
let data = await fetch({
...commonOpts,
path: `/repos/${owner}/${repo}/releases?per_page=100`,
method: "GET",
});
data = data || [];
const releasesData = [];
let page = 1;
let hasMorePages = true;
while (hasMorePages) {
let pageData = await fetch({
...commonOpts,
path: `/repos/${owner}/${repo}/releases?per_page=100&page=${page}`,
method: "GET",
});
if (pageData.length === 0) {
hasMorePages = false;
} else {
releasesData.push(...pageData);
page++;
}
}

data = releasesData || [];
// filter for delete_pattern
const activeMatchedReleases = data.filter(
({ draft, tag_name }) => !draft && tag_name.indexOf(deletePattern) !== -1
({ draft, tag_name, assets }) => !draft && tag_name.indexOf(deletePattern) !== -1 && assets.length > 0
);

if (activeMatchedReleases.length === 0) {
Expand All @@ -93,12 +128,54 @@ async function deleteOlderReleases(keepLatest) {
`💬 found total of ${activeMatchedReleases.length}${matchingLoggingAddition} active release(s)`
);


releaseIdsAndTags = activeMatchedReleases
.sort((a,b)=> Date.parse(b.published_at) - Date.parse(a.published_at))
.map(({ id, tag_name: tagName }) => ({ id, tagName }))
.map(item=> {
const totalDownloads = item.assets.reduce((sum, asset) => sum + asset.download_count, 0);
return {
id: item.id,
tagName: item.tag_name,
published_at: item.published_at,
download_counts: totalDownloads
}
})
.slice(keepLatest);

} catch (error) {

if (keepMinDownloadCount !== 0)
{
if (deleteExpiredData !== 0)
{
const currentDate = new Date();
releaseIdsAndTags = releaseIdsAndTags.filter(item => {
const publishedDate = new Date(item.published_at);
const timeDifference = currentDate - publishedDate;
const daysDifference = Math.floor(timeDifference / (1000 * 3600 * 24));
return item.download_counts < keepMinDownloadCount || daysDifference > deleteExpiredData;
});
}
else
{
releaseIdsAndTags=releaseIdsAndTags.filter(item => item.download_counts < keepMinDownloadCount);
}
}
else
{
if (deleteExpiredData !== 0)
{
const currentDate = new Date();
releaseIdsAndTags = releaseIdsAndTags.filter(item => {
const publishedDate = new Date(item.published_at);
const timeDifference = currentDate - publishedDate;
const daysDifference = Math.floor(timeDifference / (1000 * 3600 * 24));
return daysDifference > deleteExpiredData;
});
}
}


}catch (error) {
console.error(`🌶 failed to get list of releases <- ${error.message}`);
console.error(`exiting...`);
process.exitCode = 1;
Expand Down Expand Up @@ -159,7 +236,7 @@ async function deleteOlderReleases(keepLatest) {
}

async function run() {
await deleteOlderReleases(keepLatest);
await deleteOlderReleases(keepLatest, keepMinDownloadCount, deleteExpiredData);
}

run();

0 comments on commit 12d87c8

Please sign in to comment.