-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
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
[feature] - Clear approvals if new commit is pushed #5997
Comments
I searched for a similar issue but could not find one |
+1 |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs during the next 2 weeks. Thank you for your contributions. |
We should give an option on protected branch to allow reset or not. |
👮♂️ In our current workflow, we would like to be able to reset approvals completely if someone pushes a new commit on the PR. We've had some ninja pushes to repo's like that in the past and this feature would enforce our workflow |
FYI, GitHub has this feature as "Dismiss stale pull request approvals when new commits are pushed". https://help.github.com/assets/images/help/repository/PR-reviews-required.png |
Yes, we also need an option on protected branch just like github. |
Should there be commits which do not trigger stale approvals? I am mainly thinking of merges with the target branch, if the diff has not changed the review would still be valid? I think that will be the hardest part of this issue to solve, if needed. |
I agree. That shouldn't mean a rollback in approvals. |
But only merges from PR target branch can be skipped ;) |
@lafriks Yeah, but is that sufficient condition? A normal case is to solve merge conflicts when doing merges, meaning the diff to the target branch will not be the same. Would old approvals still count in that case? There are even people doing completely unrelated changes in a merge commit. 😱 Thus I was more thinking it was necessary to check if the diff to the target branch was changed (diff the diff 😄 ). I did some initial tests how GitHub is handling this, and they don't stale approvals on merges. However I have not tested these scenarios. |
In my opinion every commit (except empty ones) should invalidate approvals. |
If the diff to the target branch doesn't change by a commit (this includes clean merge commits), I don't think the content of the PR has changed and thus invalidating approvals should preferably not be done. But implementation-wise it will be much easier to just invalidate at every commit, so if acceptable that could be an initial approach. |
I looked a bit on this. To know if a new push will affect the PR diff (to target branch), it is necessary to compare the two diffs (diff between merge base and old commit and new commit respectively). Additionaly the git diff includes which two commits a file differ, this has to be ignored because it can update even if the diff will not (see line starting with_index_ below).
As there was recently a change to not store the patch on file (PR #9302), the old diff will have to be calculated again. |
Ok. How can we uniquely define a patch? Essentially it the difference between two shas. So when we approve we need to store the current head and current base SHAs. Head SHA is simple, it's the pulls ref for this PR. Base branch SHA is a bit more difficult but could be set as another ref. How do we account for force pushes? here's where things are more difficult. We will have to check the differences using the base repo pulls heads before these are updated. It's also here that we should generate the diffs to send to watchers. Now how do we check if these are different diffs? Well we could just generate the patches to a temporary file or perhaps better we could apply the old patch to an index from the new base SHA and then ensure there is no diff on the new head SHA - returning the diff between these if there is one. Hopefully that makes some sense. |
@zeripath I don't think we need to store anything at approve time. If a push causes approvals to become stale it would make all approvals for that PR stale. For sure someone might force-push the old SHA back and make the approval valid again, but IMO we don't need to consider that case. So my idea is either
|
Pushes to base branch: In my opinion this should not make approvals stale / require re-review. If there are merge conflicts that would require re-review after that has been fixed. |
…#9532) Fix #5997. If a push causes the patch/diff of a PR towards target branch to change, all existing reviews for the PR will be set and shown as stale. New branch protection option to dismiss stale approvals are added. To show that a review is not based on the latest PR changes, an hourglass is shown
[x]
):Description
As a user, I want to be able to discard approvals automatically on my PR if a new commit has been pushed on my branch.
In our current workflow, we would like to be able to reset approvals completely if someone pushes a new commit on the PR. We've had some ninja pushes to repo's like that in the past and this feature would enforce our workflow.
I would imagine this feature being located in the branch section of the repository, when I enable protected branches, it would be an additional checkbox titled :
[x] Reset approvals on push
I know github doesn't have this feature (last time I checked), but bitbucket and gitlab do have it and can be very useful for larger teams with a lot of juniors.
On the technical side of things, I would imagine it being some sort of pre-commit hook that would check if there is a pull request, and on that pull request if there were approvals, and remove them if there were.
The text was updated successfully, but these errors were encountered: