* [PATCH 1/2] Create a fnmatch-style pattern TreeFilter
@ 2008-06-22 23:25 Robin Rosenberg
2008-06-22 23:25 ` [PATCH 2/2] LsTree: Enable pattern matching in LsTree Robin Rosenberg
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Robin Rosenberg @ 2008-06-22 23:25 UTC (permalink / raw)
To: git; +Cc: Shawn O. Pearce, Marek Zawirski, Florian Koeberle,
Robin Rosenberg
This uses Florian's pattern matcher to perform the matching.
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
.../jgit/revwalk/filter/WildCardTreeFilter.java | 101 ++++++++++++++++++++
1 files changed, 101 insertions(+), 0 deletions(-)
create mode 100644 org.spearce.jgit/src/org/spearce/jgit/revwalk/filter/WildCardTreeFilter.java
diff --git a/org.spearce.jgit/src/org/spearce/jgit/revwalk/filter/WildCardTreeFilter.java b/org.spearce.jgit/src/org/spearce/jgit/revwalk/filter/WildCardTreeFilter.java
new file mode 100644
index 0000000..fd75458
--- /dev/null
+++ b/org.spearce.jgit/src/org/spearce/jgit/revwalk/filter/WildCardTreeFilter.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - 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.
+ *
+ * - Neither the name of the Git Development Community 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 OWNER 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 org.spearce.jgit.revwalk.filter;
+
+import java.io.IOException;
+
+import org.spearce.jgit.errors.IncorrectObjectTypeException;
+import org.spearce.jgit.errors.InvalidPatternException;
+import org.spearce.jgit.errors.MissingObjectException;
+import org.spearce.jgit.fnmatch.FileNameMatcher;
+import org.spearce.jgit.treewalk.TreeWalk;
+import org.spearce.jgit.treewalk.filter.TreeFilter;
+
+/**
+ * This class implements a TreeeFilter that uses the wildcard style pattern
+ * matching like of Posix fnmatch function.
+ */
+public class WildCardTreeFilter extends TreeFilter {
+
+ private final FileNameMatcher matcher;
+
+ private final String pattern;
+
+ protected WildCardTreeFilter(final String pattern) {
+ try {
+ this.pattern = pattern;
+ matcher = new FileNameMatcher(pattern, null);
+ } catch (InvalidPatternException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ @Override
+ public TreeFilter clone() {
+ return new WildCardTreeFilter(pattern);
+ }
+
+ @Override
+ public boolean include(TreeWalk walker) throws MissingObjectException,
+ IncorrectObjectTypeException, IOException {
+ matcher.reset();
+ matcher.append(walker.getPathString());
+ if (matcher.isMatch())
+ return true;
+ return false;
+ }
+
+ @Override
+ public boolean shouldBeRecursive() {
+ return true;
+ }
+
+ /**
+ * Construct a WildCardmatcher like POSIX fnmatch.
+ *
+ * @param pattern
+ * A POSIX wildcard pattern
+ * @return a {@link TreeFilter} that matches pattern
+ * @throws IllegalArgumentException
+ * if the pattern is malformed
+ */
+ public static TreeFilter create(final String pattern) {
+ return new WildCardTreeFilter(pattern);
+ }
+
+}
--
1.5.5.1.178.g1f811
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] LsTree: Enable pattern matching in LsTree
2008-06-22 23:25 [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Robin Rosenberg
@ 2008-06-22 23:25 ` Robin Rosenberg
2008-06-23 0:27 ` [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Shawn O. Pearce
2008-06-23 17:32 ` Florian Köberle
2 siblings, 0 replies; 5+ messages in thread
From: Robin Rosenberg @ 2008-06-22 23:25 UTC (permalink / raw)
To: git; +Cc: Shawn O. Pearce, Marek Zawirski, Florian Koeberle,
Robin Rosenberg
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
.../src/org/spearce/jgit/pgm/LsTree.java | 19 +++++++++++++------
1 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/LsTree.java b/org.spearce.jgit/src/org/spearce/jgit/pgm/LsTree.java
index c242bd7..2cda485 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/pgm/LsTree.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/pgm/LsTree.java
@@ -41,10 +41,13 @@ import java.io.File;
import org.spearce.jgit.lib.Constants;
import org.spearce.jgit.lib.FileMode;
+import org.spearce.jgit.revwalk.filter.WildCardTreeFilter;
import org.spearce.jgit.treewalk.FileTreeIterator;
import org.spearce.jgit.treewalk.TreeWalk;
+import org.spearce.jgit.treewalk.filter.TreeFilter;
class LsTree extends TextBuiltin {
+
@Override
void execute(final String[] args) throws Exception {
final TreeWalk walk = new TreeWalk(db);
@@ -60,17 +63,21 @@ class LsTree extends TextBuiltin {
break;
}
- if (argi == args.length)
- throw die("usage: [-r] treename");
- else if (argi + 1 < args.length)
- throw die("too many arguments");
-
- final String n = args[argi];
+ final String n = args[argi++];
if (is_WorkDir(n))
walk.addTree(new FileTreeIterator(new File(n)));
else
walk.addTree(resolve(n));
+ if (argi == args.length - 1) {
+ TreeFilter filter = WildCardTreeFilter.create(args[argi++]);
+ walk.setFilter(filter);
+ }
+ if (argi + 1 == args.length)
+ throw die("usage: [-r] treename [pattern]");
+ else if (argi + 1 < args.length)
+ throw die("too many arguments");
+
while (walk.next()) {
final FileMode mode = walk.getFileMode(1);
if (mode == FileMode.TREE)
--
1.5.5.1.178.g1f811
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] Create a fnmatch-style pattern TreeFilter
2008-06-22 23:25 [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Robin Rosenberg
2008-06-22 23:25 ` [PATCH 2/2] LsTree: Enable pattern matching in LsTree Robin Rosenberg
@ 2008-06-23 0:27 ` Shawn O. Pearce
2008-06-23 17:32 ` Florian Köberle
2 siblings, 0 replies; 5+ messages in thread
From: Shawn O. Pearce @ 2008-06-23 0:27 UTC (permalink / raw)
To: Robin Rosenberg; +Cc: git, Marek Zawirski, Florian Koeberle
Robin Rosenberg <robin.rosenberg@dewire.com> wrote:
> +
> +package org.spearce.jgit.revwalk.filter;
This should be treewalk.filter, its a filter for tree entries.
> + * This class implements a TreeeFilter that uses the wildcard style pattern
fyi, minooooor typo on TreeFilter.
> +public class WildCardTreeFilter extends TreeFilter {
...
> + @Override
> + public boolean include(TreeWalk walker) throws MissingObjectException,
> + IncorrectObjectTypeException, IOException {
> + matcher.reset();
> + matcher.append(walker.getPathString());
> + if (matcher.isMatch())
> + return true;
> + return false;
> + }
Hmm.
It isn't as efficient as it could be. Obtaining the string of
the path is somewhat costly as we have to convert from the byte[]
to a char[] and then wrap that into a String, just to check the
pattern again. Its more accurate to convert to the string, but
it is a lot slower.
But I'm wondering about what happens when the TreeWalk is considering
a subtree path name. Does the matcher still match the pattern? By
that I mean lets say the pattern was:
src/xdiff/*.c
In this case the include method is first called with the path "src";
if it returns false the TreeWalk won't recurse into the subtree and
thus you'll never get to consider "src/xdiff" or "src/xdiff/foo.c".
--
Shawn.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] Create a fnmatch-style pattern TreeFilter
2008-06-22 23:25 [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Robin Rosenberg
2008-06-22 23:25 ` [PATCH 2/2] LsTree: Enable pattern matching in LsTree Robin Rosenberg
2008-06-23 0:27 ` [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Shawn O. Pearce
@ 2008-06-23 17:32 ` Florian Köberle
2008-06-23 17:43 ` [[JGIT PATCH]] Implementation of a copy constructor for FileNameMatcher Florian Köberle
2 siblings, 1 reply; 5+ messages in thread
From: Florian Köberle @ 2008-06-23 17:32 UTC (permalink / raw)
To: Robin Rosenberg; +Cc: git, Shawn O. Pearce, Marek Zawirski
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi Robin,
thank you for accepting my first patch :D.
| +/**
| + * This class implements a TreeeFilter that uses the wildcard style
pattern
| + * matching like of Posix fnmatch function.
| + */
Typo: One 'e' to much in TreeeFilter.
It would be more efficient to
| + @Override
| + public TreeFilter clone() {
| + return new WildCardTreeFilter(pattern);
| + }
One way to create a clone of the FileNameMatcher is to call:
originalMatcher.reset()
FileNameMatcher clone = originalMatcher.createMatcherForSuffix()
I will send a patch which implements a copy constructor for FileNameMatcher.
First I wanted to implement a clone() method, but found this page and
decided then to implement a copy constructor:
http://www.javapractices.com/topic/TopicAction.do?Id=71
A Implementor of a super class could imply that clone() of object gets
called, as stated in the javadoc of clone():
quote (javadoc ob Object#clone()):
- -----------
By convention, the returned object should be obtained by calling super.clone
- -----------
I think this is a bad convention, as one should not rely on
Object#clone() to do the copy job for one. If you really need a clone
method then I would do it the same way you did, by calling a constructor
which does the job.
Best regards,
Florian
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFIX94k59ca4mzhfxMRAgDjAJ9S76L8I5Lqed4lKfgTf+2cp2IQ9gCfQNVh
z72+NGvmIy3H0gwveKRfn+w=
=wnpy
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 5+ messages in thread
* [[JGIT PATCH]] Implementation of a copy constructor for FileNameMatcher.
2008-06-23 17:32 ` Florian Köberle
@ 2008-06-23 17:43 ` Florian Köberle
0 siblings, 0 replies; 5+ messages in thread
From: Florian Köberle @ 2008-06-23 17:43 UTC (permalink / raw)
To: git; +Cc: robin.rosenberg, spearce, Florian Köberle
Signed-off-by: Florian Köberle <florianskarten@web.de>
---
.../spearce/jgit/fnmatch/FileNameMatcherTest.java | 31 ++++++++++++++++++++
.../org/spearce/jgit/fnmatch/FileNameMatcher.java | 30 +++++++++++++++++--
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/fnmatch/FileNameMatcherTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/fnmatch/FileNameMatcherTest.java
index ad72ac8..0c9501b 100644
--- a/org.spearce.jgit.test/tst/org/spearce/jgit/fnmatch/FileNameMatcherTest.java
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/fnmatch/FileNameMatcherTest.java
@@ -723,4 +723,35 @@ public class FileNameMatcherTest extends TestCase {
assertEquals(true, childMatcher.isMatch());
assertEquals(false, childMatcher.canAppendMatch());
}
+
+ public void testCopyConstructor() throws Exception {
+ final String pattern = "helloworld";
+ final FileNameMatcher matcher = new FileNameMatcher(pattern, null);
+ matcher.append("hello");
+ final FileNameMatcher copy = new FileNameMatcher(matcher);
+ assertEquals(false, matcher.isMatch());
+ assertEquals(true, matcher.canAppendMatch());
+ assertEquals(false, copy.isMatch());
+ assertEquals(true, copy.canAppendMatch());
+ matcher.append("world");
+ assertEquals(true, matcher.isMatch());
+ assertEquals(false, matcher.canAppendMatch());
+ assertEquals(false, copy.isMatch());
+ assertEquals(true, copy.canAppendMatch());
+ copy.append("world");
+ assertEquals(true, matcher.isMatch());
+ assertEquals(false, matcher.canAppendMatch());
+ assertEquals(true, copy.isMatch());
+ assertEquals(false, copy.canAppendMatch());
+ copy.reset();
+ assertEquals(true, matcher.isMatch());
+ assertEquals(false, matcher.canAppendMatch());
+ assertEquals(false, copy.isMatch());
+ assertEquals(true, copy.canAppendMatch());
+ copy.append("helloworld");
+ assertEquals(true, matcher.isMatch());
+ assertEquals(false, matcher.canAppendMatch());
+ assertEquals(true, copy.isMatch());
+ assertEquals(false, copy.canAppendMatch());
+ }
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/fnmatch/FileNameMatcher.java b/org.spearce.jgit/src/org/spearce/jgit/fnmatch/FileNameMatcher.java
index 9ac1875..702f7b3 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/fnmatch/FileNameMatcher.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/fnmatch/FileNameMatcher.java
@@ -99,10 +99,23 @@ public class FileNameMatcher {
* must be a list which will never be modified.
*/
private FileNameMatcher(final List<Head> headsStartValue) {
+ this(headsStartValue, headsStartValue);
+ }
+
+ /**
+ *
+ * @param headsStartValue
+ * must be a list which will never be modified.
+ * @param heads
+ * a list which will be cloned and then used as current head
+ * list.
+ */
+ private FileNameMatcher(final List<Head> headsStartValue,
+ final List<Head> heads) {
this.headsStartValue = headsStartValue;
- this.heads = new ArrayList<Head>(headsStartValue.size());
- this.heads.addAll(this.headsStartValue);
- this.listForLocalUseage = new ArrayList<Head>(headsStartValue.size());
+ this.heads = new ArrayList<Head>(heads.size());
+ this.heads.addAll(heads);
+ this.listForLocalUseage = new ArrayList<Head>(heads.size());
}
/**
@@ -120,6 +133,17 @@ public class FileNameMatcher {
this(createHeadsStartValues(patternString, invalidWildgetCharacter));
}
+ /**
+ * A Copy Constructor which creates a new {@link FileNameMatcher} with the
+ * same state and reset point like <code>other</code>.
+ *
+ * @param other
+ * another {@link FileNameMatcher} instance.
+ */
+ public FileNameMatcher(FileNameMatcher other) {
+ this(other.headsStartValue, other.heads);
+ }
+
private static List<Head> createHeadsStartValues(
final String patternString, final Character invalidWildgetCharacter)
throws InvalidPatternException {
--
1.5.4.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-06-23 17:45 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-22 23:25 [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Robin Rosenberg
2008-06-22 23:25 ` [PATCH 2/2] LsTree: Enable pattern matching in LsTree Robin Rosenberg
2008-06-23 0:27 ` [PATCH 1/2] Create a fnmatch-style pattern TreeFilter Shawn O. Pearce
2008-06-23 17:32 ` Florian Köberle
2008-06-23 17:43 ` [[JGIT PATCH]] Implementation of a copy constructor for FileNameMatcher Florian Köberle
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.