Remove gitIgnoreTimestamp from abstract iterator API

This never should have been exposed on the top of the
AbstractTreeIterator type hierarchy.  There is no concept of a
timestamp in a canonical tree read from the object database, and
the time in the DirCache isn't what we want here either.

Actually all that we need is to find the files whose names are
".gitignore" and are below the root directory.  We can accomplish
that with a suffix filter, and process them immediately.

Change-Id: Ib09cbf81a9e038452ce491385c65498312e2916b
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
CC: Charley Wang <chwang@redhat.com>
CC: Chris Aniszczyk <caniszczyk@gmail.com>
CC: Stefan Lay <stefan.lay@sap.com>
CC: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
Shawn O. Pearce 2010-07-20 08:58:14 -07:00
parent 395d236058
commit c59db09bc5
3 changed files with 11 additions and 61 deletions

View File

@ -46,11 +46,12 @@
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.treewalk.FileTreeIterator;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathSuffixFilter;
import org.eclipse.jgit.util.FS;
/**
@ -112,19 +113,10 @@ public void initialize() throws IOException {
TreeWalk tw = new TreeWalk(repository);
tw.reset();
tw.addTree(new FileTreeIterator(repository.getWorkDir(), FS.DETECTED));
tw.setFilter(PathSuffixFilter.create("/" + Constants.DOT_GIT_IGNORE));
tw.setRecursive(true);
//Don't waste time trying to add iterators that already exist
HashSet<FileTreeIterator> toAdd = new HashSet<FileTreeIterator>();
while (tw.next()) {
FileTreeIterator t = tw.getTree(0, FileTreeIterator.class);
if (t.hasGitIgnore()) {
toAdd.add(t);
//TODO: Account for and test the removal of .gitignore files
}
}
for (FileTreeIterator t : toAdd)
addNodeFromTree(t);
while (tw.next())
addNodeFromTree(tw.getTree(0, FileTreeIterator.class));
//The base is special
//TODO: Test alternate locations for GIT_DIR
@ -153,24 +145,15 @@ private void readRulesAtBase() {
}
/**
* Adds a node located at the FileTreeIterator's root directory.
* <br>
* Will check for the presence of a .gitignore using {@link FileTreeIterator#hasGitIgnore()}.
* If no .gitignore file exists, nothing will be done.
* <br>
* Will check the last time of modification using {@link FileTreeIterator#hasGitIgnore()}.
* If a node already exists and the time stamp has not changed, do nothing.
* <br>
* Note: This can be extended later if necessary to AbstractTreeIterator by using
* byte[] path instead of File directory.
* Adds a node located at the FileTreeIterator's current position.
*
* @param t
* AbstractTreeIterator to check for ignore info. The name of the node
* should be .gitignore
* FileTreeIterator to check for ignore info. The name of the
* entry should be ".gitignore".
*/
protected void addNodeFromTree(FileTreeIterator t) {
IgnoreNode n = ignoreMap.get(relativize(t.getDirectory()));
long time = t.getGitIgnoreLastModified();
long time = t.getEntryLastModified();
if (n != null) {
if (n.getLastModified() == time)
//TODO: Test and optimize

View File

@ -138,19 +138,11 @@ public abstract class AbstractTreeIterator {
*/
protected int pathLen;
/**
* Last modified time of the .gitignore file. Greater than 0 if a .gitignore
* file exists.
*
*/
protected long gitIgnoreTimeStamp;
/** Create a new iterator with no parent. */
protected AbstractTreeIterator() {
parent = null;
path = new byte[DEFAULT_PATH_SIZE];
pathOffset = 0;
gitIgnoreTimeStamp = 0l;
}
/**
@ -170,7 +162,6 @@ protected AbstractTreeIterator() {
*/
protected AbstractTreeIterator(final String prefix) {
parent = null;
gitIgnoreTimeStamp = 0l;
if (prefix != null && prefix.length() > 0) {
final ByteBuffer b;
@ -205,7 +196,6 @@ protected AbstractTreeIterator(final String prefix) {
*/
protected AbstractTreeIterator(final byte[] prefix) {
parent = null;
gitIgnoreTimeStamp = 0l;
if (prefix != null && prefix.length > 0) {
pathLen = prefix.length;
@ -230,7 +220,6 @@ protected AbstractTreeIterator(final AbstractTreeIterator p) {
parent = p;
path = p.path;
pathOffset = p.pathLen + 1;
gitIgnoreTimeStamp = 0l;
try {
path[pathOffset - 1] = '/';
@ -261,7 +250,6 @@ protected AbstractTreeIterator(final AbstractTreeIterator p,
parent = p;
path = childPath;
pathOffset = childPathOffset;
gitIgnoreTimeStamp = 0l;
}
/**
@ -605,22 +593,4 @@ public int getNameLength() {
public void getName(byte[] buffer, int offset) {
System.arraycopy(path, pathOffset, buffer, offset, pathLen - pathOffset);
}
/**
* @return
* True if this iterator encountered a .gitignore file when initializing entries.
* Checks if the gitIgnoreTimeStamp > 0.
*/
public boolean hasGitIgnore() {
return gitIgnoreTimeStamp > 0;
}
/**
* @return
* Last modified time of the .gitignore file, if any. Will be > 0 if a .gitignore
* exists.
*/
public long getGitIgnoreLastModified() {
return gitIgnoreTimeStamp;
}
}

View File

@ -69,6 +69,7 @@ public class FileTreeIterator extends WorkingTreeIterator {
* the root of the repository.
*/
protected final File directory;
/**
* the file system abstraction which will be necessary to
* perform certain file system operations.
@ -117,16 +118,12 @@ public AbstractTreeIterator createSubtreeIterator(final Repository repo)
}
private Entry[] entries() {
gitIgnoreTimeStamp = 0l;
final File[] all = directory.listFiles();
if (all == null)
return EOF;
final Entry[] r = new Entry[all.length];
for (int i = 0; i < r.length; i++) {
for (int i = 0; i < r.length; i++)
r[i] = new FileEntry(all[i], fs);
if (all[i].getName().equals(Constants.DOT_GIT_IGNORE))
gitIgnoreTimeStamp = r[i].getLastModified();
}
return r;
}