Skip to content

Commit c3e6165

Browse files
hramosfacebook-github-bot
authored andcommitted
Warn if base !== master, tag CODEOWNERS
Summary: The following PR modifies the Danger rules in the following way: 1. Verifies if a PR is opened against master. If not, it will warn (if opened against stable) or fail (anything else). 2. No longer adds a markdown message tagging the facebook/react-native team, as the bot does not have the necessary scope to mention the team. 3. Mentions people that have marked themselves as interested in a file, when that file is modified. This is based off CODEOWNERS. The bot should be able to use mentions here as it will act as any other regular user. Verify it tags the right people in facebook#15139 ``` $ npm run danger pr facebook#15139 > @ danger /Users/hramos/git/react-native/danger > node ./node_modules/.bin/danger "pr" "facebook#15139" { fails: [], warnings: [], messages: [], markdowns: ["Attention: grabbou, kureev"] } ``` It should not tag anyone for facebook#15175: ``` $ npm run danger pr facebook#15175 > @ danger /Users/hramos/git/react-native/danger > node ./node_modules/.bin/danger "pr" "facebook#15175" { fails: [], warnings: [], messages: [], markdowns: [] } ``` It should warn on facebook#14640 as it targets 0.45-stable: ``` $ npm run danger pr facebook#14640 > @ danger /Users/hramos/git/react-native/danger > node ./node_modules/.bin/danger "pr" "facebook#14640" { fails: [], warnings: [ { message: ":grey_question: Base Branch - <i>The base branch for this PR is something other than `master`. Are you sure you want to merge these changes into a stable release? If you are interested in backporting updates to an older release, the suggested approach is to land those changes on `master` first and then cherry-pick the commits into the branch for that release. The [Releases Guide](https://github.com/facebook/react-native/blob/master/Releases.md) has more information.</i>" } ], messages: [], markdowns: [":page_facing_up: Thanks for your contribution to the docs!"] } ``` It should not warn on facebook#15175 because it targets master. ``` $ npm run danger pr facebook#15175 > @ danger /Users/hramos/git/react-native/danger > node ./node_modules/.bin/danger "pr" "facebook#15175" { fails: [], warnings: [], messages: [], markdowns: [] } ``` Closes facebook#15179 Differential Revision: D5490047 Pulled By: hramos fbshipit-source-id: a46a23b7d0a59d12b8039746d6e9c4399ef32d5f
1 parent fbaedfd commit c3e6165

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

danger/dangerfile.js

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
const fs = require('fs');
1313
const includes = require('lodash.includes');
14+
const minimatch = require('minimatch');
1415

1516
import { danger, fail, markdown, warn } from 'danger';
1617

@@ -33,7 +34,6 @@ if (addsBlogPost) {
3334
const idea = 'This PR appears to add a new blog post, ' +
3435
'and may require further review from the React Native team.';
3536
warn(`${message} - <i>${idea}</i>`);
36-
markdown(':memo: This PR requires attention from the @facebook/react-native team.');
3737
}
3838

3939
// Flags edits to blog posts
@@ -43,7 +43,6 @@ if (editsBlogPost) {
4343
const idea = 'This PR appears to edit an existing blog post, ' +
4444
'and may require further review from the React Native team.';
4545
warn(`${message} - <i>${idea}</i>`);
46-
markdown('This PR requires attention from the @facebook/react-native team.');
4746
}
4847

4948
// Fails if the description is too short.
@@ -66,7 +65,6 @@ if (packageChanged) {
6665
const idea = 'Changes were made to package.json. ' +
6766
'This will require a manual import by a Facebook employee.';
6867
warn(`${message} - <i>${idea}</i>`);
69-
markdown('This PR requires attention from the @facebook/react-native team.');
7068
}
7169

7270
// Warns if a test plan is missing.
@@ -102,3 +100,37 @@ if (issueCommandsFileModified) {
102100
'GitHub bot.';
103101
warn(`${message} - <i>${idea}</i>`);
104102
}
103+
104+
// Warns if the PR is opened against stable, as commits need to be cherry picked and tagged by a release maintainer.
105+
// Fails if the PR is opened against anything other than `master` or `-stable`.
106+
const isMergeRefMaster = danger.github.pr.base.ref === 'master';
107+
const isMergeRefStable = danger.github.pr.base.ref.indexOf(`-stable`) !== -1;
108+
if (!isMergeRefMaster && isMergeRefStable) {
109+
const message = ':grey_question: Base Branch';
110+
const idea = 'The base branch for this PR is something other than `master`. Are you sure you want to merge these changes into a stable release? If you are interested in backporting updates to an older release, the suggested approach is to land those changes on `master` first and then cherry-pick the commits into the branch for that release. The [Releases Guide](https://github.com/facebook/react-native/blob/master/Releases.md) has more information.';
111+
warn(`${message} - <i>${idea}</i>`);
112+
} else if (!isMergeRefMaster && !isMergeRefStable) {
113+
const message = ':exclamation: Base Branch';
114+
const idea = 'The base branch for this PR is something other than `master`. [Are you sure you want to target something other than the `master` branch?](http://facebook.github.io/react-native/docs/contributing.html#pull-requests)';
115+
fail(`${message} - <i>${idea}</i>`);
116+
}
117+
118+
// People can add themselves to CODEOWNERS in order to be automatically added as reviewers when a file matching a glob pattern is modified. The following will have the bot add a mention in that case.
119+
const codeowners = fs.readFileSync('../.github/CODEOWNERS', 'utf8').split('\n');
120+
let mentions = [];
121+
codeowners.forEach((codeowner) => {
122+
const pattern = codeowner.split(' ')[0];
123+
const owners = codeowner.substring(pattern.length).trim().split(' ');
124+
125+
const modifiedFileHasOwner = path => minimatch(path, pattern);
126+
const modifiesOwnedCode = danger.git.modified_files.filter(modifiedFileHasOwner).length > 0;
127+
128+
if (modifiesOwnedCode) {
129+
mentions = mentions.concat(owners);
130+
}
131+
});
132+
const isOwnedCodeModified = mentions.length > 0;
133+
if (isOwnedCodeModified) {
134+
const uniqueMentions = new Set(mentions);
135+
markdown('Attention: ' + [...uniqueMentions].join(', '));
136+
}

danger/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
},
66
"devDependencies": {
77
"danger": "^0.21.2",
8-
"lodash.includes": "^4.3.0"
8+
"lodash.includes": "^4.3.0",
9+
"minimatch": "^3.0.4"
910
}
1011
}

0 commit comments

Comments
 (0)