Search in sources :

Example 1 with TreeDifference

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;
}
Also used : MutableTree(org.locationtech.geogig.api.plumbing.diff.MutableTree) ProgressListener(org.locationtech.geogig.api.ProgressListener) ObjectId(org.locationtech.geogig.api.ObjectId) ObjectDatabase(org.locationtech.geogig.storage.ObjectDatabase) Node(org.locationtech.geogig.api.Node) TreeDifference(org.locationtech.geogig.api.plumbing.diff.TreeDifference) RevTree(org.locationtech.geogig.api.RevTree)

Example 2 with TreeDifference

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;
}
Also used : MutableTree(org.locationtech.geogig.api.plumbing.diff.MutableTree) NodeRef(org.locationtech.geogig.api.NodeRef) ObjectId(org.locationtech.geogig.api.ObjectId) Iterator(java.util.Iterator) TreeDifference(org.locationtech.geogig.api.plumbing.diff.TreeDifference)

Aggregations

ObjectId (org.locationtech.geogig.api.ObjectId)2 MutableTree (org.locationtech.geogig.api.plumbing.diff.MutableTree)2 TreeDifference (org.locationtech.geogig.api.plumbing.diff.TreeDifference)2 Iterator (java.util.Iterator)1 Node (org.locationtech.geogig.api.Node)1 NodeRef (org.locationtech.geogig.api.NodeRef)1 ProgressListener (org.locationtech.geogig.api.ProgressListener)1 RevTree (org.locationtech.geogig.api.RevTree)1 ObjectDatabase (org.locationtech.geogig.storage.ObjectDatabase)1