@Test public void testEmptyRepo() { ObjectId root = command.call(); assertNotNull(root); assertEquals(RevTree.EMPTY_TREE_ID, root); }
private void handleDeletedTrees(TreeDifference treeDifference, Set<String> ignoreList) { SortedSet<NodeRef> deletes = treeDifference.findDeletes(); for (NodeRef ref : deletes) { String path = ref.path(); if (ignoreList.contains(path)) { continue; } ignoreList.add(path); if (!filterMatchesOrIsParent(path)) { if (filterApplies(path, treeDifference.getRightTree())) { // can't optimize RevTree newTree = applyChanges(ref, null); Node newNode = Node.tree(ref.name(), newTree.getId(), ref.getMetadataId()); MutableTree leftTree = treeDifference.getLeftTree(); leftTree.forceChild(ref.getParentPath(), newNode); } } else { MutableTree leftTree = treeDifference.getLeftTree(); leftTree.removeChild(path); } } }
private TreeDifference computeTreeDifference() { final String rightTreeish = Ref.STAGE_HEAD; final ObjectId rootTreeId = resolveRootTreeId(); final ObjectId stageRootId = stagingArea().getTree().getId(); final Supplier<Iterator<NodeRef>> leftTreeRefs; final Supplier<Iterator<NodeRef>> rightTreeRefs; if (rootTreeId.isNull()) { Iterator<NodeRef> empty = Collections.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; }
final ProgressListener progress = getProgressListener(); final ObjectId stageRootId = stagingArea().getTree().getId(); return stageRootId; TreeDifference treeDifference = computeTreeDifference(); handleRenames(treeDifference, ignoreList); handlePureMetadataChanges(treeDifference, ignoreList); handleNewTrees(treeDifference, ignoreList); handleDeletedTrees(treeDifference, ignoreList); handleRemainingDifferences(treeDifference, ignoreList); final ObjectDatabase repositoryDatabase = objectDatabase(); final RevTree newRoot = newLeftTree.build(repositoryDatabase);
private void handleRemainingDifferences(TreeDifference treeDifference, Set<String> ignoreList) { // old/new refs to trees that have changed and apply to the pathFilters, deepest paths first final SortedMap<NodeRef, NodeRef> changedTrees = treeDifference.findChanges(); final SortedMap<NodeRef, NodeRef> filteredChangedTrees = changedTrees;// filterChanges(changedTrees); for (Map.Entry<NodeRef, NodeRef> changedTreeRefs : filteredChangedTrees.entrySet()) { NodeRef leftTreeRef = changedTreeRefs.getKey(); NodeRef rightTreeRef = changedTreeRefs.getValue(); String newPath = rightTreeRef.path(); if (ignoreList.contains(newPath)) { continue; } if (!filterApplies(newPath, treeDifference.getRightTree())) { continue; } ignoreList.add(newPath); RevTree tree = applyChanges(leftTreeRef, rightTreeRef); Envelope bounds = SpatialOps.boundsOf(tree); Node newTreeNode = Node.create(rightTreeRef.name(), tree.getId(), rightTreeRef.getMetadataId(), TYPE.TREE, bounds); MutableTree leftRoot = treeDifference.getLeftTree(); String parentPath = rightTreeRef.getParentPath(); leftRoot.setChild(parentPath, newTreeNode); } }
writeTree.setOldRoot(oldRoot).setProgressListener(subProgress(writeTreeProgress)); if (!pathFilters.isEmpty()) { writeTree.setPathFilter(pathFilters); newTreeId = writeTree.call();
/** * @return the differences between the given right tree(staged) and the resulting tree after * running {@link WriteTree2} with the given filters. The result's left refs are the * ones in the new tree, and the right refs the same as given in the rightTree */ private MapDifference<String, NodeRef> runWithPathFilter(RevTree leftTree, RevTree rightTree, String... filters) { // print(leftTree.getId()); // print(rightTree.getId()); final ObjectId newRepoRoot = command.setPathFilter(Arrays.asList(filters)).call(); assertNotNull(newRepoRoot); // print(newRepoRoot); // check all blobs have been moved from the index to the object database verifyRepositoryTree(NodeRef.ROOT, newRepoRoot); final boolean includeFeatures = true; ImmutableMap<String, NodeRef> stagedRefs = getRefsByPath(rightTree.getId(), includeFeatures); ImmutableMap<String, NodeRef> resultRefs = getRefsByPath(newRepoRoot, includeFeatures); MapDifference<String, NodeRef> difference = Maps.difference(resultRefs, stagedRefs); return difference; }
.setOldRoot(tree(repo.getHead().get().getObjectId())).call(); newRepoTreeId2 = geogig.command(WriteTree2.class).setOldRoot(tree(newRepoTreeId1)) .call(); newRepoTreeId3 = geogig.command(WriteTree2.class).setOldRoot(tree(newRepoTreeId2)) .call();
"either left or right tree shall be non null"); final ObjectDatabase repositoryDatabase = objectDatabase(); final String treePath = rightTreeRef == null ? leftTreeRef.path() : rightTreeRef.path(); final Set<String> strippedPathFilters = stripParentAndFiltersThatDontApply(this.pathFilters, treePath); DiffTree diffs = command(DiffTree.class).setRecursive(false).setReportTrees(false) .setOldTree(leftTreeId).setNewTree(rightTreeId) .setPathFilter(new ArrayList<>(strippedPathFilters)).setCustomFilter(null);
return true; boolean filterIsParentOfTree = filterMatchesOrIsParent(treePath); boolean filterIsTree = childTrees.contains(filter); if (filterIsParentOfTree && filterIsTree) {
/** * @return the resolved root tree id */ private ObjectId resolveRootTreeId() { if (oldRoot != null) { RevTree rootTree = oldRoot.get(); return rootTree.getId(); } ObjectId targetTreeId = command(ResolveTreeish.class).setTreeish(Ref.HEAD).call().get(); return targetTreeId; }
final ProgressListener progress = getProgressListener(); final ObjectId stageRootId = stagingArea().getTree().getId(); return stageRootId; TreeDifference treeDifference = computeTreeDifference(); handleRenames(treeDifference, ignoreList); handlePureMetadataChanges(treeDifference, ignoreList); handleNewTrees(treeDifference, ignoreList); handleDeletedTrees(treeDifference, ignoreList); handleRemainingDifferences(treeDifference, ignoreList); final ObjectDatabase repositoryDatabase = objectDatabase(); final RevTree newRoot = newLeftTree.build(repositoryDatabase);
writeTree.setOldRoot(oldRoot).setProgressListener(subProgress(writeTreeProgress)); if (!pathFilters.isEmpty()) { writeTree.setPathFilter(pathFilters); newTreeId = writeTree.call();
/** * @return the differences between the given right tree(staged) and the resulting tree after * running {@link WriteTree2} with the given filters. The result's left refs are the * ones in the new tree, and the right refs the same as given in the rightTree */ private MapDifference<String, NodeRef> runWithPathFilter(RevTree leftTree, RevTree rightTree, String... filters) { // print(leftTree.getId()); // print(rightTree.getId()); final ObjectId newRepoRoot = command.setPathFilter(Arrays.asList(filters)).call(); assertNotNull(newRepoRoot); // print(newRepoRoot); // check all blobs have been moved from the index to the object database verifyRepositoryTree(NodeRef.ROOT, newRepoRoot); final boolean includeFeatures = true; ImmutableMap<String, NodeRef> stagedRefs = getRefsByPath(rightTree.getId(), includeFeatures); ImmutableMap<String, NodeRef> resultRefs = getRefsByPath(newRepoRoot, includeFeatures); MapDifference<String, NodeRef> difference = Maps.difference(resultRefs, stagedRefs); return difference; }
.setOldRoot(tree(repo.getHead().get().getObjectId())).call(); newRepoTreeId2 = geogig.command(WriteTree2.class).setOldRoot(tree(newRepoTreeId1)) .call(); newRepoTreeId3 = geogig.command(WriteTree2.class).setOldRoot(tree(newRepoTreeId2)) .call();
"either left or right tree shall be non null"); final ObjectDatabase repositoryDatabase = objectDatabase(); final String treePath = rightTreeRef == null ? leftTreeRef.path() : rightTreeRef.path(); final Set<String> strippedPathFilters = stripParentAndFiltersThatDontApply(this.pathFilters, treePath); DiffTree diffs = command(DiffTree.class).setRecursive(false).setReportTrees(false) .setOldTree(leftTreeId).setNewTree(rightTreeId) .setPathFilter(new ArrayList<>(strippedPathFilters)).setCustomFilter(null);
private void handleRemainingDifferences(TreeDifference treeDifference, Set<String> ignoreList) { // old/new refs to trees that have changed and apply to the pathFilters, deepest paths first final SortedMap<NodeRef, NodeRef> changedTrees = treeDifference.findChanges(); final SortedMap<NodeRef, NodeRef> filteredChangedTrees = changedTrees;// filterChanges(changedTrees); for (Map.Entry<NodeRef, NodeRef> changedTreeRefs : filteredChangedTrees.entrySet()) { NodeRef leftTreeRef = changedTreeRefs.getKey(); NodeRef rightTreeRef = changedTreeRefs.getValue(); String newPath = rightTreeRef.path(); if (ignoreList.contains(newPath)) { continue; } if (!filterApplies(newPath, treeDifference.getRightTree())) { continue; } ignoreList.add(newPath); RevTree tree = applyChanges(leftTreeRef, rightTreeRef); Envelope bounds = SpatialOps.boundsOf(tree); Node newTreeNode = RevObjectFactory.defaultInstance().createNode(rightTreeRef.name(), tree.getId(), rightTreeRef.getMetadataId(), TYPE.TREE, bounds, null); MutableTree leftRoot = treeDifference.getLeftTree(); String parentPath = rightTreeRef.getParentPath(); leftRoot.setChild(parentPath, newTreeNode); } }
return true; boolean filterIsParentOfTree = filterMatchesOrIsParent(treePath); boolean filterIsTree = childTrees.contains(filter); if (filterIsParentOfTree && filterIsTree) {
/** * @return the resolved root tree id */ private ObjectId resolveRootTreeId() { if (oldRoot != null) { RevTree rootTree = oldRoot.get(); return rootTree.getId(); } ObjectId targetTreeId = command(ResolveTreeish.class).setTreeish(Ref.HEAD).call().get(); return targetTreeId; }
@Test public void testEmptyRepo() { ObjectId root = command.call(); assertNotNull(root); assertEquals(RevTree.EMPTY_TREE_ID, root); }