Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Halstrick2012-08-21 13:10:02 +0000
committerStefan Lay2012-08-21 13:10:02 +0000
commit252727c4fcfb1277661b9e9e3396e6ccd488cc82 (patch)
treed216a55cc2caf4c702fdd50bf6294f98d254496d
parent376a741d8f2ddbd7d801067fdbf304ea3ba3a2bb (diff)
downloadjgit-252727c4fcfb1277661b9e9e3396e6ccd488cc82.tar.gz
jgit-252727c4fcfb1277661b9e9e3396e6ccd488cc82.tar.xz
jgit-252727c4fcfb1277661b9e9e3396e6ccd488cc82.zip
Support branches with name 'config'
JGit was not able to lookup refs which had the name of files which exist in the .git folder. When JGit was looking up a ref named X it has a fixed set of directories where it searched for files named X (ignore packed refs for now). First directory to search for is .git. In case of the ref named 'config' it searched there for this file, found it (it's the .git/config file with the repo configuration in it), parsed it, found it is an invalid ref and stopped searching. It never looked for a file .git/refs/heads/config. I changed JGit in a way that when it finds a file in GIT_DIR which corresponds to a ref name and if this file doesn't contain a valid ref then it will ignore the InvalidObjectIdException and continue searching. Change-Id: Ic26a329fb1624a5b2b2494c78bac4bd76817c100 Bug: 381574 Signed-off-by: Christian Halstrick <christian.halstrick@sap.com> Signed-off-by: Stefan Lay <stefan.lay@sap.com>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java13
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java22
2 files changed, 30 insertions, 5 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 153f7b791c..a602f7c7d5 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
@@ -360,6 +360,19 @@ public class RefDirectoryTest extends LocalDiskRepositoryTestCase {
}
@Test
+ public void testReadNotExistingBranchConfig() throws IOException {
+ assertNull("find branch config", refdir.getRef("config"));
+ assertNull("find branch config", refdir.getRef("refs/heads/config"));
+ }
+
+ @Test
+ public void testReadBranchConfig() throws IOException {
+ writeLooseRef("refs/heads/config", A);
+
+ assertNotNull("find branch config", refdir.getRef("config"));
+ }
+
+ @Test
public void testGetRefs_HeadsOnly_AllLoose() throws IOException {
Map<String, Ref> heads;
Ref a, b;
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 3d082fb4af..6ae3f8cc8b 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
@@ -73,6 +73,7 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.errors.InvalidObjectIdException;
import org.eclipse.jgit.errors.LockFailedException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.ObjectWritingException;
@@ -260,10 +261,17 @@ public class RefDirectory extends RefDatabase {
final RefList<Ref> packed = getPackedRefs();
Ref ref = null;
for (String prefix : SEARCH_PATH) {
- ref = readRef(prefix + needle, packed);
- if (ref != null) {
- ref = resolve(ref, 0, null, null, packed);
- break;
+ try {
+ ref = readRef(prefix + needle, packed);
+ if (ref != null) {
+ ref = resolve(ref, 0, null, null, packed);
+ break;
+ }
+ } catch (IOException e) {
+ if (!(!needle.contains("/") && "".equals(prefix) && e
+ .getCause() instanceof InvalidObjectIdException)) {
+ throw e;
+ }
}
}
fireRefsChanged();
@@ -937,7 +945,11 @@ public class RefDirectory extends RefDatabase {
while (0 < n && Character.isWhitespace(buf[n - 1]))
n--;
String content = RawParseUtils.decode(buf, 0, n);
- throw new IOException(MessageFormat.format(JGitText.get().notARef, name, content));
+
+ IOException ioException = new IOException(MessageFormat.format(JGitText.get().notARef,
+ name, content));
+ ioException.initCause(notRef);
+ throw ioException;
}
return new LooseUnpeeled(otherSnapshot, name, id);
}

Back to the top