List of usage examples for org.eclipse.jgit.treewalk TreeWalk getTreeCount
public int getTreeCount()
From source file:com.mpdeimos.ct_tests.vcs.GitFileDiff.java
License:Apache License
/** * Computer file diffs for specified tree walk and commit * * @param walk/*ww w . jav a 2s . com*/ * @param commit * @return non-null but possibly empty array of file diffs * @throws MissingObjectException * @throws IncorrectObjectTypeException * @throws CorruptObjectException * @throws IOException */ public static GitFileDiff[] compute(final TreeWalk walk, final RevCommit commit) throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException { final ArrayList<GitFileDiff> r = new ArrayList<GitFileDiff>(); if (commit.getParentCount() > 0) walk.reset(trees(commit)); else { walk.reset(); walk.addTree(new EmptyTreeIterator()); walk.addTree(commit.getTree()); } if (walk.getTreeCount() <= 2) { List<DiffEntry> entries = DiffEntry.scan(walk); for (DiffEntry entry : entries) { final GitFileDiff d = new GitFileDiff(commit, entry); r.add(d); } } else { // DiffEntry does not support walks with more than two trees final int nTree = walk.getTreeCount(); final int myTree = nTree - 1; while (walk.next()) { if (matchAnyParent(walk, myTree)) continue; final GitFileDiffForMerges d = new GitFileDiffForMerges(commit); d.path = walk.getPathString(); int m0 = 0; for (int i = 0; i < myTree; i++) m0 |= walk.getRawMode(i); final int m1 = walk.getRawMode(myTree); d.change = ChangeType.MODIFY; if (m0 == 0 && m1 != 0) d.change = ChangeType.ADD; else if (m0 != 0 && m1 == 0) d.change = ChangeType.DELETE; else if (m0 != m1 && walk.idEqual(0, myTree)) d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged d.blobs = new ObjectId[nTree]; d.modes = new FileMode[nTree]; for (int i = 0; i < nTree; i++) { d.blobs[i] = walk.getObjectId(i); d.modes[i] = walk.getFileMode(i); } r.add(d); } } final GitFileDiff[] tmp = new GitFileDiff[r.size()]; r.toArray(tmp); return tmp; }
From source file:com.xiplink.jira.git.FileDiff.java
License:Open Source License
static FileDiff[] compute(final TreeWalk walk, final RevCommit commit) throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException { final ArrayList<FileDiff> r = new ArrayList<FileDiff>(); if (commit.getParentCount() > 0) { walk.reset(trees(commit));/* www . j a v a 2 s .co m*/ } else { walk.reset(); walk.addTree(new EmptyTreeIterator()); walk.addTree(commit.getTree()); } if (walk.getTreeCount() <= 2) { List<DiffEntry> entries = DiffEntry.scan(walk); int number = 0; for (DiffEntry entry : entries) { final FileDiff d = new FileDiff(commit, entry, number); r.add(d); number++; } } else { // DiffEntry does not support walks with more than two trees final int nTree = walk.getTreeCount(); final int myTree = nTree - 1; while (walk.next()) { if (matchAnyParent(walk, myTree)) { continue; } final FileDiffForMerges d = new FileDiffForMerges(commit); d.path = walk.getPathString(); int m0 = 0; for (int i = 0; i < myTree; i++) { m0 |= walk.getRawMode(i); } final int m1 = walk.getRawMode(myTree); d.change = ChangeType.MODIFY; if (m0 == 0 && m1 != 0) { d.change = ChangeType.ADD; } else if (m0 != 0 && m1 == 0) { d.change = ChangeType.DELETE; } else if (m0 != m1 && walk.idEqual(0, myTree)) { d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged } d.blobs = new ObjectId[nTree]; d.modes = new FileMode[nTree]; for (int i = 0; i < nTree; i++) { d.blobs[i] = walk.getObjectId(i); d.modes[i] = walk.getFileMode(i); } r.add(d); } } final FileDiff[] tmp = new FileDiff[r.size()]; r.toArray(tmp); return tmp; }
From source file:jetbrains.buildServer.buildTriggers.vcs.git.submodules.IgnoreSubmoduleErrorsTreeFilter.java
License:Apache License
@Override public boolean include(TreeWalk walker) throws IOException { if (myRoot.isCheckoutSubmodules()) { String path = walker.getPathString(); if (isFirstTreeHasBrokenSubmodule(walker, path)) { myBrokenSubmodulePathsInFirstTree.add(path); return false; } else if (!myBrokenSubmodulePathsInRestTrees.contains(path)) { for (int i = 1; i < walker.getTreeCount(); i++) { if (isTreeIteratorOnBrokenSubmoduleEntry(walker, i)) { myBrokenSubmodulePathsInRestTrees.add(path); }//from w w w . j a v a2s . c o m } } return TreeFilter.ANY_DIFF.include(walker); } else { return TreeFilter.ANY_DIFF.include(walker); } }
From source file:org.eclipse.egit.core.internal.merge.TreeWalkResourceVariantTreeProvider.java
License:Open Source License
/** * Constructs the resource variant trees by iterating over the given tree * walk. This TreeWalk must contain at least three trees corresponding to * the three "sides" we need.// ww w.java2 s .c o m * <p> * The tree walk will be reset to its initial state when we are done with * the iteration. * </p> * * @param repository * The repository this tree walk has been created for. * @param treeWalk * The tree walk to iterate over. * @param baseIndex * Index of the ancestor tree in the given TreeWalk (value * returned by {@link TreeWalk#addTree(AbstractTreeIterator)}) * @param ourIndex * Index of our tree in the given TreeWalk (value returned by * {@link TreeWalk#addTree(AbstractTreeIterator)}) * @param theirIndex * Index of their tree in the given TreeWalk (value returned by * {@link TreeWalk#addTree(AbstractTreeIterator)}) * @throws IOException * if we somehow cannot iterate over the treewalk. */ public TreeWalkResourceVariantTreeProvider(Repository repository, TreeWalk treeWalk, int baseIndex, int ourIndex, int theirIndex) throws IOException { // Record the initial state of this tree walk before iterating final AbstractTreeIterator[] initialTrees = new AbstractTreeIterator[treeWalk.getTreeCount()]; for (int i = 0; i < treeWalk.getTreeCount(); i++) { initialTrees[i] = treeWalk.getTree(i, AbstractTreeIterator.class); } final GitResourceVariantCache baseCache = new GitResourceVariantCache(); final GitResourceVariantCache theirsCache = new GitResourceVariantCache(); final GitResourceVariantCache oursCache = new GitResourceVariantCache(); while (treeWalk.next()) { final int modeBase = treeWalk.getRawMode(baseIndex); final int modeOurs = treeWalk.getRawMode(ourIndex); final int modeTheirs = treeWalk.getRawMode(theirIndex); if (modeBase == 0 && modeOurs == 0 && modeTheirs == 0) { // untracked continue; } final CanonicalTreeParser base = treeWalk.getTree(baseIndex, CanonicalTreeParser.class); final CanonicalTreeParser ours = treeWalk.getTree(ourIndex, CanonicalTreeParser.class); final CanonicalTreeParser theirs = treeWalk.getTree(theirIndex, CanonicalTreeParser.class); final IPath path = new Path(treeWalk.getPathString()); final IResource resource = ResourceUtil.getResourceHandleForLocation(path); // Resource variants only make sense for IResources. Do not consider // files outside of the workspace or otherwise non accessible. if (resource != null && resource.getProject().isAccessible()) { if (modeBase != 0) { baseCache.setVariant(resource, TreeParserResourceVariant.create(repository, base)); } if (modeOurs != 0) { oursCache.setVariant(resource, TreeParserResourceVariant.create(repository, ours)); } if (modeTheirs != 0) { theirsCache.setVariant(resource, TreeParserResourceVariant.create(repository, theirs)); } } if (treeWalk.isSubtree()) { treeWalk.enterSubtree(); } } // TODO any better way to reset the tree walk after an iteration? treeWalk.reset(); for (int i = 0; i < initialTrees.length; i++) { initialTrees[i].reset(); treeWalk.addTree(initialTrees[i]); } baseTree = new GitCachedResourceVariantTree(baseCache); theirsTree = new GitCachedResourceVariantTree(theirsCache); oursTree = new GitCachedResourceVariantTree(oursCache); roots = new LinkedHashSet<IResource>(); roots.addAll(baseCache.getRoots()); roots.addAll(oursCache.getRoots()); roots.addAll(theirsCache.getRoots()); knownResources = new LinkedHashSet<IResource>(); knownResources.addAll(baseCache.getKnownResources()); knownResources.addAll(oursCache.getKnownResources()); knownResources.addAll(theirsCache.getKnownResources()); }
From source file:org.eclipse.egit.core.synchronize.GitFolderResourceVariant.java
License:Open Source License
/** * @param progress/* www. j av a 2s . c om*/ * @return members * @throws IOException */ public IResourceVariant[] getMembers(IProgressMonitor progress) throws IOException { if (members != null) try { return members; } finally { progress.done(); } Repository repo = getRepository(); TreeWalk tw = new TreeWalk(repo); tw.reset(); int nth = tw.addTree(getObjectId()); int iteratorNth = tw.addTree(new FileTreeIterator(repo)); tw.setFilter(new NotIgnoredFilter(iteratorNth)); IProgressMonitor monitor = SubMonitor.convert(progress); monitor.beginTask(NLS.bind(CoreText.GitFolderResourceVariant_fetchingMembers, this), tw.getTreeCount()); List<IResourceVariant> result = new ArrayList<IResourceVariant>(); try { while (tw.next()) { if (monitor.isCanceled()) throw new OperationCanceledException(); ObjectId newObjectId = tw.getObjectId(nth); String path = getPath() + "/" + new String(tw.getRawPath()); //$NON-NLS-1$ if (!newObjectId.equals(zeroId())) if (tw.isSubtree()) result.add(new GitFolderResourceVariant(repo, getRevCommit(), newObjectId, path)); else result.add(new GitBlobResourceVariant(repo, getRevCommit(), newObjectId, path)); monitor.worked(1); } members = result.toArray(new IResourceVariant[result.size()]); return members; } finally { monitor.done(); } }
From source file:org.eclipse.egit.core.synchronize.ThreeWayDiffEntry.java
License:Open Source License
/** * Converts the TreeWalk into TreeWayDiffEntry headers. * * @param walk// w ww.ja v a 2 s.c o m * the TreeWalk to walk through. Must have exactly three trees in * this order: local, base and remote and can't be recursive. * @return headers describing the changed file. * @throws IOException * the repository cannot be accessed. * @throws IllegalArgumentException * when {@code walk} doen't have exactly three trees, or when * {@code walk} is recursive */ public static List<ThreeWayDiffEntry> scan(TreeWalk walk) throws IOException { if (walk.getTreeCount() != 3 && walk.getTreeCount() != 4) throw new IllegalArgumentException("TreeWalk need to have three or four trees"); //$NON-NLS-1$ if (walk.isRecursive()) throw new IllegalArgumentException("TreeWalk shouldn't be recursive."); //$NON-NLS-1$ List<ThreeWayDiffEntry> r = new ArrayList<ThreeWayDiffEntry>(); MutableObjectId idBuf = new MutableObjectId(); while (walk.next()) { ThreeWayDiffEntry e = new ThreeWayDiffEntry(); walk.getObjectId(idBuf, 0); e.localId = AbbreviatedObjectId.fromObjectId(idBuf); walk.getObjectId(idBuf, 1); e.baseId = AbbreviatedObjectId.fromObjectId(idBuf); walk.getObjectId(idBuf, 2); e.remoteId = AbbreviatedObjectId.fromObjectId(idBuf); boolean localSameAsBase = e.localId.equals(e.baseId); if (!A_ZERO.equals(e.localId) && localSameAsBase && e.baseId.equals(e.remoteId)) continue; e.path = walk.getPathString(); boolean localIsMissing = walk.getFileMode(0) == FileMode.MISSING; boolean baseIsMissing = walk.getFileMode(1) == FileMode.MISSING; boolean remoteIsMissing = walk.getFileMode(2) == FileMode.MISSING; if (localIsMissing || baseIsMissing || remoteIsMissing) { if (!localIsMissing && baseIsMissing && remoteIsMissing) { e.direction = Direction.OUTGOING; e.changeType = ChangeType.ADD; } else if (localIsMissing && baseIsMissing && !remoteIsMissing) { e.direction = Direction.INCOMING; e.changeType = ChangeType.ADD; } else if (!localIsMissing && !baseIsMissing && remoteIsMissing) { e.direction = Direction.INCOMING; e.changeType = ChangeType.DELETE; } else if (localIsMissing && !baseIsMissing && !remoteIsMissing) { e.direction = Direction.OUTGOING; e.changeType = ChangeType.DELETE; } else { e.direction = Direction.CONFLICTING; e.changeType = ChangeType.MODIFY; } } else { if (localSameAsBase && !e.localId.equals(e.remoteId)) e.direction = Direction.INCOMING; else if (e.remoteId.equals(e.baseId) && !e.remoteId.equals(e.localId)) e.direction = Direction.OUTGOING; else e.direction = Direction.CONFLICTING; e.changeType = ChangeType.MODIFY; } r.add(e); if (walk.isSubtree()) { e.isTree = true; walk.enterSubtree(); } } return r; }
From source file:org.eclipse.egit.ui.internal.history.FileDiff.java
License:Open Source License
static FileDiff[] compute(final TreeWalk walk, final RevCommit commit) throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException { final ArrayList<FileDiff> r = new ArrayList<FileDiff>(); if (commit.getParentCount() > 0) walk.reset(trees(commit));/*w w w . j a v a 2 s . c om*/ else { walk.reset(); walk.addTree(new EmptyTreeIterator()); walk.addTree(commit.getTree()); } if (walk.getTreeCount() <= 2) { List<DiffEntry> entries = DiffEntry.scan(walk); for (DiffEntry entry : entries) { final FileDiff d = new FileDiff(commit, entry); r.add(d); } } else { // DiffEntry does not support walks with more than two trees final int nTree = walk.getTreeCount(); final int myTree = nTree - 1; while (walk.next()) { if (matchAnyParent(walk, myTree)) continue; final FileDiffForMerges d = new FileDiffForMerges(commit); d.path = walk.getPathString(); int m0 = 0; for (int i = 0; i < myTree; i++) m0 |= walk.getRawMode(i); final int m1 = walk.getRawMode(myTree); d.change = ChangeType.MODIFY; if (m0 == 0 && m1 != 0) d.change = ChangeType.ADD; else if (m0 != 0 && m1 == 0) d.change = ChangeType.DELETE; else if (m0 != m1 && walk.idEqual(0, myTree)) d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged d.blobs = new ObjectId[nTree]; d.modes = new FileMode[nTree]; for (int i = 0; i < nTree; i++) { d.blobs[i] = walk.getObjectId(i); d.modes[i] = walk.getFileMode(i); } r.add(d); } } final FileDiff[] tmp = new FileDiff[r.size()]; r.toArray(tmp); return tmp; }
From source file:org.eclipse.emf.compare.egit.internal.merge.TreeWalkResourceVariantTreeProvider.java
License:Open Source License
/** * Constructs the resource variant trees by iterating over the given tree walk. This TreeWalk must contain * at least three trees corresponding to the three "sides" we need. * <p>// w ww . java2s . c om * The tree walk will be reset to its initial state when we are done with the iteration. * </p> * * @param repository * The repository this tree walk has been created for. * @param treeWalk * The tree walk to iterate over. * @param baseIndex * Index of the ancestor tree in the given TreeWalk (value returned by * {@link TreeWalk#addTree(AbstractTreeIterator)}) * @param ourIndex * Index of our tree in the given TreeWalk (value returned by * {@link TreeWalk#addTree(AbstractTreeIterator)}) * @param theirIndex * Index of their tree in the given TreeWalk (value returned by * {@link TreeWalk#addTree(AbstractTreeIterator)}) * @throws IOException * if we somehow cannot iterate over the treewalk. */ public TreeWalkResourceVariantTreeProvider(Repository repository, TreeWalk treeWalk, int baseIndex, int ourIndex, int theirIndex) throws IOException { // Record the initial state of this tree walk before iterating final AbstractTreeIterator[] initialTrees = new AbstractTreeIterator[treeWalk.getTreeCount()]; for (int i = 0; i < treeWalk.getTreeCount(); i++) { initialTrees[i] = treeWalk.getTree(i, AbstractTreeIterator.class); } final GitResourceVariantCache baseCache = new GitResourceVariantCache(); final GitResourceVariantCache theirsCache = new GitResourceVariantCache(); final GitResourceVariantCache oursCache = new GitResourceVariantCache(); while (treeWalk.next()) { final int modeBase = treeWalk.getRawMode(baseIndex); final int modeOurs = treeWalk.getRawMode(ourIndex); final int modeTheirs = treeWalk.getRawMode(theirIndex); if (!hasSignificantDifference(modeBase, modeOurs, modeTheirs)) { // conflict on file modes, leave the default merger handle it continue; } final CanonicalTreeParser base = treeWalk.getTree(baseIndex, CanonicalTreeParser.class); final CanonicalTreeParser ours = treeWalk.getTree(ourIndex, CanonicalTreeParser.class); final CanonicalTreeParser theirs = treeWalk.getTree(theirIndex, CanonicalTreeParser.class); final int nonZeroMode = modeBase != 0 ? modeBase : modeOurs != 0 ? modeOurs : modeTheirs; final IResource resource = getResourceHandleForLocation(repository, treeWalk.getPathString(), FileMode.fromBits(nonZeroMode) == FileMode.TREE); // Resource variants only make sense for IResources. if (resource != null) { IPath workspacePath = resource.getFullPath(); if (modeBase != 0) { baseCache.setVariant(resource, TreeParserResourceVariant.create(repository, base, workspacePath)); } if (modeOurs != 0) { oursCache.setVariant(resource, TreeParserResourceVariant.create(repository, ours, workspacePath)); } if (modeTheirs != 0) { theirsCache.setVariant(resource, TreeParserResourceVariant.create(repository, theirs, workspacePath)); } } if (treeWalk.isSubtree()) { treeWalk.enterSubtree(); } } // TODO any better way to reset the tree walk after an iteration? treeWalk.reset(); for (int i = 0; i < initialTrees.length; i++) { initialTrees[i].reset(); treeWalk.addTree(initialTrees[i]); } baseTree = new GitCachedResourceVariantTree(baseCache); theirsTree = new GitCachedResourceVariantTree(theirsCache); oursTree = new GitCachedResourceVariantTree(oursCache); roots = new LinkedHashSet<IResource>(); roots.addAll(baseCache.getRoots()); roots.addAll(oursCache.getRoots()); roots.addAll(theirsCache.getRoots()); knownResources = new LinkedHashSet<IResource>(); knownResources.addAll(baseCache.getKnownResources()); knownResources.addAll(oursCache.getKnownResources()); knownResources.addAll(theirsCache.getKnownResources()); }
From source file:org.flowerplatform.web.git.history.internal.FileDiff.java
License:Open Source License
/** * Computer file diffs for specified tree walk and commit * * @param walk/*from ww w . j a v a 2 s . c o m*/ * @param commit * @param markTreeFilters optional filters for marking entries, see {@link #isMarked(int)} * @return non-null but possibly empty array of file diffs * @throws MissingObjectException * @throws IncorrectObjectTypeException * @throws CorruptObjectException * @throws IOException */ public static FileDiff[] compute(final TreeWalk walk, final RevCommit commit, final TreeFilter... markTreeFilters) throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException, IOException { final ArrayList<FileDiff> r = new ArrayList<FileDiff>(); if (commit.getParentCount() > 0) walk.reset(trees(commit)); else { walk.reset(); walk.addTree(new EmptyTreeIterator()); walk.addTree(commit.getTree()); } if (walk.getTreeCount() <= 2) { List<DiffEntry> entries = DiffEntry.scan(walk, false, markTreeFilters); for (DiffEntry entry : entries) { final FileDiff d = new FileDiff(commit, entry); r.add(d); } } else { // DiffEntry does not support walks with more than two trees final int nTree = walk.getTreeCount(); final int myTree = nTree - 1; TreeFilterMarker treeFilterMarker = new TreeFilterMarker(markTreeFilters); while (walk.next()) { if (matchAnyParent(walk, myTree)) continue; int treeFilterMarks = treeFilterMarker.getMarks(walk); final FileDiffForMerges d = new FileDiffForMerges(commit, treeFilterMarks); d.path = walk.getPathString(); int m0 = 0; for (int i = 0; i < myTree; i++) m0 |= walk.getRawMode(i); final int m1 = walk.getRawMode(myTree); d.change = ChangeType.MODIFY; if (m0 == 0 && m1 != 0) d.change = ChangeType.ADD; else if (m0 != 0 && m1 == 0) d.change = ChangeType.DELETE; else if (m0 != m1 && walk.idEqual(0, myTree)) d.change = ChangeType.MODIFY; // there is no ChangeType.TypeChanged d.blobs = new ObjectId[nTree]; d.modes = new FileMode[nTree]; for (int i = 0; i < nTree; i++) { d.blobs[i] = walk.getObjectId(i); d.modes[i] = walk.getFileMode(i); } r.add(d); } } final FileDiff[] tmp = new FileDiff[r.size()]; r.toArray(tmp); return tmp; }
From source file:org.gitective.core.filter.commit.CommitDiffFilter.java
License:Open Source License
@Override public boolean include(final RevWalk walker, final RevCommit commit) throws IOException { final TreeWalk walk = createTreeWalk(walker, commit); final List<DiffEntry> diffs; final int treeCount = walk.getTreeCount(); switch (treeCount) { case 0://w w w.ja v a2 s .co m case 1: diffs = Collections.emptyList(); break; case 2: diffs = DiffEntry.scan(walk); break; default: diffs = new ArrayList<DiffEntry>(); final MutableObjectId currentId = new MutableObjectId(); final int currentTree = treeCount - 1; while (walk.next()) { final int currentMode = walk.getRawMode(currentTree); int parentMode = 0; boolean same = false; for (int i = 0; i < currentTree; i++) { final int mode = walk.getRawMode(i); same = mode == currentMode && walk.idEqual(currentTree, i); if (same) break; parentMode |= mode; } if (same) continue; final LocalDiffEntry diff = new LocalDiffEntry(walk.getPathString()); diff.setOldMode(FileMode.fromBits(parentMode)); diff.setNewMode(FileMode.fromBits(currentMode)); walk.getObjectId(currentId, currentTree); diff.setNewId(AbbreviatedObjectId.fromObjectId(currentId)); if (parentMode == 0 && currentMode != 0) diff.setChangeType(ChangeType.ADD); else if (parentMode != 0 && currentMode == 0) diff.setChangeType(ChangeType.DELETE); else diff.setChangeType(ChangeType.MODIFY); diffs.add(diff); } } if (detectRenames) { renameDetector.reset(); renameDetector.addAll(diffs); return include(walker, commit, renameDetector.compute(walker.getObjectReader(), INSTANCE)) ? true : include(false); } else return include(walker, commit, diffs) ? true : include(false); }