Skip to content

XS✔ ◾ Template-updates #1

XS✔ ◾ Template-updates

XS✔ ◾ Template-updates #1

Workflow file for this run

# Contributors: @wicksipedia @william-liebenberg @GordonBeeming
name: "PR - Manage Stale PRs"
on:
pull_request:
types: [opened, ready_for_review]
branches: [main]
schedule:
# run every 2nd hour
# https://crontab.guru/#0_0/2_*_*_*
- cron: "0 0/2 * * *"
workflow_dispatch:
permissions:
contents: read
issues: write
repository-projects: read
pull-requests: write
jobs:
new_pull_request:
if: ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
steps:
- name: add labels
uses: actions-ecosystem/action-add-labels@v1
with:
labels: |
Age: 🥚 - New
scheduled_run:
if: ${{ github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Find PRs
shell: pwsh
run: |
# labels for each age in hours (as an array)
$labels = @(
'Age: 🥚 - New', # 2 hours
'Age: 🐣 - Young', # 4 hours
'Age: 🐥 - Adolescent', # 8 hours
'Age: 🐤 - Mature', # 16 hours
'Age: 🐓 - Old', # 32 hours
'Age: 🍗 - Ancient', # 64 hours
'Age: 🦖 - Extinct' # 128 hours
)
# ensure labels exist - create them if they don't
# https://docs.github.com/en/rest/reference/issues#create-a-label
$index = 0
$labels | ForEach-Object {
$label = $_
$description = "About $([math]::Pow(2, $index + 1)) hours old"
Write-Output "Ensuring label exists: $label ($description))"
gh api repos/${{ github.repository }}/labels -f name="$label" -f color=000000 -f description="$description"
$index++
}
$now = Get-Date -AsUTC
# use github cli to get a list of open pull requests
$openPullRequests = gh pr list -s open --json title,number,createdAt,labels,author
Write-Output "Open pull requests:"
# for each pull request in the list calculate the age in hours
$openPullRequests | ConvertFrom-Json | ForEach-Object {
$title = $_.title
$number = $_.number
$createdAt = $_.createdAt
$prLabels = $_.labels
$author = $_.author
$ageInHours = [int]($now - $createdAt).TotalHours
if ($ageInHours -eq 0) {
Write-Output "$($number): $title ($ageInHours hours old) - skipping"
return
}
Write-Output "$($number): $title ($ageInHours hours old)"
# find age as nearest doubling number of 2
$ageAsPoints = [math]::Ceiling([math]::Log($ageInHours, 2))
Write-Output "ageAsPoints: $([math]::Pow(2,$ageAsPoints))"
# if the age is 0, then set it to 1
if ($ageAsPoints -eq 0) {
$ageAsPoints = 1
}
# if the age is greater than the length of the labels array
# then set it to the last label
if ($ageAsPoints -gt $labels.Length) {
$ageAsPoints = $labels.Length
}
$newLabel = $labels[$ageAsPoints - 1]
$labelExists = $prLabels | Where-Object { $_.name -eq $newLabel }
if ($labelExists) {
return
}
Write-Output "Adding label: $newLabel"
# all labels except the new label
$allLabels = ($labels | Where-Object { $_ -ne $newLabel }) -join ','
Write-Output "Removing labels: $allLabels"
gh pr edit $number --add-label "$newLabel" --remove-label "$allLabels"
Write-Output ""
if ($ageAsPoints -eq 5 -and $author.is_bot -eq $false) { # older than 32 hours
$comment = @"
Howzit @$($author.login),
This PR has been here a while.
[Did you know you should avoid merge debt?](https://www.ssw.com.au/rules/merge-debt/)
Please review and merge or close.
Thanks!
"@
Set-Content -Path "comment.md" -Value $comment
gh pr comment $number --body-file comment.md
}
}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}