From e0744891fe233f1b78b55ea14675d5766d3ac321 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 19 Nov 2019 19:55:06 -0800 Subject: [PATCH] FileRepository: cleanup refs outside refs/ on reftable conversion Change-Id: Iab7d3a08906e826e26572f534512a09d3a5876b0 Signed-off-by: Han-Wen Nienhuys Signed-off-by: Matthias Sohn --- .../internal/storage/file/FileReftableTest.java | 5 +++++ .../jgit/internal/storage/file/FileRepository.java | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java index bb68ef185..e0e20fb4d 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/FileReftableTest.java @@ -122,6 +122,11 @@ public void testRacyReload() throws Exception { } } + @Test + public void additionalRefsAreRemoved() { + assertFalse(new File(db.getDirectory(), Constants.HEAD).exists()); + } + @Test public void testCompactFully() throws Exception { ObjectId c1 = db.resolve("master^^"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java index cb00fc4ef..2f6ef5113 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java @@ -46,6 +46,8 @@ package org.eclipse.jgit.internal.storage.file; +import static java.util.stream.Collectors.toList; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -740,6 +742,10 @@ void convertToReftable(boolean writeLogs, boolean backup) File packedRefs = new File(getDirectory(), Constants.PACKED_REFS); File logsDir = new File(getDirectory(), Constants.LOGS); + + List additional = getRefDatabase().getAdditionalRefs().stream() + .map(Ref::getName).collect(toList()); + additional.add(Constants.HEAD); if (backup) { FileUtils.rename(refsFile, new File(getDirectory(), "refs.old")); if (packedRefs.exists()) { @@ -750,10 +756,17 @@ void convertToReftable(boolean writeLogs, boolean backup) FileUtils.rename(logsDir, new File(getDirectory(), Constants.LOGS + ".old")); } + for (String r : additional) { + FileUtils.rename(new File(getDirectory(), r), + new File(getDirectory(), r + ".old")); + } } else { packedRefs.delete(); // ignore return value. FileUtils.delete(logsDir, FileUtils.RECURSIVE); FileUtils.delete(refsFile, FileUtils.RECURSIVE); + for (String r : additional) { + new File(getDirectory(), r).delete(); + } } // Put new data.