List of usage examples for org.eclipse.jgit.diff RenameDetector addAll
public void addAll(Collection<DiffEntry> entriesToAdd)
From source file:com.microsoft.gittf.core.tasks.pendDiff.PendDifferenceTask.java
License:Open Source License
/** * Creates the CheckinAnalysisChangeCollection analysis object that includes * the list of pending changes needed that map to the differences between * the fromCommit and toCommit/*from www . j a va2 s .c o m*/ * * @param repository * the git repository * @param fromRootTree * the from commit tree * @param toRootTree * the to commit tree * @param renameMode * the rename mode to use when generating the analysis * @param progressMonitor * the progress monitor to use to report progress * @return * @throws Exception */ public static CheckinAnalysisChangeCollection analyzeDifferences(Repository repository, RevObject fromRootTree, RevObject toRootTree, RenameMode renameMode, final TaskProgressMonitor progressMonitor) throws Exception { Check.notNull(fromRootTree, "fromRootTree"); //$NON-NLS-1$ Check.notNull(toRootTree, "toRootTree"); //$NON-NLS-1$ Check.notNull(progressMonitor, "progressMonitor"); //$NON-NLS-1$ progressMonitor.beginTask(Messages.getString("PendDifferencesTask.AnalyzingCommits"), //$NON-NLS-1$ TaskProgressMonitor.INDETERMINATE, TaskProgressDisplay.DISPLAY_SUBTASK_DETAIL); /* Init the analysis object */ final CheckinAnalysisChangeCollection analysis = new CheckinAnalysisChangeCollection(repository, fromRootTree, toRootTree); log.debug("Walking thru the git-repository tree."); /* Init the tree walker object */ final TreeWalk treeWalker = new NameConflictTreeWalk(repository); final RenameDetector repositoryRenameDetector = new RenameDetector(repository); try { treeWalker.setRecursive(true); treeWalker.addTree(fromRootTree); treeWalker.addTree(toRootTree); treeWalker.setFilter(TreeFilter.ANY_DIFF); List<DiffEntry> treeDifferences = DiffEntry.scan(treeWalker); log.debug("The number of differences found: " + treeDifferences.size()); /* * If we need to detect file renames then use the rename detector to * analayze the differences first */ if (renameMode != RenameMode.NONE) { repositoryRenameDetector.addAll(treeDifferences); treeDifferences = repositoryRenameDetector.compute(); } /* * If the rename mode is either none or file only then we do not * need to detect folder deletes as well, since deleting empty * folders that have items that have been renamed out is not * supported in TFS */ if (renameMode != RenameMode.ALL) { analysis.setProcessDeletedFolders(false); } Map<String, DiffEntry> deleteChanges = new HashMap<String, DiffEntry>(); Map<String, DiffEntry> addChanges = new HashMap<String, DiffEntry>(); for (DiffEntry change : treeDifferences) { switch (change.getChangeType()) { case ADD: addChanges.put(change.getNewPath().toUpperCase(), change); break; case DELETE: deleteChanges.put(change.getOldPath().toUpperCase(), change); break; } } /* Append each change in to the analysis object */ for (DiffEntry change : treeDifferences) { switch (change.getChangeType()) { case ADD: case COPY: if (!isCaseSensitiveRename(change, deleteChanges, addChanges)) { analysis.pendAdd(new AddChange(change.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, change.getNewId()))); analysis.pendPropertyIfChanged(new PropertyChange(change.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, change.getNewId()), change.getNewMode())); } break; case DELETE: if (isCaseSensitiveRename(change, deleteChanges, addChanges)) { DiffEntry addChange = addChanges.get(change.getOldPath().toUpperCase()); analysis.pendRename(new RenameChange(change.getOldPath(), addChange.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, addChange.getNewId()), !change.getOldId().equals(addChange.getNewId()))); analysis.pendPropertyIfChanged(new PropertyChange(addChange.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, addChange.getNewId()), change.getOldMode(), addChange.getNewMode())); } else { analysis.pendDelete(new DeleteChange(change.getOldPath(), change.getOldMode())); } break; case MODIFY: analysis.pendEdit(new EditChange(change.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, change.getNewId()))); analysis.pendPropertyIfChanged(new PropertyChange(change.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, change.getNewId()), change.getOldMode(), change.getNewMode())); break; case RENAME: analysis.pendRename(new RenameChange(change.getOldPath(), change.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, change.getNewId()), !change.getOldId().equals(change.getNewId()))); analysis.pendPropertyIfChanged(new PropertyChange(change.getNewPath(), CommitUtil.resolveAbbreviatedId(repository, change.getNewId()), change.getOldMode(), change.getNewMode())); } } } finally { if (treeWalker != null) { treeWalker.release(); } progressMonitor.endTask(); } log.debug("Walk thru the git-repository tree finished."); return analysis; }
From source file:de.andreasgiemza.jgeagle.repo.rcs.JGit.java
License:Open Source License
/** * * Based on http://stackoverflow.com/a/11504177/2246865 by OneWorld * * @param follow// ww w . ja v a 2 s .c o m * @param start * @param path * @return * @throws IOException * @throws GitAPIException */ private String getRenamedPath(boolean follow, RevCommit start, String path) throws IOException, GitAPIException { if (!follow) { return null; } Iterable<RevCommit> allCommitsLater = git.log().add(start).call(); for (RevCommit commit : allCommitsLater) { TreeWalk tw = new TreeWalk(repository); tw.addTree(commit.getTree()); tw.addTree(start.getTree()); tw.setRecursive(true); RenameDetector rd = new RenameDetector(repository); rd.addAll(DiffEntry.scan(tw)); List<DiffEntry> files = rd.compute(); for (DiffEntry deffE : files) { if ((deffE.getChangeType() == DiffEntry.ChangeType.RENAME || deffE.getChangeType() == DiffEntry.ChangeType.COPY) && deffE.getNewPath().contains(path)) { return deffE.getOldPath(); } } } return null; }
From source file:org.eclipse.che.git.impl.jgit.JGitDiffPage.java
License:Open Source License
/** * Show changes between index and working tree. * * @param formatter// w w w . ja v a2 s. c o m * diff formatter * @return list of diff entries * @throws IOException * if any i/o errors occurs */ private List<DiffEntry> indexToWorkingTree(DiffFormatter formatter) throws IOException { DirCache dirCache = null; ObjectReader reader = repository.newObjectReader(); List<DiffEntry> diff; try { dirCache = repository.lockDirCache(); DirCacheIterator iterA = new DirCacheIterator(dirCache); FileTreeIterator iterB = new FileTreeIterator(repository); // Seems bug in DiffFormatter when work with working. Disable detect // renames by formatter and do it later. formatter.setDetectRenames(false); diff = formatter.scan(iterA, iterB); if (!request.isNoRenames()) { // Detect renames. RenameDetector renameDetector = createRenameDetector(); ContentSource.Pair sourcePairReader = new ContentSource.Pair(ContentSource.create(reader), ContentSource.create(iterB)); renameDetector.addAll(diff); diff = renameDetector.compute(sourcePairReader, NullProgressMonitor.INSTANCE); } } finally { reader.close(); if (dirCache != null) { dirCache.unlock(); } } return diff; }
From source file:org.eclipse.che.git.impl.jgit.JGitDiffPage.java
License:Open Source License
/** * Show changes between specified revision and working tree. * * @param commitId//from www.j a v a2 s . co m * id of commit * @param formatter * diff formatter * @return list of diff entries * @throws IOException * if any i/o errors occurs */ private List<DiffEntry> commitToWorkingTree(String commitId, DiffFormatter formatter) throws IOException { ObjectId commitA = repository.resolve(commitId); if (commitA == null) { File heads = new File(repository.getWorkTree().getPath() + "/.git/refs/heads"); if (heads.exists() && heads.list().length == 0) { return Collections.emptyList(); } throw new IllegalArgumentException("Invalid commit id " + commitId); } RevTree treeA; try (RevWalk revWalkA = new RevWalk(repository)) { treeA = revWalkA.parseTree(commitA); } List<DiffEntry> diff; try (ObjectReader reader = repository.newObjectReader()) { CanonicalTreeParser iterA = new CanonicalTreeParser(); iterA.reset(reader, treeA); FileTreeIterator iterB = new FileTreeIterator(repository); // Seems bug in DiffFormatter when work with working. Disable detect // renames by formatter and do it later. formatter.setDetectRenames(false); diff = formatter.scan(iterA, iterB); if (!request.isNoRenames()) { // Detect renames. RenameDetector renameDetector = createRenameDetector(); ContentSource.Pair sourcePairReader = new ContentSource.Pair(ContentSource.create(reader), ContentSource.create(iterB)); renameDetector.addAll(diff); diff = renameDetector.compute(sourcePairReader, NullProgressMonitor.INSTANCE); } } return diff; }
From source file:org.eclipse.egit.bc.BeyondCompareRepositoryActionHandler.java
License:Open Source License
protected String getPreviousPath(Repository repository, ObjectReader reader, RevCommit headCommit, RevCommit previousCommit, String path) throws IOException { TreeWalk walk = new TreeWalk(reader); walk.setRecursive(true);/*from w w w . j a v a2 s. c om*/ walk.addTree(previousCommit.getTree()); walk.addTree(headCommit.getTree()); List<DiffEntry> entries = DiffEntry.scan(walk); if (entries.size() < 2) return path; for (DiffEntry diff : entries) if (diff.getChangeType() == ChangeType.MODIFY && path.equals(diff.getNewPath())) return path; RenameDetector detector = new RenameDetector(repository); detector.addAll(entries); List<DiffEntry> renames = detector.compute(walk.getObjectReader(), NullProgressMonitor.INSTANCE); for (DiffEntry diff : renames) if (diff.getChangeType() == ChangeType.RENAME && path.equals(diff.getNewPath())) return diff.getOldPath(); return path; }
From source file:svnserver.repository.git.GitRepository.java
License:GNU General Public License
@NotNull private Map<String, String> collectRename(@NotNull GitFile oldTree, @NotNull GitFile newTree) throws IOException { if (!renameDetection) { return Collections.emptyMap(); }/*from w w w. j a v a 2 s . c om*/ final GitObject<ObjectId> oldTreeId = oldTree.getObjectId(); final GitObject<ObjectId> newTreeId = newTree.getObjectId(); if (oldTreeId == null || newTreeId == null || !Objects.equals(oldTreeId.getRepo(), newTreeId.getRepo())) { return Collections.emptyMap(); } final TreeWalk tw = new TreeWalk(repository); tw.setRecursive(true); tw.addTree(oldTree.getObjectId().getObject()); tw.addTree(newTree.getObjectId().getObject()); final RenameDetector rd = new RenameDetector(repository); rd.addAll(DiffEntry.scan(tw)); final Map<String, String> result = new HashMap<>(); for (DiffEntry diff : rd.compute(tw.getObjectReader(), null)) { if (diff.getScore() >= rd.getRenameScore()) { result.put(StringHelper.normalize(diff.getNewPath()), StringHelper.normalize(diff.getOldPath())); } } return result; }