mirror of
https://github.com/TheBinaryNinja/tvapp2.git
synced 2026-06-04 11:55:41 -04:00
ci: add issues-new github workflow
This commit is contained in:
897
.github/workflows/issues-new.yml
vendored
Normal file
897
.github/workflows/issues-new.yml
vendored
Normal file
@@ -0,0 +1,897 @@
|
|||||||
|
# #
|
||||||
|
# @type github workflow
|
||||||
|
# @desc searches a new issues title and body for certain keywords and assigns a label
|
||||||
|
# sets the assignee for the issue to the repository owner
|
||||||
|
# @author Aetherinox
|
||||||
|
# @url https://github.com/Aetherinox
|
||||||
|
#
|
||||||
|
# requires the following labels to be created in your repo:
|
||||||
|
# - bug
|
||||||
|
# - feature
|
||||||
|
# - urgent
|
||||||
|
# - roadmap
|
||||||
|
# #
|
||||||
|
|
||||||
|
name: "🎫 Issue › New"
|
||||||
|
run-name: "🎫 Issue › New › ${{ github.event.issue.number }}: ${{ github.event.issue.title }}"
|
||||||
|
|
||||||
|
# #
|
||||||
|
# triggers
|
||||||
|
# #
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types:
|
||||||
|
- reopened
|
||||||
|
- opened
|
||||||
|
|
||||||
|
# #
|
||||||
|
# environment variables
|
||||||
|
# #
|
||||||
|
|
||||||
|
env:
|
||||||
|
PREFIX_BUG: "Bug"
|
||||||
|
PREFIX_DEPENDENCY: "Dependency"
|
||||||
|
PREFIX_DOCS: "Docs"
|
||||||
|
PREFIX_FEATURE: "Feature"
|
||||||
|
PREFIX_GIT: "Git Action"
|
||||||
|
PREFIX_PR: "PR"
|
||||||
|
PREFIX_ROADMAP: "Roadmap"
|
||||||
|
PREFIX_INTERNAL: "Internal"
|
||||||
|
PREFIX_URGENT: "Urgent"
|
||||||
|
|
||||||
|
LABEL_BUG: "Type ◦ Bug"
|
||||||
|
LABEL_DEPENDENCY: "Type ◦ Dependency"
|
||||||
|
LABEL_DOCS: "Type ◦ Docs"
|
||||||
|
LABEL_FEATURE: "Type ◦ Feature"
|
||||||
|
LABEL_GIT: "Type ◦ Git Action"
|
||||||
|
LABEL_PR: "Type ◦ Pull Request"
|
||||||
|
LABEL_ROADMAP: "Type ◦ Roadmap"
|
||||||
|
LABEL_INTERNAL: "Type ◦ Git Action"
|
||||||
|
LABEL_URGENT: "⚠ Urgent"
|
||||||
|
|
||||||
|
BOT_NAME_1: EuropaServ
|
||||||
|
BOT_NAME_DEPENDABOT: dependabot[bot]
|
||||||
|
|
||||||
|
LABELS_JSON: |
|
||||||
|
[
|
||||||
|
{ "name": "AC › Changes Made", "color": "8F1784", "description": "Requested changes have been made and are pending a re-scan" },
|
||||||
|
{ "name": "AC › Changes Required", "color": "8F1784", "description": "Requires changes to be made to the package before being accepted" },
|
||||||
|
{ "name": "AC › Failed", "color": "a61f2d", "description": "Autocheck failed to run through a complete cycle, requires investigation" },
|
||||||
|
{ "name": "AC › Needs Rebase", "color": "8F1784", "description": "Due to the permissions on the requesting repo, this pull request must be rebased by the author" },
|
||||||
|
{ "name": "AC › Passed", "color": "146b4a", "description": "Ready to be reviewed" },
|
||||||
|
{ "name": "AC › Review Required", "color": "8F1784", "description": "PR needs to be reviewed by another person, after the requested changes have been made" },
|
||||||
|
{ "name": "AC › Security Warning", "color": "761620", "description": "Does not conform to developer policies, or includes potentially dangerous code" },
|
||||||
|
{ "name": "AC › Skipped Scan", "color": "8F1784", "description": "Author has skipped code scan" },
|
||||||
|
{ "name": "Status 𐄂 Duplicate", "color": "75536b", "description": "Issue or pull request already exists" },
|
||||||
|
{ "name": "Status 𐄂 Accepted", "color": "2e7539", "description": "This pull request has been accepted" },
|
||||||
|
{ "name": "Status 𐄂 Autoclosed", "color": "3E0915", "description": "Originally stale and was autoclosed for no activity" },
|
||||||
|
{ "name": "Status 𐄂 Denied", "color": "ba4058", "description": "Pull request has been denied" },
|
||||||
|
{ "name": "Status 𐄂 Locked", "color": "550F45", "description": "Automatically locked by AdminServ for a prolonged period of inactivity" },
|
||||||
|
{ "name": "Status 𐄂 Need Info", "color": "2E3C4C", "description": "Not enough information to resolve" },
|
||||||
|
{ "name": "Status 𐄂 No Action", "color": "030406", "description": "Closed without any action being taken" },
|
||||||
|
{ "name": "Status 𐄂 Pending", "color": "984b12", "description": "Pending pull request" },
|
||||||
|
{ "name": "Status 𐄂 Released", "color": "1b6626", "description": "Issues or PR has been implemented and is now live" },
|
||||||
|
{ "name": "Status 𐄂 Reopened", "color": "8a6f14", "description": "A previously closed PR which has been re-opened" },
|
||||||
|
{ "name": "Status 𐄂 Review", "color": "9e1451", "description": "Currently pending review" },
|
||||||
|
{ "name": "Status 𐄂 Stale", "color": "928282", "description": "Has not had any activity in over 30 days" },
|
||||||
|
{ "name": "Type ◦ Bug", "color": "9a2c2c", "description": "Something isn't working" },
|
||||||
|
{ "name": "Type ◦ Dependency", "color": "243759", "description": "Item is associated to dependency" },
|
||||||
|
{ "name": "Type ◦ Docs", "color": "0e588d", "description": "Improvements or modifications to docs" },
|
||||||
|
{ "name": "Type ◦ Feature", "color": "3c4e93", "description": "Feature request" },
|
||||||
|
{ "name": "Type ◦ Git Action", "color": "030406", "description": "GitHub Action / workflow" },
|
||||||
|
{ "name": "Type ◦ Pull Request", "color": "8F1784", "description": "Normal pull request" },
|
||||||
|
{ "name": "Type ◦ Roadmap", "color": "8F1784", "description": "Feature or bug currently planned for implementation" },
|
||||||
|
{ "name": "Type ◦ Internal", "color": "A51994", "description": "Assigned items are for internal developer use" },
|
||||||
|
{ "name": "Build ◦ Desktop", "color": "c7ca4a", "description": "Specific to desktop" },
|
||||||
|
{ "name": "Build ◦ Linux", "color": "c7ca4a", "description": "Specific to Linux" },
|
||||||
|
{ "name": "Build ◦ MacOS", "color": "c7ca4a", "description": "Specific to MacOS" },
|
||||||
|
{ "name": "Build ◦ Mobile", "color": "c7ca4a", "description": "Specific to mobile" },
|
||||||
|
{ "name": "Build ◦ Web", "color": "c7ca4a", "description": "Specific to web" },
|
||||||
|
{ "name": "Build ◦ Windows", "color": "c7ca4a", "description": "Specific to Windows" },
|
||||||
|
{ "name": "› API", "color": "F99B50", "description": "Plugin API, CLI, browser JS API" },
|
||||||
|
{ "name": "› Auto-type", "color": "9141E0", "description": "Auto-type functionality in desktop apps" },
|
||||||
|
{ "name": "› Browser", "color": "9141E0", "description": "Browser plugins and passing data to <=> from app" },
|
||||||
|
{ "name": "› Customization", "color": "E3F0FC", "description": "Customizations: plugins, themes, configs" },
|
||||||
|
{ "name": "› Design", "color": "FA70DE", "description": "Design related queries" },
|
||||||
|
{ "name": "› Dist", "color": "FA70DE", "description": "Installers and other forms of software distribution" },
|
||||||
|
{ "name": "› Enterprise", "color": "11447a", "description": "Issues about collaboration, administration, and so on" },
|
||||||
|
{ "name": "› Hardware", "color": "5a7503", "description": "YubiKey, other tokens, biometrics" },
|
||||||
|
{ "name": "› Import/Export", "color": "F5FFCC", "description": "Import from and export to different file formats" },
|
||||||
|
{ "name": "› Improvement", "color": "185c98", "description": "Enhance an existing feature" },
|
||||||
|
{ "name": "› Performance", "color": "006b75", "description": "Web and desktop performance issues" },
|
||||||
|
{ "name": "› Plugin Request", "color": "FCE9CA", "description": "Requested changes should be implemented as a plugin" },
|
||||||
|
{ "name": "› Security", "color": "F75D39", "description": "Security issues" },
|
||||||
|
{ "name": "› Self-Hosting", "color": "fad8c7", "description": "Self-hosting installations and configs" },
|
||||||
|
{ "name": "› Storage", "color": "5319e7", "description": "Storage providers: Dropbox, Google, WebDAV, etc." },
|
||||||
|
{ "name": "› Updater", "color": "1BADDE", "description": "Auto-updater issues" },
|
||||||
|
{ "name": "› UX", "color": "1BADDE", "description": "UX and usability" },
|
||||||
|
{ "name": "› Website", "color": "fef2c0", "description": "Website related issues" },
|
||||||
|
{ "name": "⚠ Urgent", "color": "a8740e", "description": "Requires urgent attention" },
|
||||||
|
{ "name": "⚠ Announcement", "color": "DB4712", "description": "Announcements" },
|
||||||
|
{ "name": "📰 Progress Report", "color": "392297", "description": "Development updates" },
|
||||||
|
{ "name": "📦 Release", "color": "277542", "description": "Release announcements" },
|
||||||
|
{ "name": "✔️ Poll", "color": "972255", "description": "Community polls" },
|
||||||
|
{ "name": "❔ Question", "color": "FFFFFF", "description": "All questions" }
|
||||||
|
]
|
||||||
|
|
||||||
|
# #
|
||||||
|
# jobs
|
||||||
|
# #
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job [ Verify / Create Labels ]
|
||||||
|
#
|
||||||
|
# This job will ensure you have labels already created in your repo.
|
||||||
|
# All labels come from the JSON table LABELS_JSON.
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-labels-create:
|
||||||
|
name: >-
|
||||||
|
🎫 Labels › Verify Existing
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Create Labels ] Start
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
✅ Start
|
||||||
|
id: task_label_create_start
|
||||||
|
run: |
|
||||||
|
echo "Assigning labels and assignees"
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Create Labels ] Checkout
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
☑️ Checkout
|
||||||
|
id: task_label_create_checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Create Labels ] Verify Existing Labels
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ Verify Existing Labels
|
||||||
|
id: task_label_create_verify
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
const labels = JSON.parse( process.env.LABELS_JSON );
|
||||||
|
for ( const label of labels )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await github.rest.issues.createLabel(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
name: label.name,
|
||||||
|
description: label.description || '',
|
||||||
|
color: label.color
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch ( err )
|
||||||
|
{
|
||||||
|
if ( err.status === 422 )
|
||||||
|
{
|
||||||
|
console.log( `Label '${label.name}' already exists. Skipping.` );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
console.error( `Error creating label '${label.name}': ${err}` );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job [ Assign Labels ]
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-assign-labels:
|
||||||
|
name: >-
|
||||||
|
🏷️ Labels › Assign
|
||||||
|
needs:
|
||||||
|
- job-labels-create
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
permissions:
|
||||||
|
contents: 'read'
|
||||||
|
id-token: 'write'
|
||||||
|
issues: 'write'
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Assign > Get Issue Title
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ Get Issue Title
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
id: task_get_title
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
let iss_title = `${ context.payload.issue.title }`;
|
||||||
|
|
||||||
|
core.setOutput( 'issue_title', iss_title )
|
||||||
|
core.info( `Setting env issue title: ${ iss_title }` )
|
||||||
|
|
||||||
|
console.log( "\n\n" )
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Labels > Bugs
|
||||||
|
#
|
||||||
|
# Title of issue is carried over from the previous step.
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ ${{ env.PREFIX_BUG }} › Assignment
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
id: task_issues_bugs
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
|
||||||
|
const issueLabels = await github.rest.issues.listLabelsOnIssue(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number
|
||||||
|
});
|
||||||
|
|
||||||
|
let add_labels = issueLabels.data.map( label => label.name );
|
||||||
|
|
||||||
|
let iss_title = `${{ steps.task_get_title.outputs.issue_title }}` || `${ context.payload.issue.title }`;
|
||||||
|
let iss_body = `${ context.payload.issue.body }`;
|
||||||
|
let iss_author = `${ context.payload.issue.user.login }`;
|
||||||
|
|
||||||
|
const iss_title_lc = iss_title.toLowerCase( );
|
||||||
|
|
||||||
|
console.log( "Bug Title ..................... " + iss_title )
|
||||||
|
console.log( "Bug Output .................... " + `${{ steps.task_get_title.outputs.issue_title }}` )
|
||||||
|
console.log( "Bug Payload ................... " + `${ context.payload.issue.title }` )
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tags
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_tag = `${{ env.PREFIX_BUG }}:`;
|
||||||
|
const bug_lbl = `${{ env.LABEL_BUG }}`;
|
||||||
|
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
|
||||||
|
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
|
||||||
|
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
|
||||||
|
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
|
||||||
|
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
|
||||||
|
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bugs
|
||||||
|
*/
|
||||||
|
|
||||||
|
const words = [ "bug", "broke", "issue", "fail" ];
|
||||||
|
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/Z99Gnq/2
|
||||||
|
*/
|
||||||
|
|
||||||
|
const findWordList = /^\b(?:I?\s*have\s*(?:a|an)\s*(?:issue|problem|bug))|(?:will\s*not\s*work)|(?:it\s*is\s*(?:broken|broke|stuck))|(?:found\s*(?:an?|the)\s*(?:bug|issue))|(?:can\s*I\s*fix\s*the\s*(?:bug|issue))|(?:(?:does not|doesn'?t|don'?t|won'?t|can'?t|can\s?not|will\s*not)\s*(?:work|load|function))|(?:it\s*(?:will\s?not|won'?t|can\s?not|can'?t))\s*(?:get|find)\s*the\s*(?:website|site|webpage|page)|(?:the\s*(?:window|frame)\s*is\s*(?:blank|white|empty|missing))\b$/igm;
|
||||||
|
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
|
||||||
|
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const bug_bFoundPRTitle = Boolean( bug_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
console.log( "Title Lowercase ............... " + iss_title_lc )
|
||||||
|
console.log( "Startswith " + bug_tag.toLowerCase( ) + "................ " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
|
||||||
|
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
|
||||||
|
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Bug:"
|
||||||
|
- Check if title contains word in words
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
console.log( "⚠️ " + bug_tag + " ---------------------------------------" )
|
||||||
|
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
|
||||||
|
add_labels.push( `${ bug_lbl }` );
|
||||||
|
|
||||||
|
console.log( `Adding Tag ....................... ${ bug_lbl }` )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ iss_author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Bug:
|
||||||
|
// Make sure issue / pr title doesnt already contain a beginning title tag
|
||||||
|
|
||||||
|
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !bug_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
console.log( "Renaming Title" )
|
||||||
|
console.log( `Old Title: .................. ${ iss_title }` )
|
||||||
|
|
||||||
|
const title = context.payload.issue.title
|
||||||
|
let title_new = title.replace( /^\s?bug\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?fail\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?issue\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ bug_tag } ${ title_new }`;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log( `New Title: ...................... ${ iss_title }` )
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
core.setOutput( 'issue_title', iss_title )
|
||||||
|
console.log( "\n\n" )
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Labels > Features
|
||||||
|
#
|
||||||
|
# Title of issue is carried over from the previous step.
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ ${{ env.PREFIX_FEATURE }} › Assignment
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
id: task_issues_features
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
|
||||||
|
const issueLabels = await github.rest.issues.listLabelsOnIssue(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number
|
||||||
|
});
|
||||||
|
|
||||||
|
let add_labels = issueLabels.data.map( label => label.name );
|
||||||
|
|
||||||
|
let iss_title = `${{ steps.task_issues_bugs.outputs.issue_title }}` || `${ context.payload.issue.title }`;
|
||||||
|
let iss_body = `${ context.payload.issue.body }`;
|
||||||
|
|
||||||
|
const iss_title_lc = iss_title.toLowerCase( );
|
||||||
|
|
||||||
|
console.log( "Feat Title .................... " + iss_title )
|
||||||
|
console.log( "Feat Output ................... " + `${{ steps.task_issues_bugs.outputs.issue_title }}` )
|
||||||
|
console.log( "Feat Payload .................. " + `${ context.payload.issue.title }` )
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tags
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_tag = `${{ env.PREFIX_BUG }}:`;
|
||||||
|
const bug_lbl = `${{ env.LABEL_BUG }}`;
|
||||||
|
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
|
||||||
|
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
|
||||||
|
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
|
||||||
|
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
|
||||||
|
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
|
||||||
|
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Features
|
||||||
|
*/
|
||||||
|
|
||||||
|
const words = [ "feature", "request", "add support" ];
|
||||||
|
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/fR1Hm6/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const findWordList = /^(?:(?:request|include|see)\s*(?:an?|the?)\s*(?:feature|addon|addition|plugin))|(?:(?:add|see|get)\s*support\s*(?:for|with|of))|(?:can\s*we\s*get\s*(?:the|a)\s*(?:ability|feature))|(?:💡 Feature:)$/igm;
|
||||||
|
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
|
||||||
|
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const feat_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const feat_bFoundPRTitle = Boolean( feat_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
console.log( "Title Lowercase ............... " + iss_title_lc )
|
||||||
|
console.log( "Startswith " + feat_tag.toLowerCase( ) + "............ " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
|
||||||
|
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
|
||||||
|
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Feature:"
|
||||||
|
- Check if title contains word in words
|
||||||
|
*/
|
||||||
|
|
||||||
|
// change TAG per category
|
||||||
|
if ( iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
console.log( "⚠️ " + feat_tag + " ---------------------------------------" )
|
||||||
|
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
|
||||||
|
// change LBL per category
|
||||||
|
add_labels.push( `${ feat_lbl }` );
|
||||||
|
|
||||||
|
console.log( `Adding Tag ....................... ${ feat_lbl }` )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ iss_author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Feature:
|
||||||
|
// Make sure issue / pr title doesnt already contain a beginning title tag
|
||||||
|
|
||||||
|
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !feat_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
console.log( "Renaming Title" )
|
||||||
|
console.log( `Old Title: .................. ${ iss_title }` )
|
||||||
|
|
||||||
|
const title = context.payload.issue.title
|
||||||
|
let title_new = title.replace( /^\s?feature\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?request\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?add(.*?)\s?feature\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?add(.*?)\s?support\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ feat_tag } ${ title_new }`; // change TAG per category
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log( `New Title: ...................... ${ iss_title }` )
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
core.setOutput( 'issue_title', iss_title )
|
||||||
|
console.log( "\n\n" )
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Labels > Urgent
|
||||||
|
#
|
||||||
|
# Title of issue is carried over from the previous step.
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ ${{ env.PREFIX_URGENT }} › Assignment
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
id: task_issues_urgent
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
const issueLabels = await github.rest.issues.listLabelsOnIssue(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number
|
||||||
|
});
|
||||||
|
|
||||||
|
let add_labels = issueLabels.data.map( label => label.name );
|
||||||
|
|
||||||
|
let iss_title = `${{ steps.task_issues_features.outputs.issue_title }}` || `${ context.payload.issue.title }`;
|
||||||
|
let iss_body = `${ context.payload.issue.body }`;
|
||||||
|
|
||||||
|
const iss_title_lc = iss_title.toLowerCase( );
|
||||||
|
|
||||||
|
console.log( "Urgn Title .................... " + iss_title )
|
||||||
|
console.log( "Urgn Output ................... " + `${{ steps.task_issues_features.outputs.issue_title }}` )
|
||||||
|
console.log( "Urgn Payload .................. " + `${ context.payload.issue.title }` )
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tags
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_tag = `${{ env.PREFIX_BUG }}:`;
|
||||||
|
const bug_lbl = `${{ env.LABEL_BUG }}`;
|
||||||
|
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
|
||||||
|
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
|
||||||
|
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
|
||||||
|
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
|
||||||
|
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
|
||||||
|
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Urgent
|
||||||
|
*/
|
||||||
|
|
||||||
|
const words = [ "urgent", "urgency", "emergency", "important", "critical" ];
|
||||||
|
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/eE9tJX/2
|
||||||
|
*/
|
||||||
|
|
||||||
|
const findWordList = /(?:(?:this)?is\s*a?n?\s*?(?:emergency|urgent|important|vital|acute|crucial|grave|pressing|serious|top.?priority|high.?priority))|(?:reply|respond|answer|write|address)\s*(?:immediate|quick|asap|urgent|now|fast|(?:as)?\s*(?:soon|quick|immediate|fast))(?:ly)?|(?:need\s*(?:help|support|fixed|answer|reply|response)!)|(?:emergency|critical|urgen(?:t|cy)|high.?priority)/igm;
|
||||||
|
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
|
||||||
|
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const urgn_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const urgn_bFoundPRTitle = Boolean( urgn_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
console.log( "Title Lowercase ............... " + iss_title_lc )
|
||||||
|
console.log( "Startswith " + urgn_tag.toLowerCase( ) + "............. " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
|
||||||
|
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
|
||||||
|
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Urgent:"
|
||||||
|
- Check if title contains word in words
|
||||||
|
*/
|
||||||
|
|
||||||
|
// change TAG per category
|
||||||
|
if ( iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
console.log( "⚠️ " + urgn_tag + " ---------------------------------------" )
|
||||||
|
console.log( "Already starts with " + bug_tag + " ......... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + feat_tag + " ..... " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + urgn_tag + " ...... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + road_tag + " ..... " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
|
||||||
|
// change LBL per category
|
||||||
|
add_labels.push( `${ urgn_lbl }` );
|
||||||
|
|
||||||
|
console.log( `Adding Tag ....................... ${ urgn_lbl }` )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ iss_author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Urgent:
|
||||||
|
// Make sure issue / pr title doesnt already contain a beginning title tag
|
||||||
|
|
||||||
|
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !urgn_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
console.log( "Renaming Title" )
|
||||||
|
console.log( `Old Title: .................. ${ iss_title }` )
|
||||||
|
|
||||||
|
const title = context.payload.issue.title
|
||||||
|
let title_new = title.replace( /^\s?emergency\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?urgent\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?urgency\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?important\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?critical\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ urgn_tag } ${ title_new }`; // change TAG per category
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log( `New Title: ...................... ${ iss_title }` )
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
core.setOutput( 'issue_title', iss_title )
|
||||||
|
console.log( "\n\n" )
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Labels > Roadmap
|
||||||
|
#
|
||||||
|
# Title of issue is carried over from the previous step.
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ ${{ env.PREFIX_ROADMAP }} › Assignment
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
id: task_issues_roadmap
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
const issueLabels = await github.rest.issues.listLabelsOnIssue(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number
|
||||||
|
});
|
||||||
|
|
||||||
|
let add_labels = issueLabels.data.map( label => label.name );
|
||||||
|
|
||||||
|
let iss_title = `${{ steps.task_issues_urgent.outputs.issue_title }}` || `${ context.payload.issue.title }`;
|
||||||
|
let iss_body = `${ context.payload.issue.body }`;
|
||||||
|
|
||||||
|
const iss_title_lc = iss_title.toLowerCase( );
|
||||||
|
|
||||||
|
console.log( "Road Title .................... " + iss_title )
|
||||||
|
console.log( "Road Output ................... " + `${{ steps.task_issues_urgent.outputs.issue_title }}` )
|
||||||
|
console.log( "Road Payload .................. " + `${ context.payload.issue.title }` )
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tags
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_tag = `${{ env.PREFIX_BUG }}:`;
|
||||||
|
const bug_lbl = `${{ env.LABEL_BUG }}`;
|
||||||
|
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
|
||||||
|
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
|
||||||
|
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
|
||||||
|
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
|
||||||
|
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
|
||||||
|
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Roadmap
|
||||||
|
*/
|
||||||
|
|
||||||
|
const words = [ "roadmap", "road map", "planned" ];
|
||||||
|
const bTriggerWordInTitle = words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
Roadmap requires headers #Summary and #Proposal | #Objective
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/ucajBZ/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const findWordList = /#\s*Summary[\S\s]+#\s*(?:Proposal|Objective)[^\]]+/igm;
|
||||||
|
const bFoundMatchTitle = Boolean( findWordList.test( iss_title ) );
|
||||||
|
const bFoundMatchBody = Boolean( findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const road_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const road_bFoundPRTitle = Boolean( road_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
console.log( "Title Lowercase ............... " + iss_title_lc )
|
||||||
|
console.log( "Startswith " + road_tag.toLowerCase( ) + "............ " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Title Includes Keyword ........ " + bTriggerWordInTitle )
|
||||||
|
console.log( "Title Includes Regex .......... " + bFoundMatchTitle )
|
||||||
|
console.log( "Body Includes Regex ........... " + bFoundMatchBody )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Roadmap:"
|
||||||
|
- Check if title contains word in words
|
||||||
|
*/
|
||||||
|
|
||||||
|
// change TAG per category
|
||||||
|
if ( iss_title_lc.startsWith( road_tag.toLowerCase( ) ) || bTriggerWordInTitle || bFoundMatchTitle || bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
console.log( "⚠️ " + road_tag + " ---------------------------------------" )
|
||||||
|
console.log( "Already starts with " + bug_tag + " ...... " + iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + feat_tag + " .. " + iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + urgn_tag + " ... " + iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) )
|
||||||
|
console.log( "Already starts with " + road_tag + " .. " + iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
|
||||||
|
// change LBL per category
|
||||||
|
add_labels.push( `${ road_lbl }` );
|
||||||
|
|
||||||
|
console.log( `Adding Tag .................... ${ road_lbl }` )
|
||||||
|
console.log( "\n" )
|
||||||
|
|
||||||
|
if ( iss_author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ iss_author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Roadmap:
|
||||||
|
// Make sure issue / pr title doesnt already contain a beginning title tag
|
||||||
|
|
||||||
|
if ( iss_author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !road_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
console.log( "Renaming Title" )
|
||||||
|
console.log( `Old Title: .................. ${ iss_title }` )
|
||||||
|
|
||||||
|
const title = context.payload.issue.title
|
||||||
|
let title_new = title.replace( /^\s?broad(.*?)\s?map\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?planned\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?broadmap\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ road_tag } ${ title_new }`; // change TAG per category
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log( `New Title: .................... ${ iss_title }` )
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
core.setOutput( 'issue_title', iss_title )
|
||||||
|
console.log( "\n\n" )
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job > Phrase Search
|
||||||
|
#
|
||||||
|
# Checks a message for certain keywords and then responds to the user as a reply / comment
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-phrase-search:
|
||||||
|
name: >-
|
||||||
|
🏷️ Labels › Phrase Search
|
||||||
|
needs:
|
||||||
|
- job-labels-create
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
permissions:
|
||||||
|
contents: 'read'
|
||||||
|
id-token: 'write'
|
||||||
|
issues: 'write'
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Search Phrase ] Checkout
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
☑️ Prepare
|
||||||
|
id: issues-labels-check-checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Search Phrase ] Search
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
👄 Search Phrases
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
const fs = require( 'fs' );
|
||||||
|
const iss_title = `${ context.payload.issue.title }`;
|
||||||
|
const iss_body = `${ context.payload.issue.body }`;
|
||||||
|
let message = [ "\n<br />\n" ]
|
||||||
|
let bHasMessage = false
|
||||||
|
|
||||||
|
/*********************************************
|
||||||
|
Keyword > Help
|
||||||
|
**********************************************/
|
||||||
|
|
||||||
|
let HE_message =
|
||||||
|
`
|
||||||
|
💡 It appears you might need help, please check the resources below for documentation that might assist with your issue:
|
||||||
|
- [Documentation](${{github.event.repository.url}})
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<sub>I am a bot reaching out to you with an automated response. If the above info doesn't apply to you, please ignore it.</sub>
|
||||||
|
`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
found searched word "for help"
|
||||||
|
append / prepare message for bot to send
|
||||||
|
*/
|
||||||
|
|
||||||
|
const HEfindWordList = /^\b(?:have\s*(?:a|some)?\s*question*s?)|(?:can\s*you\s*(?:tell|help)\s*me)|(?:need\s*(?:some)?\s*(?:help|assistance|guidance))|(?:how\s*can\s*I\s*find)|(?:point\s*me\s*in\s*the\s*direction)|(?:where\s*can\s*I\s*find)|(?:where\s*(?:\N*)\s*(?:\N*)\s*find)|(?:please\s*help)|(?:where\s*\N*\s*(?:located|at))|(?:documentation)\b$/igm;
|
||||||
|
const HEbFoundMatchTitle = Boolean( HEfindWordList.test( iss_title ) );
|
||||||
|
const HEbFoundMatchBody = Boolean( HEfindWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
if ( HEbFoundMatchTitle || HEbFoundMatchBody )
|
||||||
|
{
|
||||||
|
message.push ( HE_message );
|
||||||
|
bHasMessage = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot has message to send
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( bHasMessage == true )
|
||||||
|
{
|
||||||
|
await github.rest.issues.createComment(
|
||||||
|
{
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: message.join('\n'),
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job > Add Assignees
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-assign-assignees:
|
||||||
|
name: >-
|
||||||
|
✍️ Issue › Assignees
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
needs: [ job-assign-labels ]
|
||||||
|
if: |
|
||||||
|
always()
|
||||||
|
&& contains( needs.*.result, 'success' )
|
||||||
|
&& !contains( needs.*.result, 'failure' )
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Assignees] Assign
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
✍️ Set Assignees
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
const assignees = [ `${{ github.repository_owner }}` ];
|
||||||
|
|
||||||
|
if ( assignees.length > 0 )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await github.rest.issues.addAssignees(
|
||||||
|
{
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
assignees
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch ( error )
|
||||||
|
{
|
||||||
|
core.setFailed( error.message );
|
||||||
|
}
|
||||||
|
}
|
||||||
5
.github/workflows/issues-scan.yml
vendored
5
.github/workflows/issues-scan.yml
vendored
@@ -19,7 +19,7 @@ run-name: "🎫 Issues › Scan"
|
|||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
branches:
|
branches:
|
||||||
- alpine-base
|
- main
|
||||||
|
|
||||||
# #
|
# #
|
||||||
# environment variables
|
# environment variables
|
||||||
@@ -114,7 +114,8 @@ jobs:
|
|||||||
# #
|
# #
|
||||||
|
|
||||||
pr-autoscan:
|
pr-autoscan:
|
||||||
runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|||||||
674
.github/workflows/issues-stale.yml
vendored
Normal file
674
.github/workflows/issues-stale.yml
vendored
Normal file
@@ -0,0 +1,674 @@
|
|||||||
|
# #
|
||||||
|
# @type github workflow
|
||||||
|
# @desc creates repository labels if they are not yet installed
|
||||||
|
# issues marked as stale after 30 days, given tag Status 𐄂 Stale
|
||||||
|
# inactive issues closed after 180 days, given tag Status 𐄂 Locked
|
||||||
|
# inactive pr closed after 365 days, given tag Status 𐄂 Locked
|
||||||
|
# issues marked stale after 30 days, given tag Status 𐄂 Stale
|
||||||
|
# issues marked closed 7 days after being marked stale, given tag Status 𐄂 Autoclosed
|
||||||
|
# @author Aetherinox
|
||||||
|
# @url https://github.com/Aetherinox
|
||||||
|
#
|
||||||
|
# This Github action must be activated manually. This workflow script will do the
|
||||||
|
# following:
|
||||||
|
#
|
||||||
|
# - Scan issues / pull requests and make sure they have properly assigned labels:
|
||||||
|
# - `Bug`
|
||||||
|
# - `Feature`
|
||||||
|
# - `Urgent`
|
||||||
|
# - `Roadmap`
|
||||||
|
#
|
||||||
|
# - Workflow script will then scan each pr or issue and mark them as `Stale`
|
||||||
|
# if they haven't had any replies in 30 days.
|
||||||
|
#
|
||||||
|
# - Workflow will `autoclose` pr or issues which haven't had action in `365 days`.
|
||||||
|
# #
|
||||||
|
|
||||||
|
name: "🎫 Issues › Stale"
|
||||||
|
run-name: "🎫 Issues › Stale"
|
||||||
|
|
||||||
|
# #
|
||||||
|
# triggers
|
||||||
|
# #
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
|
||||||
|
# #
|
||||||
|
# environment variables
|
||||||
|
# #
|
||||||
|
|
||||||
|
env:
|
||||||
|
PREFIX_BUG: "Bug"
|
||||||
|
PREFIX_DEPENDENCY: "Dependency"
|
||||||
|
PREFIX_DOCS: "Docs"
|
||||||
|
PREFIX_FEATURE: "Feature"
|
||||||
|
PREFIX_GIT: "Git Action"
|
||||||
|
PREFIX_PR: "PR"
|
||||||
|
PREFIX_ROADMAP: "Roadmap"
|
||||||
|
PREFIX_INTERNAL: "Internal"
|
||||||
|
PREFIX_URGENT: "Urgent"
|
||||||
|
|
||||||
|
LABEL_BUG: "Type ◦ Bug"
|
||||||
|
LABEL_DEPENDENCY: "Type ◦ Dependency"
|
||||||
|
LABEL_DOCS: "Type ◦ Docs"
|
||||||
|
LABEL_FEATURE: "Type ◦ Feature"
|
||||||
|
LABEL_GIT: "Type ◦ Git Action"
|
||||||
|
LABEL_PR: "Type ◦ Pull Request"
|
||||||
|
LABEL_ROADMAP: "Type ◦ Roadmap"
|
||||||
|
LABEL_INTERNAL: "Type ◦ Internal"
|
||||||
|
LABEL_URGENT: "⚠ Urgent"
|
||||||
|
|
||||||
|
BOT_NAME_1: EuropaServ
|
||||||
|
BOT_NAME_DEPENDABOT: dependabot[bot]
|
||||||
|
LABELS_JSON: |
|
||||||
|
[
|
||||||
|
{ "name": "AC › Changes Made", "color": "8F1784", "description": "Requested changes have been made and are pending a re-scan" },
|
||||||
|
{ "name": "AC › Changes Required", "color": "8F1784", "description": "Requires changes to be made to the package before being accepted" },
|
||||||
|
{ "name": "AC › Failed", "color": "a61f2d", "description": "Autocheck failed to run through a complete cycle, requires investigation" },
|
||||||
|
{ "name": "AC › Needs Rebase", "color": "8F1784", "description": "Due to the permissions on the requesting repo, this pull request must be rebased by the author" },
|
||||||
|
{ "name": "AC › Passed", "color": "146b4a", "description": "Ready to be reviewed" },
|
||||||
|
{ "name": "AC › Review Required", "color": "8F1784", "description": "PR needs to be reviewed by another person, after the requested changes have been made" },
|
||||||
|
{ "name": "AC › Security Warning", "color": "761620", "description": "Does not conform to developer policies, or includes potentially dangerous code" },
|
||||||
|
{ "name": "AC › Skipped Scan", "color": "8F1784", "description": "Author has skipped code scan" },
|
||||||
|
{ "name": "Status 𐄂 Duplicate", "color": "75536b", "description": "Issue or pull request already exists" },
|
||||||
|
{ "name": "Status 𐄂 Accepted", "color": "2e7539", "description": "This pull request has been accepted" },
|
||||||
|
{ "name": "Status 𐄂 Autoclosed", "color": "3E0915", "description": "Originally stale and was autoclosed for no activity" },
|
||||||
|
{ "name": "Status 𐄂 Denied", "color": "ba4058", "description": "Pull request has been denied" },
|
||||||
|
{ "name": "Status 𐄂 Locked", "color": "550F45", "description": "Automatically locked by AdminServ for a prolonged period of inactivity" },
|
||||||
|
{ "name": "Status 𐄂 Need Info", "color": "2E3C4C", "description": "Not enough information to resolve" },
|
||||||
|
{ "name": "Status 𐄂 No Action", "color": "030406", "description": "Closed without any action being taken" },
|
||||||
|
{ "name": "Status 𐄂 Pending", "color": "984b12", "description": "Pending pull request" },
|
||||||
|
{ "name": "Status 𐄂 Released", "color": "1b6626", "description": "Issues or PR has been implemented and is now live" },
|
||||||
|
{ "name": "Status 𐄂 Reopened", "color": "8a6f14", "description": "A previously closed PR which has been re-opened" },
|
||||||
|
{ "name": "Status 𐄂 Review", "color": "9e1451", "description": "Currently pending review" },
|
||||||
|
{ "name": "Status 𐄂 Stale", "color": "928282", "description": "Has not had any activity in over 30 days" },
|
||||||
|
{ "name": "Type ◦ Bug", "color": "9a2c2c", "description": "Something isn't working" },
|
||||||
|
{ "name": "Type ◦ Dependency", "color": "243759", "description": "Item is associated to dependency" },
|
||||||
|
{ "name": "Type ◦ Docs", "color": "0e588d", "description": "Improvements or modifications to docs" },
|
||||||
|
{ "name": "Type ◦ Feature", "color": "3c4e93", "description": "Feature request" },
|
||||||
|
{ "name": "Type ◦ Git Action", "color": "030406", "description": "GitHub Action / workflow" },
|
||||||
|
{ "name": "Type ◦ Pull Request", "color": "8F1784", "description": "Normal pull request" },
|
||||||
|
{ "name": "Type ◦ Roadmap", "color": "8F1784", "description": "Feature or bug currently planned for implementation" },
|
||||||
|
{ "name": "Type ◦ Internal", "color": "A51994", "description": "Assigned items are for internal developer use" },
|
||||||
|
{ "name": "Build ◦ Desktop", "color": "c7ca4a", "description": "Specific to desktop" },
|
||||||
|
{ "name": "Build ◦ Linux", "color": "c7ca4a", "description": "Specific to Linux" },
|
||||||
|
{ "name": "Build ◦ MacOS", "color": "c7ca4a", "description": "Specific to MacOS" },
|
||||||
|
{ "name": "Build ◦ Mobile", "color": "c7ca4a", "description": "Specific to mobile" },
|
||||||
|
{ "name": "Build ◦ Web", "color": "c7ca4a", "description": "Specific to web" },
|
||||||
|
{ "name": "Build ◦ Windows", "color": "c7ca4a", "description": "Specific to Windows" },
|
||||||
|
{ "name": "› API", "color": "F99B50", "description": "Plugin API, CLI, browser JS API" },
|
||||||
|
{ "name": "› Auto-type", "color": "9141E0", "description": "Auto-type functionality in desktop apps" },
|
||||||
|
{ "name": "› Browser", "color": "9141E0", "description": "Browser plugins and passing data to <=> from app" },
|
||||||
|
{ "name": "› Customization", "color": "E3F0FC", "description": "Customizations: plugins, themes, configs" },
|
||||||
|
{ "name": "› Design", "color": "FA70DE", "description": "Design related queries" },
|
||||||
|
{ "name": "› Dist", "color": "FA70DE", "description": "Installers and other forms of software distribution" },
|
||||||
|
{ "name": "› Enterprise", "color": "11447a", "description": "Issues about collaboration, administration, and so on" },
|
||||||
|
{ "name": "› Hardware", "color": "5a7503", "description": "YubiKey, other tokens, biometrics" },
|
||||||
|
{ "name": "› Import/Export", "color": "F5FFCC", "description": "Import from and export to different file formats" },
|
||||||
|
{ "name": "› Improvement", "color": "185c98", "description": "Enhance an existing feature" },
|
||||||
|
{ "name": "› Performance", "color": "006b75", "description": "Web and desktop performance issues" },
|
||||||
|
{ "name": "› Plugin Request", "color": "FCE9CA", "description": "Requested changes should be implemented as a plugin" },
|
||||||
|
{ "name": "› Security", "color": "F75D39", "description": "Security issues" },
|
||||||
|
{ "name": "› Self-Hosting", "color": "fad8c7", "description": "Self-hosting installations and configs" },
|
||||||
|
{ "name": "› Storage", "color": "5319e7", "description": "Storage providers: Dropbox, Google, WebDAV, etc." },
|
||||||
|
{ "name": "› Updater", "color": "1BADDE", "description": "Auto-updater issues" },
|
||||||
|
{ "name": "› UX", "color": "1BADDE", "description": "UX and usability" },
|
||||||
|
{ "name": "› Website", "color": "fef2c0", "description": "Website related issues" },
|
||||||
|
{ "name": "⚠ Urgent", "color": "a8740e", "description": "Requires urgent attention" },
|
||||||
|
{ "name": "⚠ Announcement", "color": "DB4712", "description": "Announcements" },
|
||||||
|
{ "name": "📰 Progress Report", "color": "392297", "description": "Development updates" },
|
||||||
|
{ "name": "📦 Release", "color": "277542", "description": "Release announcements" },
|
||||||
|
{ "name": "✔️ Poll", "color": "972255", "description": "Community polls" },
|
||||||
|
{ "name": "❔ Question", "color": "FFFFFF", "description": "All questions" }
|
||||||
|
]
|
||||||
|
|
||||||
|
# #
|
||||||
|
# jobs
|
||||||
|
# #
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job [ Verify / Create Labels ]
|
||||||
|
#
|
||||||
|
# This job will ensure you have labels already created in your repo.
|
||||||
|
# All labels come from the JSON table LABELS_JSON.
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-labels-create:
|
||||||
|
name: >-
|
||||||
|
🎫 Labels › Verify Existing
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Create Labels ] Start
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
✅ Start
|
||||||
|
id: task_label_create_start
|
||||||
|
run: |
|
||||||
|
echo "Assigning labels and assignees"
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Create Labels ] Checkout
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
☑️ Checkout
|
||||||
|
id: task_label_create_checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Create Labels ] Verify Existing Labels
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: >-
|
||||||
|
🏷️ Verify Existing Labels
|
||||||
|
id: task_label_create_verify
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
const labels = JSON.parse( process.env.LABELS_JSON );
|
||||||
|
for ( const label of labels )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await github.rest.issues.createLabel(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
name: label.name,
|
||||||
|
description: label.description || '',
|
||||||
|
color: label.color
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch ( err )
|
||||||
|
{
|
||||||
|
if ( err.status === 422 )
|
||||||
|
{
|
||||||
|
console.log( `Label '${label.name}' already exists. Skipping.` );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
console.error( `Error creating label '${label.name}': ${err}` );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job [ Check Labels ]
|
||||||
|
#
|
||||||
|
# Runs through all submissions to check for ones that have not been properly labeled
|
||||||
|
# - Bug
|
||||||
|
# - Feature
|
||||||
|
# - Urgent
|
||||||
|
# - Roadmap
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-issues-nolabel:
|
||||||
|
name: >-
|
||||||
|
🎫 Labels › Assign Missing
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
needs: job-labels-create
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Check Labels ] Checkout
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: "☑️ Prepare"
|
||||||
|
id: task_issues_nolabel_prepare
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Check Labels ] Check
|
||||||
|
# Check if repo has labels currently added to issues
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: 🏷️ Checking Issues
|
||||||
|
id: task_issues_nolabel_run
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
script: |
|
||||||
|
|
||||||
|
/*
|
||||||
|
Date/Time
|
||||||
|
*/
|
||||||
|
|
||||||
|
const dateTimeformat = ( date ) =>
|
||||||
|
{
|
||||||
|
let month = date.getMonth( ) + 1;
|
||||||
|
month = month.toString( ).padStart( 2, '0' );
|
||||||
|
let day = date.getDate( ).toString( ).padStart( 2, '0' );
|
||||||
|
let year = date.getFullYear( ).toString( ).padStart( 2, '0' );
|
||||||
|
|
||||||
|
let hours = date.getHours();
|
||||||
|
let minutes = date.getMinutes();
|
||||||
|
let x = hours >= 12 ? 'PM' : 'AM';
|
||||||
|
hours = hours % 12;
|
||||||
|
hours = hours ? hours : 12;
|
||||||
|
minutes = minutes.toString( ).padStart( 2, '0' );
|
||||||
|
|
||||||
|
let mergeTime = month + '.' + day + '.' + year + ' ' + hours + ':' + minutes + ' ' + x;
|
||||||
|
|
||||||
|
return mergeTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Change last number ( 36 = hours )
|
||||||
|
*/
|
||||||
|
|
||||||
|
const expireAfterMs = 1000 * 60 * 60 * 36; // milliseconds ( 36 hours )
|
||||||
|
const curtime = new Date( ).getTime( ); // 1711471510629
|
||||||
|
const issues = await github.rest.issues.listForRepo( { owner: context.repo.owner, repo: context.repo.repo, state: 'open' } );
|
||||||
|
|
||||||
|
console.log( ` 📦── Found ${issues.data.length} open issues` );
|
||||||
|
|
||||||
|
for ( const issue of issues.data )
|
||||||
|
{
|
||||||
|
|
||||||
|
const author = `${ issue.user.login }`;
|
||||||
|
let date_UpdateDate = new Date( `${ issue.updated_at }` ?? `${ issue.created_at }` ); // Tue Mar 26 2024 16:40:41 GMT+0000 (Coordinated Universal Time)
|
||||||
|
date_UpdateDate.toISOString( ) // Tue Mar 26 2024 16:40:41 GMT+0000 (Coordinated Universal Time) (string)
|
||||||
|
|
||||||
|
let date_UpdateHuman = dateTimeformat( date_UpdateDate ) + " UTC"; // 03.26.2024 4:40 PM UTC
|
||||||
|
const time_UpdateMs = new Date( issue.updated_at ).getTime( ); // 1711471241000
|
||||||
|
|
||||||
|
//if ( curtime < time_UpdateMs + expireAfterMs ) continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Anything past this point is stale / to be closed
|
||||||
|
*/
|
||||||
|
|
||||||
|
const timeline = await github.rest.issues.listEventsForTimeline( { owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number } );
|
||||||
|
// const labelEvent = timeline.data.find( event => event.event === 'labeled' && event.label.name === 'status-stale' );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get Issue Data
|
||||||
|
*/
|
||||||
|
|
||||||
|
const add_labels = issue.labels.map( label => label.name );
|
||||||
|
|
||||||
|
let iss_title = `${ issue.title }`;
|
||||||
|
const iss_title_lc = iss_title.toLowerCase( );
|
||||||
|
|
||||||
|
let iss_body = `${ issue.body }`;
|
||||||
|
const iss_body_lc = iss_body.toLowerCase( );
|
||||||
|
|
||||||
|
console.log( ` └── 📁 ` + iss_title );
|
||||||
|
console.log( ` └── 📄 Issue #${ issue.number } last updated on ${ date_UpdateHuman }` );
|
||||||
|
console.log( ` └── 📄 ${add_labels}` );
|
||||||
|
console.log( `\n\n` )
|
||||||
|
|
||||||
|
/*
|
||||||
|
Keywords
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_words = [ "bug", "broke", "issue", "fail" ];
|
||||||
|
const feat_words = [ "feature", "request", "add support" ];
|
||||||
|
const urgn_words = [ "urgent", "urgency", "emergency", "important", "critical" ];
|
||||||
|
const road_words = [ "roadmap", "road map", "planned" ];
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tags
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_tag = `${{ env.PREFIX_BUG }}:`;
|
||||||
|
const bug_lbl = `${{ env.LABEL_BUG }}`;
|
||||||
|
const feat_tag = `${{ env.PREFIX_FEATURE }}:`;
|
||||||
|
const feat_lbl = `${{ env.LABEL_FEATURE }}`;
|
||||||
|
const urgn_tag = `${{ env.PREFIX_URGENT }}:`;
|
||||||
|
const urgn_lbl = `${{ env.LABEL_URGENT }}`;
|
||||||
|
const road_tag = `${{ env.PREFIX_ROADMAP }}:`;
|
||||||
|
const road_lbl = `${{ env.LABEL_ROADMAP }}`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Label > Bugs
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_bIncWordT = bug_words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/Z99Gnq/2
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_findWordList = /^\b(?:I?\s*have\s*(?:a|an)\s*(?:issue|problem|bug))|(?:will\s*not\s*work)|(?:it\s*is\s*(?:broken|broke|stuck))|(?:found\s*(?:an?|the)\s*(?:bug|issue))|(?:can\s*I\s*fix\s*the\s*(?:bug|issue))|(?:(?:does not|doesn'?t|don'?t|won'?t|can'?t|can\s?not|will\s*not)\s*(?:work|load|function))|(?:it\s*(?:will\s?not|won'?t|can\s?not|can'?t))\s*(?:get|find)\s*the\s*(?:website|site|webpage|page)|(?:the\s*(?:window|frame)\s*is\s*(?:blank|white|empty|missing))\b$/igm;
|
||||||
|
const bug_bFoundMatchTitle = Boolean( bug_findWordList.test( iss_title ) );
|
||||||
|
const bug_bFoundMatchBody = Boolean( bug_findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const bug_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const bug_bFoundPRTitle = Boolean( bug_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Bug:"
|
||||||
|
- Check if title contains word in containsList
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) || bug_bIncWordT || bug_bFoundMatchTitle || bug_bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
add_labels.push( `${ bug_lbl }` );
|
||||||
|
|
||||||
|
if ( author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Bug:
|
||||||
|
if ( author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !bug_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
const title = issue.title;
|
||||||
|
let title_new = title.replace( /^\s?bug\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?fail\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?issue\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ bug_tag } ${ title_new }`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Label > Features
|
||||||
|
*/
|
||||||
|
|
||||||
|
const feat_bIncWordT = feat_words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/fR1Hm6/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const feat_findWordList = /^(?:(?:request|include|see)\s*(?:an?|the?)\s*(?:feature|addon|addition|plugin))|(?:(?:add|see|get)\s*support\s*(?:for|with|of))|(?:can\s*we\s*get\s*(?:the|a)\s*(?:ability|feature))|(?:💡 Feature:)$/igm;
|
||||||
|
const feat_bFoundMatchTitle = Boolean( feat_findWordList.test( iss_title ) );
|
||||||
|
const feat_bFoundMatchBody = Boolean( feat_findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const feat_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const feat_bFoundPRTitle = Boolean( feat_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Feature:"
|
||||||
|
- Check if title contains word in containsList
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) || feat_bIncWordT || feat_bFoundMatchTitle || feat_bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
add_labels.push( `${ feat_lbl }` );
|
||||||
|
|
||||||
|
if ( author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Feature:
|
||||||
|
if ( author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !feat_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
const title = issue.title;
|
||||||
|
let title_new = title.replace( /^\s?feature\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?request\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?add(.*?)\s?feature\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?add(.*?)\s?support\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ feat_tag } ${ title_new }`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Label > Urgent
|
||||||
|
*/
|
||||||
|
|
||||||
|
const urgn_bIncWordT = urgn_words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/eE9tJX/2
|
||||||
|
*/
|
||||||
|
|
||||||
|
const urgn_findWordList = /(?:(?:this)?is\s*a?n?\s*?(?:emergency|urgent|important|vital|acute|crucial|grave|pressing|serious|top.?priority|high.?priority))|(?:reply|respond|answer|write|address)\s*(?:immediate|quick|asap|urgent|now|fast|(?:as)?\s*(?:soon|quick|immediate|fast))(?:ly)?|(?:need\s*(?:help|support|fixed|answer|reply|response)!)|(?:emergency|critical|urgen(?:t|cy)|high.?priority)/igm;
|
||||||
|
const urgn_bFoundMatchTitle = Boolean( urgn_findWordList.test( iss_title ) );
|
||||||
|
const urgn_bFoundMatchBody = Boolean( urgn_findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const urgn_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const urgn_bFoundPRTitle = Boolean( urgn_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Urgent:"
|
||||||
|
- Check if title contains word in containsList
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) || urgn_bIncWordT || urgn_bFoundMatchTitle || urgn_bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
add_labels.push( `${ urgn_lbl }` );
|
||||||
|
|
||||||
|
if ( author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Urgent:
|
||||||
|
if ( author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !urgn_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
const title = issue.title;
|
||||||
|
let title_new = title.replace( /^\s?emergency\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?urgent\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?urgency\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?important\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?critical\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ urgn_tag } ${ title_new }`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Label > Roadmap
|
||||||
|
*/
|
||||||
|
|
||||||
|
const road_bIncWordT = road_words.some( s => s.includes( iss_title_lc ) || iss_title_lc.includes( s ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Find regex based phrases
|
||||||
|
Roadmap requires headers #Summary and #Proposal | #Objective
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/ucajBZ/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const road_findWordList = /#\s*Summary[\S\s]+#\s*(?:Proposal|Objective)[^\]]+/igm;
|
||||||
|
const road_bFoundMatchTitle = Boolean( road_findWordList.test( iss_title ) );
|
||||||
|
const road_bFoundMatchBody = Boolean( road_findWordList.test( iss_body ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not change a title if the item starts with a PR: #
|
||||||
|
|
||||||
|
Regex:
|
||||||
|
https://regex101.com/r/JOrqbN/1
|
||||||
|
*/
|
||||||
|
|
||||||
|
const road_findPRTitle = /^PR\s?#?(?:[0-9]*:)/igm;
|
||||||
|
const road_bFoundPRTitle = Boolean( road_findPRTitle.test( iss_title ) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
- Check if issue title matches the issue label "Roadmap:"
|
||||||
|
- Check if title contains word in containsList
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( iss_title_lc.startsWith( road_tag.toLowerCase( ) ) || road_bIncWordT || road_bFoundMatchTitle || road_bFoundMatchBody )
|
||||||
|
{
|
||||||
|
|
||||||
|
add_labels.push( `${ road_lbl }` );
|
||||||
|
|
||||||
|
if ( author === `${{ env.BOT_NAME_DEPENDABOT }}` )
|
||||||
|
core.info( `Skipping: Detected ${ author }` )
|
||||||
|
|
||||||
|
// Rename title to contain Roadmap:
|
||||||
|
if ( author !== `${{ env.BOT_NAME_DEPENDABOT }}` && !road_bFoundPRTitle && !iss_title_lc.startsWith( bug_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( feat_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( urgn_tag.toLowerCase( ) ) && !iss_title_lc.startsWith( road_tag.toLowerCase( ) ) )
|
||||||
|
{
|
||||||
|
const title = issue.title;
|
||||||
|
let title_new = title.replace( /^\s?emergency\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?urgent\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?urgency\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?important\s*(.*?)\b/gi, '' );
|
||||||
|
title_new = title.replace( /^\s?critical\s*(.*?)\b/gi, '' );
|
||||||
|
iss_title = `${ road_tag } ${ title_new }`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number,
|
||||||
|
title: `${ iss_title }`, labels: add_labels
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
await github.rest.issues.update(
|
||||||
|
{
|
||||||
|
owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number,
|
||||||
|
state: 'closed', state_reason: 'not planned'
|
||||||
|
} );
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job [ Stale Issues ]
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-issues-stale:
|
||||||
|
name: >-
|
||||||
|
💤 Check › Stale
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
needs:
|
||||||
|
- job-labels-create
|
||||||
|
- job-issues-nolabel
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Stale Issues ] Check Condition
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: "💤 Stale › Check Condition"
|
||||||
|
uses: actions/stale@v9
|
||||||
|
id: task_issues_stale_run
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
stale-issue-message: |
|
||||||
|
⚠️ It looks like there hasn't been any recent updates on this issue. If you created this issue and no longer consider it open, then please login to github and close the issue.
|
||||||
|
|
||||||
|
If there is no further activity on this issue, it will be automatically closed in the next week.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<sub>I am a bot reaching out to you with an automated response.</sub>
|
||||||
|
stale-issue-label: 'Status 𐄂 Stale'
|
||||||
|
close-issue-label: 'Status 𐄂 Autoclosed'
|
||||||
|
exempt-issue-labels: 'Status 𐄂 Accepted,Status 𐄂 Review,Status 𐄂 Pending,Type ◦ Bug,Type ◦ Dependency,Type ◦ Docs,Type ◦ Feature,Type ◦ Git Action,Type ◦ Pull Request,Type ◦ Roadmap'
|
||||||
|
days-before-stale: 60
|
||||||
|
days-before-close: 7
|
||||||
|
days-before-pr-stale: -1
|
||||||
|
days-before-pr-close: -1
|
||||||
|
|
||||||
|
# #
|
||||||
|
# Job [ Lock Issues ]
|
||||||
|
# #
|
||||||
|
|
||||||
|
job-issues-lock:
|
||||||
|
name: >-
|
||||||
|
🔒 Check › Inactive
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
|
needs:
|
||||||
|
- job-labels-create
|
||||||
|
- job-issues-nolabel
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# #
|
||||||
|
# [ Lock Issues ] Look for inactives
|
||||||
|
# #
|
||||||
|
|
||||||
|
- name: "🔒 Lock › Inactives"
|
||||||
|
uses: dessant/lock-threads@v5
|
||||||
|
id: task_issues_lock_run
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.ADMINSERV_TOKEN_CL }}
|
||||||
|
exclude-any-issue-labels: 'AC › Review Required,Status 𐄂 Accepted,Status 𐄂 Review,Status 𐄂 Pending,Type ◦ Bug,Type ◦ Dependency,Type ◦ Docs,Type ◦ Feature,Type ◦ Git Action,Type ◦ Roadmap,Type ◦ Internal'
|
||||||
|
add-issue-labels: 'Status 𐄂 Locked'
|
||||||
|
issue-inactive-days: '60'
|
||||||
|
issue-lock-reason: 'resolved'
|
||||||
|
issue-comment: >
|
||||||
|
⚠️ This **issue** has been automatically locked since there has not been any recent activity after it was closed.
|
||||||
|
|
||||||
|
Please open a new issue for related bugs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<sub>I am a bot reaching out to you with an automated response.</sub>
|
||||||
|
exclude-any-pr-labels: 'AC › Review Required,Status 𐄂 Accepted,Status 𐄂 Review,Status 𐄂 Pending,Type ◦ Bug,Type ◦ Dependency,Type ◦ Docs,Type ◦ Feature,Type ◦ Git Action,Type ◦ Roadmap,Type ◦ Internal'
|
||||||
|
add-pr-labels: 'Status 𐄂 Locked'
|
||||||
|
pr-inactive-days: '365'
|
||||||
|
pr-lock-reason: 'resolved'
|
||||||
|
pr-comment: >
|
||||||
|
⚠️ This **pull request** has been automatically locked since there has not been any recent activity after it was closed.
|
||||||
|
|
||||||
|
Please open a new issue for related bugs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<sub>I am a bot reaching out to you with an automated response.</sub>
|
||||||
4
.github/workflows/labels-clean.yml
vendored
4
.github/workflows/labels-clean.yml
vendored
@@ -113,7 +113,9 @@ jobs:
|
|||||||
issues-labels-remove:
|
issues-labels-remove:
|
||||||
name: >-
|
name: >-
|
||||||
🎫 Labels › Remove
|
🎫 Labels › Remove
|
||||||
runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
|
runs-on: apollo-x64
|
||||||
|
timeout-minutes: 4
|
||||||
permissions:
|
permissions:
|
||||||
contents: 'read'
|
contents: 'read'
|
||||||
id-token: 'write'
|
id-token: 'write'
|
||||||
|
|||||||
Reference in New Issue
Block a user