Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get it working #1

Merged
merged 31 commits into from
Aug 2, 2019
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# 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
4 changes: 0 additions & 4 deletions __tests__/main.test.ts

This file was deleted.

14 changes: 9 additions & 5 deletions action.yml
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:
repoToken:
description: 'Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }}'
required: true
issueMessage:
description: 'Comment to post on an individuals first issue'
prMessage:
description: 'Comment to post on an individuals first pull request'
runs:
using: 'docker'
image: 'Dockerfile'
11 changes: 0 additions & 11 deletions jest.config.js

This file was deleted.

82 changes: 78 additions & 4 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,92 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
};
const core = require('@actions/core');
const github = require('@actions/github');
const fs = require('fs');
function run() {
return __awaiter(this, void 0, void 0, function* () {
try {
const myInput = core.getInput('myInput');
core.debug(`Hello ${myInput} from inside a container`);
// Get github context data
// Get client and context
const client = new github.GitHub(core.getInput('repoToken', { 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('Nothing was opened');
return;
}
// Do nothing if its not a pr or issue
const isIssue = !!context.payload.issue;
if (!isIssue && !context.payload.pull_request) {
console.log('Not a pull request or issue');
return;
}
// Do nothing if its not their first contribution
console.log('Checking if its the users first contribution');
const sender = context.payload.sender.login;
const issue = context.issue;
const firstContribution = isIssue ? yield isFirstIssue(client, issue.owner, issue.repo, sender, issue.number) : yield 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 = isIssue ? core.getInput('issueMessage') : core.getInput('prMessage');
if (!message) {
console.log('No message provided for this type of contribution');
return;
}
// Add a comment to the appropriate place
console.log(`Adding message: ${message}`);
if (isIssue) {
yield client.issues.createComment({ owner: issue.owner, repo: issue.repo, issue_number: issue.number, body: message });
}
else {
yield client.pulls.createReview({ owner: issue.owner, repo: issue.repo, pull_number: issue.number, body: message, event: 'COMMENT' });
}
}
catch (error) {
core.setFailed(error.message);
return;
}
});
}
function isFirstIssue(client, owner, repo, sender, number) {
return __awaiter(this, void 0, void 0, function* () {
console.log(`owner ${owner}, repo ${repo}, creator: ${sender}`);
const { status, data: issues } = yield client.issues.listForRepo({ owner: owner, repo: repo, creator: sender, state: 'all' });
if (status !== 200) {
throw new Error(`Received API status code ${status}`);
}
if (issues.length === 0) {
return true;
}
for (const issue of issues) {
const issueNumber = issue.number;
console.log(issueNumber, number);
if (issueNumber < number) {
return false;
}
}
return true;
});
}
// No way to filter pulls by creator
function isFirstPull(client, owner, repo, sender, number, page = 1) {
return __awaiter(this, void 0, void 0, function* () {
console.log('Checking...');
const { status, data: pulls } = yield client.pulls.list({ owner: owner, repo: repo, per_page: 100, page: page, state: 'all' });
if (status !== 200) {
throw new Error(`Received API status code ${status}`);
}
if (pulls.length === 0) {
return true;
}
for (const pull of pulls) {
const login = pull.user.login;
const pullNumber = pull.number;
if (login === sender && pullNumber < number) {
return false;
}
}
return yield isFirstPull(client, owner, repo, sender, number, page + 1);
});
}
run();
96 changes: 91 additions & 5 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,103 @@
const core = require('@actions/core');
const github = require('@actions/github');
const fs = require('fs');

async function run() {
try {
const myInput = core.getInput('myInput');
core.debug(`Hello ${myInput} from inside a container`);

// Get github context data
// Get client and context
const client = new github.GitHub(core.getInput('repoToken', { 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('Nothing was opened');
return;
}

// Do nothing if its not a pr or issue
const isIssue = !!context.payload.issue;
if (!isIssue && !context.payload.pull_request) {
console.log('Not a pull request or issue');
return;
}

// Do nothing if its not their first contribution
console.log('Checking if its the users first contribution');
const sender = context.payload.sender.login;
const issue = context.issue;
const firstContribution = isIssue ? await isFirstIssue(client, issue.owner, issue.repo, sender, issue.number) : 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 = isIssue ? core.getInput('issueMessage') : core.getInput('prMessage');
if (!message) {
console.log('No message provided for this type of contribution');
return;
}

// Add a comment to the appropriate place
console.log(`Adding message: ${message}`);
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, owner, repo, sender, number): Promise<boolean> {
console.log(`owner ${owner}, repo ${repo}, creator: ${sender}`);
const {status, data: issues} = await client.issues.listForRepo({owner: owner, repo: repo, creator: sender, state: 'all'});

if (status !== 200) {
throw new Error(`Received API status code ${status}`);
}

if (issues.length === 0) {
return true;
}

for (const issue of issues) {
const issueNumber = issue.number;
console.log(issueNumber, number);
if (issueNumber < number) {
return false;
}
}

return true;
}

// No way to filter pulls by creator
async function isFirstPull(client, owner, repo, sender, number, page = 1): Promise<boolean> {
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 API status code ${status}`);
}

if (pulls.length === 0) {
return true;
}

for (const pull of pulls) {
const login = pull.user.login;
const pullNumber = pull.number;
if (login === sender && pullNumber < number) {
return false;
}
}

return await isFirstPull(client, owner, repo, sender, number, page+1);
}

run();
Binary file modified toolkit/actions-github-0.0.0.tgz
Binary file not shown.