/* * Copyright (C) 2022, Google Inc. and others * * 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.assertNull; import static org.junit.Assert.assertSame; 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.eclipse.jgit.revwalk.filter.RevFilter; import org.junit.Before; import org.junit.Test; public class RevCommitWithOverriddenParentTest { private TestRepository 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() throws Exception { RevCommit a = tr.commit().add("a", "foo").create(); RevCommit b = tr.commit().parent(a).add("b", "bar").create(); RevCommit c = tr.commit().parent(b).message("commit3").add("a", "foo'") .create(); RevCommit cBar = new RevCommit(c.getId()) { @Override public int getParentCount() { return 1; } @Override public RevCommit getParent(int nth) { return a; } @Override public RevCommit[] getParents() { return new RevCommit[] { a }; } }; rw.parseBody(cBar); assertEquals(a, cBar.getParents()[0]); assertEquals("commit3", cBar.getFullMessage()); assertEquals("foo'", blobAsString(cBar, "a")); } @Test public void testParseHeader() throws Exception { RevCommit a = tr.commit().add("a", "foo").create(); RevCommit b = tr.commit().parent(a).add("b", "bar").create(); RevCommit c = tr.commit().parent(b).message("commit3").add("a", "foo'") .create(); RevCommit cBar = new RevCommit(c.getId()) { @Override public int getParentCount() { return 1; } @Override public RevCommit getParent(int nth) { return a; } @Override public RevCommit[] getParents() { return new RevCommit[] { a }; } }; RevCommit parsed = rw.parseCommit(cBar.getId()); rw.parseHeaders(cBar); assertEquals(c.getId(), parsed.getId()); assertEquals(parsed.getTree(), cBar.getTree()); assertEquals(parsed.getCommitTime(), cBar.getCommitTime()); assertEquals(parsed.getAuthorIdent(), cBar.getAuthorIdent()); } @Test public void testFilter() throws Exception { RevCommit a = tr.commit().add("a", "foo").create(); RevCommit b = tr.commit().parent(a).add("b", "bar").create(); RevCommit c = tr.commit().parent(b).message("commit3").add("a", "foo'") .create(); RevCommit cBar = new RevCommit(c.getId()) { @Override public int getParentCount() { return 1; } @Override public RevCommit getParent(int nth) { return a; } @Override public RevCommit[] getParents() { return new RevCommit[] { a }; } }; rw.setRevFilter(RevFilter.ALL); rw.markStart(cBar); assertSame(cBar, rw.next()); assertSame(a, rw.next()); assertNull(rw.next()); } @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(); RevCommit commitOrigBar = new RevCommit(orig.getId()) { @Override public int getParentCount() { return 1; } @Override public RevCommit getParent(int nth) { return root; } @Override public RevCommit[] getParents() { return new RevCommit[] { root }; } }; assertEquals(RevObject.PARSED, orig.flags); assertEquals(0, commitOrigBar.flags); commitOrigBar.parseBody(rw); assertEquals(RevObject.PARSED, commitOrigBar.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); } }