Allow deletion of HEAD ref if the repository is bare.

Change-Id: I2281d818c9f76019e7e053e89b20214f2d663957
Signed-off-by: Mike Williams <miwilliams@google.com>
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 4843418..4d91a23 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 @@ private void delete(final RefUpdate ref, final Result expected)
 
 	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 void testDeleteHead() throws IOException {
 		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 4316cd0..c1027f0 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 Result delete() throws IOException {
 	 */
 	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();