Skip to content

Commit

Permalink
[yegor256#1459] Add a check for .rultor.yml file
Browse files Browse the repository at this point in the history
  • Loading branch information
pnatashap committed Feb 6, 2024
1 parent 2681197 commit 66dd744
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 19 deletions.
1 change: 1 addition & 0 deletions .github/workflows/codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
156 changes: 156 additions & 0 deletions src/main/java/com/rultor/agents/github/qtn/CheckablePull.java
Original file line number Diff line number Diff line change
@@ -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 ([email protected])
* @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<Commit> commits() throws IOException {
return pull.commits();
}

@Override
public Iterable<JsonObject> 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;
}
}
27 changes: 8 additions & 19 deletions src/main/java/com/rultor/agents/github/qtn/QnMerge.java
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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;
}

}
2 changes: 2 additions & 0 deletions src/main/resources/phrases_en_US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit 66dd744

Please sign in to comment.