]> source.dussan.org Git - jgit.git/commitdiff
DescribeCommand: use glob match instead of path match 30/141730/2
authorThomas Wolf <thomas.wolf@paranor.ch>
Tue, 30 Apr 2019 17:11:16 +0000 (19:11 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 7 Jun 2019 15:19:07 +0000 (17:19 +0200)
Otherwise tags may fail to match if their name contains slashes.
Canonical git also uses its wildcard matcher in glob mode.[1]

[1] https://github.com/git/git/blob/v2.21.0/builtin/describe.c#L182

Bug: 546703
Change-Id: I122c7959974fa1fc6a53dfc65837e4314a8badd4
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java

index fd3aa2884ac927f509fb46285ac8c799da167ad6..df9ae6a0fb61f20334d7e498475fed4864103169 100644 (file)
@@ -421,6 +421,23 @@ public class DescribeCommandTest extends RepositoryTestCase {
                }
        }
 
+       @Test
+       public void globMatchWithSlashes() throws Exception {
+               ObjectId c1 = modify("aaa");
+               tag("a/b/version");
+               ObjectId c2 = modify("bbb");
+               tag("a/b/version2");
+               if (useAnnotatedTags || describeUseAllTags) {
+                       assertEquals("a/b/version", describe(c1, "*/version*"));
+                       assertEquals("a/b/version2", describe(c2, "*/version*"));
+               } else {
+                       assertNull(describe(c1));
+                       assertNull(describe(c1, "*/version*"));
+                       assertNull(describe(c2));
+                       assertNull(describe(c2, "*/version*"));
+               }
+       }
+
        private ObjectId merge(ObjectId c2) throws GitAPIException {
                return git.merge().include(c2).call().getNewHead();
        }
index db3a3d947dbac455e121173b215918d4e8f020f0..9ad77e65fdbbfea258da2f66a720ffd3591ebaff 100644 (file)
@@ -63,8 +63,7 @@ import org.eclipse.jgit.api.errors.RefNotFoundException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.InvalidPatternException;
 import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.ignore.internal.IMatcher;
-import org.eclipse.jgit.ignore.internal.PathMatcher;
+import org.eclipse.jgit.fnmatch.FileNameMatcher;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -104,7 +103,7 @@ public class DescribeCommand extends GitCommand<String> {
        /**
         * Pattern matchers to be applied to tags under consideration.
         */
-       private List<IMatcher> matchers = new ArrayList<>();
+       private List<FileNameMatcher> matchers = new ArrayList<>();
 
        /**
         * Whether to use all tags (incl. lightweight) or not.
@@ -242,7 +241,7 @@ public class DescribeCommand extends GitCommand<String> {
         */
        public DescribeCommand setMatch(String... patterns) throws InvalidPatternException {
                for (String p : patterns) {
-                       matchers.add(PathMatcher.createPathMatcher(p, null, false));
+                       matchers.add(new FileNameMatcher(p, null));
                }
                return this;
        }
@@ -275,9 +274,15 @@ public class DescribeCommand extends GitCommand<String> {
                        // Find the first tag that matches in the stream of all tags
                        // filtered by matchers ordered by tie break order
                        Stream<Ref> matchingTags = Stream.empty();
-                       for (IMatcher matcher : matchers) {
+                       for (FileNameMatcher matcher : matchers) {
                                Stream<Ref> m = tags.stream().filter(
-                                               tag -> matcher.matches(tag.getName(), false, false));
+                                               tag -> {
+                                                       matcher.append(
+                                                                       tag.getName().substring(R_TAGS.length()));
+                                                       boolean result = matcher.isMatch();
+                                                       matcher.reset();
+                                                       return result;
+                                               });
                                matchingTags = Stream.of(matchingTags, m).flatMap(i -> i);
                        }
                        return matchingTags.sorted(TAG_TIE_BREAKER).findFirst();