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

fix(land): prevent duplicate and self-refs #478

Merged
merged 1 commit into from
Aug 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions lib/links.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,27 @@ class LinkParser {
}

getRefsUrlsFromArray(arr) {
const result = [];
const result = new Set();
for (const item of arr) {
const m = item.match(REF_RE);
if (!m) continue;
const ref = m[1];
const url = this.getUrlFromOP(ref);
if (url) result.push(url);
if (url) result.add(url);
}
return result;
return Array.from(result);
}

getPRUrlsFromArray(arr) {
const result = [];
const result = new Set();
for (const item of arr) {
const m = item.match(PR_RE);
if (!m) continue;
const prUrl = m[1];
const url = this.getUrlFromOP(prUrl);
if (url) result.push(url);
if (url) result.add(url);
}
return result;
return Array.from(result);
}

// Do this so we can reliably get the correct url.
Expand Down
2 changes: 1 addition & 1 deletion lib/metadata_gen.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class MetadataGenerator {

const parser = new LinkParser(owner, repo, op);
const fixes = parser.getFixes();
const refs = parser.getRefs();
const refs = parser.getRefs().filter(f => f !== prUrl);
const altPrUrl = parser.getAltPrUrl();

const meta = [];
Expand Down
6 changes: 5 additions & 1 deletion test/fixtures/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ const firstTimerPrivatePR = readJSON('first_timer_pr_with_private_email.json');
const semverMajorPR = readJSON('semver_major_pr.json');
const fixAndRefPR = readJSON('pr_with_fixes_and_refs.json');
const fixCrossPR = readJSON('pr_with_fixes_cross.json');
const duplicateRefPR = readJSON('pr_with_duplicate_refs.json');
const selfRefPR = readJSON('pr_with_self_ref.json');
const backportPR = readJSON('pr_with_backport.json');
const conflictingPR = readJSON('conflicting_pr.json');
const emptyProfilePR = readJSON('empty_profile_pr.json');
Expand Down Expand Up @@ -137,5 +139,7 @@ module.exports = {
readmeNoCollaboratorE,
readmeUnordered,
closedPR,
mergedPR
mergedPR,
selfRefPR,
duplicateRefPR
};
20 changes: 20 additions & 0 deletions test/fixtures/pr_with_duplicate_refs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"createdAt": "2017-10-24T11:13:43Z",
"url": "https://github.com/nodejs/node/pull/16438",
"bodyHTML":
"<p>Refs: <a href=\"https://github.com/nodejs/node/pull/16439\" class=\"issue-link js-issue-link\" data-error-text=\"Failed to load issue title\" data-id=\"271243248\" data-permission-text=\"Issue title is private\" data-url=\"https://github.com/nodejs/node/pull/16439\">#16439</a>\nRefs: <a href=\"https://github.com/nodejs/node/pull/16439\" class=\"issue-link js-issue-link\" data-error-text=\"Failed to load issue title\" data-id=\"271243248\" data-permission-text=\"Issue title is private\" data-url=\"https://github.com/nodejs/node/pull/16439\">#16439</a></p>",
"bodyText": "Refs: https://github.com/nodejs/node/pull/16439\nRefs: https://github.com/nodejs/node/pull/16439",
"labels": {
"nodes": [
{
"name": "build"
},
{
"name": "npm"
},
{
"name": "python"
}
]
}
}
20 changes: 20 additions & 0 deletions test/fixtures/pr_with_self_ref.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"createdAt": "2017-10-24T11:13:43Z",
"url": "https://github.com/nodejs/node/pull/16438",
"bodyHTML":
"<p>Refs: <a href=\"https://github.com/nodejs/node/pull/16438\" class=\"issue-link js-issue-link\" data-error-text=\"Failed to load issue title\" data-id=\"271243248\" data-permission-text=\"Issue title is private\" data-url=\"https://github.com/nodejs/node/pull/16438\">#16438</a></p>",
"bodyText": "Refs: https://github.com/nodejs/node/pull/16438",
"labels": {
"nodes": [
{
"name": "build"
},
{
"name": "npm"
},
{
"name": "python"
}
]
}
}
51 changes: 41 additions & 10 deletions test/unit/metadata_gen.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,30 @@
const MetadataGenerator = require('../../lib/metadata_gen');
const {
fixAndRefPR,
selfRefPR,
duplicateRefPR,
fixCrossPR,
backportPR,
allGreenReviewers
} = require('../fixtures/data');

const assert = require('assert');

const data = {
owner: 'nodejs',
repo: 'node',
pr: fixAndRefPR,
reviewers: allGreenReviewers
};
const crossData = Object.assign({}, data, { pr: fixCrossPR });
const expected = `PR-URL: https://github.com/nodejs/node/pull/16438
Fixes: https://github.com/nodejs/node/issues/16437
Refs: https://github.com/nodejs/node/pull/15148
Reviewed-By: Foo User <foo@example.com>
Reviewed-By: Quux User <quux@example.com>
Reviewed-By: Baz User <baz@example.com>
Reviewed-By: Bar User <bar@example.com>
`;

const backportArgv = {
argv: {
owner: 'nodejs',
Expand All @@ -29,29 +40,39 @@ const backportArgv = {
backport: true
}
};

const backportData = Object.assign({}, data, { pr: backportPR }, backportArgv);
const backportExpected = `PR-URL: https://github.com/nodejs/node/pull/29995
Backport-PR-URL: https://github.com/nodejs/node/pull/30072
Fixes: https://github.com/nodejs/build/issues/1961
Refs: https://github.com/nodejs/node/commit/53ca0b9ae145c430842bf78e553e3b6cbd2823aa#commitcomment-35494896
`;

const expected = `PR-URL: https://github.com/nodejs/node/pull/16438
Fixes: https://github.com/nodejs/node/issues/16437
Refs: https://github.com/nodejs/node/pull/15148
const selfRefData = Object.assign({}, data, { pr: selfRefPR });
const selfRefExpected = `PR-URL: https://github.com/nodejs/node/pull/16438
Reviewed-By: Foo User <foo@example.com>
Reviewed-By: Quux User <quux@example.com>
Reviewed-By: Baz User <baz@example.com>
Reviewed-By: Bar User <bar@example.com>
`;

const duplicateRefData = Object.assign({}, data, { pr: duplicateRefPR });
const duplicateRefExpected = `PR-URL: https://github.com/nodejs/node/pull/16438
Refs: https://github.com/nodejs/node/pull/16439
Reviewed-By: Foo User <foo@example.com>
Reviewed-By: Quux User <quux@example.com>
Reviewed-By: Baz User <baz@example.com>
Reviewed-By: Bar User <bar@example.com>
`;

const crossData = Object.assign({}, data, { pr: fixCrossPR });
const crossExpected = `PR-URL: https://github.com/nodejs/node/pull/16438
Fixes: https://github.com/joyeecheung/node-core-utils/issues/123
Reviewed-By: Foo User <foo@example.com>
Reviewed-By: Quux User <quux@example.com>
Reviewed-By: Baz User <baz@example.com>
Reviewed-By: Bar User <bar@example.com>
`;
const backportExpected = `PR-URL: https://github.com/nodejs/node/pull/29995
Backport-PR-URL: https://github.com/nodejs/node/pull/30072
Fixes: https://github.com/nodejs/build/issues/1961
Refs: https://github.com/nodejs/node/commit/53ca0b9ae145c430842bf78e553e3b6cbd2823aa#commitcomment-35494896
`;

const skipRefsExpected = `PR-URL: https://github.com/nodejs/node/pull/16438
Reviewed-By: Foo User <foo@example.com>
Reviewed-By: Quux User <quux@example.com>
Expand All @@ -65,6 +86,16 @@ describe('MetadataGenerator', () => {
assert.strictEqual(expected, results);
});

it('should prevent duplicate references', () => {
const results = new MetadataGenerator(duplicateRefData).getMetadata();
assert.strictEqual(duplicateRefExpected, results);
});

it('should prevent self-referential references', () => {
const results = new MetadataGenerator(selfRefData).getMetadata();
assert.strictEqual(selfRefExpected, results);
});

it('should handle cross-owner and cross-repo fixes properly', () => {
const results = new MetadataGenerator(crossData).getMetadata();
assert.strictEqual(crossExpected, results);
Expand Down