From 66dd744d75d4b518326791cf7c18bddeb5631b03 Mon Sep 17 00:00:00 2001 From: Natalia Pozhidaeva Date: Mon, 5 Feb 2024 22:38:13 -0500 Subject: [PATCH] [#1459] Add a check for .rultor.yml file --- .github/workflows/codecov.yml | 1 + .../agents/github/qtn/CheckablePull.java | 156 ++++++++++++++++++ .../com/rultor/agents/github/qtn/QnMerge.java | 27 +-- src/main/resources/phrases_en_US.properties | 2 + 4 files changed, 167 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/rultor/agents/github/qtn/CheckablePull.java diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index f055ed25fc..fffaf995ce 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -22,5 +22,6 @@ jobs: - run: mvn install -Pjacoco - uses: codecov/codecov-action@v4 with: + token: ${{ secrets.CODECOV_TOKEN }} file: ./target/site/jacoco/jacoco.xml fail_ci_if_error: true diff --git a/src/main/java/com/rultor/agents/github/qtn/CheckablePull.java b/src/main/java/com/rultor/agents/github/qtn/CheckablePull.java new file mode 100644 index 0000000000..0e8ddf0ad4 --- /dev/null +++ b/src/main/java/com/rultor/agents/github/qtn/CheckablePull.java @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2009-2024 Yegor Bugayenko + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: 1) Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. 2) Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. 3) Neither the name of the rultor.com nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.rultor.agents.github.qtn; + +import com.jcabi.aspects.Immutable; +import com.jcabi.github.*; +import javax.json.JsonObject; +import java.io.IOException; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * Checkable pull request. + * + * @author Yegor Bugayenko (yegor256@gmail.com) + * @since 2.0 + */ +@Immutable +@ToString +@EqualsAndHashCode +public class CheckablePull implements Pull { + /** + * Pull request. + */ + private Pull pull; + + /** + * Ctor. + * @param pull Pull to validate + */ + public CheckablePull(final Pull pull) { + this.pull = pull; + } + @Override + public Repo repo() { + return pull.repo(); + } + + @Override + public int number() { + return pull.number(); + } + + @Override + public PullRef base() throws IOException { + return pull.base(); + } + + @Override + public PullRef head() throws IOException { + return pull.head(); + } + + @Override + public Iterable commits() throws IOException { + return pull.commits(); + } + + @Override + public Iterable files() throws IOException { + return pull.files(); + } + + @Override + public void merge(String s) throws IOException { + pull.merge(s); + } + + @Override + public MergeState merge(String s, String s1) throws IOException { + return pull.merge(s, s1); + } + + @Override + public PullComments comments() throws IOException { + return pull.comments(); + } + + @Override + public Checks checks() throws IOException { + return pull.checks(); + } + + @Override + public void patch(JsonObject jsonObject) throws IOException { + pull.patch(jsonObject); + } + + @Override + public JsonObject json() throws IOException { + return pull.json(); + } + + @Override + public int compareTo(Pull o) { + return pull.compareTo(o); + } + + /** + * Checks if all checks are successful. + * @return True if all checks are successful + * @throws IOException If fails + */ + public boolean allChecksSuccessful() throws IOException { + boolean result = true; + for (final Check check : pull.checks().all()) { + if (!check.successful()) { + result = false; + break; + } + } + return result; + } + + /** + * Checks if file is affected by pull request. + * @param fileName File name to check + * @return True if all checks are successful + * @throws IOException If fails + */ + public boolean containsFile(String fileName) throws IOException { + for (final JsonObject file : pull.files()) { + if (file.getString("filename").equals(fileName)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/rultor/agents/github/qtn/QnMerge.java b/src/main/java/com/rultor/agents/github/qtn/QnMerge.java index e5b80c3655..be1790a000 100644 --- a/src/main/java/com/rultor/agents/github/qtn/QnMerge.java +++ b/src/main/java/com/rultor/agents/github/qtn/QnMerge.java @@ -77,7 +77,14 @@ public Req understand(final Comment.Smart comment, this, "merge request found in %s#%d, comment #%d", issue.repo().coordinates(), issue.number(), comment.number() ); - if (QnMerge.allChecksSuccessful(issue.pull())) { + final CheckablePull mr = new CheckablePull(issue.pull()); + if (mr.containsFile(".rultor.yml")) { + new Answer(comment).post( + false, + QnMerge.PHRASES.getString("QnMerge.system-files-affected") + ); + req = Req.DONE; + } else if (mr.allChecksSuccessful()) { new Answer(comment).post( true, String.format( @@ -173,22 +180,4 @@ private static Req pack(final Comment.Smart comment, return req; } - /** - * Checks if all checks are successful. - * @param pull Pull - * @return True if all checks are successful - * @throws IOException If fails - */ - private static boolean allChecksSuccessful(final Pull pull) - throws IOException { - boolean result = true; - for (final Check check : pull.checks().all()) { - if (!check.successful()) { - result = false; - break; - } - } - return result; - } - } diff --git a/src/main/resources/phrases_en_US.properties b/src/main/resources/phrases_en_US.properties index c43c9138eb..5d2589e721 100644 --- a/src/main/resources/phrases_en_US.properties +++ b/src/main/resources/phrases_en_US.properties @@ -36,6 +36,8 @@ QnMerge.checks-are-failed=Can't merge it. Some CI checks were failed. \ Apparently, the pull request is not ready to be \ merged since it has some problems. \ Please, fix them first. +QnMerge.system-files-affected=Can't merge it. File `.rultor.yml` is affected by \ + this pull request. QnDeploy.start=OK, I'll try to deploy now. You can check the progress [here](%s)