summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Rosenberg <robin.rosenberg@dewire.com>2011-08-10 14:40:25 -0400
committerCode Review <codereview-daemon@eclipse.org>2011-08-10 14:40:25 -0400
commit5a3a2b53eec76e914bf54848dc88a55ac7e347f7 (patch)
treecd75fd98a6e8174a279a450d00cb0e686165c54e
parentd4db26bb57b0a8027764679e06a99d3f4bfe628e (diff)
parentc536873c87db0d87292a90a905b30301c110ceb3 (diff)
downloadjgit-5a3a2b53eec76e914bf54848dc88a55ac7e347f7.tar.gz
jgit-5a3a2b53eec76e914bf54848dc88a55ac7e347f7.zip
Merge "Fix reading of ref names containing characters that sort before /"
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java30
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java11
2 files changed, 39 insertions, 2 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java
index dc2ccb97fb..3ca4f589db 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java
@@ -61,6 +61,9 @@ import java.io.File;
import java.io.IOException;
import java.util.Map;
+import org.eclipse.jgit.events.ListenerHandle;
+import org.eclipse.jgit.events.RefsChangedEvent;
+import org.eclipse.jgit.events.RefsChangedListener;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.AnyObjectId;
@@ -466,6 +469,33 @@ public class RefDirectoryTest extends LocalDiskRepositoryTestCase {
}
@Test
+ public void testGetRefs_LooseSorting_Bug_348834() throws IOException {
+ Map<String, Ref> refs;
+
+ writeLooseRef("refs/heads/my/a+b", A);
+ writeLooseRef("refs/heads/my/a/b/c", B);
+
+ final int[] count = new int[1];
+
+ ListenerHandle listener = Repository.getGlobalListenerList()
+ .addRefsChangedListener(new RefsChangedListener() {
+
+ public void onRefsChanged(RefsChangedEvent event) {
+ count[0]++;
+ }
+ });
+
+ refs = refdir.getRefs(RefDatabase.ALL);
+ refs = refdir.getRefs(RefDatabase.ALL);
+ listener.remove();
+ assertEquals(1, count[0]); // Bug 348834 multiple RefsChangedEvents
+ assertEquals(2, refs.size());
+ assertEquals(A, refs.get("refs/heads/my/a+b").getObjectId());
+ assertEquals(B, refs.get("refs/heads/my/a/b/c").getObjectId());
+
+ }
+
+ @Test
public void testGetRefs_TagsOnly_AllPacked() throws IOException {
Map<String, Ref> tags;
Ref a;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java
index 0590f905ec..3917ff4716 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java
@@ -385,10 +385,17 @@ public class RefDirectory extends RefDatabase {
if (entries == null) // not a directory or an I/O error
return false;
if (0 < entries.length) {
+ for (int i = 0; i < entries.length; ++i) {
+ String e = entries[i];
+ File f = new File(dir, e);
+ if (f.isDirectory())
+ entries[i] += '/';
+ }
Arrays.sort(entries);
for (String name : entries) {
- File e = new File(dir, name);
- if (!scanTree(prefix + name + '/', e))
+ if (name.charAt(name.length() - 1) == '/')
+ scanTree(prefix + name, new File(dir, name));
+ else
scanOne(prefix + name);
}
}