generated from actions/container-toolkit-action
-
Notifications
You must be signed in to change notification settings - Fork 340
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Get it working (#1) * Get it working * Required token * Logging * Debug * Debug * Correct logging * No setNeutral * debug * debug * debug * debug * debug * debug * debug * debug * debug * debug * debug * working * logging * logging * logging * logging * logging * logging * logging * logging * logging * logging * debug * debug * Logging * Dont validate issues against prs * Inputs should be snake cased * Add example usage * Respond to some feedback, some still left * Respond to rest of feedback * Fix period
- Loading branch information
Danny McCormick
authored
Aug 7, 2019
1 parent
a10eefa
commit 46c4697
Showing
8 changed files
with
310 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,20 @@ | ||
# Container Action Template | ||
# First Interaction | ||
|
||
To get started, click the `Use this template` button on this repository [which will create a new repository based on this template](https://github.blog/2019-06-06-generate-new-repositories-with-repository-templates/). | ||
An action for filtering pull requests and issues from first-time contributors. | ||
|
||
# Usage | ||
|
||
See [action.yml](action.yml) | ||
|
||
```yaml | ||
steps: | ||
- uses: actions/first-interaction@v1 | ||
with: | ||
repo-token: ${{ secrets.GITHUB_TOKEN }} | ||
issue-message: '# Mesage with markdown.\nThis is the message that will be displayed on users' first issue.' | ||
pr-message: 'Message that will be displayed on users' first pr. Look, a `code block` for markdown.' | ||
``` | ||
# License | ||
The scripts and documentation in this project are released under the [MIT License](LICENSE) |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,14 @@ | ||
name: 'Container Action Template' | ||
name: 'First interaction' | ||
description: 'Get started with Container actions' | ||
author: 'GitHub' | ||
inputs: | ||
myInput: | ||
description: 'Input to use' | ||
default: 'world' | ||
inputs: | ||
repo-token: | ||
description: 'Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }}' | ||
required: true | ||
issue-message: | ||
description: 'Comment to post on an individuals first issue' | ||
pr-message: | ||
description: 'Comment to post on an individuals first pull request' | ||
runs: | ||
using: 'docker' | ||
image: 'Dockerfile' |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,170 @@ | ||
const core = require('@actions/core'); | ||
const github = require('@actions/github'); | ||
import * as core from '@actions/core'; | ||
import * as github from '@actions/github'; | ||
|
||
async function run() { | ||
try { | ||
const myInput = core.getInput('myInput'); | ||
core.debug(`Hello ${myInput} from inside a container`); | ||
|
||
// Get github context data | ||
const issueMessage: string = core.getInput('issue-message'); | ||
const prMessage: string = core.getInput('pr-message'); | ||
if (!issueMessage && !prMessage) { | ||
throw new Error( | ||
'Action must have at least one of issue-message or pr-message set' | ||
); | ||
} | ||
// Get client and context | ||
const client: github.GitHub = new github.GitHub( | ||
core.getInput('repo-token', {required: true}) | ||
); | ||
const context = github.context; | ||
console.log(`We can even get context data, like the repo: ${context.repo.repo}`) | ||
|
||
if (context.payload.action !== 'opened') { | ||
console.log('No issue or PR was opened, skipping'); | ||
return; | ||
} | ||
|
||
// Do nothing if its not a pr or issue | ||
const isIssue: boolean = !!context.payload.issue; | ||
if (!isIssue && !context.payload.pull_request) { | ||
console.log( | ||
'The event that triggered this action was not a pull request or issue, skipping.' | ||
); | ||
return; | ||
} | ||
|
||
// Do nothing if its not their first contribution | ||
console.log('Checking if its the users first contribution'); | ||
if (!context.payload.sender) { | ||
throw new Error('Internal error, no sender provided by GitHub'); | ||
} | ||
const sender: string = context.payload.sender!.login; | ||
const issue: {owner: string; repo: string; number: number} = context.issue; | ||
let firstContribution: boolean = false; | ||
if (isIssue) { | ||
firstContribution = await isFirstIssue( | ||
client, | ||
issue.owner, | ||
issue.repo, | ||
sender, | ||
issue.number | ||
); | ||
} else { | ||
firstContribution = await isFirstPull( | ||
client, | ||
issue.owner, | ||
issue.repo, | ||
sender, | ||
issue.number | ||
); | ||
} | ||
if (!firstContribution) { | ||
console.log('Not the users first contribution'); | ||
return; | ||
} | ||
|
||
// Do nothing if no message set for this type of contribution | ||
const message: string = isIssue ? issueMessage : prMessage; | ||
if (!message) { | ||
console.log('No message provided for this type of contribution'); | ||
return; | ||
} | ||
|
||
const issueType: string = isIssue ? 'issue' : 'pull request'; | ||
// Add a comment to the appropriate place | ||
console.log(`Adding message: ${message} to ${issueType} ${issue.number}`); | ||
if (isIssue) { | ||
await client.issues.createComment({ | ||
owner: issue.owner, | ||
repo: issue.repo, | ||
issue_number: issue.number, | ||
body: message | ||
}); | ||
} else { | ||
await client.pulls.createReview({ | ||
owner: issue.owner, | ||
repo: issue.repo, | ||
pull_number: issue.number, | ||
body: message, | ||
event: 'COMMENT' | ||
}); | ||
} | ||
} catch (error) { | ||
core.setFailed(error.message); | ||
return; | ||
} | ||
} | ||
|
||
async function isFirstIssue( | ||
client: github.GitHub, | ||
owner: string, | ||
repo: string, | ||
sender: string, | ||
curIssueNumber: number | ||
): Promise<boolean> { | ||
const {status, data: issues} = await client.issues.listForRepo({ | ||
owner: owner, | ||
repo: repo, | ||
creator: sender, | ||
state: 'all' | ||
}); | ||
|
||
if (status !== 200) { | ||
throw new Error(`Received unexpected API status code ${status}`); | ||
} | ||
|
||
if (issues.length === 0) { | ||
return true; | ||
} | ||
|
||
for (const issue of issues) { | ||
if (issue.number < curIssueNumber && !issue.pull_request) { | ||
return false; | ||
} | ||
} | ||
|
||
return true; | ||
} | ||
|
||
// No way to filter pulls by creator | ||
async function isFirstPull( | ||
client: github.GitHub, | ||
owner: string, | ||
repo: string, | ||
sender: string, | ||
curPullNumber: number, | ||
page: number = 1 | ||
): Promise<boolean> { | ||
// Provide console output if we loop for a while. | ||
console.log('Checking...'); | ||
const {status, data: pulls} = await client.pulls.list({ | ||
owner: owner, | ||
repo: repo, | ||
per_page: 100, | ||
page: page, | ||
state: 'all' | ||
}); | ||
|
||
if (status !== 200) { | ||
throw new Error(`Received unexpected API status code ${status}`); | ||
} | ||
|
||
if (pulls.length === 0) { | ||
return true; | ||
} | ||
|
||
for (const pull of pulls) { | ||
const login: string = pull.user.login; | ||
if (login === sender && pull.number < curPullNumber) { | ||
return false; | ||
} | ||
} | ||
|
||
return await isFirstPull( | ||
client, | ||
owner, | ||
repo, | ||
sender, | ||
curPullNumber, | ||
page + 1 | ||
); | ||
} | ||
|
||
run(); | ||
This comment has been minimized.
Sorry, something went wrong. |
Binary file not shown.
toolkit/actions-github-0.0.0.tgz