summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlcemir Santos <alcemir.santos@gmail.com>2016-04-12 20:11:32 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2016-05-20 01:05:40 +0200
commitba0dfe1ae2c6d0e3370822eedb0ffd2eeef0d8e2 (patch)
treefa54845e55195e367b4ab92624f174a55a89044a
parent36528871085b6cbbd7cc8f607155d07b44eaae51 (diff)
downloadjgit-ba0dfe1ae2c6d0e3370822eedb0ffd2eeef0d8e2.tar.gz
jgit-ba0dfe1ae2c6d0e3370822eedb0ffd2eeef0d8e2.zip
Added filter for merge and non-merges commits.
Added the option to retrieve either merge or non-merge commits in the LogCommand. Change-Id: Ie0e1c515a823f2392783f1a47d385c31230e8167 Signed-off-by: Alcemir Santos <alcemir.santos@gmail.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java79
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java25
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java32
3 files changed, 136 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java
index 34432c588b..1310625a9b 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java
@@ -53,7 +53,9 @@ import java.util.List;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.merge.MergeStrategy;
import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.filter.RevFilter;
import org.junit.Test;
public class LogCommandTest extends RepositoryTestCase {
@@ -210,4 +212,81 @@ public class LogCommandTest extends RepositoryTestCase {
assertEquals("commit#2", commit.getShortMessage());
assertFalse(log.hasNext());
}
+
+ @Test
+ public void logOnlyMergeCommits() throws Exception {
+ setCommitsAndMerge();
+ Git git = Git.wrap(db);
+
+ Iterable<RevCommit> commits = git.log().all().call();
+ Iterator<RevCommit> i = commits.iterator();
+ RevCommit commit = i.next();
+ assertEquals("merge s0 with m1", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("s0", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("m1", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("m0", commit.getFullMessage());
+ assertFalse(i.hasNext());
+
+ commits = git.log().setRevFilter(RevFilter.ONLY_MERGES).call();
+ i = commits.iterator();
+ commit = i.next();
+ assertEquals("merge s0 with m1", commit.getFullMessage());
+ assertFalse(i.hasNext());
+ }
+
+ @Test
+ public void logNoMergeCommits() throws Exception {
+ setCommitsAndMerge();
+ Git git = Git.wrap(db);
+
+ Iterable<RevCommit> commits = git.log().all().call();
+ Iterator<RevCommit> i = commits.iterator();
+ RevCommit commit = i.next();
+ assertEquals("merge s0 with m1", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("s0", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("m1", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("m0", commit.getFullMessage());
+ assertFalse(i.hasNext());
+
+ commits = git.log().setRevFilter(RevFilter.NO_MERGES).call();
+ i = commits.iterator();
+ commit = i.next();
+ assertEquals("m1", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("s0", commit.getFullMessage());
+ commit = i.next();
+ assertEquals("m0", commit.getFullMessage());
+ assertFalse(i.hasNext());
+ }
+
+ private void setCommitsAndMerge() throws Exception {
+ Git git = Git.wrap(db);
+ writeTrashFile("file1", "1\n2\n3\n4\n");
+ git.add().addFilepattern("file1").call();
+ RevCommit masterCommit0 = git.commit().setMessage("m0").call();
+
+ createBranch(masterCommit0, "refs/heads/side");
+ checkoutBranch("refs/heads/side");
+
+ writeTrashFile("file2", "1\n2\n3\n4\n5\n6\n7\n8\n");
+ git.add().addFilepattern("file2").call();
+ RevCommit c = git.commit().setMessage("s0").call();
+
+ checkoutBranch("refs/heads/master");
+
+ writeTrashFile("file3", "1\n2\n");
+ git.add().addFilepattern("file3").call();
+ git.commit().setMessage("m1").call();
+
+ git.merge().include(c.getId())
+ .setStrategy(MergeStrategy.RESOLVE)
+ .setMessage("merge s0 with m1").call();
+ }
+
} \ No newline at end of file
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
index 9690f799c1..bb1a738149 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java
@@ -65,6 +65,7 @@ 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.RevFilter;
import org.eclipse.jgit.revwalk.filter.SkipRevFilter;
import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
import org.eclipse.jgit.treewalk.filter.PathFilter;
@@ -104,6 +105,8 @@ public class LogCommand extends GitCommand<Iterable<RevCommit>> {
private boolean startSpecified = false;
+ private RevFilter revFilter;
+
private final List<PathFilter> pathFilters = new ArrayList<PathFilter>();
private int maxCount = -1;
@@ -156,6 +159,11 @@ public class LogCommand extends GitCommand<Iterable<RevCommit>> {
e);
}
}
+
+ if (this.revFilter != null) {
+ walk.setRevFilter(this.revFilter);
+ }
+
setCallable(false);
return walk;
}
@@ -342,4 +350,21 @@ public class LogCommand extends GitCommand<Iterable<RevCommit>> {
, start), e);
}
}
+
+
+ /**
+ * Sets a filter for the <code>LogCommand</code>.
+ *
+ *
+ * @param aFilter
+ * the filter that this instance of <code>LogCommand</code>
+ * should use
+ * @return {@code this}
+ * @since 4.4
+ */
+ public LogCommand setRevFilter(RevFilter aFilter) {
+ checkCallable();
+ this.revFilter = aFilter;
+ return this;
+ }
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java
index 2a5cb2b2ac..14a98a10bf 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/filter/RevFilter.java
@@ -82,6 +82,7 @@ import org.eclipse.jgit.revwalk.RevWalk;
* <b>Merge filters:</b>
* <ul>
* <li>Skip all merges: {@link #NO_MERGES}.</li>
+ * <li>Skip all non-merges: {@link #ONLY_MERGES}</li>
* </ul>
*
* <p>
@@ -143,6 +144,37 @@ public abstract class RevFilter {
}
}
+ /**
+ * Filter including only merge commits, excluding all commits with less than
+ * two parents (thread safe).
+ *
+ * @since 4.4
+ */
+ public static final RevFilter ONLY_MERGES = new OnlyMergesFilter();
+
+ private static final class OnlyMergesFilter extends RevFilter {
+
+ @Override
+ public boolean include(RevWalk walker, RevCommit c) {
+ return c.getParentCount() >= 2;
+ }
+
+ @Override
+ public RevFilter clone() {
+ return this;
+ }
+
+ @Override
+ public boolean requiresCommitBody() {
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "ONLY_MERGES"; //$NON-NLS-1$
+ }
+ }
+
/** Excludes commits with more than one parent (thread safe). */
public static final RevFilter NO_MERGES = new NoMergesFilter();