/* * Copyright (C) 2023, Google LLC 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.internal.storage.file; import static org.eclipse.jgit.internal.storage.pack.PackExt.REVERSE_INDEX; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Collections; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.storage.pack.PackConfig; import org.eclipse.jgit.util.IO; import org.junit.Test; public class GcReverseIndexTest extends GcTestCase { @Test public void testWriteDefault() throws Exception { PackConfig config = new PackConfig(repo); gc.setPackConfig(config); RevCommit tip = commitChain(10); TestRepository.BranchBuilder bb = tr.branch("refs/heads/main"); bb.update(tip); gc.gc().get(); assertRidxDoesNotExist(repo); } @Test public void testWriteDisabled() throws Exception { PackConfig config = new PackConfig(repo); config.setWriteReverseIndex(false); gc.setPackConfig(config); RevCommit tip = commitChain(10); TestRepository.BranchBuilder bb = tr.branch("refs/heads/main"); bb.update(tip); gc.gc().get(); assertRidxDoesNotExist(repo); } @Test public void testWriteEmptyRepo() throws Exception { PackConfig config = new PackConfig(repo); config.setWriteReverseIndex(true); gc.setPackConfig(config); gc.gc().get(); assertRidxDoesNotExist(repo); } @Test public void testWriteShallowRepo() throws Exception { PackConfig config = new PackConfig(repo); config.setWriteReverseIndex(true); gc.setPackConfig(config); RevCommit tip = commitChain(2); TestRepository.BranchBuilder bb = tr.branch("refs/heads/main"); bb.update(tip); repo.getObjectDatabase().setShallowCommits(Collections.singleton(tip)); gc.gc().get(); assertValidRidxExists(repo); } @Test public void testWriteEnabled() throws Exception { PackConfig config = new PackConfig(repo); config.setWriteReverseIndex(true); gc.setPackConfig(config); RevCommit tip = commitChain(10); TestRepository.BranchBuilder bb = tr.branch("refs/heads/main"); bb.update(tip); gc.gc().get(); assertValidRidxExists(repo); } private static void assertValidRidxExists(FileRepository repo) throws Exception { PackFile packFile = repo.getObjectDatabase().getPacks().iterator() .next().getPackFile(); File file = packFile.create(REVERSE_INDEX); assertTrue(file.exists()); try (InputStream os = new FileInputStream(file)) { byte[] magic = new byte[4]; IO.readFully(os, magic, 0, 4); assertArrayEquals(new byte[] { 'R', 'I', 'D', 'X' }, magic); } } private static void assertRidxDoesNotExist(FileRepository repo) { File packDir = repo.getObjectDatabase().getPackDirectory(); String[] reverseIndexFilenames = packDir.list( (dir, name) -> name.endsWith(REVERSE_INDEX.getExtension())); assertEquals(0, reverseIndexFilenames.length); } }