List of usage examples for org.eclipse.jgit.revwalk RevCommit getTree
public final RevTree getTree()
From source file:ShowFileDiff.java
License:Apache License
private static AbstractTreeIterator prepareTreeParser(Repository repository, String objectId) throws IOException, MissingObjectException, IncorrectObjectTypeException { // from the commit we can build the tree which allows us to construct the TreeParser RevWalk walk = new RevWalk(repository); RevCommit commit = walk.parseCommit(ObjectId.fromString(objectId)); RevTree tree = walk.parseTree(commit.getTree().getId()); CanonicalTreeParser oldTreeParser = new CanonicalTreeParser(); ObjectReader oldReader = repository.newObjectReader(); try {//from www . j a v a 2 s . c om oldTreeParser.reset(oldReader, tree.getId()); } finally { oldReader.release(); } walk.dispose(); return oldTreeParser; }
From source file:am.ik.categolj3.api.git.GitStore.java
License:Apache License
void syncHead() { log.info("Syncing HEAD..."); ObjectId oldHead = this.currentHead.get(); ObjectId newHead = this.head(); try (Repository repository = this.git.getRepository()) { DiffFormatter diffFormatter = new DiffFormatter(System.out); diffFormatter.setRepository(repository); RevWalk walk = new RevWalk(repository); try {/*from ww w .j a v a 2 s . c o m*/ RevCommit fromCommit = walk.parseCommit(oldHead); RevCommit toCommit = walk.parseCommit(newHead); List<DiffEntry> list = diffFormatter.scan(fromCommit.getTree(), toCommit.getTree()); list.forEach(diff -> { log.info("[{}]\tnew={}\told={}", diff.getChangeType(), diff.getNewPath(), diff.getOldPath()); if (diff.getOldPath() != null) { Path path = Paths .get(gitProperties.getBaseDir().getAbsolutePath() + "/" + diff.getOldPath()); if (Entry.isPublic(path)) { Long entryId = Entry.parseEntryId(path); log.info("evict Entry({})", entryId); this.entryCache.evict(entryId); } } if (diff.getNewPath() != null) { Path path = Paths .get(gitProperties.getBaseDir().getAbsolutePath() + "/" + diff.getNewPath()); this.loadEntry(path).ifPresent(entry -> { log.info("put Entry({})", entry.getEntryId()); this.entryCache.put(entry.getEntryId(), entry); }); } }); } finally { walk.dispose(); } } catch (IOException e) { throw new UncheckedIOException(e); } catch (Exception e) { throw new IllegalStateException(e); } this.currentHead.set(newHead); }
From source file:at.ac.tuwien.inso.subcat.miner.GitMiner.java
License:Open Source License
private void processDiff(Repository repository, RevWalk walk, RevCommit current, DiffOutputStream outputStream, Map<String, FileStats> fileStatsMap) throws IOException { assert (repository != null); assert (walk != null); assert (current != null); assert (outputStream != null); assert (fileStatsMap != null); if (processDiffs == false) { return;//from ww w . j a v a 2 s . com } try { DiffFormatter df = new DiffFormatter(outputStream); df.setRepository(repository); df.setDetectRenames(true); List<DiffEntry> entries; if (current.getParentCount() > 0) { RevCommit parent = current.getParent(0); ObjectId oldTree = walk.parseCommit(parent).getTree(); ObjectId newTree = current.getTree(); entries = df.scan(oldTree, newTree); } else { entries = df.scan(new EmptyTreeIterator(), new CanonicalTreeParser(null, walk.getObjectReader(), current.getTree())); } for (DiffEntry de : entries) { if (stopped == true) { break; } int emptyLinesAddedStart = outputStream.getTotalEmptyLinesAdded(); int emptyLinesRemovedStart = outputStream.getTotalEmptyLinesRemoved(); int linesAddedStart = outputStream.getTotalLinesAdded(); int linesRemovedStart = outputStream.getTotalLinesRemoved(); int chunksStart = outputStream.getTotalChunks(); String oldPath = null; String path = null; switch (de.getChangeType()) { case ADD: path = de.getNewPath(); break; case DELETE: path = de.getOldPath(); break; case MODIFY: path = de.getOldPath(); break; case COPY: oldPath = de.getOldPath(); path = de.getNewPath(); break; case RENAME: oldPath = de.getOldPath(); path = de.getNewPath(); break; default: continue; } assert (fileStatsMap.containsKey(path) == false); assert (path != null); FileStats fileStats = new FileStats(); fileStatsMap.put(path, fileStats); outputStream.resetFile(); df.format(de); df.flush(); fileStats.emptyLinesAdded = outputStream.getTotalEmptyLinesAdded() - emptyLinesAddedStart; fileStats.emptyLinesRemoved = outputStream.getTotalEmptyLinesRemoved() - emptyLinesRemovedStart; fileStats.linesAdded += outputStream.getTotalLinesAdded() - linesAddedStart; fileStats.linesRemoved += outputStream.getTotalLinesRemoved() - linesRemovedStart; fileStats.chunks += outputStream.getTotalChunks() - chunksStart; fileStats.type = de.getChangeType(); fileStats.oldPath = oldPath; } } catch (IOException e) { throw e; } }
From source file:at.bitandart.zoubek.mervin.gerrit.GerritReviewRepositoryService.java
License:Open Source License
/** * loads all patches of from the given list of {@link DiffEntry}s. * /* www .j a v a 2 s . c o m*/ * @param patchSet * the patchSet to add the patches to. * @param ref * the ref to the commit of the patch set. * @param repository * the git repository instance * @throws RepositoryIOException */ private void loadPatches(PatchSet patchSet, Ref ref, Git git) throws RepositoryIOException { EList<Patch> patches = patchSet.getPatches(); Repository repository = git.getRepository(); try { RevWalk revWalk = new RevWalk(repository); RevCommit newCommit = revWalk.parseCommit(ref.getObjectId()); RevCommit oldCommit = newCommit.getParent(0); revWalk.parseHeaders(oldCommit); ObjectReader objectReader = repository.newObjectReader(); revWalk.close(); CanonicalTreeParser newTreeIterator = new CanonicalTreeParser(); newTreeIterator.reset(objectReader, newCommit.getTree().getId()); CanonicalTreeParser oldTreeIterator = new CanonicalTreeParser(); oldTreeIterator.reset(objectReader, oldCommit.getTree().getId()); List<DiffEntry> diffs = git.diff().setOldTree(oldTreeIterator).setNewTree(newTreeIterator).call(); for (DiffEntry diff : diffs) { String newPath = diff.getNewPath(); String oldPath = diff.getOldPath(); Patch patch = null; /* * only papyrus diagrams are supported for now, so models are in * .uml files, diagrams in .notation files */ if (diff.getChangeType() != ChangeType.DELETE) { if (newPath.endsWith(".uml")) { patch = modelReviewFactory.createModelPatch(); } else if (newPath.endsWith(".notation")) { patch = modelReviewFactory.createDiagramPatch(); } else { patch = modelReviewFactory.createPatch(); } } else { if (oldPath.endsWith(".uml")) { patch = modelReviewFactory.createModelPatch(); } else if (oldPath.endsWith(".notation")) { patch = modelReviewFactory.createDiagramPatch(); } else { patch = modelReviewFactory.createPatch(); } } switch (diff.getChangeType()) { case ADD: patch.setChangeType(PatchChangeType.ADD); break; case COPY: patch.setChangeType(PatchChangeType.COPY); break; case DELETE: patch.setChangeType(PatchChangeType.DELETE); break; case MODIFY: patch.setChangeType(PatchChangeType.MODIFY); break; case RENAME: patch.setChangeType(PatchChangeType.RENAME); break; } patch.setNewPath(newPath); patch.setOldPath(oldPath); if (diff.getChangeType() != ChangeType.DELETE) { ObjectLoader objectLoader = repository.open(diff.getNewId().toObjectId()); patch.setNewContent(objectLoader.getBytes()); } if (diff.getChangeType() != ChangeType.ADD) { ObjectLoader objectLoader = repository.open(diff.getOldId().toObjectId()); patch.setOldContent(objectLoader.getBytes()); } patches.add(patch); } } catch (IOException e) { throw new RepositoryIOException(MessageFormat.format( "An IO error occured during loading the patches for patch set #{0}", patchSet.getId()), e); } catch (GitAPIException e) { throw new RepositoryIOException( MessageFormat.format("An JGit API error occured during loading the patches for patch set #{0}", patchSet.getId()), e); } }
From source file:at.bitandart.zoubek.mervin.gerrit.GerritReviewRepositoryService.java
License:Open Source License
@Override public void saveReview(URI uri, ModelReview modelReview, User currentReviewer, IProgressMonitor monitor) throws InvalidReviewRepositoryException, InvalidReviewException, RepositoryIOException { monitor.beginTask("Connecting to repository", IProgressMonitor.UNKNOWN); String repoFileURI = COMMENTS_FILE_URI; try {// w w w. j a v a 2 s . co m Git git = Git.open(new File(uri)); Repository repository = git.getRepository(); ObjectInserter objectInserter = repository.newObjectInserter(); String commentRefName = getCommentRefName(modelReview); Ref commentRef = repository.exactRef(commentRefName); DirCache index = DirCache.newInCore(); DirCacheBuilder dirCacheBuilder = index.builder(); monitor.beginTask("Preparing commit...", IProgressMonitor.UNKNOWN); if (commentRef != null) { /* * The ref already exists so we have to copy the previous * RevTree to keep all already attached files */ RevWalk revWalk = new RevWalk(repository); RevCommit prevCommit = revWalk.parseCommit(commentRef.getObjectId()); RevTree tree = prevCommit.getTree(); List<String> ignoredFiles = new ArrayList<>(); /* * add file path of the new file to the ignored file paths, as * we don't want any already existing old file in our new tree */ ignoredFiles.add(repoFileURI); buildDirCacheFromTree(tree, repository, dirCacheBuilder, ignoredFiles); revWalk.close(); } monitor.beginTask("Writing comments file...", IProgressMonitor.UNKNOWN); ResourceSet resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(org.eclipse.emf.common.util.URI.createURI(repoFileURI)); addCommentsToResource(modelReview, resource); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); resource.save(outputStream, null); // insert file as object byte[] content = outputStream.toByteArray(); long length = content.length; InputStream inputStream = new ByteArrayInputStream(content); ObjectId objectId = objectInserter.insert(Constants.OBJ_BLOB, length, inputStream); inputStream.close(); // create tree entry DirCacheEntry entry = new DirCacheEntry(repoFileURI); entry.setFileMode(FileMode.REGULAR_FILE); entry.setLastModified(System.currentTimeMillis()); entry.setLength(length); entry.setObjectId(objectId); dirCacheBuilder.add(entry); dirCacheBuilder.finish(); // write new tree in database ObjectId indexTreeId = index.writeTree(objectInserter); monitor.beginTask("Commiting comments...", IProgressMonitor.UNKNOWN); // create commit CommitBuilder commitBuilder = new CommitBuilder(); PersonIdent personIdent = new PersonIdent("Mervin", "mervin@mervin.modelreview"); commitBuilder.setCommitter(personIdent); commitBuilder.setAuthor(personIdent); commitBuilder.setMessage( MessageFormat.format("Updated comments by user \"{0}\"", currentReviewer.getName())); if (commentRef != null) { commitBuilder.setParentId(commentRef.getObjectId()); } commitBuilder.setTreeId(indexTreeId); // commit ObjectId commitId = objectInserter.insert(commitBuilder); objectInserter.flush(); RefUpdate refUpdate = repository.updateRef(commentRefName); refUpdate.setNewObjectId(commitId); if (commentRef != null) refUpdate.setExpectedOldObjectId(commentRef.getObjectId()); else refUpdate.setExpectedOldObjectId(ObjectId.zeroId()); /* * TODO the result handling below is copied from the CommitCommand * class, I don't know if this is really necessary in our case */ Result result = refUpdate.forceUpdate(); switch (result) { case NEW: case FORCED: case FAST_FORWARD: { if (repository.getRepositoryState() == RepositoryState.MERGING_RESOLVED) { /* * Commit was successful. Now delete the files used for * merge commits */ repository.writeMergeCommitMsg(null); repository.writeMergeHeads(null); } else if (repository.getRepositoryState() == RepositoryState.CHERRY_PICKING_RESOLVED) { repository.writeMergeCommitMsg(null); repository.writeCherryPickHead(null); } else if (repository.getRepositoryState() == RepositoryState.REVERTING_RESOLVED) { repository.writeMergeCommitMsg(null); repository.writeRevertHead(null); } break; } case REJECTED: case LOCK_FAILURE: throw new RepositoryIOException("Error occured during writing to the git repository", new ConcurrentRefUpdateException("Could not lock ref " + refUpdate.getRef().getName(), refUpdate.getRef(), result)); default: throw new RepositoryIOException("Error occured during writing to the git repository", new JGitInternalException(MessageFormat.format(JGitText.get().updatingRefFailed, refUpdate.getRef().getName(), commitId.toString(), result))); } } catch (IOException e) { throw new InvalidReviewRepositoryException("Could not open local git repository", e); } finally { monitor.done(); } }
From source file:au.id.soundadvice.systemdesign.versioning.jgit.GitVersionControl.java
License:Open Source License
@Override public Optional<BufferedReader> getBufferedReader(IdentityValidator identityValidator, String filename, Optional<VersionInfo> version) throws IOException { if (version.isPresent()) { Pair<String, ObjectId> diff = diffCache.get(); if (!version.get().getId().equals(diff.getKey())) { // Grab the id of the commit we are trying to diff against ObjectId id = ObjectId.fromString(version.get().getId()); RevWalk revWalk = new RevWalk(repo.getRepository()); try { // Read the commit RevCommit commit = revWalk.parseCommit(id); ObjectId matchedDirectory = findMatchingIdentity(identityValidator, commit.getTree()); diff = new Pair<>(version.get().getId(), matchedDirectory); diffCache.set(diff);/*from w ww . j av a 2 s .c om*/ } finally { revWalk.release(); } } if (ObjectId.zeroId().equals(diff.getValue())) { // No such tree return Optional.empty(); } else { // Find the file in this tree TreeWalk treeWalk = new TreeWalk(repo.getRepository()); try { treeWalk.setRecursive(false); treeWalk.addTree(diff.getValue()); while (treeWalk.next()) { if (filename.equals(treeWalk.getNameString())) { // Read the file ObjectLoader loader = repo.getRepository().open(treeWalk.getObjectId(0)); ObjectStream stream = loader.openStream(); InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8); return Optional.of(new BufferedReader(reader)); } } // No such file return Optional.empty(); } finally { treeWalk.release(); } } } else { Path path = identityValidator.getDirectoryPath().resolve(filename); if (Files.exists(path)) { return Optional.of(Files.newBufferedReader(path)); } else { return Optional.empty(); } } }
From source file:boa.datagen.scm.GitCommit.java
License:Apache License
private void getChangeFiles(final RevCommit parent, final RevCommit rc, final HashMap<String, String> rChangedPaths, final HashMap<String, String> rRemovedPaths, final HashMap<String, String> rAddedPaths) { final DiffFormatter df = new DiffFormatter(NullOutputStream.INSTANCE); df.setRepository(repository);//from w ww . ja va2 s. c o m df.setDiffComparator(RawTextComparator.DEFAULT); df.setDetectRenames(true); try { final AbstractTreeIterator parentIter; if (parent == null) parentIter = new EmptyTreeIterator(); else parentIter = new CanonicalTreeParser(null, repository.newObjectReader(), parent.getTree()); for (final DiffEntry diff : df.scan(parentIter, new CanonicalTreeParser(null, repository.newObjectReader(), rc.getTree()))) { if (diff.getChangeType() == ChangeType.MODIFY || diff.getChangeType() == ChangeType.COPY || diff.getChangeType() == ChangeType.RENAME) { if (diff.getOldMode().getObjectType() == Constants.OBJ_BLOB && diff.getNewMode().getObjectType() == Constants.OBJ_BLOB) { String path = diff.getNewPath(); rChangedPaths.put(path, diff.getOldPath()); filePathGitObjectIds.put(path, diff.getNewId().toObjectId()); } } else if (diff.getChangeType() == ChangeType.ADD) { if (diff.getNewMode().getObjectType() == Constants.OBJ_BLOB) { String path = diff.getNewPath(); rAddedPaths.put(path, null); filePathGitObjectIds.put(path, diff.getNewId().toObjectId()); } } else if (diff.getChangeType() == ChangeType.DELETE) { if (diff.getOldMode().getObjectType() == Constants.OBJ_BLOB) { rRemovedPaths.put(diff.getOldPath(), diff.getOldPath()); } } } } catch (final IOException e) { if (debug) System.err.println("Git Error getting commit diffs: " + e.getMessage()); } df.close(); }
From source file:br.com.metricminer2.scm.GitRepository.java
License:Apache License
private List<DiffEntry> diffsForTheCommit(Repository repo, RevCommit commit) throws IOException, AmbiguousObjectException, IncorrectObjectTypeException { AnyObjectId currentCommit = repo.resolve(commit.getName()); AnyObjectId parentCommit = commit.getParentCount() > 0 ? repo.resolve(commit.getParent(0).getName()) : null; DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE); df.setBinaryFileThreshold(2 * 1024); // 2 mb max a file df.setRepository(repo);//from w ww .j a va 2s . c o m df.setDiffComparator(RawTextComparator.DEFAULT); df.setDetectRenames(true); List<DiffEntry> diffs = null; if (parentCommit == null) { RevWalk rw = new RevWalk(repo); diffs = df.scan(new EmptyTreeIterator(), new CanonicalTreeParser(null, rw.getObjectReader(), commit.getTree())); rw.release(); } else { diffs = df.scan(parentCommit, currentCommit); } df.release(); return diffs; }
From source file:br.edu.ifpb.scm.api.git.Git.java
/** * Recupera a diferea entre as verses// w w w .ja v a 2s .c o m * * @param repoJGit {@link org.eclipse.jgit.lib.Repository} Repositorio JGit * JGit * @param rev1 {@link RevCommit} RevCommit * @param rev2 {@link RevCommit} RevCommit * @return {@link List} List de {@link Version} */ private List<ChangedFiles> searchDiff(RevCommit rev1, RevCommit rev2) { List<ChangedFiles> listaOfChangedFiles = new ArrayList<>(); try { ObjectId oldHead = repoJGit.resolve(rev2.getTree().getName()); ObjectId head = repoJGit.resolve(rev1.getTree().getName()); ObjectReader reader = repoJGit.newObjectReader(); CanonicalTreeParser oldTreeIter = new CanonicalTreeParser(); oldTreeIter.reset(reader, oldHead); CanonicalTreeParser newTreeIter = new CanonicalTreeParser(); newTreeIter.reset(reader, head); org.eclipse.jgit.api.Git g = new org.eclipse.jgit.api.Git(repoJGit); List<DiffEntry> diffs = g.diff().setNewTree(newTreeIter).setOldTree(oldTreeIter).call(); diffs.iterator().forEachRemaining(entry -> { String oldPath = null; if (entry.getChangeType().equals(DiffEntry.ChangeType.MODIFY) || entry.getChangeType().equals(DiffEntry.ChangeType.COPY)) { oldPath = entry.getOldPath(); } List<DiffEntry> call = Collections.EMPTY_LIST; ChangedFiles changed = new ChangedFiles(oldPath, entry.getNewPath(), entry.getChangeType().name(), call); listaOfChangedFiles.add(changed); }); } catch (RevisionSyntaxException | IOException | GitAPIException e) { throw new DiffException(e); } return listaOfChangedFiles; }
From source file:br.edu.ifpb.scm.api.loads.LoaderVersions.java
public static String teste3() throws IOException { try (org.eclipse.jgit.lib.Repository repository = org.eclipse.jgit.api.Git.open(PATH).getRepository()) { // See e.g. GetRevCommitFromObjectId for how to use a SHA-1 directly Ref head = repository.findRef("HEAD"); System.out.println(/*from w ww.j a v a2 s . c o m*/ "Ref of HEAD: " + head + ": " + head.getName() + " - " + head.getObjectId().getName() + "\n"); System.out.println("Ref of HEAD getName: " + head.getName() + "\n"); System.out.println("Ref of HEAD getId().getName: " + head.getObjectId().getName() + "\n"); // a RevWalk allows to walk over commits based on some filtering that is defined try (RevWalk walk = new RevWalk(repository)) { RevCommit commit = walk.parseCommit(head.getObjectId()); System.out.println("Commit: " + commit); // a commit points to a tree RevTree tree = walk.parseTree(commit.getTree().getId()); System.out.println("FOUND TREE: " + tree.getName()); walk.dispose(); return tree.getName(); } } }