Git Product home page Git Product logo

bors's Introduction

NOTE (2021):

This project is only very moderately maintained and mostly dormant (though not obsolete -- it's still used daily). It was originally developed for use early in the Rust project's life, and has been superseded by multiple enhanced rewrites:

I will periodically accept PRs and such for minor compatibility issues or blockers to keep it running, but in general future feature-work or development of the lineage should go to one of the successor projects.

Bors is an automated integrator for github and buildbot.

It's written for the rust project, so probably contains a number of peculiarities of this project. You may need to do some work to reuse it elsewhere.

We assume bors is run in a loop, perhaps once per minute from cron (github has a rate-limited API). Each time it runs it reloads its entire state from github and buildbot, decides what the most fruitful next-thing it can do is, does that one thing, and exits. This is a crude design but it means the script and workspace is mostly stateless and should (once debugged) never require operator intervention in the workspace driving it, only sometimes on the sites it reads from (github and buildbot).

It requires a config file, bors.cfg, in its workspace. This config file should hold the a json dictionary:

 {
       "owner": "<github-username-the-owner-of-repo>",
       "repo": "<short-github-repo-name>",
       "reviewers": ["<user1>", "<user2>", ...],
       "builders": ["<buildbot-builder1>", "<buildbot-builder2>", ...],
       "test_ref": "<git-ref-for-testing>",
       "master_ref": "<git-ref-for-integration>",
       "nbuilds": <number-of-buildbot-builds-history-to-look-at>,
       "buildbot": "<buildbot-url>",
       "gh_user": "<github-user-to-run-as>",
       "gh_pass": "<password-for-that-user>"
 }

For example, the rust config at the time of writing (minus password) is:

 {
       "owner": "mozilla",
       "repo": "rust",
       "reviewers": ["brson", "catamorphism", "graydon", "nikomatsakis", "pcwalton"],
       "builders": ["auto-linux", "auto-win", "auto-bsd", "auto-mac"],
       "test_ref": "auto",
       "master_ref": "incoming",
       "nbuilds": 5,
       "buildbot": "http://buildbot.rust-lang.org",
       "gh_user": "bors",
       "gh_pass": "..."
 }

The general cycle of bors' operation is as follows:

  • load all pull reqs

  • load all statuses and comments

  • sort them by the STATE_* values below

  • pick the ripest (latest-state) one and try to advance it, meaning:

    • if state==UNREVIEWED or DISCUSSING, look for r+ or r-:

      • if r+, set APPROVED
      • if r-, set DISAPPROVED
      • (if nothing is said, exit; nothing to do!)
    • if state==APPROVED, merge pull.sha + master => test_ref:

      • if merge ok, set PENDING
      • if merge fail, set ERROR (pull req bitrotted)
    • if state==PENDING, look at buildbot for test results:

      • if failed, set FAILED
      • if passed, set TESTED
      • (if no test status, exit; waiting for results)
    • if state==TESTED, fast-forward master to test_ref

      • if ffwd works, close pull req
      • if ffwd fails, set ERROR (someone moved master on us)

License

Copyright 2013 Mozilla Foundation.

Licensed under the Apache License, Version 2.0 or the MIT license, at your option. These files may not be copied, modified, or distributed except according to those terms.

bors's People

Contributors

adriann avatar avoine avatar bcully avatar bhearsum avatar brahman81 avatar brson avatar cblp avatar frewsxcv avatar graydon avatar jsoref avatar mortimerp9 avatar nathantypanski avatar reiddraper avatar steveklabnik avatar vagabond avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bors's Issues

Should not close pull requests

When a set of builds/tests pass, bors appears to explicitly close the corresponding pull-request. Is there a reason to do this? If it didn’t, GitHub would automatically mark the PR as "Merged" (which is nicer than "Closed") when bors merges into master and the commit ends up in HEAD’s ancestry.

Fast-forward master in the same run as seeing the passing tests

Currently there's a two-step process for merging a successful PR: see that the tests passed and post the status to github; see that the branch is ready for merge and fast-forward. This is two invocations of bors' cron job, which for Rust is 5 minutes apart. This is costing us at least an hour of down time every day.

Approval list issues

Reading through the code, the approval list has several issues:

  • r=me on a commit will put both the posting user and a username "me" on the approval list
  • r=username on a commit is accepted even if neither the poster nor the referenced username are reviewers. This seems like a reasonably major issue. Edit: This isn't true, head_comments is actually filtered to only comments made by reviewers.
  • r=metajack on a commit will put both the posting user and "metajack" on the approval list; in this instance, it's seeing the r=me prefix and not realizing that the "me" was part of a larger username
  • r+ $SHA and r=username $SHA on PR comments requires $SHA to be all lowercase. Minor issue, but it really should accept uppercase as well (and the regex should require hex characters, rather than any letter, although that's moot since a non-hex char won't match the current sha anyway).

A couple of priority issues as well:

  • p=100 on a commit is accepted by anyone, even a non-reviewer, even if it's on a different comment than the comment that establishes approval. Edit: This isn't true, as above, head_comments is filtered to only reviewer comments. It still allows it on a different comment but that's probably fine.
  • p=100 can't be specified on a PR comment, even one that establishes approval.

Warn when bors is stuck

On rust-dev, Sanghyeon Seo wrote: "The [queue status] page has last-updated timestamp. It would be useful to get timestamp from the browser and warn when the queue is not updating. (Say, when the gap is more than 10 minutes.)"

Generalize and link to Buildbot

There are lots of folks who want better Github-Buildbot integration. I get questions about it every month or so. Bors seems like it's very close to being generally useful for such things -- and it's designed in a secure fashion.

I'd love to have a bit more publicity around Bors that I could point the Buildbot community at -- blog posts, official github repos (is this the one?), etc. Perhaps (in the best possible outcome) one of the Buildbot users/hackers will work to integrate Bors more closely with Buildbot itself.

Bors polls too hard

Rust's bors instance is close to the API rate limit (though I don't have numbers), and already doesn't update fast enough, with a 5 minute polling interval. This situation impresses GitHub support none-to-much when asking for a rate limit increase.

I assume bors will need to be more stateful.

Note that Rust is still running an old version of bors that doesn't incorporate any of the changes from the last six months, so this behavior may be better now, but I don't think so.

Maximum number of pull requests

On rust-dev, Sanghyeon Seo wrote: "[The queue status page] seems to show no more than 30 pull requests. It used to be enough, but these days we often have more than 30 pull requests in the queue."

A "show more" link could be added.

Accept r=foo to indicate r+

Right now you can only write "r+" to indicate that Bors should move forward. I would like to be able to write "r=foo" so that I can indicate that review was granted by someone else. This is frequently needed when one has rebased and force-pushed in order to resolve merge conflicts.

In Bors queue status page, distinguish between "un-reviewed" and "un-discussed"

When the queue is large ( http://buildbot.rust-lang.org/bors/bors.html ) it is useful to see which unreviewed pulls have comments. If something has a lot of comments already, it's probably blocked on discussion and doesn't need me to look at it. If I'm trying to look at the pull requests that haven't been getting any love, I probably want to see the unreviewed ones with no comments (or comments only from the submitter). But the bors queue page doesn't distinguish them right now.

Let users know when feature branch is stale

Bors won't run when the feature branch is not mergeable into the target branch. This is the correct behavior, but can sometimes be confusing if you haven't noticed that the branch isn't mergeable. Maybe bors should issue a polite reminder?

github statuses feature doesn't count correctly

When using the status API, bors doesn't do any counting of successes. If the number of successes is greater than zero and it sees no failures, it will assume it passed.

For some reason, some status updates aren't going through, so bors will see successes=1 and failures=0 and not wait for the second builder's status to show up. This caused it to land a few PRs that failed tests in Servo.

Bors allows PR owners to change control messages

Bors has this huge security hole still: because bors looks at comments on commits for commands like 'r+', and repo owners can edit others' comments on their own commits, a PR submitter can turn any comment from a reviewer into 'r+'.

Add an optimism parameter for rolling PRs together

Often PRs come through where one can be highly confident, or even certain, that the PR will not cause test failure. (e.g. documentation that is not tested, typos in comments, Vim syntax files for Rust.)

At the simplest level, optimism would just be a boolean flag: that if a developer is optimistic that a patch will land successfully, it can merge multiple optimistic patches at once.

A slightly higher level of implementation for this feature would be a parameter optimism=X, for values of X between 0 and 1 (inclusive).

optimism=1 means "there is no way this can genuinely go wrong" which would also mean that you could merge it with a non-optimistic patch and impute no failure to this patch in case of failure, and so immediately put it back in the approved queue rather than the bad queue. If it fails three times (arbitrary number), mark it as bad, just in case the optimism flag was erroneous. @retry isn't hard in such cases.

You could let optimism=0.99 merge only with other optimistic patches.

After that, you could get into moderately advanced statistics, if you wanted—probability that a patch will land, and then let bors calculate potential time savings by merging multiple patches at once (win if they land; lose if they don't, and then it can take a guess at which broke it and try a smaller set of patches). Artificial intelligence! Machine learning! Fun!

But for the moment, basic optimism checking would be a good feature to have.

Bors' merge commit drops title from original PR

When Bors does the merge of the PR, it only puts the description from the PR into its commit message on the merge commit. Importantly, it leaves out the original title, which I claim is a bug in Bors.

This bug matters because the workflow of github often leads one to put important info into the title of the PR and the title alone: When I create a PR via github (on the button that comes up when you've recently pushed to a branch on your fork of the repository), it extracts the title of the PR from the first line of the commit message (or some prefix of that first line), and then uses the rest of the commit message as the description, leaving out the first sentence itself.


Concrete example:

Consider this PR: rust-lang/rust#12154

Here is the commit that the title and description of that PR was based upon: pnkfelix/rust@d2d1129

But here is the merge commit that bors decided to create: rust-lang/rust@fd4979a

Notably, the first line of the original commit had the most important information about the commit, but it is missing from bors' merge.


Now, this is not a fatal bug, because:

  1. One can easily workaround it by copying the title into the description in the PR (or, if one prefers, formatting one's git commits with a title followed by a description that stands indpendently from the title).
  2. One can always follow the parents of the bors-merge in the commit graph to find the original commit's first line so no information has been lost.

But it would still be nice if Bors just copied the title into the commit message for the merge.

sort by date, oldest first

currently it sorts by state and explicit priority. within an explicit priority, it should sort by date so that old stuff gets picked up.

Add PR "rollups"

Rust frequently has a dozen small PR's in the queue and we are near our throughput limit for serially landing them, so we frequently "rollup" multiple branches into one PR. bors should have a simple way to do this automatically, maybe r+ rollup.

cc @alexcrichton

bors' version of github.py sometimes has json related tracebacks

Hit this today:
2013-07-25 09:03:01 PDT - INFO - ---------- starting run ----------
2013-07-25 09:03:01 PDT - INFO - loading bors.cfg
2013-07-25 09:03:01 PDT - INFO - loading pull reqs (page 1)
2013-07-25 09:03:03 PDT - INFO - loading pull reqs (page 2)
2013-07-25 09:03:03 PDT - INFO - loading pull and issue comments on pull #620
2013-07-25 09:03:05 PDT - INFO - loading head comments on sonwow/servo/bindings = 65d2ea2f
2013-07-25 09:03:06 PDT - INFO - loading statuses of sonwow/servo/bindings = 65d2ea2f
2013-07-25 09:03:06 PDT - INFO - loading mergeability of 620
2013-07-25 09:03:07 PDT - INFO - loading pull and issue comments on pull #619
Traceback (most recent call last):
File "/builds/bors/servo/bin/bors", line 9, in
load_entry_point('bors==1.1', 'console_scripts', 'bors')()
File "/builds/bors/servo/lib/python2.7/site-packages/bors.py", line 548, in main
all_pulls ]
File "/builds/bors/servo/lib/python2.7/site-packages/bors.py", line 219, in init
self.get_pull_comments()
File "/builds/bors/servo/lib/python2.7/site-packages/bors.py", line 241, in get_pull_comments
cs = (self.dst().pulls(self.num).comments().get()
File "/builds/bors/servo/lib/python2.7/site-packages/github.py", line 184, in call
return self._gh._http(self._method, self._path, **kw)
File "/builds/bors/servo/lib/python2.7/site-packages/github.py", line 158, in _http
resp = JsonObject(code=e.code, json=json)
UnboundLocalError: local variable 'json' referenced before assignment

bors retried the same pull request over and over and over

We hit this today on the Servo Bors. Issue #617 was pushed by Bors, then Bors ran again and said it was running tests, and then every subsequent run pushed it again and again. The logs from the first three runs are below:
4055 2013-07-24 13:33:01 PDT - INFO - ---------- starting run ----------
4056 2013-07-24 13:33:01 PDT - INFO - loading bors.cfg
4057 2013-07-24 13:33:01 PDT - INFO - loading pull reqs (page 1)
4058 2013-07-24 13:33:02 PDT - INFO - loading pull reqs (page 2)
4059 2013-07-24 13:33:03 PDT - INFO - loading pull and issue comments on pull #617
4060 2013-07-24 13:33:04 PDT - INFO - loading head comments on kmcallister/servo/test-html = 350c0a61
4061 2013-07-24 13:33:06 PDT - INFO - loading statuses of kmcallister/servo/test-html = 350c0a61
4062 2013-07-24 13:33:06 PDT - INFO - loading mergeability of 617
4063 2013-07-24 13:33:07 PDT - INFO - loading pull and issue comments on pull #553
4064 2013-07-24 13:33:08 PDT - INFO - loading head comments on pcwalton/servo/cpu-rendering = 707846f5
4065 2013-07-24 13:33:10 PDT - INFO - loading statuses of pcwalton/servo/cpu-rendering = 707846f5
4066 2013-07-24 13:33:10 PDT - INFO - loading mergeability of 553
4067 2013-07-24 13:33:11 PDT - INFO - loading pull and issue comments on pull #439
4068 2013-07-24 13:33:13 PDT - INFO - loading head comments on yichoi/servo/current = a196dc17
4069 2013-07-24 13:33:14 PDT - INFO - loading statuses of yichoi/servo/current = a196dc17
4070 2013-07-24 13:33:14 PDT - INFO - loading mergeability of 439
4071 2013-07-24 13:33:18 PDT - INFO - got 3 open pull reqs
4072 2013-07-24 13:33:18 PDT - INFO - got 1 viable pull reqs
4073 2013-07-24 13:33:18 PDT - INFO - (2,0) : pull servo/servo#617 - kmcallister/servo/test-html = 350c0a61 - 'Add an HTML file where JavaScr'
4074 2013-07-24 13:33:18 PDT - INFO - working with most-ripe pull kmcallister/servo/test-html = 350c0a61
4075 2013-07-24 13:33:18 PDT - INFO - considering pull servo/servo#617 - kmcallister/servo/test-html = 350c0a61 - 'Add an HTML file where JavaSc r'
4076 2013-07-24 13:33:18 PDT - INFO - kmcallister/servo/test-html = 350c0a61 - found approval, advancing to test
4077 2013-07-24 13:33:19 PDT - INFO - resetting auto to master = fe91f6e2
4078 2013-07-24 13:33:20 PDT - INFO - merging kmcallister/servo/test-html = 350c0a61 into auto
4079 2013-07-24 13:33:22 PDT - INFO - kmcallister/servo/test-html = 350c0a61 merged ok, testing candidate = a1c02ded
4080 2013-07-24 13:33:23 PDT - INFO - kmcallister/servo/test-html = 350c0a61 - setting status: pending ({'target_url': 'servo/servo@a1c02ded3c a015af430d42f294326c5ec12c2c32', 'description': 'running tests'})

4081 2013-07-24 13:36:01 PDT - INFO - ---------- starting run ----------
4082 2013-07-24 13:36:01 PDT - INFO - loading bors.cfg
4083 2013-07-24 13:36:01 PDT - INFO - loading pull reqs (page 1)
4084 2013-07-24 13:36:02 PDT - INFO - loading pull reqs (page 2)
4085 2013-07-24 13:36:03 PDT - INFO - loading pull and issue comments on pull #617
4086 2013-07-24 13:36:04 PDT - INFO - loading head comments on kmcallister/servo/test-html = 350c0a61
4087 2013-07-24 13:36:05 PDT - INFO - loading statuses of kmcallister/servo/test-html = 350c0a61
4088 2013-07-24 13:36:05 PDT - INFO - loading mergeability of 617
4089 2013-07-24 13:36:06 PDT - INFO - loading pull and issue comments on pull #553
4090 2013-07-24 13:36:08 PDT - INFO - loading head comments on pcwalton/servo/cpu-rendering = 707846f5
4091 2013-07-24 13:36:09 PDT - INFO - loading statuses of pcwalton/servo/cpu-rendering = 707846f5
4092 2013-07-24 13:36:09 PDT - INFO - loading mergeability of 553
4093 2013-07-24 13:36:10 PDT - INFO - loading pull and issue comments on pull #439
4094 2013-07-24 13:36:11 PDT - INFO - loading head comments on yichoi/servo/current = a196dc17
4095 2013-07-24 13:36:13 PDT - INFO - loading statuses of yichoi/servo/current = a196dc17
4096 2013-07-24 13:36:13 PDT - INFO - loading mergeability of 439
4097 2013-07-24 13:36:15 PDT - INFO - test ref 'auto' = a1c02ded, parents: 'master' = fe91f6e2 and candidate = 350c0a61
4098 2013-07-24 13:36:15 PDT - INFO - candidate = 350c0a61 found in pull req kmcallister/servo/test-html = 350c0a61
4099 2013-07-24 13:36:15 PDT - INFO - got 3 open pull reqs
4100 2013-07-24 13:36:15 PDT - INFO - got 1 viable pull reqs
4101 2013-07-24 13:36:15 PDT - INFO - (3,0) : pull servo/servo#617 - kmcallister/servo/test-html = 350c0a61 - 'Add an HTML file where JavaScr'
4102 2013-07-24 13:36:15 PDT - INFO - working with most-ripe pull kmcallister/servo/test-html = 350c0a61
4103 2013-07-24 13:36:15 PDT - INFO - considering pull servo/servo#617 - kmcallister/servo/test-html = 350c0a61 - 'Add an HTML file where JavaSc r'
4104 2013-07-24 13:36:15 PDT - INFO - kmcallister/servo/test-html = 350c0a61 - found pending state, checking tests
4105 2013-07-24 13:36:15 PDT - INFO - loading build/test status from buildbot
4106 2013-07-24 13:36:15 PDT - INFO - fetching http://servo-buildbot.pub.build.mozilla.org/json/builders/linux/builds?select=-1&select=-2&select=-3&select=-4&select=-5
4107 2013-07-24 13:36:16 PDT - INFO - fetching http://servo-buildbot.pub.build.mozilla.org/json/builders/mac/builds?select=-1&select=-2&select=-3&select=-4&select=-5
4108 2013-07-24 13:36:16 PDT - INFO - missing info sha a1c02ded3ca015af430d42f294326c5ec12c2c32
4109 2013-07-24 13:36:16 PDT - INFO - kmcallister/servo/test-html = 350c0a61 - no info yet, waiting on tests

4110 2013-07-24 13:39:02 PDT - INFO - ---------- starting run ----------
4111 2013-07-24 13:39:02 PDT - INFO - loading bors.cfg
4112 2013-07-24 13:39:02 PDT - INFO - loading pull reqs (page 1)
4113 2013-07-24 13:39:03 PDT - INFO - loading pull reqs (page 2)
4114 2013-07-24 13:39:03 PDT - INFO - loading pull and issue comments on pull #617
4115 2013-07-24 13:39:05 PDT - INFO - loading head comments on kmcallister/servo/test-html = 350c0a61
4116 2013-07-24 13:39:06 PDT - INFO - loading statuses of kmcallister/servo/test-html = 350c0a61
4117 2013-07-24 13:39:06 PDT - INFO - loading mergeability of 617
4118 2013-07-24 13:39:07 PDT - INFO - loading pull and issue comments on pull #553
4119 2013-07-24 13:39:08 PDT - INFO - loading head comments on pcwalton/servo/cpu-rendering = 707846f5
4120 2013-07-24 13:39:10 PDT - INFO - loading statuses of pcwalton/servo/cpu-rendering = 707846f5
4121 2013-07-24 13:39:10 PDT - INFO - loading mergeability of 553
4122 2013-07-24 13:39:10 PDT - INFO - loading pull and issue comments on pull #439
4123 2013-07-24 13:39:12 PDT - INFO - loading head comments on yichoi/servo/current = a196dc17
4124 2013-07-24 13:39:13 PDT - INFO - loading statuses of yichoi/servo/current = a196dc17
4125 2013-07-24 13:39:13 PDT - INFO - loading mergeability of 439
4126 2013-07-24 13:39:16 PDT - INFO - test ref 'auto' = a1c02ded, parents: 'master' = fe91f6e2 and candidate = 350c0a61
4127 2013-07-24 13:39:16 PDT - INFO - candidate = 350c0a61 found in pull req kmcallister/servo/test-html = 350c0a61
4128 2013-07-24 13:39:16 PDT - INFO - got 3 open pull reqs
4129 2013-07-24 13:39:16 PDT - INFO - got 1 viable pull reqs
4130 2013-07-24 13:39:16 PDT - INFO - (2,0) : pull servo/servo#617 - kmcallister/servo/test-html = 350c0a61 - 'Add an HTML file where JavaScr'
4131 2013-07-24 13:39:16 PDT - INFO - working with most-ripe pull kmcallister/servo/test-html = 350c0a61
4132 2013-07-24 13:39:16 PDT - INFO - considering pull servo/servo#617 - kmcallister/servo/test-html = 350c0a61 - 'Add an HTML file where JavaSc r'
4133 2013-07-24 13:39:16 PDT - INFO - kmcallister/servo/test-html = 350c0a61 - found approval, advancing to test
4134 2013-07-24 13:39:18 PDT - INFO - resetting auto to master = fe91f6e2
4135 2013-07-24 13:39:18 PDT - INFO - merging kmcallister/servo/test-html = 350c0a61 into auto
4136 2013-07-24 13:39:20 PDT - INFO - kmcallister/servo/test-html = 350c0a61 merged ok, testing candidate = 513c09c3
4137 2013-07-24 13:39:21 PDT - INFO - kmcallister/servo/test-html = 350c0a61 - setting status: pending ({'target_url': 'servo/servo@513c09c372 e1cad69339976ea46ea8082b6ed11c', 'description': 'running tests'})

The builds from the original push didn't hit any issues (http://buildbot-master-servo-01.srv.servo.releng.use1.mozilla.com:8001/builders/linux/builds/157 and http://buildbot-master-servo-01.srv.servo.releng.use1.mozilla.com:8001/builders/mac/builds/128).

The only code that sets PENDING is this block: https://github.com/graydon/bors/blob/master/bors.py#L401, so I presume that the pendings vs. retries comparison is ending up in APPROVAL. I don't know why, though.

add PR id to comments posted on commit

It is sometimes hard to backtrack from the comments that bors leaves on a github commit over to the original Pull Request that prompted bors to attempt a merge.

It seems like bors should be able to include a link to the PR in the comment it leaves.

This would ease (for example) going to see if the author has posted a follow-up commit fixing the errors that bors found on its first merge attempt.

feature req: bors queue should also link to head commit

There is a problem with the bors UX.

It is documented on discussion here: rust-lang/rust#13157 (comment)

The summary is that github presents commits in a PR in chronological order, not topological order. So it is easy for a reviewer to mistakenly put the r+ mark on a non-head commit.

To work-around this, it would be nice if the bors queue would present a link to the head commit for a PR.


(As a side-feature, it might also be good if bors somehow indicated if there is already an r+ mark on any commit other than the head one in the PR, so that people reviewing the queue could easily see if if a given PR has already been ("partially") reviewed and/or if the reviewer may have mistakenly put the r+ on the wrong commit.

Retry command is too picky

The code specifically matches on '@username: retry'. The colon shouldn't be necessary. And it should allow you to retry on the pull-request itself with a sha: '@username retry deadbeef'.

Scream loudly when something breaks

We often end up noticing that bors has been sitting silently after claiming to be testing some new PR; it turns out that if the commit author doesn't match the github account email (or the if the github account doesn't have an email) then bors decides to sulk quietly instead of telling anybody about the problem.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.