| /* |
| * Copyright (C) 2022, Tencent. |
| * |
| * 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.junit.Assert.assertArrayEquals; |
| import static org.junit.Assert.assertFalse; |
| 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.lib.ConfigConstants; |
| import org.eclipse.jgit.lib.Constants; |
| import org.eclipse.jgit.lib.StoredConfig; |
| import org.eclipse.jgit.revwalk.RevCommit; |
| import org.eclipse.jgit.util.IO; |
| import org.junit.Test; |
| |
| public class GcCommitGraphTest extends GcTestCase { |
| |
| @Test |
| public void testCommitGraphConfig() { |
| StoredConfig config = repo.getConfig(); |
| assertFalse(gc.shouldWriteCommitGraphWhenGc()); |
| |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true); |
| assertTrue(gc.shouldWriteCommitGraphWhenGc()); |
| |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, false); |
| assertFalse(gc.shouldWriteCommitGraphWhenGc()); |
| } |
| |
| @Test |
| public void testWriteEmptyRepo() throws Exception { |
| StoredConfig config = repo.getConfig(); |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, true); |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true); |
| |
| assertTrue(gc.shouldWriteCommitGraphWhenGc()); |
| gc.writeCommitGraph(Collections.emptySet()); |
| File graphFile = new File(repo.getObjectsDirectory(), |
| Constants.INFO_COMMIT_GRAPH); |
| assertFalse(graphFile.exists()); |
| } |
| |
| @Test |
| public void testWriteShallowRepo() throws Exception { |
| StoredConfig config = repo.getConfig(); |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, true); |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true); |
| |
| RevCommit tip = commitChain(2); |
| TestRepository.BranchBuilder bb = tr.branch("refs/heads/master"); |
| bb.update(tip); |
| repo.getObjectDatabase().setShallowCommits(Collections.singleton(tip)); |
| |
| gc.writeCommitGraph(Collections.singleton(tip)); |
| File graphFile = new File(repo.getObjectsDirectory(), |
| Constants.INFO_COMMIT_GRAPH); |
| assertFalse(graphFile.exists()); |
| } |
| |
| @Test |
| public void testWriteWhenGc() throws Exception { |
| StoredConfig config = repo.getConfig(); |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, true); |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true); |
| |
| RevCommit tip = commitChain(10); |
| TestRepository.BranchBuilder bb = tr.branch("refs/heads/master"); |
| bb.update(tip); |
| |
| assertTrue(gc.shouldWriteCommitGraphWhenGc()); |
| gc.gc().get(); |
| File graphFile = new File(repo.getObjectsDirectory(), |
| Constants.INFO_COMMIT_GRAPH); |
| assertGraphFile(graphFile); |
| } |
| |
| @Test |
| public void testDefaultWriteWhenGc() throws Exception { |
| RevCommit tip = commitChain(10); |
| TestRepository.BranchBuilder bb = tr.branch("refs/heads/master"); |
| bb.update(tip); |
| |
| assertFalse(gc.shouldWriteCommitGraphWhenGc()); |
| gc.gc().get(); |
| File graphFile = new File(repo.getObjectsDirectory(), |
| Constants.INFO_COMMIT_GRAPH); |
| assertFalse(graphFile.exists()); |
| } |
| |
| @Test |
| public void testDisableWriteWhenGc() throws Exception { |
| RevCommit tip = commitChain(10); |
| TestRepository.BranchBuilder bb = tr.branch("refs/heads/master"); |
| bb.update(tip); |
| File graphFile = new File(repo.getObjectsDirectory(), |
| Constants.INFO_COMMIT_GRAPH); |
| |
| StoredConfig config = repo.getConfig(); |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, false); |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, true); |
| |
| gc.gc().get(); |
| assertFalse(graphFile.exists()); |
| |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, true); |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, false); |
| gc.gc().get(); |
| assertFalse(graphFile.exists()); |
| |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, false); |
| config.setBoolean(ConfigConstants.CONFIG_GC_SECTION, null, |
| ConfigConstants.CONFIG_KEY_WRITE_COMMIT_GRAPH, false); |
| gc.gc().get(); |
| assertFalse(graphFile.exists()); |
| } |
| |
| @Test |
| public void testWriteCommitGraphOnly() throws Exception { |
| RevCommit tip = commitChain(10); |
| TestRepository.BranchBuilder bb = tr.branch("refs/heads/master"); |
| bb.update(tip); |
| |
| StoredConfig config = repo.getConfig(); |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, false); |
| gc.writeCommitGraph(Collections.singleton(tip)); |
| |
| File graphFile = new File(repo.getObjectsDirectory(), |
| Constants.INFO_COMMIT_GRAPH); |
| assertFalse(graphFile.exists()); |
| |
| config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, |
| ConfigConstants.CONFIG_COMMIT_GRAPH, true); |
| gc.writeCommitGraph(Collections.singleton(tip)); |
| assertGraphFile(graphFile); |
| } |
| |
| private void assertGraphFile(File graphFile) throws Exception { |
| assertTrue(graphFile.exists()); |
| try (InputStream os = new FileInputStream(graphFile)) { |
| byte[] magic = new byte[4]; |
| IO.readFully(os, magic, 0, 4); |
| assertArrayEquals(new byte[] { 'C', 'G', 'P', 'H' }, magic); |
| } |
| } |
| } |