Merge "Allow deletion of HEAD ref if the repository is bare."

This commit is contained in:
Shawn Pearce 2016-02-15 13:02:04 -05:00 committed by Gerrit Code Review @ Eclipse.org
commit 621b0740b3
2 changed files with 20 additions and 3 deletions

View File

@ -104,9 +104,14 @@ private void delete(final RefUpdate ref, final Result expected)
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 { 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(expected, ref.delete());
assertEquals(!removed, db.getAllRefs().containsKey(ref.getName())); assertEquals(!removed, repo.getAllRefs().containsKey(ref.getName()));
} }
@Test @Test
@ -232,6 +237,17 @@ public void testDeleteHead() throws IOException {
assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size()); 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, * Delete a loose ref and make sure the directory in refs is deleted too,
* and the reflog dir too * and the reflog dir too

View File

@ -552,7 +552,8 @@ public Result delete() throws IOException {
*/ */
public Result delete(final RevWalk walk) throws IOException { public Result delete(final RevWalk walk) throws IOException {
final String myName = getRef().getLeaf().getName(); 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); Ref head = getRefDatabase().getRef(Constants.HEAD);
while (head != null && head.isSymbolic()) { while (head != null && head.isSymbolic()) {
head = head.getTarget(); head = head.getTarget();