Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Stocker2012-12-14 16:32:14 +0000
committerGerrit Code Review @ Eclipse.org2012-12-16 14:12:24 +0000
commit560daa441e43571c670d5f393e4c17dc55761241 (patch)
tree45835d478822d43576b2865865141535931d8aa7
parent1afed28c44cfaa632bf4b9f0361f1ee4d4d0bdbb (diff)
downloadegit-560daa441e43571c670d5f393e4c17dc55761241.tar.gz
egit-560daa441e43571c670d5f393e4c17dc55761241.tar.xz
egit-560daa441e43571c670d5f393e4c17dc55761241.zip
Fix incorrect decorations when ignored resources are created
The problem was that ignored paths were not correctly merged in the incremental index diff update. They can not be merged with the mergeList method because they can also include folder paths. Bug: 396613 Change-Id: I5b9019df86a005ee0d4f64d656b3aaacf7160398
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/TestProject.java6
-rw-r--r--org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/indexDiff/IndexDiffCacheTest.java56
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/indexdiff/IndexDiffData.java22
3 files changed, 82 insertions, 2 deletions
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/TestProject.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/TestProject.java
index fd8fa5e805..f6808ea6df 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/TestProject.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/TestProject.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org>
+ * Copyright (C) 2012, Robin Stocker <robin@nibor.org>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -175,6 +176,11 @@ public class TestProject {
public IFolder createFolder(String name) throws Exception {
IFolder folder = project.getFolder(name);
folder.create(true, true, null);
+ return folder;
+ }
+
+ public IFolder createFolderWithKeep(String name) throws Exception {
+ IFolder folder = createFolder(name);
IFile keep = project.getFile(name + "/keep");
keep.create(new ByteArrayInputStream(new byte[] {0}), true, null);
diff --git a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/indexDiff/IndexDiffCacheTest.java b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/indexDiff/IndexDiffCacheTest.java
index 3922654fd2..f998c6915a 100644
--- a/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/indexDiff/IndexDiffCacheTest.java
+++ b/org.eclipse.egit.core.test/src/org/eclipse/egit/core/test/indexDiff/IndexDiffCacheTest.java
@@ -108,6 +108,62 @@ public class IndexDiffCacheTest extends GitTestCase {
assertThat(data2.getUntrackedFolders(), hasItem("Project-1/folder/b/"));
}
+ @Test
+ public void testAddIgnoredFolder() throws Exception {
+ testRepository.connect(project.project);
+ project.createFile(".gitignore", "ignore\n".getBytes("UTF-8"));
+ project.createFolder("ignore");
+ project.createFile("ignore/file.txt", new byte[] {});
+ project.createFolder("sub");
+ testRepository.addToIndex(project.project);
+ testRepository.createInitialCommit("testAddFileInIgnoredFolder\n\nfirst commit\n");
+ prepareCacheEntry();
+
+ IndexDiffData data1 = waitForListenerCalled();
+ assertThat(data1.getIgnoredNotInIndex(), hasItem("Project-1/ignore"));
+
+ project.createFolder("sub/ignore");
+
+ IndexDiffData data2 = waitForListenerCalled();
+ assertThat(data2.getIgnoredNotInIndex(), hasItem("Project-1/ignore"));
+ assertThat(data2.getIgnoredNotInIndex(), hasItem("Project-1/sub/ignore"));
+
+ // Must not change anything (ignored path starts with this string, but
+ // it's not a prefix path of it)
+ project.createFile("sub/ignorenot", new byte[] {});
+
+ IndexDiffData data3 = waitForListenerCalled();
+ assertThat(data3.getUntracked(), hasItem("Project-1/sub/ignorenot"));
+ assertThat(data3.getIgnoredNotInIndex(), hasItem("Project-1/ignore"));
+ assertThat(data3.getIgnoredNotInIndex(), hasItem("Project-1/sub/ignore"));
+ }
+
+ @Test
+ public void testRemoveIgnoredFile() throws Exception {
+ testRepository.connect(project.project);
+ project.createFile(".gitignore", "ignore\n".getBytes("UTF-8"));
+ project.createFolder("sub");
+ IFile file = project.createFile("sub/ignore", new byte[] {});
+ testRepository.addToIndex(project.project);
+ testRepository.createInitialCommit("testRemoveIgnoredFile\n\nfirst commit\n");
+ prepareCacheEntry();
+
+ IndexDiffData data1 = waitForListenerCalled();
+ assertThat(data1.getIgnoredNotInIndex(), hasItem("Project-1/sub/ignore"));
+
+ // Must not change anything (ignored path starts with this string, but
+ // it's not a prefix path of it)
+ project.createFile("sub/ignorenot", new byte[] {});
+
+ IndexDiffData data2 = waitForListenerCalled();
+ assertThat(data2.getIgnoredNotInIndex(), hasItem("Project-1/sub/ignore"));
+
+ file.delete(false, null);
+
+ IndexDiffData data3 = waitForListenerCalled();
+ assertThat(data3.getIgnoredNotInIndex(), not(hasItem("Project-1/sub/ignore")));
+ }
+
private void prepareCacheEntry() {
IndexDiffCache indexDiffCache = Activator.getDefault()
.getIndexDiffCache();
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/indexdiff/IndexDiffData.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/indexdiff/IndexDiffData.java
index 3cb3dac2c7..1ece7741d5 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/indexdiff/IndexDiffData.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/indexdiff/IndexDiffData.java
@@ -100,7 +100,6 @@ public class IndexDiffData {
Set<String> modified2 = new HashSet<String>(baseDiff.getModified());
Set<String> untracked2 = new HashSet<String>(baseDiff.getUntracked());
Set<String> conflicts2 = new HashSet<String>(baseDiff.getConflicting());
- Set<String> ignored2 = new HashSet<String>(baseDiff.getIgnoredNotInIndex());
mergeList(added2, changedFiles, diffForChangedFiles.getAdded());
mergeList(changed2, changedFiles, diffForChangedFiles.getChanged());
@@ -113,7 +112,7 @@ public class IndexDiffData {
getUntrackedFolders(diffForChangedFiles));
mergeList(conflicts2, changedFiles,
diffForChangedFiles.getConflicting());
- mergeList(ignored2, changedFiles,
+ Set<String> ignored2 = mergeIgnored(baseDiff.getIgnoredNotInIndex(), changedFiles,
diffForChangedFiles.getIgnoredNotInIndex());
added = Collections.unmodifiableSet(added2);
@@ -161,6 +160,25 @@ public class IndexDiffData {
return false;
}
+ private static Set<String> mergeIgnored(Set<String> oldIgnoredPaths,
+ Collection<String> changedPaths, Set<String> newIgnoredPaths) {
+ Set<String> merged = new HashSet<String>();
+ for (String oldIgnoredPath : oldIgnoredPaths) {
+ boolean changed = isAnyPrefixOf(oldIgnoredPath, changedPaths);
+ if (!changed)
+ merged.add(oldIgnoredPath);
+ }
+ merged.addAll(newIgnoredPaths);
+ return merged;
+ }
+
+ private static boolean isAnyPrefixOf(String pathToCheck, Collection<String> possiblePrefixes) {
+ for (String possiblePrefix : possiblePrefixes)
+ if (pathToCheck.startsWith(possiblePrefix) || possiblePrefix.equals(pathToCheck + '/'))
+ return true;
+ return false;
+ }
+
/**
* @return list of files added to the index, not in the tree
*/

Back to the top