RFR: 1258: Add review link/details to comments section

Guoxiong Li gli at openjdk.java.net
Sat Dec 4 07:37:33 UTC 2021


On Fri, 3 Dec 2021 12:55:03 GMT, Guoxiong Li <gli at openjdk.org> wrote:

> Hi all,
> 
> This patch adds a comment to the jira issue when the corresponding PR is submitted. Because currently, the class `Issue` has no an api to remove a comment. So I need to create and implement it, too. And the test cases are added.
> 
> Thanks for taking the time to review.
> 
> Best Regards,
> -- Guoxiong

> > From the code, I guess you can see the second style. Is my guess right?
>
> You see the first one, as onNewCommit seems to be executing first. I have searched back JBS and the newest bugs with where the second style comment can be found were fixed for JDK 16, so before #784 (in these issues both comments are present).

The `see the first one` confused me. Please see the following code analysis.

The method `parseWebLinkComment` can only identify the comment lines `Remote link:` and `URL:`. 


    private static final Pattern titlePattern = Pattern.compile("^Remote link: (.*)");
    private static final Pattern urlPattern = Pattern.compile("^URL: (.*)");
    private static final Pattern summaryPattern = Pattern.compile("^Summary: (.*)");
    private static final Pattern relationshipPattern = Pattern.compile("^Relationship: (.*)");

    private Optional<Link> parseWebLinkComment(Comment comment) {
        var lines = comment.body().lines().collect(Collectors.toList());
        if ((lines.size() < 2 ) || (lines.size() > 4)) {
            return Optional.empty();
        }
        var titleMatcher = titlePattern.matcher(lines.get(0));  // <----  Remote link: XXXX
        var urlMatcher = urlPattern.matcher(lines.get(1));   // <----  URL: XXXX
        if (!titleMatcher.matches() || !urlMatcher.matches()) {   // <---- Both `Remote link:` and `URL:` should exist
            return Optional.empty();   // <---- if not, it will return Optional.empty()
        }
        // ignore other code...
    }
``` 

So when the #784 added the following code, the variable `alreadyPosted` just can identify the comment which has `Remote link:` and `URL:`. But it can't identify the comment created by the method `onNewCommit`, which has `Changeset: Author: Committer: Date: URL: `.


    private void addWebLinkAsComment(Link link) {
        var alreadyPosted = comments().stream()
                                      .map(this::parseWebLinkComment)
                                      .filter(Optional::isPresent)
                                      .map(Optional::get)
                                      .anyMatch(l -> l.uri().equals(link.uri()) && l.title().equals(link.title()));
        if (alreadyPosted) {
            return;
        }
        // ignore other code...
    }


As @rwestberg mentioned in the #784:

> Please review this change that avoids potentially posting the same Jira link comment multiple times.

The #784 only can avoid potentially posting **the same** Jira link comment multiple times.

And the method `onNewCommit` has the following code which can identify the comment created by `addWebLinkAsComment`. It only checks the url and not checks the other pattern, which is not like `parseWebLinkComment`.

``` 
    // only check the url
    var alreadyPostedComment = existingComments.stream()
            .filter(comment -> comment.author().equals(issueProject.issueTracker().currentUser()))
            .anyMatch(comment -> comment.body().contains(hashUrl) || comment.body().contains(shortHashUrl));
    if (!alreadyPostedComment) {
        issue.addComment(commitNotification);
    }


---

>From the code, we can simulate the run result.

**If the issues are public (I can see):**
1. if the `onNewCommit` runs earier than `onIntegratedPullRequest`.
  (1) The `onNewCommit` will create the comment as `Changeset: Author: Committer: Date: URL:`.
  (2) Then the `onIntegratedPullRequest` will  create the issue link for the commit.

  It is reasonable and expected.

2. if the `onIntegratedPullRequest` runs earier than `onNewCommit`.
  (1) The `onIntegratedPullRequest` will  create the issue link for the commit.
  (2) Then the `onNewCommit` will create the comment as `Changeset: Author: Committer: Date: URL:`.

  The result is the same as the point 1. And it is the situation I always see in the OpenJDK JBS.


**If the issues are confidential (not public) (I can't see):**
1. if the `onNewCommit` runs earier than `onIntegratedPullRequest`.
  (1) The `onNewCommit` will create the comment as `Changeset: Author: Committer: Date: URL:`.
  (2) Then the `onIntegratedPullRequest` runs. Because `parseWebLinkComment` can't identify the comment `Changeset: Author: Committer: Date: URL:`, so `onIntegratedPullRequest` creates another comment `Remote link:` and `URL:` for the commit.

  In this situation, there are two comments added. It is unexpected.

2. if the `onIntegratedPullRequest` runs earier than `onNewCommit`.  
  (1) The `onIntegratedPullRequest` runs. Because there is no comment now, so `onIntegratedPullRequest` creates comment `Remote link:  URL:` for the commit.
  (2) Then the `onNewCommit` runs. It only identifies the url, which can identify the comment `Remote link: URL:`. So it won't create the comment again.

  In this situation, only one comment like `Remote link:  URL:` is added to the issue. It is unexpected, too. Because @erikj79 said `see the first one`.

----

I think the problem is not in method `parseWebLinkComment` and `addWebLink`.  I re-read the code, it seems the problem is caused by the config `commitLink`.

In the public issues, the `commitLink` is `true`, so the issue link can be created by using the method `onIntegratedPullRequest`.
So the analysis above about this situation is right.


// method onIntegratedPullRequest
            if (commitLink) {   // <---- Here
                var linkBuilder = Link.create(repository.webUrl(hash), "Commit")
                                      .summary(repository.name() + "/" + hash.abbreviate());
                if (commitIcon != null) {
                    linkBuilder.iconTitle("Commit");
                    linkBuilder.iconUrl(commitIcon);
                }
                issue.addLink(linkBuilder.build());  // <---- if the commitLink is false, this line never runs.
            }


In the confidential issues, the `commitLink` is false, so the issue comment `Remote link:  URL:`  never be created because the `issue.addLink` never runs. And the method `onNewCommit` will always create the comment `Changeset: Author: Committer: Date: URL:`, which you can see in current confidential (oracle internal) issues.

Could I get your help to read the configuration about the `commitLink` to verify my suspection?

-------------

PR: https://git.openjdk.java.net/skara/pull/1250


More information about the skara-dev mailing list