debug-rebuild-ref-tree: Copy HEAD into RefTree

HEAD is not part of getRefs(ALL) and must be copied explicitly.
This allows `jgit debug-rebuild-ref-tree --enable` to convert an
existing repository to use RefTree with a local working tree:

  mkdir testRepo
  cd testRepo

  jgit init
  jgit debug-rebuild-ref-tree --enable

  touch a
  jgit add a
  jgit commit -m initial

Change-Id: I46cbc2611b9ae683ef7319dc46af277925dfaee5
This commit is contained in:
Shawn Pearce 2016-01-15 14:13:25 -08:00
parent e1529ced42
commit 14dfa70520
1 changed files with 13 additions and 4 deletions

View File

@ -43,9 +43,11 @@
package org.eclipse.jgit.pgm.debug;
import static org.eclipse.jgit.lib.Constants.HEAD;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.internal.storage.reftree.RefTree;
import org.eclipse.jgit.internal.storage.reftree.RefTreeDatabase;
@ -108,7 +110,7 @@ protected void run() throws Exception {
oldTreeId = ObjectId.zeroId();
}
RefTree tree = rebuild(refDb.getRefs(RefDatabase.ALL));
RefTree tree = rebuild(refDb);
b.setTreeId(tree.writeTree(inserter));
b.setAuthor(new PersonIdent(db));
b.setCommitter(b.getAuthor());
@ -139,12 +141,19 @@ protected void run() throws Exception {
}
}
private RefTree rebuild(Map<String, Ref> refMap) {
private RefTree rebuild(RefDatabase refdb) throws IOException {
RefTree tree = RefTree.newEmptyTree();
List<org.eclipse.jgit.internal.storage.reftree.Command> cmds
= new ArrayList<>();
for (Ref r : refMap.values()) {
Ref head = refdb.exactRef(HEAD);
if (head != null) {
cmds.add(new org.eclipse.jgit.internal.storage.reftree.Command(
null,
head));
}
for (Ref r : refdb.getRefs(RefDatabase.ALL).values()) {
if (r.getName().equals(txnCommitted)
|| r.getName().startsWith(txnNamespace)) {
continue;