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>
This commit is contained in:
parent
3652887108
commit
ba0dfe1ae2
|
@ -53,7 +53,9 @@
|
|||
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 void logAllCommitsWithSkipAndMaxCount() throws Exception {
|
|||
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();
|
||||
}
|
||||
|
||||
}
|
|
@ -65,6 +65,7 @@
|
|||
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 @@ else if (maxCount > -1)
|
|||
e);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.revFilter != null) {
|
||||
walk.setRevFilter(this.revFilter);
|
||||
}
|
||||
|
||||
setCallable(false);
|
||||
return walk;
|
||||
}
|
||||
|
@ -342,4 +350,21 @@ private LogCommand add(boolean include, AnyObjectId start)
|
|||
, 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,6 +82,7 @@
|
|||
* <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 String toString() {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue