aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Wolf2018-06-29 11:05:33 -0400
committerThomas Wolf2018-07-05 13:20:35 -0400
commit96d430a13d0e9210ccf563d42ba94c202d578d18 (patch)
treee8448780a20dc206f531eaf8af5becb6d164bad9
parentf25e7c92b13fc6517da3d78315489a19b57328d7 (diff)
downloadegit-96d430a13d0e9210ccf563d42ba94c202d578d18.zip
egit-96d430a13d0e9210ccf563d42ba94c202d578d18.tar.gz
egit-96d430a13d0e9210ccf563d42ba94c202d578d18.tar.xz
Fix error marker updates in staging view
Use (absolute) paths instead of resources to determine which elements to update in the staging viewer. Using resources may give inconsistent results if * a file occurs several times in the Eclipse resource tree, or * a on-disk directory doesn't exist as a resource in Eclipse at all. The latter can occur if tree representation is used and an Eclipse project lives in some sub-directory (for instance, "bundles") in the git working tree. In that case the staging view will have a folder "bundles", but there's no resource for it, and thus our top-down tree traversal will skip it and all its descendants. Bug: 536471 Change-Id: I46fc84737471e2994af056ecb238b3bbfb55e413 Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/ProblemLabelDecorator.java60
1 files changed, 43 insertions, 17 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/ProblemLabelDecorator.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/ProblemLabelDecorator.java
index 23a2857..e5dd1fa 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/ProblemLabelDecorator.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/ProblemLabelDecorator.java
@@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.decorators;
+import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -22,7 +23,10 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
import org.eclipse.egit.core.AdapterUtils;
+import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
@@ -108,26 +112,42 @@ public class ProblemLabelDecorator extends BaseLabelProvider implements
@Override
public void resourceChanged(IResourceChangeEvent event) {
- Set<IResource> resources = new HashSet<>();
+ Set<IPath> paths = new HashSet<>();
IMarkerDelta[] markerDeltas = event.findMarkerDeltas(IMarker.PROBLEM,
true);
for (IMarkerDelta delta : markerDeltas) {
- // Also add parents
IResource resource = delta.getResource();
- while (resource.getType() != IResource.ROOT
- && resources.add(resource)) {
- resource = resource.getParent();
+ if (resource == null) {
+ continue;
+ }
+ RepositoryMapping mapping = RepositoryMapping.getMapping(resource);
+ if (mapping == null || mapping.getRepository().isBare()) {
+ continue;
+ }
+ IPath path = resource.getLocation();
+ if (path == null) {
+ continue;
+ }
+ // Also add parents
+ File workTree = mapping.getWorkTree();
+ if (workTree == null) {
+ continue;
+ }
+ int n = new Path(workTree.getAbsolutePath()).segmentCount();
+ for (int i = path.segmentCount(); i > n; i--) {
+ paths.add(path);
+ path = path.removeLastSegments(1);
}
}
- if (!resources.isEmpty()) {
- updateLabels(resources);
+ if (!paths.isEmpty()) {
+ updateLabels(paths);
}
}
- private void updateLabels(Set<IResource> changedResources) {
- List<Object> elements = getAffectedElements(changedResources);
+ private void updateLabels(Set<IPath> changedPaths) {
+ List<Object> elements = getAffectedElements(changedPaths);
if (!elements.isEmpty()) {
final Object[] updateElements = elements.toArray(new Object[elements.size()]);
Display display = viewer.getControl().getDisplay();
@@ -141,25 +161,31 @@ public class ProblemLabelDecorator extends BaseLabelProvider implements
}
}
- private List<Object> getAffectedElements(Set<IResource> resources) {
+ private List<Object> getAffectedElements(Set<IPath> paths) {
List<Object> result = new ArrayList<>();
if (viewer.getContentProvider() instanceof IStructuredContentProvider) {
IStructuredContentProvider contentProvider = (IStructuredContentProvider) viewer.getContentProvider();
- getAffectedElements(resources, contentProvider.getElements(null),
+ getAffectedElements(paths, contentProvider.getElements(null),
contentProvider, result);
}
return result;
}
- private void getAffectedElements(Set<IResource> resources,
- Object[] elements, IStructuredContentProvider contentProvider,
- List<Object> result) {
+ private void getAffectedElements(Set<IPath> paths, Object[] elements,
+ IStructuredContentProvider contentProvider, List<Object> result) {
for (Object element : elements) {
- IResource resource = AdapterUtils.adapt(element, IResource.class);
- if (resource != null && resources.contains(resource)) {
+ IPath path = AdapterUtils.adapt(element, IPath.class);
+ if (path == null) {
+ IResource resource = AdapterUtils.adapt(element,
+ IResource.class);
+ if (resource != null) {
+ path = resource.getLocation();
+ }
+ }
+ if (path != null && paths.contains(path)) {
result.add(element);
if (contentProvider instanceof ITreeContentProvider) {
- getAffectedElements(resources,
+ getAffectedElements(paths,
((ITreeContentProvider) contentProvider)
.getChildren(element),
contentProvider, result);