use of org.locationtech.geogig.api.plumbing.diff.TreeDifference in project GeoGig by boundlessgeo.
the class WriteTree2 method _call.
/**
* Executes the write tree operation.
*
* @return the new root tree id, the current HEAD tree id if there are no differences between
* the index and the HEAD, or {@code null} if the operation has been cancelled (as
* indicated by the {@link #getProgressListener() progress listener}.
*/
@Override
protected ObjectId _call() {
final ProgressListener progress = getProgressListener();
TreeDifference treeDifference = computeTreeDifference();
if (treeDifference.areEqual()) {
MutableTree leftTree = treeDifference.getLeftTree();
Node leftNode = leftTree.getNode();
ObjectId leftOid = leftNode.getObjectId();
return leftOid;
}
final MutableTree oldLeftTree = treeDifference.getLeftTree().clone();
Preconditions.checkState(oldLeftTree.equals(treeDifference.getLeftTree()));
// handle renames before new and deleted trees for the computation of new and deleted to be
// accurate
Set<String> ignoreList = Sets.newHashSet();
handleRenames(treeDifference, ignoreList);
handlePureMetadataChanges(treeDifference, ignoreList);
handleNewTrees(treeDifference, ignoreList);
handleDeletedTrees(treeDifference, ignoreList);
handleRemainingDifferences(treeDifference, ignoreList);
progress.complete();
MutableTree newLeftTree = treeDifference.getLeftTree();
final ObjectDatabase repositoryDatabase = objectDatabase();
final RevTree newRoot = newLeftTree.build(stagingDatabase(), repositoryDatabase);
if (newRoot.trees().isPresent()) {
for (Node n : newRoot.trees().get()) {
if (n.getMetadataId().isPresent())
deepMove(n.getMetadataId().get());
}
}
ObjectId newRootId = newRoot.getId();
return newRootId;
}
use of org.locationtech.geogig.api.plumbing.diff.TreeDifference in project GeoGig by boundlessgeo.
the class WriteTree2 method computeTreeDifference.
private TreeDifference computeTreeDifference() {
final String rightTreeish = Ref.STAGE_HEAD;
final ObjectId rootTreeId = resolveRootTreeId();
final ObjectId stageRootId = index().getTree().getId();
final Supplier<Iterator<NodeRef>> leftTreeRefs;
final Supplier<Iterator<NodeRef>> rightTreeRefs;
if (rootTreeId.isNull()) {
Iterator<NodeRef> empty = Iterators.emptyIterator();
leftTreeRefs = Suppliers.ofInstance(empty);
} else {
leftTreeRefs = command(LsTreeOp.class).setReference(rootTreeId.toString()).setStrategy(Strategy.DEPTHFIRST_ONLY_TREES);
}
rightTreeRefs = command(LsTreeOp.class).setReference(rightTreeish).setStrategy(Strategy.DEPTHFIRST_ONLY_TREES);
MutableTree leftTree = MutableTree.createFromRefs(rootTreeId, leftTreeRefs);
MutableTree rightTree = MutableTree.createFromRefs(stageRootId, rightTreeRefs);
TreeDifference treeDifference = TreeDifference.create(leftTree, rightTree);
return treeDifference;
}
Aggregations