From 48ad6842fc20ce1aaf1198d5f30239633c89c52c Mon Sep 17 00:00:00 2001 From: Mike Williams Date: Mon, 25 Jan 2016 12:45:33 -0500 Subject: [PATCH] Allow deletion of HEAD ref if the repository is bare. Change-Id: I2281d818c9f76019e7e053e89b20214f2d663957 Signed-off-by: Mike Williams --- .../internal/storage/file/RefUpdateTest.java | 20 +++++++++++++++++-- .../src/org/eclipse/jgit/lib/RefUpdate.java | 3 ++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java index 48434189e..4d91a2368 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java @@ -104,9 +104,14 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { private void delete(final RefUpdate ref, final Result expected, final boolean exists, final boolean removed) throws IOException { - assertEquals(exists, db.getAllRefs().containsKey(ref.getName())); + delete(db, ref, expected, exists, removed); + } + + private void delete(Repository repo, final RefUpdate ref, final Result expected, + final boolean exists, final boolean removed) throws IOException { + assertEquals(exists, repo.getAllRefs().containsKey(ref.getName())); assertEquals(expected, ref.delete()); - assertEquals(!removed, db.getAllRefs().containsKey(ref.getName())); + assertEquals(!removed, repo.getAllRefs().containsKey(ref.getName())); } @Test @@ -232,6 +237,17 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size()); } + @Test + public void testDeleteHeadInBareRepo() throws IOException { + try (Repository bareRepo = createBareRepository()) { + RefUpdate ref = bareRepo.updateRef(Constants.HEAD); + ref.setNewObjectId(ObjectId.fromString("0123456789012345678901234567890123456789")); + // Create the HEAD ref so we can delete it. + assertEquals(Result.NEW, ref.update()); + ref = bareRepo.updateRef(Constants.HEAD); + delete(bareRepo, ref, Result.NO_CHANGE, true, true); + } + } /** * Delete a loose ref and make sure the directory in refs is deleted too, * and the reflog dir too diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java index 4316cd0a1..c1027f0f7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java @@ -552,7 +552,8 @@ public abstract class RefUpdate { */ public Result delete(final RevWalk walk) throws IOException { final String myName = getRef().getLeaf().getName(); - if (myName.startsWith(Constants.R_HEADS)) { + if (myName.startsWith(Constants.R_HEADS) && !getRepository().isBare()) { + // Don't allow the currently checked out branch to be deleted. Ref head = getRefDatabase().getRef(Constants.HEAD); while (head != null && head.isSymbolic()) { head = head.getTarget();