Browse Source
This has been deprecated for some time now. Applications should instead use DirCache within a TreeWalk. Change-Id: I8099d93f07139c33fe09bdeef8d739782397da17 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>stable-0.12
Shawn O. Pearce
14 years ago
4 changed files with 0 additions and 606 deletions
@ -1,162 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com> |
|
||||||
* Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org> |
|
||||||
* and other copyright owners as documented in the project's IP log. |
|
||||||
* |
|
||||||
* This program and the accompanying materials are made available |
|
||||||
* under the terms of the Eclipse Distribution License v1.0 which |
|
||||||
* accompanies this distribution, is reproduced below, and is |
|
||||||
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
|
||||||
* |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or |
|
||||||
* without modification, are permitted provided that the following |
|
||||||
* conditions are met: |
|
||||||
* |
|
||||||
* - Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* - Redistributions in binary form must reproduce the above |
|
||||||
* copyright notice, this list of conditions and the following |
|
||||||
* disclaimer in the documentation and/or other materials provided |
|
||||||
* with the distribution. |
|
||||||
* |
|
||||||
* - Neither the name of the Eclipse Foundation, Inc. nor the |
|
||||||
* names of its contributors may be used to endorse or promote |
|
||||||
* products derived from this software without specific prior |
|
||||||
* written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.eclipse.jgit.lib; |
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals; |
|
||||||
import static org.junit.Assert.assertTrue; |
|
||||||
import static org.junit.Assert.fail; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
import java.util.ArrayList; |
|
||||||
|
|
||||||
import org.eclipse.jgit.lib.GitIndex.Entry; |
|
||||||
import org.junit.Test; |
|
||||||
|
|
||||||
public class IndexTreeWalkerTest extends RepositoryTestCase { |
|
||||||
private ArrayList<String> treeOnlyEntriesVisited = new ArrayList<String>(); |
|
||||||
private ArrayList<String> bothVisited = new ArrayList<String>(); |
|
||||||
private ArrayList<String> indexOnlyEntriesVisited = new ArrayList<String>(); |
|
||||||
|
|
||||||
private class TestIndexTreeVisitor extends AbstractIndexTreeVisitor { |
|
||||||
public void visitEntry(TreeEntry treeEntry, Entry indexEntry, File file) { |
|
||||||
if (treeEntry == null) |
|
||||||
indexOnlyEntriesVisited.add(indexEntry.getName()); |
|
||||||
else if (indexEntry == null) |
|
||||||
treeOnlyEntriesVisited.add(treeEntry.getFullName()); |
|
||||||
else bothVisited.add(indexEntry.getName()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/* |
|
||||||
* Need to think about what I really need to be able to do.... |
|
||||||
* |
|
||||||
* 1) Visit all entries in index and tree |
|
||||||
* 2) Get all directories that exist in the index, but not in the tree |
|
||||||
* -- I'm pretty sure that I don't need to do the other way around |
|
||||||
* because I already |
|
||||||
*/ |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testTreeOnlyOneLevel() throws IOException { |
|
||||||
GitIndex index = new GitIndex(db); |
|
||||||
Tree tree = new Tree(db); |
|
||||||
tree.addFile("foo"); |
|
||||||
tree.addFile("bar"); |
|
||||||
|
|
||||||
new IndexTreeWalker(index, tree, trash, new TestIndexTreeVisitor()).walk(); |
|
||||||
|
|
||||||
assertTrue(treeOnlyEntriesVisited.get(0).equals("bar")); |
|
||||||
assertTrue(treeOnlyEntriesVisited.get(1).equals("foo")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testIndexOnlyOneLevel() throws IOException { |
|
||||||
GitIndex index = new GitIndex(db); |
|
||||||
Tree tree = new Tree(db); |
|
||||||
|
|
||||||
index.add(trash, writeTrashFile("foo", "foo")); |
|
||||||
index.add(trash, writeTrashFile("bar", "bar")); |
|
||||||
new IndexTreeWalker(index, tree, trash, new TestIndexTreeVisitor()).walk(); |
|
||||||
|
|
||||||
assertTrue(indexOnlyEntriesVisited.get(0).equals("bar")); |
|
||||||
assertTrue(indexOnlyEntriesVisited.get(1).equals("foo")); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testBoth() throws IOException { |
|
||||||
GitIndex index = new GitIndex(db); |
|
||||||
Tree tree = new Tree(db); |
|
||||||
|
|
||||||
index.add(trash, writeTrashFile("a", "a")); |
|
||||||
tree.addFile("b/b"); |
|
||||||
index.add(trash, writeTrashFile("c", "c")); |
|
||||||
tree.addFile("c"); |
|
||||||
|
|
||||||
new IndexTreeWalker(index, tree, trash, new TestIndexTreeVisitor()).walk(); |
|
||||||
assertTrue(indexOnlyEntriesVisited.contains("a")); |
|
||||||
assertTrue(treeOnlyEntriesVisited.contains("b/b")); |
|
||||||
assertTrue(bothVisited.contains("c")); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testIndexOnlySubDirs() throws IOException { |
|
||||||
GitIndex index = new GitIndex(db); |
|
||||||
Tree tree = new Tree(db); |
|
||||||
|
|
||||||
index.add(trash, writeTrashFile("foo/bar/baz", "foobar")); |
|
||||||
index.add(trash, writeTrashFile("asdf", "asdf")); |
|
||||||
new IndexTreeWalker(index, tree, trash, new TestIndexTreeVisitor()).walk(); |
|
||||||
|
|
||||||
assertEquals("asdf", indexOnlyEntriesVisited.get(0)); |
|
||||||
assertEquals("foo/bar/baz", indexOnlyEntriesVisited.get(1)); |
|
||||||
} |
|
||||||
|
|
||||||
@Test |
|
||||||
public void testLeavingTree() throws IOException { |
|
||||||
GitIndex index = new GitIndex(db); |
|
||||||
index.add(trash, writeTrashFile("foo/bar", "foo/bar")); |
|
||||||
index.add(trash, writeTrashFile("foobar", "foobar")); |
|
||||||
|
|
||||||
new IndexTreeWalker(index, db.mapTree(index.writeTree()), trash, new AbstractIndexTreeVisitor() { |
|
||||||
@Override |
|
||||||
public void visitEntry(TreeEntry entry, Entry indexEntry, File f) { |
|
||||||
if (entry == null || indexEntry == null) |
|
||||||
fail(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void finishVisitTree(Tree tree, int i, String curDir) |
|
||||||
throws IOException { |
|
||||||
if (tree.memberCount() == 0) |
|
||||||
fail(); |
|
||||||
if (i == 0) |
|
||||||
fail(); |
|
||||||
} |
|
||||||
|
|
||||||
}).walk(); |
|
||||||
} |
|
||||||
} |
|
@ -1,82 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com> |
|
||||||
* Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> |
|
||||||
* Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org> |
|
||||||
* and other copyright owners as documented in the project's IP log. |
|
||||||
* |
|
||||||
* This program and the accompanying materials are made available |
|
||||||
* under the terms of the Eclipse Distribution License v1.0 which |
|
||||||
* accompanies this distribution, is reproduced below, and is |
|
||||||
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
|
||||||
* |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or |
|
||||||
* without modification, are permitted provided that the following |
|
||||||
* conditions are met: |
|
||||||
* |
|
||||||
* - Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* - Redistributions in binary form must reproduce the above |
|
||||||
* copyright notice, this list of conditions and the following |
|
||||||
* disclaimer in the documentation and/or other materials provided |
|
||||||
* with the distribution. |
|
||||||
* |
|
||||||
* - Neither the name of the Eclipse Foundation, Inc. nor the |
|
||||||
* names of its contributors may be used to endorse or promote |
|
||||||
* products derived from this software without specific prior |
|
||||||
* written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.eclipse.jgit.lib; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.eclipse.jgit.lib.GitIndex.Entry; |
|
||||||
|
|
||||||
/** |
|
||||||
* Implementation of IndexTreeVisitor that can be subclassed if you don't |
|
||||||
* case about certain events |
|
||||||
* @author dwatson |
|
||||||
* |
|
||||||
* @deprecated Use {@link org.eclipse.jgit.treewalk.TreeWalk} instead, with a |
|
||||||
* {@link org.eclipse.jgit.dircache.DirCacheIterator} as one of the members. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public class AbstractIndexTreeVisitor implements IndexTreeVisitor { |
|
||||||
public void finishVisitTree(Tree tree, Tree auxTree, String curDir) |
|
||||||
throws IOException { |
|
||||||
// Empty
|
|
||||||
} |
|
||||||
|
|
||||||
public void finishVisitTree(Tree tree, int i, String curDir) |
|
||||||
throws IOException { |
|
||||||
// Empty
|
|
||||||
} |
|
||||||
|
|
||||||
public void visitEntry(TreeEntry treeEntry, Entry indexEntry, File file) |
|
||||||
throws IOException { |
|
||||||
// Empty
|
|
||||||
} |
|
||||||
|
|
||||||
public void visitEntry(TreeEntry treeEntry, TreeEntry auxEntry, |
|
||||||
Entry indexEntry, File file) throws IOException { |
|
||||||
// Empty
|
|
||||||
} |
|
||||||
} |
|
@ -1,107 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com> |
|
||||||
* Copyright (C) 2007-2008, Robin Rosenberg <robin.rosenberg@dewire.com> |
|
||||||
* Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org> |
|
||||||
* and other copyright owners as documented in the project's IP log. |
|
||||||
* |
|
||||||
* This program and the accompanying materials are made available |
|
||||||
* under the terms of the Eclipse Distribution License v1.0 which |
|
||||||
* accompanies this distribution, is reproduced below, and is |
|
||||||
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
|
||||||
* |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or |
|
||||||
* without modification, are permitted provided that the following |
|
||||||
* conditions are met: |
|
||||||
* |
|
||||||
* - Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* - Redistributions in binary form must reproduce the above |
|
||||||
* copyright notice, this list of conditions and the following |
|
||||||
* disclaimer in the documentation and/or other materials provided |
|
||||||
* with the distribution. |
|
||||||
* |
|
||||||
* - Neither the name of the Eclipse Foundation, Inc. nor the |
|
||||||
* names of its contributors may be used to endorse or promote |
|
||||||
* products derived from this software without specific prior |
|
||||||
* written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.eclipse.jgit.lib; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.eclipse.jgit.lib.GitIndex.Entry; |
|
||||||
|
|
||||||
/** |
|
||||||
* Visitor interface for traversing the index and two trees in parallel. |
|
||||||
* |
|
||||||
* When merging we deal with up to two tree nodes and a base node. Then |
|
||||||
* we figure out what to do. |
|
||||||
* |
|
||||||
* A File argument is supplied to allow us to check for modifications in |
|
||||||
* a work tree or update the file. |
|
||||||
* |
|
||||||
* @deprecated Use {@link org.eclipse.jgit.treewalk.TreeWalk} instead, with |
|
||||||
* a {@link org.eclipse.jgit.dircache.DirCacheIterator} as a member. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public interface IndexTreeVisitor { |
|
||||||
/** |
|
||||||
* Visit a blob, and corresponding tree and index entries. |
|
||||||
* |
|
||||||
* @param treeEntry |
|
||||||
* @param indexEntry |
|
||||||
* @param file |
|
||||||
* @throws IOException |
|
||||||
*/ |
|
||||||
public void visitEntry(TreeEntry treeEntry, Entry indexEntry, File file) throws IOException; |
|
||||||
|
|
||||||
/** |
|
||||||
* Visit a blob, and corresponding tree nodes and associated index entry. |
|
||||||
* |
|
||||||
* @param treeEntry |
|
||||||
* @param auxEntry |
|
||||||
* @param indexEntry |
|
||||||
* @param file |
|
||||||
* @throws IOException |
|
||||||
*/ |
|
||||||
public void visitEntry(TreeEntry treeEntry, TreeEntry auxEntry, Entry indexEntry, File file) throws IOException; |
|
||||||
|
|
||||||
/** |
|
||||||
* Invoked after handling all child nodes of a tree, during a three way merge |
|
||||||
* |
|
||||||
* @param tree |
|
||||||
* @param auxTree |
|
||||||
* @param curDir |
|
||||||
* @throws IOException |
|
||||||
*/ |
|
||||||
public void finishVisitTree(Tree tree, Tree auxTree, String curDir) throws IOException; |
|
||||||
|
|
||||||
/** |
|
||||||
* Invoked after handling all child nodes of a tree, during two way merge. |
|
||||||
* |
|
||||||
* @param tree |
|
||||||
* @param i |
|
||||||
* @param curDir |
|
||||||
* @throws IOException |
|
||||||
*/ |
|
||||||
public void finishVisitTree(Tree tree, int i, String curDir) throws IOException; |
|
||||||
} |
|
@ -1,255 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com> |
|
||||||
* Copyright (C) 2007-2009, Robin Rosenberg <robin.rosenberg@dewire.com> |
|
||||||
* Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org> |
|
||||||
* and other copyright owners as documented in the project's IP log. |
|
||||||
* |
|
||||||
* This program and the accompanying materials are made available |
|
||||||
* under the terms of the Eclipse Distribution License v1.0 which |
|
||||||
* accompanies this distribution, is reproduced below, and is |
|
||||||
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
|
||||||
* |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or |
|
||||||
* without modification, are permitted provided that the following |
|
||||||
* conditions are met: |
|
||||||
* |
|
||||||
* - Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* - Redistributions in binary form must reproduce the above |
|
||||||
* copyright notice, this list of conditions and the following |
|
||||||
* disclaimer in the documentation and/or other materials provided |
|
||||||
* with the distribution. |
|
||||||
* |
|
||||||
* - Neither the name of the Eclipse Foundation, Inc. nor the |
|
||||||
* names of its contributors may be used to endorse or promote |
|
||||||
* products derived from this software without specific prior |
|
||||||
* written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
||||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package org.eclipse.jgit.lib; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.eclipse.jgit.JGitText; |
|
||||||
import org.eclipse.jgit.lib.GitIndex.Entry; |
|
||||||
|
|
||||||
/** |
|
||||||
* A class for traversing the index and one or two trees. |
|
||||||
* |
|
||||||
* A visitor is invoked for executing actions, like figuring out how to merge. |
|
||||||
* |
|
||||||
* @deprecated Use {@link org.eclipse.jgit.treewalk.TreeWalk} with multiple |
|
||||||
* iterators, such as {@link org.eclipse.jgit.dircache.DirCacheIterator}, |
|
||||||
* {@link org.eclipse.jgit.treewalk.FileTreeIterator}, and a native tree |
|
||||||
* {@link org.eclipse.jgit.treewalk.TreeWalk#addTree(AnyObjectId)}. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public class IndexTreeWalker { |
|
||||||
private final Tree mainTree; |
|
||||||
private final Tree newTree; |
|
||||||
private final File root; |
|
||||||
private final IndexTreeVisitor visitor; |
|
||||||
private boolean threeTrees; |
|
||||||
|
|
||||||
/** |
|
||||||
* Construct a walker for the index and one tree. |
|
||||||
* |
|
||||||
* @param index |
|
||||||
* @param tree |
|
||||||
* @param root |
|
||||||
* @param visitor |
|
||||||
*/ |
|
||||||
public IndexTreeWalker(GitIndex index, Tree tree, File root, IndexTreeVisitor visitor) { |
|
||||||
this.mainTree = tree; |
|
||||||
this.root = root; |
|
||||||
this.visitor = visitor; |
|
||||||
this.newTree = null; |
|
||||||
|
|
||||||
threeTrees = false; |
|
||||||
|
|
||||||
indexMembers = index.getMembers(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Construct a walker for the index and two trees. |
|
||||||
* |
|
||||||
* @param index |
|
||||||
* @param mainTree |
|
||||||
* @param newTree |
|
||||||
* @param root |
|
||||||
* @param visitor |
|
||||||
*/ |
|
||||||
public IndexTreeWalker(GitIndex index, Tree mainTree, Tree newTree, File root, IndexTreeVisitor visitor) { |
|
||||||
this.mainTree = mainTree; |
|
||||||
this.newTree = newTree; |
|
||||||
this.root = root; |
|
||||||
this.visitor = visitor; |
|
||||||
|
|
||||||
threeTrees = true; |
|
||||||
|
|
||||||
indexMembers = index.getMembers(); |
|
||||||
} |
|
||||||
|
|
||||||
Entry[] indexMembers; |
|
||||||
int indexCounter = 0; |
|
||||||
|
|
||||||
/** |
|
||||||
* Actually walk the index tree |
|
||||||
* |
|
||||||
* @throws IOException |
|
||||||
*/ |
|
||||||
public void walk() throws IOException { |
|
||||||
walk(mainTree, newTree); |
|
||||||
} |
|
||||||
|
|
||||||
private void walk(Tree tree, Tree auxTree) throws IOException { |
|
||||||
TreeIterator mi = new TreeIterator(tree, TreeIterator.Order.POSTORDER); |
|
||||||
TreeIterator ai = new TreeIterator(auxTree, TreeIterator.Order.POSTORDER); |
|
||||||
TreeEntry m = mi.hasNext() ? mi.next() : null; |
|
||||||
TreeEntry a = ai.hasNext() ? ai.next() : null; |
|
||||||
int curIndexPos = indexCounter; |
|
||||||
Entry i = indexCounter < indexMembers.length ? indexMembers[indexCounter++] : null; |
|
||||||
while (m != null || a != null || i != null) { |
|
||||||
int cmpma = compare(m, a); |
|
||||||
int cmpmi = compare(m, i); |
|
||||||
int cmpai = compare(a, i); |
|
||||||
|
|
||||||
TreeEntry pm = cmpma <= 0 && cmpmi <= 0 ? m : null; |
|
||||||
TreeEntry pa = cmpma >= 0 && cmpai <= 0 ? a : null; |
|
||||||
Entry pi = cmpmi >= 0 && cmpai >= 0 ? i : null; |
|
||||||
|
|
||||||
if (pi != null) |
|
||||||
visitEntry(pm, pa, pi); |
|
||||||
else |
|
||||||
finishVisitTree(pm, pa, curIndexPos); |
|
||||||
|
|
||||||
if (pm != null) m = mi.hasNext() ? mi.next() : null; |
|
||||||
if (pa != null) a = ai.hasNext() ? ai.next() : null; |
|
||||||
if (pi != null) i = indexCounter < indexMembers.length ? indexMembers[indexCounter++] : null; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void visitEntry(TreeEntry t1, TreeEntry t2, |
|
||||||
Entry i) throws IOException { |
|
||||||
|
|
||||||
assert t1 != null || t2 != null || i != null : JGitText.get().needsAtLeastOneEntry; |
|
||||||
assert root != null : JGitText.get().needsWorkdir; |
|
||||||
|
|
||||||
if (t1 != null && t1.getParent() == null) |
|
||||||
t1 = null; |
|
||||||
if (t2 != null && t2.getParent() == null) |
|
||||||
t2 = null; |
|
||||||
|
|
||||||
File f = null; |
|
||||||
if (i != null) |
|
||||||
f = new File(root, i.getName()); |
|
||||||
else if (t1 != null) |
|
||||||
f = new File(root, t1.getFullName()); |
|
||||||
else if (t2 != null) |
|
||||||
f = new File(root, t2.getFullName()); |
|
||||||
|
|
||||||
if (t1 != null || t2 != null || i != null) |
|
||||||
if (threeTrees) |
|
||||||
visitor.visitEntry(t1, t2, i, f); |
|
||||||
else |
|
||||||
visitor.visitEntry(t1, i, f); |
|
||||||
} |
|
||||||
|
|
||||||
private void finishVisitTree(TreeEntry t1, TreeEntry t2, int curIndexPos) |
|
||||||
throws IOException { |
|
||||||
|
|
||||||
assert t1 != null || t2 != null : JGitText.get().needsAtLeastOneEntry; |
|
||||||
assert root != null : JGitText.get().needsWorkdir; |
|
||||||
|
|
||||||
if (t1 != null && t1.getParent() == null) |
|
||||||
t1 = null; |
|
||||||
if (t2 != null && t2.getParent() == null) |
|
||||||
t2 = null; |
|
||||||
|
|
||||||
File f = null; |
|
||||||
String c= null; |
|
||||||
if (t1 != null) { |
|
||||||
c = t1.getFullName(); |
|
||||||
f = new File(root, c); |
|
||||||
} else if (t2 != null) { |
|
||||||
c = t2.getFullName(); |
|
||||||
f = new File(root, c); |
|
||||||
} |
|
||||||
if (t1 instanceof Tree || t2 instanceof Tree) |
|
||||||
if (threeTrees) |
|
||||||
visitor.finishVisitTree((Tree)t1, (Tree)t2, c); |
|
||||||
else |
|
||||||
visitor.finishVisitTree((Tree)t1, indexCounter - curIndexPos, c); |
|
||||||
else if (t1 != null || t2 != null) |
|
||||||
if (threeTrees) |
|
||||||
visitor.visitEntry(t1, t2, null, f); |
|
||||||
else |
|
||||||
visitor.visitEntry(t1, null, f); |
|
||||||
} |
|
||||||
|
|
||||||
static boolean lt(TreeEntry h, Entry i) { |
|
||||||
return compare(h, i) < 0; |
|
||||||
} |
|
||||||
|
|
||||||
static boolean lt(Entry i, TreeEntry t) { |
|
||||||
return compare(t, i) > 0; |
|
||||||
} |
|
||||||
|
|
||||||
static boolean lt(TreeEntry h, TreeEntry m) { |
|
||||||
return compare(h, m) < 0; |
|
||||||
} |
|
||||||
|
|
||||||
static boolean eq(TreeEntry t1, TreeEntry t2) { |
|
||||||
return compare(t1, t2) == 0; |
|
||||||
} |
|
||||||
|
|
||||||
static boolean eq(TreeEntry t1, Entry e) { |
|
||||||
return compare(t1, e) == 0; |
|
||||||
} |
|
||||||
|
|
||||||
static int compare(TreeEntry t, Entry i) { |
|
||||||
if (t == null && i == null) |
|
||||||
return 0; |
|
||||||
if (t == null) |
|
||||||
return 1; |
|
||||||
if (i == null) |
|
||||||
return -1; |
|
||||||
return Tree.compareNames(t.getFullNameUTF8(), i.getNameUTF8(), TreeEntry.lastChar(t), TreeEntry.lastChar(i)); |
|
||||||
} |
|
||||||
|
|
||||||
static int compare(TreeEntry t1, TreeEntry t2) { |
|
||||||
if (t1 != null && t1.getParent() == null && t2 != null && t2.getParent() == null) |
|
||||||
return 0; |
|
||||||
if (t1 != null && t1.getParent() == null) |
|
||||||
return -1; |
|
||||||
if (t2 != null && t2.getParent() == null) |
|
||||||
return 1; |
|
||||||
|
|
||||||
if (t1 == null && t2 == null) |
|
||||||
return 0; |
|
||||||
if (t1 == null) |
|
||||||
return 1; |
|
||||||
if (t2 == null) |
|
||||||
return -1; |
|
||||||
return Tree.compareNames(t1.getFullNameUTF8(), t2.getFullNameUTF8(), TreeEntry.lastChar(t1), TreeEntry.lastChar(t2)); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue