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