parentPath.setParentPath(child, entry, new FSParentPath(parentPath));
parentPath.setParentPath(child, entry, storeParents ? new FSParentPath(parentPath) : null);
    private FSParentPath openPath(FSRoot root, String path, boolean isLastComponentOptional, String txnId, File reposRootDir) throws SVNException{         	String canonPath = SVNPathUtil.canonicalizeAbsPath(path);        FSRevisionNode here = getRootNode(root, reposRootDir);;        String pathSoFar = "/";                //Make a parentPath item for the root node, using its own current copy-id        FSParentPath parentPath = new FSParentPath(here, null, null);        parentPath.setCopyStyle(FSParentPath.COPY_ID_INHERIT_SELF);        String rest = canonPath.substring(1);// skip the leading '/'                /* Whenever we are at the top of this loop:         - HERE is our current directory,         - REST is the path we're going to find in HERE, and          - PARENT_PATH includes HERE and all its parents.  */        while(true){            String entry = SVNPathUtil.head(rest);            String next = SVNPathUtil.removeHead(rest);            pathSoFar = SVNPathUtil.concatToAbs(pathSoFar, entry);            FSRevisionNode child = null;            if(entry == null || "".equals(entry)){                child = here;            }else{                FSRevisionNode cachedRevNode = fetchRevisionNode(root, pathSoFar, reposRootDir);                 if(cachedRevNode != null){                    child = cachedRevNode;                }else{                    try{                        child = FSReader.getChildDirNode(entry, here, reposRootDir);                    }catch(SVNException svne){                        if(svne.getErrorMessage().getErrorCode() == SVNErrorCode.FS_NOT_FOUND){                            /* If this was the last path component, and the caller                             * said it was optional, then don't return an error;                             * just put a null node pointer in the path.                               */                                            if(isLastComponentOptional && (next == null || "".equals(next)) ){                                return new FSParentPath(null, entry, parentPath);                            }                            /* Build a better error message than FSReader.getChildDirNode()                             * can provide, giving the root and full path name.                               */                            SVNErrorManager.error(FSErrors.errorNotFound(root, path), svne);                        }                        throw svne;                    }                }                parentPath.setParentPath(child, entry, new FSParentPath(parentPath));                SVNLocationEntry copyInherEntry = null;                if(FSID.isTxn(txnId)){                    copyInherEntry = FSParentPath.getCopyInheritance(reposRootDir, parentPath, txnId);                    parentPath.setCopyStyle((int)copyInherEntry.getRevision());                    parentPath.setCopySrcPath(copyInherEntry.getPath());                }                /* Cache the node we found (if it wasn't already cached). */                if(cachedRevNode == null){                    cacheRevisionNode(root, pathSoFar, child);                }            }                   if(next == null || "".equals(next)){                break;            }            /* The path isn't finished yet; we'd better be in a directory.  */            if(child.getType() != SVNNodeKind.DIR){                SVNErrorMessage err = FSErrors.errorNotDirectory(pathSoFar, reposRootDir);                SVNErrorManager.error(err.wrap("Failure opening ''{0}''", path));            }            rest = next;            here = child;        }               return parentPath;    }