Class WorkingTreeIterator

  • Direct Known Subclasses:
    FileTreeIterator

    public abstract class WorkingTreeIterator
    extends AbstractTreeIterator
    Walks a working directory tree as part of a TreeWalk.

    Most applications will want to use the standard implementation of this iterator, FileTreeIterator, as that does all IO through the standard java.io package. Plugins for a Java based IDE may however wish to create their own implementations of this class to allow traversal of the IDE's project space, as well as benefit from any caching the IDE may have.

    See Also:
    FileTreeIterator
    • Field Detail

      • MAX_EXCEPTION_TEXT_SIZE

        private static final int MAX_EXCEPTION_TEXT_SIZE
        See Also:
        Constant Field Values
      • BUFFER_SIZE

        static final int BUFFER_SIZE
        Size we perform file IO in if we have to read and hash a file.
        See Also:
        Constant Field Values
      • MAXIMUM_FILE_SIZE_TO_READ_FULLY

        private static final long MAXIMUM_FILE_SIZE_TO_READ_FULLY
        Maximum size of files which may be read fully into memory for performance reasons.
        See Also:
        Constant Field Values
      • contentId

        private byte[] contentId
        The idBuffer() for the current entry.
      • contentIdFromPtr

        private int contentIdFromPtr
        Index within entries that contentId came from.
      • entryCnt

        private int entryCnt
        Total number of entries in entries that are valid.
      • ptr

        private int ptr
        Current position within entries.
      • ignoreNode

        private IgnoreNode ignoreNode
        If there is a .gitignore file present, the parsed rules from it.
      • cleanFilterCommandHolder

        private Holder<java.lang.String> cleanFilterCommandHolder
        cached clean filter command. Use a Ref in order to distinguish between the ref not cached yet and the value null
      • eolStreamTypeHolder

        private Holder<CoreConfig.EolStreamType> eolStreamTypeHolder
        cached eol stream type. Use a Ref in order to distinguish between the ref not cached yet and the value null
      • repository

        protected Repository repository
        Repository that is the root level being iterated over
      • canonLen

        private long canonLen
        Cached canonical length, initialized from idBuffer()
      • contentIdOffset

        private int contentIdOffset
        The offset of the content id in idBuffer()
      • timestampComparator

        private final InstantComparator timestampComparator
        A comparator for Instants.
      • digits

        private static final byte[] digits
      • hblob

        private static final byte[] hblob
    • Constructor Detail

      • WorkingTreeIterator

        protected WorkingTreeIterator​(WorkingTreeOptions options)
        Create a new iterator with no parent.
        Parameters:
        options - working tree options to be used
      • WorkingTreeIterator

        protected WorkingTreeIterator​(java.lang.String prefix,
                                      WorkingTreeOptions options)
        Create a new iterator with no parent and a prefix.

        The prefix path supplied is inserted in front of all paths generated by this iterator. It is intended to be used when an iterator is being created for a subsection of an overall repository and needs to be combined with other iterators that are created to run over the entire repository namespace.

        Parameters:
        prefix - position of this iterator in the repository tree. The value may be null or the empty string to indicate the prefix is the root of the repository. A trailing slash ('/') is automatically appended if the prefix does not end in '/'.
        options - working tree options to be used
      • WorkingTreeIterator

        protected WorkingTreeIterator​(WorkingTreeIterator p)
        Create an iterator for a subtree of an existing iterator.
        Parameters:
        p - parent tree iterator.
    • Method Detail

      • initRootIterator

        protected void initRootIterator​(Repository repo)
        Initialize this iterator for the root level of a repository.

        This method should only be invoked after calling init(Entry[]), and only for the root iterator.

        Parameters:
        repo - the repository.
      • setDirCacheIterator

        public void setDirCacheIterator​(TreeWalk walk,
                                        int treeId)
        Define the matching DirCacheIterator, to optimize ObjectIds. Once the DirCacheIterator has been set this iterator must only be advanced by the TreeWalk that is supplied, as it assumes that itself and the corresponding DirCacheIterator are positioned on the same file path whenever idBuffer() is invoked.
        Parameters:
        walk - the walk that will be advancing this iterator.
        treeId - index of the matching DirCacheIterator.
      • setWalkIgnoredDirectories

        public void setWalkIgnoredDirectories​(boolean includeIgnored)
        Defines whether this WorkingTreeIterator walks ignored directories.
        Parameters:
        includeIgnored - false to skip ignored directories, if possible; true to always include them in the walk
        Since:
        5.0
      • walksIgnoredDirectories

        public boolean walksIgnoredDirectories()
        Tells whether this WorkingTreeIterator walks ignored directories.
        Returns:
        true if it does, false otherwise
        Since:
        5.0
      • hasId

        public boolean hasId()
        Whether the entry has a valid ObjectId.
        Specified by:
        hasId in class AbstractTreeIterator
        Returns:
        true if the entry has a valid ObjectId.
      • idBuffer

        public byte[] idBuffer()
        Get the byte array buffer object IDs must be copied out of.

        The id buffer contains the bytes necessary to construct an ObjectId for the current entry of this iterator. The buffer can be the same buffer for all entries, or it can be a unique buffer per-entry. Implementations are encouraged to expose their private buffer whenever possible to reduce garbage generation and copying costs.

        Specified by:
        idBuffer in class AbstractTreeIterator
        Returns:
        byte array the implementation stores object IDs within.
        See Also:
        AbstractTreeIterator.getEntryObjectId()
      • isWorkTree

        public boolean isWorkTree()
        Whether or not this Iterator is iterating through the working tree.
        Overrides:
        isWorkTree in class AbstractTreeIterator
        Returns:
        whether or not this Iterator is iterating through the working tree
      • idSubmodule

        protected byte[] idSubmodule​(java.io.File directory,
                                     WorkingTreeIterator.Entry e)
        Get submodule id using the repository at the location of the entry relative to the directory.
        Parameters:
        directory - a File object.
        e - a WorkingTreeIterator.Entry object.
        Returns:
        non-null submodule id
      • possiblyFilteredInputStream

        private java.io.InputStream possiblyFilteredInputStream​(WorkingTreeIterator.Entry e,
                                                                java.io.InputStream is,
                                                                long len)
                                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • safeClose

        private static void safeClose​(java.io.InputStream in)
      • isBinary

        private static boolean isBinary​(WorkingTreeIterator.Entry entry)
                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • filterClean

        private java.nio.ByteBuffer filterClean​(byte[] src,
                                                int n)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • filterClean

        private java.io.InputStream filterClean​(java.io.InputStream in)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • getOptions

        public WorkingTreeOptions getOptions()
        Returns the working tree options used by this iterator.
        Returns:
        working tree options
      • reset

        public void reset()
        Position this iterator on the first entry. The default implementation of this method uses back(1) until first() is true. This is most likely not the most efficient method of repositioning the iterator to its first entry, so subclasses are strongly encouraged to override the method.
        Overrides:
        reset in class AbstractTreeIterator
      • first

        public boolean first()
        Is this tree iterator positioned on its first entry?

        An iterator is positioned on the first entry if back(1) would be an invalid request as there is no entry before the current one.

        An empty iterator (one with no entries) will be first() && eof().

        Specified by:
        first in class AbstractTreeIterator
        Returns:
        true if the iterator is positioned on the first entry.
      • eof

        public boolean eof()
        Is this tree iterator at its EOF point (no more entries)?

        An iterator is at EOF if there is no current entry.

        Specified by:
        eof in class AbstractTreeIterator
        Returns:
        true if we have walked all entries and have none left.
      • parseEntry

        private void parseEntry()
      • getEntryLength

        public long getEntryLength()
        Get the raw byte length of this entry.
        Returns:
        size of this file, in bytes.
      • getEntryContentLength

        public long getEntryContentLength()
                                   throws java.io.IOException
        Get the filtered input length of this entry
        Returns:
        size of the content, in bytes
        Throws:
        java.io.IOException
      • getEntryLastModified

        @Deprecated
        public long getEntryLastModified()
        Deprecated.
        Get the last modified time of this entry.
        Returns:
        last modified time of this file, in milliseconds since the epoch (Jan 1, 1970 UTC).
      • getEntryLastModifiedInstant

        public java.time.Instant getEntryLastModifiedInstant()
        Get the last modified time of this entry.
        Returns:
        last modified time of this file
        Since:
        5.1.9
      • openEntryStream

        public java.io.InputStream openEntryStream()
                                            throws java.io.IOException
        Obtain an input stream to read the file content.

        Efficient implementations are not required. The caller will usually obtain the stream only once per entry, if at all.

        The input stream should not use buffering if the implementation can avoid it. The caller will buffer as necessary to perform efficient block IO operations.

        The caller will close the stream once complete.

        Returns:
        a stream to read from the file.
        Throws:
        java.io.IOException - the file could not be opened for reading.
      • isEntryIgnored

        public boolean isEntryIgnored()
                               throws java.io.IOException
        Determine if the current entry path is ignored by an ignore rule.
        Returns:
        true if the entry was ignored by an ignore rule file.
        Throws:
        java.io.IOException - a relevant ignore rule file exists but cannot be read.
      • isEntryIgnored

        protected boolean isEntryIgnored​(int pLen)
                                  throws java.io.IOException
        Determine if the entry path is ignored by an ignore rule.
        Parameters:
        pLen - the length of the path in the path buffer.
        Returns:
        true if the entry is ignored by an ignore rule.
        Throws:
        java.io.IOException - a relevant ignore rule file exists but cannot be read.
      • isEntryIgnored

        private boolean isEntryIgnored​(int pLen,
                                       int fileMode)
                                throws java.io.IOException
        Determine if the entry path is ignored by an ignore rule.
        Parameters:
        pLen - the length of the path in the path buffer.
        fileMode - the original iterator file mode
        Returns:
        true if the entry is ignored by an ignore rule.
        Throws:
        java.io.IOException - a relevant ignore rule file exists but cannot be read.
      • getIgnoreNode

        private IgnoreNode getIgnoreNode()
                                  throws java.io.IOException
        Throws:
        java.io.IOException
      • getEntryAttributesNode

        public AttributesNode getEntryAttributesNode()
                                              throws java.io.IOException
        Retrieves the AttributesNode for the current entry.
        Returns:
        the AttributesNode for the current entry.
        Throws:
        java.io.IOException
      • init

        protected void init​(WorkingTreeIterator.Entry[] list)
        Constructor helper.
        Parameters:
        list - files in the subtree of the work tree this iterator operates on
      • current

        protected WorkingTreeIterator.Entry current()
        Obtain the current entry from this iterator.
        Returns:
        the currently selected entry.
      • isModeDifferent

        public boolean isModeDifferent​(int rawMode)
        Is the file mode of the current entry different than the given raw mode?
        Parameters:
        rawMode - an int.
        Returns:
        true if different, false otherwise
      • isModified

        public boolean isModified​(DirCacheEntry entry,
                                  boolean forceContentCheck,
                                  ObjectReader reader)
                           throws java.io.IOException
        Checks whether this entry differs from a given entry from the DirCache. File status information is used and if status is same we consider the file identical to the state in the working directory. Native git uses more stat fields than we have accessible in Java.
        Parameters:
        entry - the entry from the dircache we want to compare against
        forceContentCheck - True if the actual file content should be checked if modification time differs.
        reader - access to repository objects if necessary. Should not be null.
        Returns:
        true if content is most likely different.
        Throws:
        java.io.IOException
        Since:
        3.3
      • getIndexFileMode

        public FileMode getIndexFileMode​(DirCacheIterator indexIter)
        Get the file mode to use for the current entry when it is to be updated in the index.
        Parameters:
        indexIter - DirCacheIterator positioned at the same entry as this iterator or null if no DirCacheIterator is available at this iterator's current entry
        Returns:
        index file mode
      • contentCheck

        private boolean contentCheck​(DirCacheEntry entry,
                                     ObjectReader reader)
                              throws java.io.IOException
        Compares the entries content with the content in the filesystem. Unsmudges the entry when it is detected that it is clean.
        Parameters:
        entry - the entry to be checked
        reader - acccess to repository data if necessary
        Returns:
        true if the content doesn't match, false if it matches
        Throws:
        java.io.IOException
      • readSymlinkTarget

        protected java.lang.String readSymlinkTarget​(WorkingTreeIterator.Entry entry)
                                              throws java.io.IOException
        Reads the target of a symlink as a string. This default implementation fully reads the entry's input stream and converts it to a normalized string. Subclasses may override to provide more specialized implementations.
        Parameters:
        entry - to read
        Returns:
        the entry's content as a normalized string
        Throws:
        java.io.IOException - if the entry cannot be read or does not denote a symlink
        Since:
        4.6
      • computeLength

        private static long computeLength​(java.io.InputStream in)
                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • computeHash

        private byte[] computeHash​(java.io.InputStream in,
                                   long length)
                            throws java.io.IOException
        Throws:
        java.io.IOException
      • getCleanFilterCommand

        public java.lang.String getCleanFilterCommand()
                                               throws java.io.IOException
        Get the clean filter command for the current entry.
        Returns:
        the clean filter command for the current entry or null if no such command is defined
        Throws:
        java.io.IOException
        Since:
        4.2
      • getEolStreamType

        public CoreConfig.EolStreamType getEolStreamType()
                                                  throws java.io.IOException
        Get the eol stream type for the current entry.
        Returns:
        the eol stream type for the current entry or null if it cannot be determined. When state or state.walk is null or the TreeWalk is not based on a Repository then null is returned.
        Throws:
        java.io.IOException
        Since:
        4.3
      • getEolStreamType

        private CoreConfig.EolStreamType getEolStreamType​(TreeWalk.OperationType opType)
                                                   throws java.io.IOException
        Parameters:
        opType - The operationtype (checkin/checkout) which should be used
        Returns:
        the eol stream type for the current entry or null if it cannot be determined. When state or state.walk is null or the TreeWalk is not based on a Repository then null is returned.
        Throws:
        java.io.IOException
      • hasCrLfInIndex

        private boolean hasCrLfInIndex​(DirCacheIterator dirCache)
        Determines whether the file was committed un-normalized. If the iterator points to a conflict entry, checks the "ours" version.
        Parameters:
        dirCache - iterator pointing to the current entry for the file in the index
        Returns:
        true if the file in the index is not binary and has CR/LF line endings, false otherwise
      • isDirectoryIgnored

        private boolean isDirectoryIgnored​(java.lang.String pathRel)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • isDirectoryIgnored

        private boolean isDirectoryIgnored​(java.lang.String pathRel,
                                           java.lang.String pathAbs)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • getParentPath

        private static java.lang.String getParentPath​(java.lang.String path)
      • concatPath

        private static java.lang.String concatPath​(java.lang.String p1,
                                                   java.lang.String p2)