]> source.dussan.org Git - jgit.git/commitdiff
Skip a number commits before starting to show the commit output 84/4884/9
authorTomasz Zarna <Tomasz.Zarna@pl.ibm.com>
Mon, 2 Jan 2012 16:40:02 +0000 (08:40 -0800)
committerKevin Sawicki <kevin@github.com>
Mon, 2 Jan 2012 16:40:02 +0000 (08:40 -0800)
Change-Id: Id2666d897d29b6371f7a6cf241cfda02964b4971
Signed-off-by: Kevin Sawicki <kevin@github.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/SkipRevFilterTest.java [new file with mode: 0644]
org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties
org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java
org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java [new file with mode: 0644]

index 6ceeb29ee7f7ad78a6c299b7c7987a81ad19a6d4..b9af9dc608a5721ea8a2464f103d91e2ee6cfcfc 100644 (file)
@@ -89,29 +89,66 @@ public class LogCommandTest extends RepositoryTestCase {
                assertFalse(log.hasNext());
        }
 
-       @Test
-       public void logAllCommitsWithMaxCount() throws Exception {
+       private List<RevCommit> createCommits(Git git) throws Exception {
                List<RevCommit> commits = new ArrayList<RevCommit>();
-               Git git = Git.wrap(db);
-
                writeTrashFile("Test.txt", "Hello world");
                git.add().addFilepattern("Test.txt").call();
                commits.add(git.commit().setMessage("commit#1").call());
-
                writeTrashFile("Test1.txt", "Hello world!");
                git.add().addFilepattern("Test1.txt").call();
                commits.add(git.commit().setMessage("commit#2").call());
-
                writeTrashFile("Test2.txt", "Hello world!!");
                git.add().addFilepattern("Test2.txt").call();
                commits.add(git.commit().setMessage("commit#3").call());
+               return commits;
+       }
+
+       @Test
+       public void logAllCommitsWithMaxCount() throws Exception {
+               Git git = Git.wrap(db);
+               List<RevCommit> commits = createCommits(git);
 
                Iterator<RevCommit> log = git.log().all().setMaxCount(2).call()
                                .iterator();
                assertTrue(log.hasNext());
-               assertTrue(commits.contains(log.next()));
+               RevCommit commit = log.next();
+               assertTrue(commits.contains(commit));
+               assertEquals("commit#3", commit.getShortMessage());
                assertTrue(log.hasNext());
-               assertTrue(commits.contains(log.next()));
+               commit = log.next();
+               assertTrue(commits.contains(commit));
+               assertEquals("commit#2", commit.getShortMessage());
+               assertFalse(log.hasNext());
+       }
+
+       @Test
+       public void logAllCommitsWithSkip() throws Exception {
+               Git git = Git.wrap(db);
+               List<RevCommit> commits = createCommits(git);
+
+               Iterator<RevCommit> log = git.log().all().setSkip(1).call().iterator();
+               assertTrue(log.hasNext());
+               RevCommit commit = log.next();
+               assertTrue(commits.contains(commit));
+               assertEquals("commit#2", commit.getShortMessage());
+               assertTrue(log.hasNext());
+               commit = log.next();
+               assertTrue(commits.contains(commit));
+               assertEquals("commit#1", commit.getShortMessage());
+               assertFalse(log.hasNext());
+       }
+
+       @Test
+       public void logAllCommitsWithSkipAndMaxCount() throws Exception {
+               Git git = Git.wrap(db);
+               List<RevCommit> commits = createCommits(git);
+
+               Iterator<RevCommit> log = git.log().all().setSkip(1).setMaxCount(1).call()
+                               .iterator();
+               assertTrue(log.hasNext());
+               RevCommit commit = log.next();
+               assertTrue(commits.contains(commit));
+               assertEquals("commit#2", commit.getShortMessage());
                assertFalse(log.hasNext());
        }
-}
+}
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/SkipRevFilterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/SkipRevFilterTest.java
new file mode 100644 (file)
index 0000000..353a487
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2011, Tomasz Zarna <Tomasz.Zarna@pl.ibm.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * 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 Eclipse Foundation, Inc. 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.eclipse.jgit.revwalk;
+
+import static org.junit.Assert.assertNull;
+
+import org.eclipse.jgit.revwalk.filter.SkipRevFilter;
+import org.junit.Test;
+
+public class SkipRevFilterTest extends RevWalkTestCase {
+       @Test
+       public void testSkipRevFilter() throws Exception {
+               final RevCommit a = commit();
+               final RevCommit b1 = commit(a);
+               final RevCommit b2 = commit(a);
+               final RevCommit c = commit(b1, b2);
+               final RevCommit d = commit(c);
+
+               rw.reset();
+               rw.setRevFilter(SkipRevFilter.create(3));
+               markStart(d);
+               assertCommit(b1, rw.next());
+               assertCommit(a, rw.next());
+               assertNull(rw.next());
+       }
+
+       @Test
+       public void testSkipRevFilter0() throws Exception {
+               final RevCommit a = commit();
+               final RevCommit b = commit(a);
+
+               rw.reset();
+               rw.setRevFilter(SkipRevFilter.create(0));
+               markStart(b);
+               assertCommit(b, rw.next());
+               assertCommit(a, rw.next());
+               assertNull(rw.next());
+       }
+
+       @Test(expected = IllegalArgumentException.class)
+       public void testSkipRevFilterNegative() throws Exception {
+               SkipRevFilter.create(-1);
+       }
+}
\ No newline at end of file
index 133dd17bad5bceb917f9ae9320acca02f5bd84d3..a80e6bcae5998af4640e12542904dc80acbdc4a0 100644 (file)
@@ -413,6 +413,7 @@ shortSkipOfBlock=Short skip of block.
 signingNotSupportedOnTag=Signing isn't supported on tag operations yet.
 similarityScoreMustBeWithinBounds=Similarity score must be between 0 and 100.
 sizeExceeds2GB=Path {0} size {1} exceeds 2 GiB limit.
+skipMustBeNonNegative=skip must be >= 0
 smartHTTPPushDisabled=smart HTTP push disabled
 sourceDestinationMustMatch=Source/Destination must match.
 sourceIsNotAWildcard=Source is not a wildcard.
index 34c372867c2f9a23776ebbd0540d4b131ceb36b0..f4de48755869f1440627d7cdd4c25a0858ac9a56 100644 (file)
@@ -473,6 +473,7 @@ public class JGitText extends TranslationBundle {
        /***/ public String signingNotSupportedOnTag;
        /***/ public String similarityScoreMustBeWithinBounds;
        /***/ public String sizeExceeds2GB;
+       /***/ public String skipMustBeNonNegative;
        /***/ public String smartHTTPPushDisabled;
        /***/ public String sourceDestinationMustMatch;
        /***/ public String sourceIsNotAWildcard;
index 632b5d0e30130d4f7350dd7476e6e4251ae0073e..21a0d342a958fd37a110d7a5655cbf0f2f463abd 100644 (file)
@@ -59,7 +59,9 @@ import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.filter.AndRevFilter;
 import org.eclipse.jgit.revwalk.filter.MaxCountRevFilter;
+import org.eclipse.jgit.revwalk.filter.SkipRevFilter;
 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
@@ -88,6 +90,8 @@ public class LogCommand extends GitCommand<Iterable<RevCommit>> {
 
        private int maxCount = -1;
 
+       private int skip = -1;
+
        /**
         * @param repo
         */
@@ -111,7 +115,12 @@ public class LogCommand extends GitCommand<Iterable<RevCommit>> {
                if (pathFilters.size() > 0)
                        walk.setTreeFilter(AndTreeFilter.create(
                                        PathFilterGroup.create(pathFilters), TreeFilter.ANY_DIFF));
-               if (maxCount > -1)
+               if (skip > -1 && maxCount > -1)
+                       walk.setRevFilter(AndRevFilter.create(SkipRevFilter.create(skip),
+                                       MaxCountRevFilter.create(maxCount)));
+               else if (skip > -1)
+                       walk.setRevFilter(SkipRevFilter.create(skip));
+               else if (maxCount > -1)
                        walk.setRevFilter(MaxCountRevFilter.create(maxCount));
                if (!startSpecified) {
                        try {
@@ -253,7 +262,20 @@ public class LogCommand extends GitCommand<Iterable<RevCommit>> {
        }
 
        /**
-        * Limit the number of commits to output
+        * Skip the number of commits before starting to show the commit output.
+        *
+        * @param skip
+        *            the number of commits to skip
+        * @return {@code this}
+        */
+       public LogCommand setSkip(int skip) {
+               checkCallable();
+               this.skip = skip;
+               return this;
+       }
+
+       /**
+        * Limit the number of commits to output.
         *
         * @param maxCount
         *            the limit
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/SkipRevFilter.java
new file mode 100644 (file)
index 0000000..7555fef
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2011, Tomasz Zarna <Tomasz.Zarna@pl.ibm.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * 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 Eclipse Foundation, Inc. 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.eclipse.jgit.revwalk.filter;
+
+import java.io.IOException;
+
+import org.eclipse.jgit.JGitText;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.StopWalkException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Filter that includes commits after a configured number are skipped.
+ */
+public class SkipRevFilter extends RevFilter {
+
+       private final int skip;
+
+       private int count;
+
+       /**
+        * Create a new skip filter.
+        *
+        * @param skip
+        *            the number of commits to skip
+        * @return a new filter
+        */
+       public static RevFilter create(int skip) {
+               if (skip < 0)
+                       throw new IllegalArgumentException(
+                                       JGitText.get().skipMustBeNonNegative);
+               return new SkipRevFilter(skip);
+       }
+
+       private SkipRevFilter(int skip) {
+               this.skip = skip;
+       }
+
+       @Override
+       public boolean include(RevWalk walker, RevCommit cmit)
+                       throws StopWalkException, MissingObjectException,
+                       IncorrectObjectTypeException, IOException {
+               if (skip > count++)
+                       return false;
+               return true;
+       }
+
+       @Override
+       public RevFilter clone() {
+               return new SkipRevFilter(skip);
+       }
+}
\ No newline at end of file