Browse Source

Allow deletion of HEAD ref if the repository is bare.

Change-Id: I2281d818c9f76019e7e053e89b20214f2d663957
Signed-off-by: Mike Williams <miwilliams@google.com>
stable-4.3
Mike Williams 9 years ago
parent
commit
48ad6842fc
  1. 20
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
  2. 3
      org.eclipse.jgit/src/org/eclipse/jgit/lib/RefUpdate.java

20
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, 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 class RefUpdateTest extends SampleDataRepositoryTestCase {
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

3
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 { 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();

Loading…
Cancel
Save