Fixed algorithm to build maintainer file ref
Rules for forming valid maintainer file ref are:
- If branch section is wildcard - file ref will be created
as combination of branch name part without wildcard + fileref
- If branch sections is not wildcard - name of the branch it self
will be used as ref(fileref ignored)
- If branch section does not contain refs/heads/
(for example wildcard like refs/*) - use refs/heads/ + fileref
Change-Id: Iee32c5e52b44ae39e625dcc68104ca7e7469f3c3
Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
diff --git a/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java b/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
index 4e8acb1..ca6d23c 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
@@ -116,9 +116,8 @@
final RevCommit parent = getRevCommit(revWalk, headCommit.getParent(0).getId());
LOG.info("Finding most recent maintainers file in {}", parent);
-
final String parentIdName = parent.getId().getName();
- LOG.info("Parent id name {}", parentIdName);
+ LOG.info("Parent commit : {}| id {}", parent.getShortMessage(), parentIdName);
try (TreeWalk treeWalk = new TreeWalk(repository)) {
treeWalk.addTree(parent.getTree());
@@ -132,10 +131,11 @@
ObjectLoader loader = repository.open(objectId);
// and then one can the loader to read the file
- final ByteArrayOutputStream out = new ByteArrayOutputStream();
- loader.copyTo(out);
- revWalk.dispose();
- return new String(out.toByteArray());
+ try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+ loader.copyTo(out);
+ revWalk.dispose();
+ return new String(out.toByteArray());
+ }
}
LOG.info("Maintainers file not found in commit {}, going deep", parent.getId());
diff --git a/src/main/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettings.java b/src/main/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettings.java
index 4005a27..17cbc3e 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettings.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettings.java
@@ -20,10 +20,9 @@
public class PluginBranchSpecificSettings {
- private static final String HEAD_PART = "/" + RefNames.HEAD;
-
private final String pluginUserName;
private final String branch;
+ private final boolean wildcardBranch;
private final String fileRef;
private final String localFilePath;
private final boolean allowMaintainersSubmit;
@@ -33,6 +32,7 @@
private PluginBranchSpecificSettings(final String pluginUserName,
final String branch,
+ final boolean wildcardBranch,
final String fileRef,
final String localFilePath,
final boolean allowMaintainersSubmit,
@@ -41,6 +41,7 @@
final boolean dislikeWarnings) {
this.pluginUserName = pluginUserName;
this.branch = branch;
+ this.wildcardBranch = wildcardBranch;
this.fileRef = fileRef;
this.localFilePath = localFilePath;
this.allowMaintainersSubmit = allowMaintainersSubmit;
@@ -65,8 +66,23 @@
return autoSubmit;
}
+ /**
+ * Rules for forming valid maintainer file ref are: <li>If branch section is wildcard - file ref will be created as
+ * combination of branch name part without wildcard + file ref</li> <li>If branch sections is not wildcard - name of
+ * the branch it self wil be used as ref </li> <li>If branch section does not contain refs/heads/ - use refs/heads/
+ * + fileref</li>
+ */
public String fullFileRef() {
- return branch.concat(fileRef);
+ // if for whatever reason someone uses some crazy wildcard like refs/*
+ if (!branch.contains(RefNames.REFS_HEADS)) {
+ return RefNames.REFS_HEADS + fileRef;
+ }
+
+ if (wildcardBranch) {
+ return branch + fileRef;
+ } else {
+ return branch;
+ }
}
public String getPluginUserName() {
@@ -77,23 +93,11 @@
return dislikeWarnings;
}
- @Override
- public String toString() {
- return "PluginBranchSpecificSettings{" +
- "pluginUserName='" + pluginUserName + '\'' +
- ", branch='" + branch + '\'' +
- ", fileRef='" + fileRef + '\'' +
- ", localFilePath='" + localFilePath + '\'' +
- ", allowMaintainersSubmit=" + allowMaintainersSubmit +
- ", autoAddReviewers=" + autoAddReviewers +
- ", autoSubmit=" + autoSubmit +
- ", dislikeWarnings=" + dislikeWarnings +
- '}';
- }
public static class PluginSettingsBuilder {
private String pluginUserName;
private String branch;
+ private boolean wildcardBranch;
private String fileRef;
private String localFilePath;
private boolean allowMaintainersSubmit;
@@ -101,16 +105,14 @@
private boolean autoSubmit;
private boolean dislikeWarnings;
- private static String reduceWildcard(String input) {
- return input.contains("*")
- ? input.substring(0, input.indexOf("*"))
- : input;
- }
-
- private static String addEndSlash(String input) {
- return input.endsWith("/")
- ? input
- : input.concat("/");
+ private String reduceWildcard(String input) {
+ if (input.endsWith("*")) {
+ wildcardBranch = true;
+ return input.substring(0, input.indexOf("*"));
+ } else {
+ wildcardBranch = false;
+ return input;
+ }
}
public PluginSettingsBuilder setPluginUserName(final String pluginUserName) {
@@ -119,8 +121,7 @@
}
public PluginSettingsBuilder setFileRef(final String fileRef) {
- // TODO - remove this replace if configuration will be changed
- this.fileRef = fileRef.replace(HEAD_PART, "");
+ this.fileRef = fileRef;
return this;
}
@@ -140,7 +141,7 @@
}
public PluginSettingsBuilder setBranch(final String branch) {
- this.branch = addEndSlash(reduceWildcard(branch));
+ this.branch = reduceWildcard(branch);
return this;
}
@@ -155,7 +156,7 @@
}
public PluginBranchSpecificSettings createPluginSettings() {
- return new PluginBranchSpecificSettings(pluginUserName, branch, fileRef, localFilePath,
+ return new PluginBranchSpecificSettings(pluginUserName, branch, wildcardBranch, fileRef, localFilePath,
allowMaintainersSubmit, autoAddReviewers, autoSubmit, dislikeWarnings);
}
}
diff --git a/src/test/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettingsTest.java b/src/test/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettingsTest.java
new file mode 100644
index 0000000..20273cb
--- /dev/null
+++ b/src/test/java/io/fd/maintainer/plugin/service/dto/PluginBranchSpecificSettingsTest.java
@@ -0,0 +1,54 @@
+package io.fd.maintainer.plugin.service.dto;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class PluginBranchSpecificSettingsTest {
+
+ @Test
+ public void getFileRefMaster() throws Exception {
+ final PluginBranchSpecificSettings pluginSettings = new PluginBranchSpecificSettings.PluginSettingsBuilder()
+ .setBranch("refs/heads/*")
+ .setFileRef("master")
+ .createPluginSettings();
+ assertEquals("refs/heads/master", pluginSettings.fullFileRef());
+ }
+
+ @Test
+ public void getFileRefMasterSpecific() throws Exception {
+ final PluginBranchSpecificSettings pluginSettings = new PluginBranchSpecificSettings.PluginSettingsBuilder()
+ .setBranch("refs/heads/master")
+ .setFileRef("master")
+ .createPluginSettings();
+ assertEquals("refs/heads/master", pluginSettings.fullFileRef());
+ }
+
+ @Test
+ public void getFileRefStable() throws Exception {
+ final PluginBranchSpecificSettings pluginSettings = new PluginBranchSpecificSettings.PluginSettingsBuilder()
+ .setBranch("refs/heads/stable/*")
+ .setFileRef("1707")
+ .createPluginSettings();
+ assertEquals("refs/heads/stable/1707", pluginSettings.fullFileRef());
+ }
+
+ @Test
+ public void getFileRefNonRefsHeadsWildcardMaster() throws Exception {
+ final PluginBranchSpecificSettings pluginSettings = new PluginBranchSpecificSettings.PluginSettingsBuilder()
+ .setBranch("refs/*")
+ .setFileRef("master")
+ .createPluginSettings();
+ assertEquals("refs/heads/master", pluginSettings.fullFileRef());
+ }
+
+ @Test
+ public void getFileRefNonRefsHeadsWildcardStable() throws Exception {
+ final PluginBranchSpecificSettings pluginSettings = new PluginBranchSpecificSettings.PluginSettingsBuilder()
+ .setBranch("refs/*")
+ .setFileRef("stable/1707")
+ .createPluginSettings();
+ assertEquals("refs/heads/stable/1707", pluginSettings.fullFileRef());
+ }
+
+}
\ No newline at end of file