Merge "Revert "Adds FilteredRevCommit that can overwrites its parents in the DAG.""
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogFilterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogFilterTest.java
index 46095b3..fa9c742 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogFilterTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogFilterTest.java
@@ -20,7 +20,6 @@
 
 import org.eclipse.jgit.junit.RepositoryTestCase;
 import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.util.FileUtils;
 import org.junit.After;
 import org.junit.Before;
@@ -32,13 +31,10 @@
 public class LogFilterTest extends RepositoryTestCase {
 	private Git git;
 
-	private RevWalk rw;
-
 	@Before
 	public void setup() throws Exception {
 		super.setUp();
 		git = new Git(db);
-		rw = new RevWalk(db);
 
 		// create first file
 		File file = new File(db.getWorkTree(), "a.txt");
@@ -102,7 +98,6 @@ public void tearDown() throws Exception {
 	public void testLogWithFilterCanDistinguishFilesByPath() throws Exception {
 		int count = 0;
 		for (RevCommit c : git.log().addPath("a.txt").call()) {
-			rw.parseHeaders(c);
 			assertEquals("commit1", c.getFullMessage());
 			count++;
 		}
@@ -110,7 +105,6 @@ public void testLogWithFilterCanDistinguishFilesByPath() throws Exception {
 
 		count = 0;
 		for (RevCommit c : git.log().addPath("b.txt").call()) {
-			rw.parseHeaders(c);
 			assertEquals("commit2", c.getFullMessage());
 			count++;
 		}
@@ -121,7 +115,6 @@ public void testLogWithFilterCanDistinguishFilesByPath() throws Exception {
 	public void testLogWithFilterCanIncludeFilesInDirectory() throws Exception {
 		int count = 0;
 		for (RevCommit c : git.log().addPath("subdir-include").call()) {
-			rw.parseHeaders(c);
 			assertEquals("commit3", c.getFullMessage());
 			count++;
 		}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FilteredRevCommitTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FilteredRevCommitTest.java
deleted file mode 100644
index c8f3c0c..0000000
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FilteredRevCommitTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2022, Google LLC.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jgit.revwalk;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-import java.util.Arrays;
-
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.junit.Before;
-import org.junit.Test;
-
-public class FilteredRevCommitTest {
-	private TestRepository<InMemoryRepository> tr;
-
-	private RevWalk rw;
-
-	@Before
-	public void setUp() throws Exception {
-		tr = new TestRepository<>(
-				new InMemoryRepository(new DfsRepositoryDescription("test")));
-		rw = tr.getRevWalk();
-	}
-
-	@Test
-	public void testParseBody_noParent() throws Exception {
-		RevCommit root = tr.commit().add("todelete", "to be deleted").create();
-		RevCommit orig = tr.commit().parent(root).rm("todelete")
-				.add("foo", "foo contents").add("bar", "bar contents")
-				.add("dir/baz", "baz contents").create();
-		FilteredRevCommit filteredRevCommit = new FilteredRevCommit(orig);
-		filteredRevCommit.parseBody(rw);
-		tr.branch("master").update(filteredRevCommit);
-		assertEquals("foo contents", blobAsString(filteredRevCommit, "foo"));
-		assertEquals("bar contents", blobAsString(filteredRevCommit, "bar"));
-		assertEquals("baz contents",
-				blobAsString(filteredRevCommit, "dir/baz"));
-	}
-
-	@Test
-	public void testParseBody_withParents() throws Exception {
-		RevCommit commit1 = tr.commit().add("foo", "foo contents\n").create();
-		RevCommit commit2 = tr.commit().parent(commit1)
-				.message("original message").add("bar", "bar contents")
-				.create();
-		RevCommit commit3 = tr.commit().parent(commit2).message("commit3")
-				.add("foo", "foo contents\n new line\n").create();
-
-		FilteredRevCommit filteredCommitHead = new FilteredRevCommit(commit3,
-				commit1);
-
-		rw.parseBody(filteredCommitHead);
-		assertEquals(commit1, Arrays.stream(filteredCommitHead.getParents())
-				.findFirst().get());
-		assertEquals("commit3", filteredCommitHead.getFullMessage());
-		assertEquals("foo contents\n new line\n",
-				blobAsString(filteredCommitHead, "foo"));
-	}
-
-	@Test
-	public void testParseHeader_withParents() throws Exception {
-		RevCommit commit1 = tr.commit().add("foo", "foo contents\n").create();
-		RevCommit commit2 = tr.commit().parent(commit1)
-				.message("original message").add("bar", "bar contents")
-				.create();
-		RevCommit commit3 = tr.commit().parent(commit2).message("commit3")
-				.add("foo", "foo contents\n new line\n").create();
-
-		FilteredRevCommit filteredCommitHead = new FilteredRevCommit(commit3,
-				commit1);
-
-		assertNull(filteredCommitHead.getTree());
-		rw.parseHeaders(filteredCommitHead);
-		assertEquals(filteredCommitHead.getTree(), commit3.getTree());
-	}
-
-	@Test
-	public void testParseCommit_withParents_parsesRealParents()
-			throws Exception {
-		RevCommit commit1 = tr.commit().add("foo", "foo contents\n").create();
-		RevCommit commit2 = tr.commit().parent(commit1)
-				.message("original message").add("bar", "bar contents")
-				.create();
-		RevCommit commit3 = tr.commit().parent(commit2).message("commit3")
-				.add("foo", "foo contents\n new line\n").create();
-
-		FilteredRevCommit filteredCommitHead = new FilteredRevCommit(commit3,
-				commit1);
-
-		RevCommit parsedCommit = rw.parseCommit(filteredCommitHead.getId());
-		assertEquals(filteredCommitHead.getId(), commit3.getId());
-		// This is an intended behavior as revWalk#parseCommit doesn't parse
-		// through the overridden parents rather uses the real parents.
-		assertNotEquals(
-				Arrays.stream(parsedCommit.getParents()).findFirst().get(),
-				Arrays.stream(filteredCommitHead.getParents()).findFirst()
-						.get());
-	}
-
-	@Test
-	public void testFlag() throws Exception {
-		RevCommit root = tr.commit().add("todelete", "to be deleted").create();
-		RevCommit orig = tr.commit().parent(root).rm("todelete")
-				.add("foo", "foo contents").add("bar", "bar contents")
-				.add("dir/baz", "baz contents").create();
-
-		FilteredRevCommit filteredRevCommit = new FilteredRevCommit(orig, root);
-		assertEquals(RevObject.PARSED, orig.flags);
-		assertEquals(0, filteredRevCommit.flags);
-		filteredRevCommit.parseBody(rw);
-		assertEquals(RevObject.PARSED, filteredRevCommit.flags);
-	}
-
-	private String blobAsString(AnyObjectId treeish, String path)
-			throws Exception {
-		RevObject obj = tr.get(rw.parseTree(treeish), path);
-		assertSame(RevBlob.class, obj.getClass());
-		ObjectLoader loader = rw.getObjectReader().open(obj);
-		return new String(loader.getCachedBytes(), UTF_8);
-	}
-}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FilteredRevWalkTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FilteredRevWalkTest.java
deleted file mode 100644
index 7c24898..0000000
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FilteredRevWalkTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2022, Google LLC.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jgit.revwalk;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.Before;
-import org.junit.Test;
-
-public class FilteredRevWalkTest extends RevWalkTestCase {
-	private TestRepository<FileRepository> repository;
-
-	@Override
-	@Before
-	public void setUp() throws Exception {
-		super.setUp();
-		repository = new TestRepository<>(db);
-	}
-
-	@Test
-	public void testWalk() throws Exception {
-		writeTrashFile("a.txt", "content");
-		repository.git().add().addFilepattern("a.txt").call();
-		RevCommit c1 = repository.git().commit().setMessage("first commit")
-				.call();
-
-		writeTrashFile("b.txt", "new file added");
-		repository.git().add().addFilepattern("b.txt").call();
-		repository.git().commit().setMessage("second commit").call();
-
-		writeTrashFile("a.txt", "content added");
-		repository.git().add().addFilepattern("a.txt").call();
-		RevCommit c3 = repository.git().commit().setMessage("third commit")
-				.call();
-
-		RevWalk revWalk = repository.getRevWalk();
-		FilteredRevCommit filteredRevCommit = new FilteredRevCommit(c3, c1);
-
-		revWalk.markStart(filteredRevCommit);
-		assertEquals(c3, revWalk.next());
-		assertEquals(c1, revWalk.next());
-	}
-
-	@Test
-	public void testParseBody() throws Exception {
-		writeTrashFile("a.txt", "content");
-		repository.git().add().addFilepattern("a.txt").call();
-		RevCommit c1 = repository.git().commit().setMessage("first commit")
-				.call();
-
-		writeTrashFile("b.txt", "new file added");
-		repository.git().add().addFilepattern("b.txt").call();
-		repository.git().commit().setMessage("second commit").call();
-
-		writeTrashFile("a.txt", "content added");
-		repository.git().add().addFilepattern("a.txt").call();
-		RevCommit c3 = repository.git().commit().setMessage("third commit")
-				.call();
-
-		RevWalk revWalk = repository.getRevWalk();
-		FilteredRevCommit filteredRevCommit = new FilteredRevCommit(c3, c1);
-
-		assertNull(filteredRevCommit.getTree());
-
-		revWalk.parseBody(filteredRevCommit);
-		assertNotNull(filteredRevCommit.getTree());
-		assertNotNull(filteredRevCommit.getFullMessage());
-	}
-
-	/**
-	 * Test that the uninteresting flag is carried over correctly. Every commit
-	 * should have the uninteresting flag resulting in a RevWalk returning no
-	 * commit.
-	 *
-	 * @throws Exception
-	 */
-	@Test
-	public void testRevWalkCarryUninteresting() throws Exception {
-		writeTrashFile("a.txt", "content");
-		repository.git().add().addFilepattern("a.txt").call();
-		RevCommit c1 = repository.git().commit().setMessage("first commit")
-				.call();
-
-		writeTrashFile("b.txt", "new file added");
-		repository.git().add().addFilepattern("b.txt").call();
-		RevCommit c2 = repository.git().commit().setMessage("second commit")
-				.call();
-
-		writeTrashFile("a.txt", "content added");
-		repository.git().add().addFilepattern("a.txt").call();
-		RevCommit c3 = repository.git().commit().setMessage("third commit")
-				.call();
-
-		RevWalk revWalk = repository.getRevWalk();
-		FilteredRevCommit filteredCommit1 = new FilteredRevCommit(c1);
-		FilteredRevCommit filteredCommit2 = new FilteredRevCommit(c2,
-				filteredCommit1);
-		FilteredRevCommit filteredCommit3 = new FilteredRevCommit(c3,
-				filteredCommit2);
-
-		revWalk.markStart(filteredCommit2);
-		markUninteresting(filteredCommit3);
-		assertNull("Found an unexpected commit", rw.next());
-	}
-}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FirstParentRevWalkTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FirstParentRevWalkTest.java
index d8d2c2d..c8256b8 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FirstParentRevWalkTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FirstParentRevWalkTest.java
@@ -423,10 +423,9 @@ public void testWithTopoSortAndTreeFilter() throws Exception {
 		rw.sort(RevSort.TOPO, true);
 		rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
 		markStart(d);
-
-		assertEquals(d, rw.next());
-		assertEquals(c, rw.next());
-		assertEquals(b, rw.next());
+		assertCommit(d, rw.next());
+		assertCommit(c, rw.next());
+		assertCommit(b, rw.next());
 		assertNull(rw.next());
 	}
 
@@ -442,8 +441,8 @@ public void testWithTopoSortAndTreeFilter2() throws Exception {
 		rw.sort(RevSort.TOPO, true);
 		rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
 		markStart(d);
-		assertEquals(d, rw.next());
-		assertEquals(c, rw.next());
+		assertCommit(d, rw.next());
+		assertCommit(c, rw.next());
 		assertNull(rw.next());
 	}
 
@@ -459,9 +458,9 @@ public void testWithTopoNonIntermixSortAndTreeFilter() throws Exception {
 		rw.sort(RevSort.TOPO_KEEP_BRANCH_TOGETHER, true);
 		rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
 		markStart(d);
-		assertEquals(d, rw.next());
-		assertEquals(c, rw.next());
-		assertEquals(b, rw.next());
+		assertCommit(d, rw.next());
+		assertCommit(c, rw.next());
+		assertCommit(b, rw.next());
 		assertNull(rw.next());
 	}
 
@@ -477,8 +476,8 @@ public void testWithTopoNonIntermixSortAndTreeFilter2() throws Exception {
 		rw.sort(RevSort.TOPO_KEEP_BRANCH_TOGETHER, true);
 		rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
 		markStart(d);
-		assertEquals(d, rw.next());
-		assertEquals(c, rw.next());
+		assertCommit(d, rw.next());
+		assertCommit(c, rw.next());
 		assertNull(rw.next());
 	}
 }
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkPathFilter1Test.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkPathFilter1Test.java
index 4bc7b0a..5cce11a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkPathFilter1Test.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkPathFilter1Test.java
@@ -23,8 +23,8 @@
 
 public class RevWalkPathFilter1Test extends RevWalkTestCase {
 	protected void filter(String path) {
-		rw.setTreeFilter(AndTreeFilter.create(
-				PathFilterGroup.createFromStrings(Collections.singleton(path)),
+		rw.setTreeFilter(AndTreeFilter.create(PathFilterGroup
+				.createFromStrings(Collections.singleton(path)),
 				TreeFilter.ANY_DIFF));
 	}
 
@@ -87,7 +87,7 @@ public void testStringOfPearls_FilePath1() throws Exception {
 		filter("d/f");
 		markStart(c);
 
-		assertEquals(c, rw.next());
+		assertCommit(c, rw.next());
 		assertEquals(1, c.getParentCount());
 		assertCommit(a, c.getParent(0)); // b was skipped
 
@@ -125,7 +125,7 @@ public void testStringOfPearls_FilePath2() throws Exception {
 		markStart(d);
 
 		// d was skipped
-		assertEquals(c, rw.next());
+		assertCommit(c, rw.next());
 		assertEquals(1, c.getParentCount());
 		assertCommit(a, c.getParent(0)); // b was skipped
 
@@ -136,7 +136,7 @@ public void testStringOfPearls_FilePath2() throws Exception {
 
 	@Test
 	public void testStringOfPearls_FilePath2_NoParentRewriting()
-			throws Exception {
+	throws Exception {
 		final RevCommit a = commit(tree(file("d/f", blob("a"))));
 		final RevCommit b = commit(tree(file("d/f", blob("a"))), a);
 		final RevCommit c = commit(tree(file("d/f", blob("b"))), b);
@@ -166,7 +166,7 @@ public void testStringOfPearls_DirPath2() throws Exception {
 		markStart(d);
 
 		// d was skipped
-		assertEquals(c, rw.next());
+		assertCommit(c, rw.next());
 		assertEquals(1, c.getParentCount());
 		assertCommit(a, c.getParent(0)); // b was skipped
 
@@ -211,11 +211,11 @@ public void testStringOfPearls_FilePath3() throws Exception {
 		filter("d/f");
 		markStart(i);
 
-		assertEquals(i, rw.next());
+		assertCommit(i, rw.next());
 		assertEquals(1, i.getParentCount());
 		assertCommit(c, i.getParent(0)); // h..d was skipped
 
-		assertEquals(c, rw.next());
+		assertCommit(c, rw.next());
 		assertEquals(1, c.getParentCount());
 		assertCommit(a, c.getParent(0)); // b was skipped
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FilteredRevCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FilteredRevCommit.java
deleted file mode 100644
index be6e57f..0000000
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/FilteredRevCommit.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2022, Google LLC.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jgit.revwalk;
-
-import org.eclipse.jgit.lib.ObjectId;
-
-/** A filtered commit reference that overrides its parent in the DAG. */
-public class FilteredRevCommit extends RevCommit {
-	private RevCommit[] overriddenParents;
-
-	/**
-	 * Create a new commit reference for the given id.
-	 *
-	 * @param id
-	 *            object name for the commit.
-	 */
-	public FilteredRevCommit(ObjectId id) {
-		this(id, NO_PARENTS);
-	}
-
-	/**
-	 * Create a new commit reference wrapping an underlying commit reference.
-	 *
-	 * @param commit
-	 *            commit that is being wrapped
-	 */
-	public FilteredRevCommit(RevCommit commit) {
-		this(commit, NO_PARENTS);
-	}
-
-	/**
-	 * Create a new commit reference wrapping an underlying commit reference.
-	 *
-	 * @param commit
-	 *            commit that is being wrapped
-	 * @param parents
-	 *            overridden parents for the commit
-	 */
-	public FilteredRevCommit(RevCommit commit, RevCommit... parents) {
-		this(commit.getId(), parents);
-	}
-
-	/**
-	 * Create a new commit reference wrapping an underlying commit reference.
-	 *
-	 * @param id
-	 *            object name for the commit.
-	 * @param parents
-	 *            overridden parents for the commit
-	 */
-	public FilteredRevCommit(ObjectId id, RevCommit... parents) {
-		super(id);
-		this.overriddenParents = parents;
-	}
-
-	/**
-	 * Update parents on the commit
-	 *
-	 * @param overriddenParents
-	 *            parents to be overwritten
-	 */
-	public void setParents(RevCommit... overriddenParents) {
-		this.overriddenParents = overriddenParents;
-	}
-
-	/**
-	 * Get the number of parent commits listed in this commit.
-	 *
-	 * @return number of parents; always a positive value but can be 0 if it has
-	 *         no parents.
-	 */
-	@Override
-	public int getParentCount() {
-		return overriddenParents.length;
-	}
-
-	/**
-	 * Get the nth parent from this commit's parent list.
-	 *
-	 * @param nth
-	 *            parent index to obtain. Must be in the range 0 through
-	 *            {@link #getParentCount()}-1.
-	 * @return the specified parent.
-	 * @throws java.lang.ArrayIndexOutOfBoundsException
-	 *             an invalid parent index was specified.
-	 */
-	@Override
-	public RevCommit getParent(int nth) {
-		return overriddenParents[nth];
-	}
-
-	/**
-	 * Obtain an array of all parents (<b>NOTE - THIS IS NOT A COPY</b>).
-	 *
-	 * <p>
-	 * This method is exposed only to provide very fast, efficient access to
-	 * this commit's parent list. Applications relying on this list should be
-	 * very careful to ensure they do not modify its contents during their use
-	 * of it.
-	 *
-	 * @return the array of parents.
-	 */
-	@Override
-	public RevCommit[] getParents() {
-		return overriddenParents;
-	}
-}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java
index 3318a97..2c88bb8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RewriteGenerator.java
@@ -79,9 +79,9 @@ RevCommit next() throws MissingObjectException,
 			final RevCommit newp = rewrite(oldp);
 			if (firstParent) {
 				if (newp == null) {
-					c = new FilteredRevCommit(c.getId());
+					c.parents = RevCommit.NO_PARENTS;
 				} else {
-					c = new FilteredRevCommit(c.getId(), newp);
+					c.parents = new RevCommit[] { newp };
 				}
 				return c;
 			}
@@ -91,7 +91,7 @@ RevCommit next() throws MissingObjectException,
 			}
 		}
 		if (rewrote) {
-			c = new FilteredRevCommit(c.getId(), cleanup(pList));
+			c.parents = cleanup(pList);
 		}
 		return c;
 	}