Search in sources :

Example 41 with RevTree

use of org.eclipse.jgit.revwalk.RevTree in project OpenGrok by OpenGrok.

the class GitRepository method prepareTreeParser.

private static AbstractTreeIterator prepareTreeParser(org.eclipse.jgit.lib.Repository repository, RevCommit commit) throws IOException {
    // from the commit we can build the tree which allows us to construct the TreeParser
    try (RevWalk walk = new RevWalk(repository)) {
        RevTree tree = walk.parseTree(commit.getTree().getId());
        CanonicalTreeParser treeParser = new CanonicalTreeParser();
        try (ObjectReader reader = repository.newObjectReader()) {
            treeParser.reset(reader, tree.getId());
        }
        walk.dispose();
        return treeParser;
    }
}
Also used : ObjectReader(org.eclipse.jgit.lib.ObjectReader) RevWalk(org.eclipse.jgit.revwalk.RevWalk) RevTree(org.eclipse.jgit.revwalk.RevTree) CanonicalTreeParser(org.eclipse.jgit.treewalk.CanonicalTreeParser)

Example 42 with RevTree

use of org.eclipse.jgit.revwalk.RevTree in project OpenGrok by OpenGrok.

the class GitRepository method getHistoryRev.

/**
 * Try to get file contents for given revision.
 *
 * @param out a required OutputStream
 * @param fullpath full pathname of the file
 * @param rev revision string
 * @return a defined instance with {@code success} == {@code true} if no
 * error occurred and with non-zero {@code iterations} if some data was transferred
 */
private HistoryRevResult getHistoryRev(OutputStream out, String fullpath, String rev) {
    HistoryRevResult result = new HistoryRevResult();
    File directory = new File(getDirectoryName());
    String filename;
    result.success = false;
    try {
        filename = getGitFilePath(Paths.get(getCanonicalDirectoryName()).relativize(Paths.get(fullpath)).toString());
    } catch (IOException e) {
        LOGGER.log(Level.WARNING, String.format("Failed to relativize '%s' in for repository '%s'", fullpath, directory), e);
        return result;
    }
    try (org.eclipse.jgit.lib.Repository repository = getJGitRepository(directory.getAbsolutePath())) {
        ObjectId commitId = repository.resolve(rev);
        // A RevWalk allows walking over commits based on some filtering that is defined.
        try (RevWalk revWalk = new RevWalk(repository)) {
            RevCommit commit = revWalk.parseCommit(commitId);
            // and using commit's tree find the path
            RevTree tree = commit.getTree();
            // Now try to find a specific file.
            try (TreeWalk treeWalk = new TreeWalk(repository)) {
                treeWalk.addTree(tree);
                treeWalk.setRecursive(true);
                treeWalk.setFilter(PathFilter.create(filename));
                if (!treeWalk.next()) {
                    LOGGER.log(Level.FINEST, "Did not find expected file ''{0}'' in revision {1} " + "for repository ''{2}''", new Object[] { filename, rev, directory });
                    return result;
                }
                ObjectId objectId = treeWalk.getObjectId(0);
                ObjectLoader loader = repository.open(objectId);
                CountingOutputStream countingOutputStream = new CountingOutputStream(out);
                loader.copyTo(countingOutputStream);
                result.iterations = countingOutputStream.getCount();
                result.success = true;
            }
            revWalk.dispose();
        }
    } catch (IOException e) {
        LOGGER.log(Level.WARNING, String.format("Failed to get file '%s' in revision %s for repository '%s'", filename, rev, directory), e);
    }
    return result;
}
Also used : ObjectId(org.eclipse.jgit.lib.ObjectId) IOException(java.io.IOException) RevWalk(org.eclipse.jgit.revwalk.RevWalk) CountingOutputStream(org.eclipse.jgit.util.io.CountingOutputStream) ObjectLoader(org.eclipse.jgit.lib.ObjectLoader) File(java.io.File) TreeWalk(org.eclipse.jgit.treewalk.TreeWalk) Repository(org.eclipse.jgit.lib.Repository) RevTree(org.eclipse.jgit.revwalk.RevTree) RevCommit(org.eclipse.jgit.revwalk.RevCommit)

Example 43 with RevTree

use of org.eclipse.jgit.revwalk.RevTree in project egit by eclipse.

the class ExistingOrNewPage method fillTreeItemWithGitDirectory.

private void fillTreeItemWithGitDirectory(RepositoryMapping m, TreeItem treeItem, IPath gitDir, boolean isAlternative) {
    if (m.getGitDir() == null)
        treeItem.setText(2, UIText.ExistingOrNewPage_SymbolicValueEmptyMapping);
    else {
        IPath relativePath = new Path(m.getGitDir());
        if (isAlternative) {
            IPath withoutLastSegment = relativePath.removeLastSegments(1);
            IPath path;
            if (withoutLastSegment.isEmpty())
                // $NON-NLS-1$
                path = Path.fromPortableString(".");
            else
                path = withoutLastSegment;
            treeItem.setText(0, path.toString());
        }
        treeItem.setText(2, relativePath.toOSString());
        try {
            IProject project = m.getContainer().getProject();
            Repository repo = new RepositoryBuilder().setGitDir(gitDir.toFile()).build();
            File workTree = repo.getWorkTree();
            IPath workTreePath = Path.fromOSString(workTree.getAbsolutePath());
            if (workTreePath.isPrefixOf(project.getLocation())) {
                IPath makeRelativeTo = project.getLocation().makeRelativeTo(workTreePath);
                String repoRelativePath = makeRelativeTo.append("/.project").toPortableString();
                ObjectId headCommitId = repo.resolve(Constants.HEAD);
                if (headCommitId != null) {
                    // Not an empty repo
                    try (RevWalk revWalk = new RevWalk(repo)) {
                        RevCommit headCommit = revWalk.parseCommit(headCommitId);
                        RevTree headTree = headCommit.getTree();
                        TreeWalk projectInRepo = TreeWalk.forPath(repo, repoRelativePath, headTree);
                        if (projectInRepo != null) {
                            // the .project file is tracked by this repo
                            treeItem.setChecked(true);
                        }
                    }
                }
            }
            repo.close();
        } catch (IOException e1) {
            Activator.logError(UIText.ExistingOrNewPage_FailedToDetectRepositoryMessage, e1);
        }
    }
}
Also used : IPath(org.eclipse.core.runtime.IPath) Path(org.eclipse.core.runtime.Path) IPath(org.eclipse.core.runtime.IPath) FileRepositoryBuilder(org.eclipse.jgit.storage.file.FileRepositoryBuilder) RepositoryBuilder(org.eclipse.jgit.lib.RepositoryBuilder) ObjectId(org.eclipse.jgit.lib.ObjectId) IOException(java.io.IOException) RevWalk(org.eclipse.jgit.revwalk.RevWalk) IProject(org.eclipse.core.resources.IProject) Repository(org.eclipse.jgit.lib.Repository) File(java.io.File) TreeWalk(org.eclipse.jgit.treewalk.TreeWalk) RevTree(org.eclipse.jgit.revwalk.RevTree) RevCommit(org.eclipse.jgit.revwalk.RevCommit)

Example 44 with RevTree

use of org.eclipse.jgit.revwalk.RevTree in project egit by eclipse.

the class RemoveCommand method isTracked.

private boolean isTracked(File file, Repository repo) throws IOException {
    ObjectId objectId = repo.resolve(Constants.HEAD);
    RevTree tree;
    try (RevWalk rw = new RevWalk(repo);
        TreeWalk treeWalk = new TreeWalk(repo)) {
        if (objectId != null)
            tree = rw.parseTree(objectId);
        else
            tree = null;
        treeWalk.setRecursive(true);
        if (tree != null)
            treeWalk.addTree(tree);
        else
            treeWalk.addTree(new EmptyTreeIterator());
        treeWalk.addTree(new DirCacheIterator(repo.readDirCache()));
        treeWalk.setFilter(PathFilterGroup.createFromStrings(Collections.singleton(Repository.stripWorkDir(repo.getWorkTree(), file))));
        return treeWalk.next();
    }
}
Also used : ObjectId(org.eclipse.jgit.lib.ObjectId) EmptyTreeIterator(org.eclipse.jgit.treewalk.EmptyTreeIterator) DirCacheIterator(org.eclipse.jgit.dircache.DirCacheIterator) RevWalk(org.eclipse.jgit.revwalk.RevWalk) TreeWalk(org.eclipse.jgit.treewalk.TreeWalk) RevTree(org.eclipse.jgit.revwalk.RevTree)

Example 45 with RevTree

use of org.eclipse.jgit.revwalk.RevTree in project gerrit by GerritCodeReview.

the class VersionedMetaDataOnInit method save.

protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException {
    File path = getPath();
    if (path == null) {
        throw new IOException(project + " does not exist.");
    }
    try (Repository repo = new FileRepository(path);
        ObjectInserter i = repo.newObjectInserter();
        ObjectReader r = repo.newObjectReader();
        RevWalk rw = new RevWalk(r)) {
        inserter = i;
        reader = r;
        RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
        newTree = readTree(srcTree);
        CommitBuilder commit = new CommitBuilder();
        commit.setAuthor(ident);
        commit.setCommitter(ident);
        commit.setMessage(msg);
        onSave(commit);
        ObjectId res = newTree.writeTree(inserter);
        if (res.equals(srcTree)) {
            return;
        }
        commit.setTreeId(res);
        if (revision != null) {
            commit.addParentId(revision);
        }
        ObjectId newRevision = inserter.insert(commit);
        updateRef(repo, ident, newRevision, "commit: " + msg);
        revision = rw.parseCommit(newRevision);
    } finally {
        inserter = null;
        reader = null;
    }
}
Also used : FileRepository(org.eclipse.jgit.internal.storage.file.FileRepository) FileRepository(org.eclipse.jgit.internal.storage.file.FileRepository) Repository(org.eclipse.jgit.lib.Repository) ObjectInserter(org.eclipse.jgit.lib.ObjectInserter) ObjectId(org.eclipse.jgit.lib.ObjectId) CommitBuilder(org.eclipse.jgit.lib.CommitBuilder) ObjectReader(org.eclipse.jgit.lib.ObjectReader) IOException(java.io.IOException) RevWalk(org.eclipse.jgit.revwalk.RevWalk) File(java.io.File) RevTree(org.eclipse.jgit.revwalk.RevTree)

Aggregations

RevTree (org.eclipse.jgit.revwalk.RevTree)55 RevWalk (org.eclipse.jgit.revwalk.RevWalk)41 RevCommit (org.eclipse.jgit.revwalk.RevCommit)29 ObjectId (org.eclipse.jgit.lib.ObjectId)27 ObjectReader (org.eclipse.jgit.lib.ObjectReader)19 IOException (java.io.IOException)16 TreeWalk (org.eclipse.jgit.treewalk.TreeWalk)14 Repository (org.eclipse.jgit.lib.Repository)13 DiffEntry (org.eclipse.jgit.diff.DiffEntry)9 RevObject (org.eclipse.jgit.revwalk.RevObject)9 CanonicalTreeParser (org.eclipse.jgit.treewalk.CanonicalTreeParser)9 IncorrectObjectTypeException (org.eclipse.jgit.errors.IncorrectObjectTypeException)7 File (java.io.File)6 AnyObjectId (org.eclipse.jgit.lib.AnyObjectId)6 ObjectLoader (org.eclipse.jgit.lib.ObjectLoader)6 Ref (org.eclipse.jgit.lib.Ref)6 ArrayList (java.util.ArrayList)4 DiffFormatter (org.eclipse.jgit.diff.DiffFormatter)3 RawTextComparator (org.eclipse.jgit.diff.RawTextComparator)3 DirCache (org.eclipse.jgit.dircache.DirCache)3