Add support for git config repack.packKeptObjects
Change Ide3445e652 introduced the `--pack-kept-objects` option to GC for including the objects contained in the locked packfiles during the repack phase. Whilst this allowed to explicitly pass a command line argument to the jgit gc program, it did not allow the option to be read from configuration. Allow the pack kept objects option to be configured exactly as C-Git documents [1], by introducing a new `repack.packKeptObjects` configuration. `repack.packKeptObjects` defaults to `true`, when the `pack.buildBitmaps` is `true` (which is the default case), `false` otherwise. [1] https://git-scm.com/docs/git-config#Documentation/git-config.txt-repackpackKeptObjects Bug: 582292 Change-Id: Ia931667277410d71bc079d27c097a57094299840
This commit is contained in:
parent
f5f4bf0ad9
commit
f103a1d5c6
|
@ -110,3 +110,9 @@ Proxy configuration uses the standard Java mechanisms via class `java.net.ProxyS
|
|||
| `pack.waitPreventRacyPack` | `false` | ⃞ | Whether we wait before opening a newly written pack to prevent its lastModified timestamp could be racy. |
|
||||
| `pack.window` | `10` | ✅ | Number of objects to try when looking for a delta base per thread searching for deltas. |
|
||||
| `pack.windowMemory` | `0` (unlimited) | ✅ | Maximum number of bytes to put into the delta search window. |
|
||||
|
||||
## __repack__ options
|
||||
|
||||
| option | default | git option | description |
|
||||
|---------|---------|------------|-------------|
|
||||
| `repack.packKeptObjects` | `true` when `pack.buildBitmaps` is set, `false` otherwise | ✅ | Include objects in packs locked by a `.keep` file when repacking. |
|
|
@ -10,6 +10,10 @@
|
|||
|
||||
package org.eclipse.jgit.internal.storage.file;
|
||||
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_BUILD_BITMAPS;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACK_KEPT_OBJECTS;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_REPACK_SECTION;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
@ -20,7 +24,9 @@
|
|||
import org.eclipse.jgit.internal.storage.file.PackIndex.MutableEntry;
|
||||
import org.eclipse.jgit.internal.storage.pack.PackExt;
|
||||
import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.storage.pack.PackConfig;
|
||||
import org.junit.Test;
|
||||
|
||||
public class GcKeepFilesTest extends GcTestCase {
|
||||
|
@ -55,6 +61,7 @@ public void testKeepFiles() throws Exception {
|
|||
PackFile bitmapFile = singlePack.getPackFile().create(PackExt.BITMAP_INDEX);
|
||||
assertTrue(keepFile.exists());
|
||||
assertTrue(bitmapFile.delete());
|
||||
gc.setPackKeptObjects(false);
|
||||
gc.gc();
|
||||
stats = gc.getStatistics();
|
||||
assertEquals(0, stats.numberOfLooseObjects);
|
||||
|
@ -78,17 +85,91 @@ public void testKeepFiles() throws Exception {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreIncluded() throws Exception {
|
||||
public void testKeptObjectsAreIncludedByDefault() throws Exception {
|
||||
testKeptObjectsAreIncluded();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreIncludedByDefaultWhenBuildBitmapsIsTrue()
|
||||
throws Exception {
|
||||
PackConfig packConfig = new PackConfig();
|
||||
Config repoConfig = repo.getObjectDatabase().getConfig();
|
||||
repoConfig.setBoolean(CONFIG_PACK_SECTION, null,
|
||||
CONFIG_KEY_BUILD_BITMAPS, true);
|
||||
packConfig.fromConfig(repoConfig);
|
||||
gc.setPackConfig(packConfig);
|
||||
|
||||
testKeptObjectsAreIncluded();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreIncludedWhenPackKeptObjectsIsFalseButOverriddenViaCommandLine()
|
||||
throws Exception {
|
||||
PackConfig packConfig = new PackConfig();
|
||||
packConfig.setPackKeptObjects(false);
|
||||
gc.setPackConfig(packConfig);
|
||||
gc.setPackKeptObjects(true);
|
||||
|
||||
testKeptObjectsAreIncluded();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreNotIncludedByDefaultWhenBuildBitmapsIsFalse()
|
||||
throws Exception {
|
||||
PackConfig packConfig = new PackConfig();
|
||||
packConfig.setBuildBitmaps(false);
|
||||
gc.setPackConfig(packConfig);
|
||||
|
||||
testKeptObjectsAreNotIncluded();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreIncludedWhenBuildBitmapsIsFalseButPackKeptObjectsIsTrue()
|
||||
throws Exception {
|
||||
PackConfig packConfig = new PackConfig();
|
||||
Config repoConfig = repo.getObjectDatabase().getConfig();
|
||||
repoConfig.setBoolean(CONFIG_PACK_SECTION, null,
|
||||
CONFIG_KEY_BUILD_BITMAPS, false);
|
||||
repoConfig.setBoolean(CONFIG_REPACK_SECTION, null,
|
||||
CONFIG_KEY_PACK_KEPT_OBJECTS, true);
|
||||
packConfig.fromConfig(repoConfig);
|
||||
gc.setPackConfig(packConfig);
|
||||
|
||||
testKeptObjectsAreIncluded();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreNotIncludedWhenPackKeptObjectsIsTrueButOverriddenViaCommandLine()
|
||||
throws Exception {
|
||||
PackConfig packConfig = new PackConfig();
|
||||
packConfig.setPackKeptObjects(true);
|
||||
gc.setPackConfig(packConfig);
|
||||
gc.setPackKeptObjects(false);
|
||||
|
||||
testKeptObjectsAreNotIncluded();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreNotIncludedWhenPackKeptObjectsConfigIsFalse()
|
||||
throws Exception {
|
||||
PackConfig packConfig = new PackConfig();
|
||||
packConfig.setPackKeptObjects(false);
|
||||
gc.setPackConfig(packConfig);
|
||||
|
||||
testKeptObjectsAreNotIncluded();
|
||||
}
|
||||
|
||||
private void testKeptObjectsAreIncluded() throws Exception {
|
||||
BranchBuilder bb = tr.branch("refs/heads/master");
|
||||
ObjectId commitObjectInLockedPack = bb.commit().create().toObjectId();
|
||||
gc.gc();
|
||||
stats = gc.getStatistics();
|
||||
assertEquals(COMMIT_AND_TREE_OBJECTS, stats.numberOfPackedObjects);
|
||||
assertEquals(1, stats.numberOfPackFiles);
|
||||
assertTrue(getSinglePack().getPackFile().create(PackExt.KEEP).createNewFile());
|
||||
assertTrue(getSinglePack().getPackFile().create(PackExt.KEEP)
|
||||
.createNewFile());
|
||||
|
||||
bb.commit().create();
|
||||
gc.setPackKeptObjects(true);
|
||||
gc.gc();
|
||||
stats = gc.getStatistics();
|
||||
assertEquals(2 * COMMIT_AND_TREE_OBJECTS + 1,
|
||||
|
@ -110,15 +191,15 @@ public void testKeptObjectsAreIncluded() throws Exception {
|
|||
assertTrue(newPackIdx.hasObject(commitObjectInLockedPack));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeptObjectsAreNotIncludedByDefault() throws Exception {
|
||||
private void testKeptObjectsAreNotIncluded() throws Exception {
|
||||
BranchBuilder bb = tr.branch("refs/heads/master");
|
||||
ObjectId commitObjectInLockedPack = bb.commit().create().toObjectId();
|
||||
gc.gc();
|
||||
stats = gc.getStatistics();
|
||||
assertEquals(COMMIT_AND_TREE_OBJECTS, stats.numberOfPackedObjects);
|
||||
assertEquals(1, stats.numberOfPackFiles);
|
||||
assertTrue(getSinglePack().getPackFile().create(PackExt.KEEP).createNewFile());
|
||||
assertTrue(getSinglePack().getPackFile().create(PackExt.KEEP)
|
||||
.createNewFile());
|
||||
|
||||
bb.commit().create();
|
||||
gc.gc();
|
||||
|
@ -142,8 +223,7 @@ public void testKeptObjectsAreNotIncludedByDefault() throws Exception {
|
|||
}
|
||||
|
||||
private Pack getSinglePack() {
|
||||
Iterator<Pack> packIt = repo.getObjectDatabase().getPacks()
|
||||
.iterator();
|
||||
Iterator<Pack> packIt = repo.getObjectDatabase().getPacks().iterator();
|
||||
Pack singlePack = packIt.next();
|
||||
assertFalse(packIt.hasNext());
|
||||
return singlePack;
|
||||
|
|
|
@ -53,6 +53,18 @@
|
|||
<message_argument value="SHA1_IMPLEMENTATION"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
<filter id="1142947843">
|
||||
<message_arguments>
|
||||
<message_argument value="5.13.3"/>
|
||||
<message_argument value="CONFIG_KEY_PACK_KEPT_OBJECTS"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
<filter id="1142947843">
|
||||
<message_arguments>
|
||||
<message_argument value="5.13.3"/>
|
||||
<message_argument value="CONFIG_REPACK_SECTION"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
</resource>
|
||||
<resource path="src/org/eclipse/jgit/lib/Repository.java" type="org.eclipse.jgit.lib.Repository">
|
||||
<filter id="1142947843">
|
||||
|
@ -69,6 +81,12 @@
|
|||
<message_argument value="DEFAULT_BITMAP_EXCLUDED_REFS_PREFIXES"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
<filter id="336658481">
|
||||
<message_arguments>
|
||||
<message_argument value="org.eclipse.jgit.storage.pack.PackConfig"/>
|
||||
<message_argument value="DEFAULT_PACK_KEPT_OBJECTS"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
<filter id="336658481">
|
||||
<message_arguments>
|
||||
<message_argument value="org.eclipse.jgit.storage.pack.PackConfig"/>
|
||||
|
@ -93,6 +111,12 @@
|
|||
<message_argument value="setBitmapExcludedRefsPrefixes(String[])"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
<filter id="1142947843">
|
||||
<message_arguments>
|
||||
<message_argument value="5.13.3"/>
|
||||
<message_argument value="DEFAULT_PACK_KEPT_OBJECTS"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
</resource>
|
||||
<resource path="src/org/eclipse/jgit/transport/BasePackPushConnection.java" type="org.eclipse.jgit.transport.BasePackPushConnection">
|
||||
<filter id="338792546">
|
||||
|
|
|
@ -62,7 +62,7 @@ public class GarbageCollectCommand extends GitCommand<Properties> {
|
|||
|
||||
private PackConfig pconfig;
|
||||
|
||||
private boolean packKeptObjects;
|
||||
private Boolean packKeptObjects;
|
||||
|
||||
/**
|
||||
* Constructor for GarbageCollectCommand.
|
||||
|
@ -141,7 +141,7 @@ public GarbageCollectCommand setAggressive(boolean aggressive) {
|
|||
* @since 5.13.3
|
||||
*/
|
||||
public GarbageCollectCommand setPackKeptObjects(boolean packKeptObjects) {
|
||||
this.packKeptObjects = packKeptObjects;
|
||||
this.packKeptObjects = Boolean.valueOf(packKeptObjects);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -189,8 +189,9 @@ public Properties call() throws GitAPIException {
|
|||
gc.setProgressMonitor(monitor);
|
||||
if (this.expire != null)
|
||||
gc.setExpire(expire);
|
||||
gc.setPackKeptObjects(packKeptObjects);
|
||||
|
||||
if (this.packKeptObjects != null) {
|
||||
gc.setPackKeptObjects(packKeptObjects.booleanValue());
|
||||
}
|
||||
try {
|
||||
gc.gc();
|
||||
return toProperties(gc.getStatistics());
|
||||
|
|
|
@ -158,7 +158,7 @@ public static void setExecutor(ExecutorService e) {
|
|||
|
||||
private Date packExpire;
|
||||
|
||||
private boolean packKeptObjects;
|
||||
private Boolean packKeptObjects;
|
||||
|
||||
private PackConfig pconfig;
|
||||
|
||||
|
@ -841,7 +841,7 @@ public Collection<Pack> repack() throws IOException {
|
|||
List<ObjectIdSet> excluded = new LinkedList<>();
|
||||
for (Pack p : repo.getObjectDatabase().getPacks()) {
|
||||
checkCancelled();
|
||||
if (!packKeptObjects && p.shouldBeKept()) {
|
||||
if (!shouldPackKeptObjects() && p.shouldBeKept()) {
|
||||
excluded.add(p.getIndex());
|
||||
}
|
||||
}
|
||||
|
@ -1316,7 +1316,13 @@ private void checkCancelled() throws CancelledException {
|
|||
* @param packKeptObjects Whether to include objects in `.keep` files when repacking.
|
||||
*/
|
||||
public void setPackKeptObjects(boolean packKeptObjects) {
|
||||
this.packKeptObjects = packKeptObjects;
|
||||
this.packKeptObjects = Boolean.valueOf(packKeptObjects);
|
||||
}
|
||||
|
||||
@SuppressWarnings("boxing")
|
||||
private boolean shouldPackKeptObjects() {
|
||||
return Optional.ofNullable(packKeptObjects)
|
||||
.orElse(pconfig.isPackKeptObjects());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -59,6 +59,12 @@ public final class ConfigConstants {
|
|||
/** The "gc" section */
|
||||
public static final String CONFIG_GC_SECTION = "gc";
|
||||
|
||||
/**
|
||||
* The "repack" section
|
||||
* @since 5.13.3
|
||||
*/
|
||||
public static final String CONFIG_REPACK_SECTION = "repack";
|
||||
|
||||
/** The "pack" section */
|
||||
public static final String CONFIG_PACK_SECTION = "pack";
|
||||
|
||||
|
@ -728,6 +734,13 @@ public final class ConfigConstants {
|
|||
*/
|
||||
public static final String CONFIG_KEY_WINDOW_MEMORY = "windowmemory";
|
||||
|
||||
/**
|
||||
* The "repack.packKeptObjects" key
|
||||
*
|
||||
* @since 5.13.3
|
||||
*/
|
||||
public static final String CONFIG_KEY_PACK_KEPT_OBJECTS = "packkeptobjects";
|
||||
|
||||
/**
|
||||
* The "feature" section
|
||||
*
|
||||
|
|
|
@ -37,8 +37,10 @@
|
|||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_WINDOW;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_WINDOW_MEMORY;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_PACK_SECTION;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PACK_KEPT_OBJECTS;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PRESERVE_OLD_PACKS;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_PRUNE_PRESERVED;
|
||||
import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_REPACK_SECTION;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.concurrent.Executor;
|
||||
|
@ -168,6 +170,16 @@ public class PackConfig {
|
|||
*/
|
||||
public static final boolean DEFAULT_BUILD_BITMAPS = true;
|
||||
|
||||
|
||||
/**
|
||||
* Default value for including objects in packs locked by .keep file when
|
||||
* repacking: {@value}
|
||||
*
|
||||
* @see #setPackKeptObjects(boolean)
|
||||
* @since 5.13.3
|
||||
*/
|
||||
public static final boolean DEFAULT_PACK_KEPT_OBJECTS = false;
|
||||
|
||||
/**
|
||||
* Default count of most recent commits to select for bitmaps. Only applies
|
||||
* when bitmaps are enabled: {@value}
|
||||
|
@ -284,6 +296,8 @@ public class PackConfig {
|
|||
|
||||
private boolean buildBitmaps = DEFAULT_BUILD_BITMAPS;
|
||||
|
||||
private boolean packKeptObjects = DEFAULT_PACK_KEPT_OBJECTS;
|
||||
|
||||
private int bitmapContiguousCommitCount = DEFAULT_BITMAP_CONTIGUOUS_COMMIT_COUNT;
|
||||
|
||||
private int bitmapRecentCommitCount = DEFAULT_BITMAP_RECENT_COMMIT_COUNT;
|
||||
|
@ -362,6 +376,7 @@ public PackConfig(PackConfig cfg) {
|
|||
this.executor = cfg.executor;
|
||||
this.indexVersion = cfg.indexVersion;
|
||||
this.buildBitmaps = cfg.buildBitmaps;
|
||||
this.packKeptObjects = cfg.packKeptObjects;
|
||||
this.bitmapContiguousCommitCount = cfg.bitmapContiguousCommitCount;
|
||||
this.bitmapRecentCommitCount = cfg.bitmapRecentCommitCount;
|
||||
this.bitmapRecentCommitSpan = cfg.bitmapRecentCommitSpan;
|
||||
|
@ -989,6 +1004,31 @@ public void setBuildBitmaps(boolean buildBitmaps) {
|
|||
this.buildBitmaps = buildBitmaps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether to include objects in `.keep` files when repacking.
|
||||
*
|
||||
* <p>Default setting: {@value #DEFAULT_PACK_KEPT_OBJECTS}
|
||||
*
|
||||
* @param packKeptObjects boolean indicating whether to include objects in
|
||||
* `.keep` files when repacking.
|
||||
* @since 5.13
|
||||
*/
|
||||
public void setPackKeptObjects(boolean packKeptObjects) {
|
||||
this.packKeptObjects = packKeptObjects;
|
||||
}
|
||||
|
||||
/**
|
||||
* True if objects in `.keep` files should be included when repacking.
|
||||
*
|
||||
* Default setting: {@value #DEFAULT_PACK_KEPT_OBJECTS}
|
||||
*
|
||||
* @return True if objects in `.keep` files should be included when repacking.
|
||||
* @since 5.13
|
||||
*/
|
||||
public boolean isPackKeptObjects() {
|
||||
return packKeptObjects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the count of most recent commits for which to build bitmaps.
|
||||
*
|
||||
|
@ -1234,8 +1274,12 @@ public void fromConfig(Config rc) {
|
|||
setSinglePack(rc.getBoolean(CONFIG_PACK_SECTION,
|
||||
CONFIG_KEY_SINGLE_PACK,
|
||||
getSinglePack()));
|
||||
setBuildBitmaps(rc.getBoolean(CONFIG_PACK_SECTION,
|
||||
CONFIG_KEY_BUILD_BITMAPS, isBuildBitmaps()));
|
||||
boolean buildBitmapsFromConfig = rc.getBoolean(CONFIG_PACK_SECTION,
|
||||
CONFIG_KEY_BUILD_BITMAPS, isBuildBitmaps());
|
||||
setBuildBitmaps(buildBitmapsFromConfig);
|
||||
setPackKeptObjects(rc.getBoolean(CONFIG_REPACK_SECTION,
|
||||
CONFIG_KEY_PACK_KEPT_OBJECTS,
|
||||
buildBitmapsFromConfig || isPackKeptObjects()));
|
||||
setBitmapContiguousCommitCount(rc.getInt(CONFIG_PACK_SECTION,
|
||||
CONFIG_KEY_BITMAP_CONTIGUOUS_COMMIT_COUNT,
|
||||
getBitmapContiguousCommitCount()));
|
||||
|
|
Loading…
Reference in New Issue