RFR: 1997: Allow the creator of a PR to set the commit author

Erik Joelsson erikj at openjdk.org
Fri Sep 1 14:20:08 UTC 2023

On Thu, 31 Aug 2023 22:42:46 GMT, Zhao Song <zsong at openjdk.org> wrote:

> In this pr, we will introduce a new pull request command `/author`.
> If an author wants to contribute a change to a repository, but he doesn't have access, then someone with the access will be able to help him with this command.
> Usage: `/author [set|remove] [@user | openjdk-user | Full Name <email at address>]`
> Examples: 
> `/author set @openjdk-bot`
> `/author @openjdk-bot`
> `/author set J. Duke <duke at openjdk.org>`
> `/author remove @openjdk-bot`
> `/author remove`
> Note: only Committers of the repository would be allowed to issue /author command.

Looks pretty good. I have some suggestions for language to make it clearer to users and a minor optimization.

bots/pr/src/main/java/org/openjdk/skara/bots/pr/AuthorCommand.java line 55:

> 53:     public void handle(PullRequestBot bot, PullRequest pr, CensusInstance censusInstance, ScratchArea scratchArea, CommandInvocation command, List<Comment> allComments, PrintWriter reply) {
> 54:         if (!command.user().equals(pr.author())) {
> 55:             reply.println("Only the author (@" + pr.author().username() + ") is allowed to issue the `author` command.");


            reply.println("Only the pull request author (@" + pr.author().username() + ") is allowed to issue the `author` command.");

bots/pr/src/main/java/org/openjdk/skara/bots/pr/AuthorCommand.java line 60:

> 58: 
> 59:         if (!censusInstance.isCommitter(pr.author())) {
> 60:             reply.println("Only committers in this [project](https://openjdk.org/census#" + censusInstance.project().name() + ") are allowed to issue the `author` command.");

I think we should link to the definition of Committer instead (like we do for Reviewers in the BackportCommand). A census link would have to be conditional on which census this repository is using.

            reply.println("Only [Committers](https://openjdk.org/bylaws#committer) are allowed to issue the `author` command.");

bots/pr/src/main/java/org/openjdk/skara/bots/pr/AuthorCommand.java line 91:

> 89:                 }
> 90:                 reply.println(Authors.setAuthorMarker(author.get()));
> 91:                 reply.println("Author of this pull request has been set to `" + author.get() + "` successfully.");

I think we need to change the language a bit. Claiming that the author of the pull request has changed can be confusing, because the author isn't actually changing in the forge. I think "pull request author" and "overriding author" are better terms. 

                reply.println("Setting overriding author to `" + author.get() + "`. When this pull request is integrated, the overriding author will be used in the commit.");

bots/pr/src/main/java/org/openjdk/skara/bots/pr/AuthorCommand.java line 112:

> 110:                     if (currAuthor.get().equals(author.get())) {
> 111:                         reply.println(Authors.removeAuthorMarker(author.get()));
> 112:                         reply.println("Author `" + author.get() + "` successfully removed.");


                        reply.println("Overriding author `" + author.get() + "` was successfully removed. When this pull request is integrated, the pull request author will be the author of the commit.");

bots/pr/src/main/java/org/openjdk/skara/bots/pr/AuthorCommand.java line 115:

> 113:                     } else {
> 114:                         reply.println("`" + author.get() + "` was not set to this pull request's author.");
> 115:                         reply.println("Current author of this pull request is set to: `" + currAuthor.get() + "`");


                        reply.println("Cannot remove `" + author.get() + "`, the overriding author is currently set to: `" + currAuthor.get() + "`");

bots/pr/src/main/java/org/openjdk/skara/bots/pr/AuthorCommand.java line 125:

> 123:     @Override
> 124:     public String description() {
> 125:         return "sets or removes author for a PR";


        return "sets an overriding author used in the final commit when the PR is integrated";

bots/pr/src/main/java/org/openjdk/skara/bots/pr/Authors.java line 32:

> 30: import java.util.regex.*;
> 31: 
> 32: class Authors {

I think this class should be just `Author` since we can never set more than one , or perhaps `OverridingAuthor` to make it even clearer what it is.

bots/pr/src/main/java/org/openjdk/skara/bots/pr/CheckablePullRequest.java line 181:

> 179:         }
> 180: 
> 181:         var authorSet = Authors.author(pr.repository().forge().currentUser(), pr.comments());

Calling `pr.comments()` here is a remote call so rather expensive. It's already done in `commitMessage`. We could at least make sure we only call it once. Looking a bit further, I see that in all places where a `CheckablePullRequest` is created, we already have a list of comments, so I think an even better solution here is to add a `comments` field and supply it to the constructor. 

I think the variable name can be clearer.

        var overridingAuthor = Authors.author(pr.repository().forge().currentUser(), pr.comments());


PR Review: https://git.openjdk.org/skara/pull/1553#pullrequestreview-1606986111
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313064434
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313058552
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313063169
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313066662
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313072027
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313077939
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313049494
PR Review Comment: https://git.openjdk.org/skara/pull/1553#discussion_r1313078472

More information about the skara-dev mailing list