Merge branch 'stable-4.4'
* stable-4.4: JGit v4.4.1.201607150455-r RefDirectory: remove ref lock file for following ref dir removal Change-Id: Ifc8a782efd7f2f991e70ad2a3691a8dba66c7554 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
This commit is contained in:
commit
0be8021819
|
@ -45,11 +45,14 @@
|
|||
|
||||
import static java.lang.Integer.valueOf;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.concurrent.BrokenBarrierException;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
|
@ -80,6 +83,17 @@ public void looseRefPacked() throws Exception {
|
|||
assertSame(repo.exactRef("refs/tags/t").getStorage(), Storage.PACKED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void emptyRefDirectoryDeleted() throws Exception {
|
||||
String ref = "dir/ref";
|
||||
tr.branch(ref).commit().create();
|
||||
String name = repo.findRef(ref).getName();
|
||||
Path dir = repo.getDirectory().toPath().resolve(name).getParent();
|
||||
|
||||
gc.packRefs();
|
||||
assertFalse(Files.exists(dir));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void concurrentOnlyOneWritesPackedRefs() throws Exception {
|
||||
RevBlob a = tr.blob("a");
|
||||
|
|
|
@ -688,7 +688,7 @@ public void pack(List<String> refs) throws IOException {
|
|||
newLoose = curLoose.remove(idx);
|
||||
} while (!looseRefs.compareAndSet(curLoose, newLoose));
|
||||
int levels = levelsIn(refName) - 2;
|
||||
delete(fileFor(refName), levels);
|
||||
delete(refFile, levels, rLck);
|
||||
}
|
||||
} finally {
|
||||
rLck.unlock();
|
||||
|
@ -1062,13 +1062,24 @@ static int levelsIn(final String name) {
|
|||
}
|
||||
|
||||
static void delete(final File file, final int depth) throws IOException {
|
||||
if (!file.delete() && file.isFile())
|
||||
throw new IOException(MessageFormat.format(JGitText.get().fileCannotBeDeleted, file));
|
||||
delete(file, depth, null);
|
||||
}
|
||||
|
||||
private static void delete(final File file, final int depth, LockFile rLck)
|
||||
throws IOException {
|
||||
if (!file.delete() && file.isFile()) {
|
||||
throw new IOException(MessageFormat.format(
|
||||
JGitText.get().fileCannotBeDeleted, file));
|
||||
}
|
||||
|
||||
if (rLck != null) {
|
||||
rLck.unlock(); // otherwise cannot delete dir below
|
||||
}
|
||||
File dir = file.getParentFile();
|
||||
for (int i = 0; i < depth; ++i) {
|
||||
if (!dir.delete())
|
||||
if (!dir.delete()) {
|
||||
break; // ignore problem here
|
||||
}
|
||||
dir = dir.getParentFile();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue