mirror of
https://github.com/actions/stale.git
synced 2025-12-30 11:58:18 +00:00
Compare commits
1 Commits
test-dash-
...
dist/updat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42fc933372 |
@@ -1,7 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
||||||
|
|
||||||
### [4.0.1](https://github.com/actions/stale/compare/v3.0.19...v4.0.1) (2021-05-19)
|
|
||||||
|
|
||||||
### [2.0.1](https://github.com/actions/stale/compare/v3.0.19...v2.0.1) (2021-05-19)
|
|
||||||
955
dist/index.js
vendored
955
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
1549
package-lock.json
generated
1549
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "stale-action",
|
"name": "stale-action",
|
||||||
"version": "4.0.1",
|
"version": "2.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Marks old issues and PRs as stale",
|
"description": "Marks old issues and PRs as stale",
|
||||||
"main": "lib/main.js",
|
"main": "lib/main.js",
|
||||||
@@ -30,17 +30,17 @@
|
|||||||
"author": "GitHub",
|
"author": "GitHub",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "file:../toolkit/packages/core",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/github": "^4.0.0",
|
"@actions/github": "^4.0.0",
|
||||||
|
"@octokit/rest": "^18.3.3",
|
||||||
"lodash.deburr": "^4.1.0",
|
"lodash.deburr": "^4.1.0",
|
||||||
"semver": "^7.3.5",
|
"semver": "^7.3.4"
|
||||||
"standard-version": "^9.3.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^26.0.20",
|
"@types/jest": "^26.0.20",
|
||||||
"@types/lodash.deburr": "^4.1.6",
|
"@types/lodash.deburr": "^4.1.6",
|
||||||
"@types/node": "^15.0.2",
|
"@types/node": "^15.0.2",
|
||||||
"@types/semver": "^7.3.5",
|
"@types/semver": "^7.3.4",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.16.1",
|
"@typescript-eslint/eslint-plugin": "^4.16.1",
|
||||||
"@typescript-eslint/parser": "^4.22.1",
|
"@typescript-eslint/parser": "^4.22.1",
|
||||||
"@vercel/ncc": "^0.27.0",
|
"@vercel/ncc": "^0.27.0",
|
||||||
@@ -55,6 +55,6 @@
|
|||||||
"prettier": "^2.2.1",
|
"prettier": "^2.2.1",
|
||||||
"terminal-link": "^2.1.1",
|
"terminal-link": "^2.1.1",
|
||||||
"ts-jest": "^26.5.3",
|
"ts-jest": "^26.5.3",
|
||||||
"typescript": "^4.2.4"
|
"typescript": "^4.2.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ export class Assignees {
|
|||||||
if (this._shouldExemptAllAssignees()) {
|
if (this._shouldExemptAllAssignees()) {
|
||||||
this._issueLogger.info(
|
this._issueLogger.info(
|
||||||
chalk.white('└──'),
|
chalk.white('└──'),
|
||||||
'Skipping this $$type because it has an exempt assignee'
|
'Skipping $$type because it has an exempt assignee'
|
||||||
);
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -51,14 +51,6 @@ export class IssuesProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static _getStaleMessageUsedOptionName(
|
|
||||||
issue: Readonly<Issue>
|
|
||||||
): Option.StalePrMessage | Option.StaleIssueMessage {
|
|
||||||
return issue.isPullRequest
|
|
||||||
? Option.StalePrMessage
|
|
||||||
: Option.StaleIssueMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly _logger: Logger = new Logger();
|
private readonly _logger: Logger = new Logger();
|
||||||
private readonly _operations: StaleOperations;
|
private readonly _operations: StaleOperations;
|
||||||
private readonly _statistics: Statistics | undefined;
|
private readonly _statistics: Statistics | undefined;
|
||||||
@@ -120,9 +112,7 @@ export class IssuesProcessor {
|
|||||||
const issueLogger: IssueLogger = new IssueLogger(issue);
|
const issueLogger: IssueLogger = new IssueLogger(issue);
|
||||||
this._statistics?.incrementProcessedItemsCount(issue);
|
this._statistics?.incrementProcessedItemsCount(issue);
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(`Found this $$type last updated ${issue.updated_at}`);
|
||||||
`Found this $$type last updated at: ${chalk.cyan(issue.updated_at)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
// calculate string based messages for this issue
|
// calculate string based messages for this issue
|
||||||
const staleMessage: string = issue.isPullRequest
|
const staleMessage: string = issue.isPullRequest
|
||||||
@@ -147,11 +137,7 @@ export class IssuesProcessor {
|
|||||||
|
|
||||||
if (onlyLabels.length > 0) {
|
if (onlyLabels.length > 0) {
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`The option ${issueLogger.createOptionLink(
|
`The option "onlyLabels" was specified to only processed the issues and pull requests with all those labels (${onlyLabels.length})`
|
||||||
Option.OnlyLabels
|
|
||||||
)} was specified to only process issues and pull requests with all those labels (${chalk.cyan(
|
|
||||||
onlyLabels.length
|
|
||||||
)})`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const hasAllWhitelistedLabels: boolean = onlyLabels.every(
|
const hasAllWhitelistedLabels: boolean = onlyLabels.every(
|
||||||
@@ -179,45 +165,31 @@ export class IssuesProcessor {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
issueLogger.info(
|
issueLogger.info(`The option "onlyLabels" was not specified`);
|
||||||
`The option ${issueLogger.createOptionLink(
|
|
||||||
Option.OnlyLabels
|
|
||||||
)} was not specified`
|
|
||||||
);
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
chalk.white('└──'),
|
chalk.white('└──'),
|
||||||
`Continuing the process for this $$type`
|
`Continuing the process for this $$type`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(`Days before $$type stale: ${daysBeforeStale}`);
|
||||||
`Days before $$type stale: ${chalk.cyan(daysBeforeStale)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
const shouldMarkAsStale: boolean = shouldMarkWhenStale(daysBeforeStale);
|
const shouldMarkAsStale: boolean = shouldMarkWhenStale(daysBeforeStale);
|
||||||
|
|
||||||
if (!staleMessage && shouldMarkAsStale) {
|
if (!staleMessage && shouldMarkAsStale) {
|
||||||
issueLogger.info(
|
issueLogger.info(`Skipping $$type due to empty stale message`);
|
||||||
`Skipping this $$type because it should be marked as stale based on the option ${issueLogger.createOptionLink(
|
|
||||||
this._getDaysBeforeStaleUsedOptionName(issue)
|
|
||||||
)} (${chalk.cyan(
|
|
||||||
daysBeforeStale
|
|
||||||
)}) but the option ${issueLogger.createOptionLink(
|
|
||||||
IssuesProcessor._getStaleMessageUsedOptionName(issue)
|
|
||||||
)} is not set`
|
|
||||||
);
|
|
||||||
IssuesProcessor._endIssueProcessing(issue);
|
IssuesProcessor._endIssueProcessing(issue);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (issue.state === 'closed') {
|
if (issue.state === 'closed') {
|
||||||
issueLogger.info(`Skipping this $$type because it is closed`);
|
issueLogger.info(`Skipping $$type because it is closed`);
|
||||||
IssuesProcessor._endIssueProcessing(issue);
|
IssuesProcessor._endIssueProcessing(issue);
|
||||||
continue; // Don't process closed issues
|
continue; // Don't process closed issues
|
||||||
}
|
}
|
||||||
|
|
||||||
if (issue.locked) {
|
if (issue.locked) {
|
||||||
issueLogger.info(`Skipping this $$type because it is locked`);
|
issueLogger.info(`Skipping $$type because it is locked`);
|
||||||
IssuesProcessor._endIssueProcessing(issue);
|
IssuesProcessor._endIssueProcessing(issue);
|
||||||
continue; // Don't process locked issues
|
continue; // Don't process locked issues
|
||||||
}
|
}
|
||||||
@@ -230,9 +202,9 @@ export class IssuesProcessor {
|
|||||||
const createdAt: Date = new Date(issue.created_at);
|
const createdAt: Date = new Date(issue.created_at);
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`A start date was specified for the ${getHumanizedDate(
|
`A start date was specified for the ${getHumanizedDate(startDate)} (${
|
||||||
startDate
|
this.options.startDate
|
||||||
)} (${chalk.cyan(this.options.startDate)})`
|
})`
|
||||||
);
|
);
|
||||||
|
|
||||||
// Expecting that GitHub will always set a creation date on the issues and PRs
|
// Expecting that GitHub will always set a creation date on the issues and PRs
|
||||||
@@ -247,14 +219,14 @@ export class IssuesProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`$$type created the ${getHumanizedDate(createdAt)} (${chalk.cyan(
|
`$$type created the ${getHumanizedDate(createdAt)} (${
|
||||||
issue.created_at
|
issue.created_at
|
||||||
)})`
|
})`
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!isDateMoreRecentThan(createdAt, startDate)) {
|
if (!isDateMoreRecentThan(createdAt, startDate)) {
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`Skipping this $$type because it was created before the specified start date`
|
`Skipping $$type because it was created before the specified start date`
|
||||||
);
|
);
|
||||||
|
|
||||||
IssuesProcessor._endIssueProcessing(issue);
|
IssuesProcessor._endIssueProcessing(issue);
|
||||||
@@ -284,7 +256,7 @@ export class IssuesProcessor {
|
|||||||
await this._removeStaleLabel(issue, staleLabel);
|
await this._removeStaleLabel(issue, staleLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
issueLogger.info(`Skipping this $$type because it has an exempt label`);
|
issueLogger.info(`Skipping $$type because it has an exempt label`);
|
||||||
IssuesProcessor._endIssueProcessing(issue);
|
IssuesProcessor._endIssueProcessing(issue);
|
||||||
continue; // Don't process exempt issues
|
continue; // Don't process exempt issues
|
||||||
}
|
}
|
||||||
@@ -293,11 +265,7 @@ export class IssuesProcessor {
|
|||||||
|
|
||||||
if (anyOfLabels.length > 0) {
|
if (anyOfLabels.length > 0) {
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`The option ${issueLogger.createOptionLink(
|
`The option "anyOfLabels" was specified to only processed the issues and pull requests with one of those labels (${anyOfLabels.length})`
|
||||||
Option.AnyOfLabels
|
|
||||||
)} was specified to only process the issues and pull requests with one of those labels (${chalk.cyan(
|
|
||||||
anyOfLabels.length
|
|
||||||
)})`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const hasOneOfWhitelistedLabels: boolean = anyOfLabels.some(
|
const hasOneOfWhitelistedLabels: boolean = anyOfLabels.some(
|
||||||
@@ -324,11 +292,7 @@ export class IssuesProcessor {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
issueLogger.info(
|
issueLogger.info(`The option "anyOfLabels" was not specified`);
|
||||||
`The option ${issueLogger.createOptionLink(
|
|
||||||
Option.AnyOfLabels
|
|
||||||
)} was not specified`
|
|
||||||
);
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
chalk.white('└──'),
|
chalk.white('└──'),
|
||||||
`Continuing the process for this $$type`
|
`Continuing the process for this $$type`
|
||||||
@@ -356,45 +320,21 @@ export class IssuesProcessor {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Determine if this issue needs to be marked stale first
|
// Determine if this issue needs to be marked stale first
|
||||||
if (!issue.isStale) {
|
if (!issue.isStale && shouldBeStale && shouldMarkAsStale) {
|
||||||
issueLogger.info(`This $$type is not stale`);
|
issueLogger.info(
|
||||||
const updatedAtDate: Date = new Date(issue.updated_at);
|
`Marking $$type stale because it was last updated on ${issue.updated_at} and it does not have a stale label`
|
||||||
|
);
|
||||||
if (shouldBeStale) {
|
await this._markStale(issue, staleMessage, staleLabel, skipMessage);
|
||||||
issueLogger.info(
|
issue.isStale = true; // This issue is now considered stale
|
||||||
`This $$type should be stale based on the last update date the ${getHumanizedDate(
|
} else if (!issue.isStale) {
|
||||||
updatedAtDate
|
issueLogger.info(
|
||||||
)} (${chalk.cyan(issue.updated_at)})`
|
`Not marking as stale: shouldBeStale=${shouldBeStale}, shouldMarkAsStale=${shouldMarkAsStale}`
|
||||||
);
|
);
|
||||||
|
|
||||||
if (shouldMarkAsStale) {
|
|
||||||
issueLogger.info(
|
|
||||||
`This $$type should be marked as stale based on the option ${issueLogger.createOptionLink(
|
|
||||||
this._getDaysBeforeStaleUsedOptionName(issue)
|
|
||||||
)} (${chalk.cyan(daysBeforeStale)})`
|
|
||||||
);
|
|
||||||
await this._markStale(issue, staleMessage, staleLabel, skipMessage);
|
|
||||||
issue.isStale = true; // This issue is now considered stale
|
|
||||||
issueLogger.info(`This $$type is now stale`);
|
|
||||||
} else {
|
|
||||||
issueLogger.info(
|
|
||||||
`This $$type should not be marked as stale based on the option ${issueLogger.createOptionLink(
|
|
||||||
this._getDaysBeforeStaleUsedOptionName(issue)
|
|
||||||
)} (${chalk.cyan(daysBeforeStale)})`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
issueLogger.info(
|
|
||||||
`This $$type should not be stale based on the last update date the ${getHumanizedDate(
|
|
||||||
updatedAtDate
|
|
||||||
)} (${chalk.cyan(issue.updated_at)})`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process the issue if it was marked stale
|
// Process the issue if it was marked stale
|
||||||
if (issue.isStale) {
|
if (issue.isStale) {
|
||||||
issueLogger.info(`This $$type is already stale`);
|
issueLogger.info(`Found a stale $$type`);
|
||||||
await this._processStaleIssue(
|
await this._processStaleIssue(
|
||||||
issue,
|
issue,
|
||||||
staleLabel,
|
staleLabel,
|
||||||
@@ -505,7 +445,7 @@ export class IssuesProcessor {
|
|||||||
): Promise<string | undefined> {
|
): Promise<string | undefined> {
|
||||||
const issueLogger: IssueLogger = new IssueLogger(issue);
|
const issueLogger: IssueLogger = new IssueLogger(issue);
|
||||||
|
|
||||||
issueLogger.info(`Checking for label on this $$type`);
|
issueLogger.info(`Checking for label on $$type`);
|
||||||
|
|
||||||
this._consumeIssueOperation(issue);
|
this._consumeIssueOperation(issue);
|
||||||
this._statistics?.incrementFetchedItemsEventsCount();
|
this._statistics?.incrementFetchedItemsEventsCount();
|
||||||
@@ -557,9 +497,7 @@ export class IssuesProcessor {
|
|||||||
? this._getDaysBeforePrClose()
|
? this._getDaysBeforePrClose()
|
||||||
: this._getDaysBeforeIssueClose();
|
: this._getDaysBeforeIssueClose();
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(`Days before $$type close: ${daysBeforeClose}`);
|
||||||
`Days before $$type close: ${chalk.cyan(daysBeforeClose)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
const issueHasUpdate: boolean = IssuesProcessor._updatedSince(
|
const issueHasUpdate: boolean = IssuesProcessor._updatedSince(
|
||||||
issue.updated_at,
|
issue.updated_at,
|
||||||
@@ -583,17 +521,13 @@ export class IssuesProcessor {
|
|||||||
|
|
||||||
if (!issueHasComments && !issueHasUpdate) {
|
if (!issueHasComments && !issueHasUpdate) {
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`Closing $$type because it was last updated on! ${chalk.cyan(
|
`Closing $$type because it was last updated on ${issue.updated_at}`
|
||||||
issue.updated_at
|
|
||||||
)}`
|
|
||||||
);
|
);
|
||||||
await this._closeIssue(issue, closeMessage, closeLabel);
|
await this._closeIssue(issue, closeMessage, closeLabel);
|
||||||
|
|
||||||
if (this.options.deleteBranch && issue.pull_request) {
|
if (this.options.deleteBranch && issue.pull_request) {
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`Deleting the branch the option ${issueLogger.createOptionLink(
|
`Deleting branch for as delete-branch option was specified`
|
||||||
Option.DeleteBranch
|
|
||||||
)} was specified`
|
|
||||||
);
|
);
|
||||||
await this._deleteBranch(issue);
|
await this._deleteBranch(issue);
|
||||||
this.deletedBranchIssues.push(issue);
|
this.deletedBranchIssues.push(issue);
|
||||||
@@ -613,9 +547,7 @@ export class IssuesProcessor {
|
|||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
const issueLogger: IssueLogger = new IssueLogger(issue);
|
const issueLogger: IssueLogger = new IssueLogger(issue);
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(`Checking for comments on $$type since ${sinceDate}`);
|
||||||
`Checking for comments on $$type since: ${chalk.cyan(sinceDate)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!sinceDate) {
|
if (!sinceDate) {
|
||||||
return true;
|
return true;
|
||||||
@@ -629,9 +561,7 @@ export class IssuesProcessor {
|
|||||||
);
|
);
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`Comments not made by actor or another bot: ${chalk.cyan(
|
`Comments not made by actor or another bot: ${filteredComments.length}`
|
||||||
filteredComments.length
|
|
||||||
)}`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// if there are any user comments returned
|
// if there are any user comments returned
|
||||||
@@ -647,7 +577,7 @@ export class IssuesProcessor {
|
|||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const issueLogger: IssueLogger = new IssueLogger(issue);
|
const issueLogger: IssueLogger = new IssueLogger(issue);
|
||||||
|
|
||||||
issueLogger.info(`Marking this $$type as stale`);
|
issueLogger.info(`Marking $$type as stale`);
|
||||||
this.staleIssues.push(issue);
|
this.staleIssues.push(issue);
|
||||||
|
|
||||||
// if the issue is being marked stale, the updated date should be changed to right now
|
// if the issue is being marked stale, the updated date should be changed to right now
|
||||||
@@ -782,7 +712,7 @@ export class IssuesProcessor {
|
|||||||
|
|
||||||
if (!pullRequest) {
|
if (!pullRequest) {
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`Not deleting this branch as no pull request was found for this $$type`
|
`Not deleting branch as pull request not found for this $$type`
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -818,7 +748,7 @@ export class IssuesProcessor {
|
|||||||
const issueLogger: IssueLogger = new IssueLogger(issue);
|
const issueLogger: IssueLogger = new IssueLogger(issue);
|
||||||
|
|
||||||
issueLogger.info(
|
issueLogger.info(
|
||||||
`Removing the label "${chalk.cyan(label)}" from this $$type...`
|
`Removing the label "${chalk.cyan(label)}" from the $$type...`
|
||||||
);
|
);
|
||||||
this.removedLabelIssues.push(issue);
|
this.removedLabelIssues.push(issue);
|
||||||
|
|
||||||
@@ -957,31 +887,4 @@ export class IssuesProcessor {
|
|||||||
this._operations.consumeOperation();
|
this._operations.consumeOperation();
|
||||||
issue.operations.consumeOperation();
|
issue.operations.consumeOperation();
|
||||||
}
|
}
|
||||||
|
|
||||||
private _getDaysBeforeStaleUsedOptionName(
|
|
||||||
issue: Readonly<Issue>
|
|
||||||
):
|
|
||||||
| Option.DaysBeforeStale
|
|
||||||
| Option.DaysBeforeIssueStale
|
|
||||||
| Option.DaysBeforePrStale {
|
|
||||||
return issue.isPullRequest
|
|
||||||
? this._getDaysBeforePrStaleUsedOptionName()
|
|
||||||
: this._getDaysBeforeIssueStaleUsedOptionName();
|
|
||||||
}
|
|
||||||
|
|
||||||
private _getDaysBeforeIssueStaleUsedOptionName():
|
|
||||||
| Option.DaysBeforeStale
|
|
||||||
| Option.DaysBeforeIssueStale {
|
|
||||||
return isNaN(this.options.daysBeforeIssueStale)
|
|
||||||
? Option.DaysBeforeStale
|
|
||||||
: Option.DaysBeforeIssueStale;
|
|
||||||
}
|
|
||||||
|
|
||||||
private _getDaysBeforePrStaleUsedOptionName():
|
|
||||||
| Option.DaysBeforeStale
|
|
||||||
| Option.DaysBeforePrStale {
|
|
||||||
return isNaN(this.options.daysBeforePrStale)
|
|
||||||
? Option.DaysBeforeStale
|
|
||||||
: Option.DaysBeforePrStale;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export class Milestones {
|
|||||||
if (this._shouldExemptAllMilestones()) {
|
if (this._shouldExemptAllMilestones()) {
|
||||||
this._issueLogger.info(
|
this._issueLogger.info(
|
||||||
chalk.white('└──'),
|
chalk.white('└──'),
|
||||||
'Skipping this $$type because it has a milestone'
|
'Skipping $$type because it has a milestone'
|
||||||
);
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user