react-native/danger/dangerfile.js
Hector Ramos c7a596534f Update Dangerfile, fix flagging IssueCommands.txt changes
Summary:
The bot was incorrectly flagging PRs that do not touch IssueCommands.txt. This PR fixes the Dangerfile rule.

Verify the warning is generated on a PR that touches IssuesCommands.txt:

```
$ DANGER_GITHUB_API_TOKEN="e622517d9f1136ea8900""07c6373666312cdfaa69" npm run danger pr https://github.com/facebook/react-native/pull/15087

> @ danger /Users/hramos/git/react-native/danger
> node ./node_modules/.bin/danger "pr" "https://github.com/facebook/react-native/pull/15087"

{
  fails: [],
  warnings: [
    {
      message: "📋 Test Plan - <i>This PR appears to be missing a Test Plan.</i>"
    },
    {
      message: " Bots - <i>This PR appears to modify the list of people that may issue commands to the GitHub bot.</i>"
    }
  ],
  messages: [],
  markdowns: []
}

```

Verify it does not warn on a PR that does not modify IssueCommands.txt:

```
$ DANGER_GITHUB_API_TOKEN="e622517d9f1136ea8900""07c6373666312cdfaa69" npm run danger pr https://github.com/facebook/react-native/pull/15089

> @ danger /Users/hramos/git/react-native/danger
> node ./node_modules/.bin/danger "pr" "https://github.com/facebook/react-native/pull/15089"

{
  fails: [],
  warnings: [],
  messages: [],
  markdowns: []
}
```
Closes https://github.com/facebook/react-native/pull/15090

Differential Revision: D5451092

Pulled By: hramos

fbshipit-source-id: 54f0426871391153db81ab02d3d1b3b7f1e75fac
2017-07-19 01:52:45 -07:00

105 lines
4.2 KiB
JavaScript

/**
* Copyright (c) 2013-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
const fs = require('fs');
const includes = require('lodash.includes');
import { danger, fail, markdown, warn } from 'danger';
const isDocsFile = path => includes(path, 'docs/');
const editsDocs = danger.git.modified_files.filter(isDocsFile).length > 0;
const addsDocs = danger.git.created_files.filter(isDocsFile).length > 0;
if (addsDocs || editsDocs) {
// Note, this does not yet cover edits to the autogenerated docs
// (e.g. comments within JS source files)
markdown(':page_facing_up: Thanks for your contribution to the docs!');
}
const isBlogFile = path => includes(path, 'blog/');
// Flags new blog posts. Note that mentions will not be parsed as the access token we're using does
// not belong to the Facebook org (on purpose)
const addsBlogPost = danger.git.created_files.filter(isBlogFile).length > 0;
if (addsBlogPost) {
const message = ':memo: Blog post';
const idea = 'This PR appears to add a new blog post, ' +
'and may require further review from the React Native team.';
warn(`${message} - <i>${idea}</i>`);
markdown(':memo: This PR requires attention from the @facebook/react-native team.');
}
// Flags edits to blog posts
const editsBlogPost = danger.git.modified_files.filter(isBlogFile).length > 0;
if (editsBlogPost) {
const message = ':memo: Blog post';
const idea = 'This PR appears to edit an existing blog post, ' +
'and may require further review from the React Native team.';
warn(`${message} - <i>${idea}</i>`);
markdown('This PR requires attention from the @facebook/react-native team.');
}
// Fails if the description is too short.
if (danger.github.pr.body.length < 10) {
fail(':grey_question: This pull request needs a description.');
}
// Warns if the PR title contains [WIP]
const isWIP = includes(danger.github.pr.title, '[WIP]');
if (isWIP) {
const message = ':construction_worker: Work In Progress';
const idea = 'This PR appears to be a work in progress, and may not be ready to be merged yet.';
warn(`${message} - <i>${idea}</i>`);
}
// Warns if there are changes to package.json, and tags the team.
const packageChanged = includes(danger.git.modified_files, 'package.json');
if (packageChanged) {
const message = ':lock: package.json';
const idea = 'Changes were made to package.json. ' +
'This will require a manual import by a Facebook employee.';
warn(`${message} - <i>${idea}</i>`);
markdown('This PR requires attention from the @facebook/react-native team.');
}
// Warns if a test plan is missing.
const gettingStartedChanged = includes(danger.git.modified_files, 'docs/GettingStarted.md');
const includesTestPlan = danger.github.pr.body.toLowerCase().includes('test plan');
// Warns if a test plan is missing, when editing the Getting Started guide. This page needs to be
// tested in all its permutations.
if (!includesTestPlan && gettingStartedChanged) {
const message = ':clipboard: Test Plan';
const idea = 'This PR appears to be missing a Test Plan.';
warn(`${message} - <i>${idea}</i>`);
}
// Doc edits rarely require a test plan. We'll trust the reviewer to push back if one is needed.
if (!includesTestPlan && !editsDocs) {
const message = ':clipboard: Test Plan';
const idea = 'This PR appears to be missing a Test Plan.';
warn(`${message} - <i>${idea}</i>`);
}
// Tags PRs that have been submitted by a core contributor.
const taskforce = fs.readFileSync('../bots/IssueCommands.txt', 'utf8').split('\n')[0].split(':')[1];
const isSubmittedByTaskforce = includes(taskforce, danger.github.pr.user.login);
if (isSubmittedByTaskforce) {
markdown('This PR has been submitted by a core contributor.');
}
// Warns if the bots whitelist file is updated.
const issueCommandsFileModified = includes(danger.git.modified_files, 'bots/IssueCommands.txt');
if (issueCommandsFileModified) {
const message = ':exclamation: Bots';
const idea = 'This PR appears to modify the list of people that may issue commands to the ' +
'GitHub bot.';
warn(`${message} - <i>${idea}</i>`);
}