Browse Source

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>
stable-2.1
Christian Halstrick 12 years ago committed by Stefan Lay
parent
commit
252727c4fc
  1. 13
      org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java
  2. 22
      org.eclipse.jgit/src/org/eclipse/jgit/storage/file/RefDirectory.java

13
org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefDirectoryTest.java

@ -359,6 +359,19 @@ public class RefDirectoryTest extends LocalDiskRepositoryTestCase {
assertTrue("empty objects/", refdir.getRefs("objects/").isEmpty()); assertTrue("empty objects/", refdir.getRefs("objects/").isEmpty());
} }
@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 @Test
public void testGetRefs_HeadsOnly_AllLoose() throws IOException { public void testGetRefs_HeadsOnly_AllLoose() throws IOException {
Map<String, Ref> heads; Map<String, Ref> heads;

22
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.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jgit.errors.InvalidObjectIdException;
import org.eclipse.jgit.errors.LockFailedException; import org.eclipse.jgit.errors.LockFailedException;
import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.ObjectWritingException; import org.eclipse.jgit.errors.ObjectWritingException;
@ -260,10 +261,17 @@ public class RefDirectory extends RefDatabase {
final RefList<Ref> packed = getPackedRefs(); final RefList<Ref> packed = getPackedRefs();
Ref ref = null; Ref ref = null;
for (String prefix : SEARCH_PATH) { for (String prefix : SEARCH_PATH) {
ref = readRef(prefix + needle, packed); try {
if (ref != null) { ref = readRef(prefix + needle, packed);
ref = resolve(ref, 0, null, null, packed); if (ref != null) {
break; ref = resolve(ref, 0, null, null, packed);
break;
}
} catch (IOException e) {
if (!(!needle.contains("/") && "".equals(prefix) && e
.getCause() instanceof InvalidObjectIdException)) {
throw e;
}
} }
} }
fireRefsChanged(); fireRefsChanged();
@ -937,7 +945,11 @@ public class RefDirectory extends RefDatabase {
while (0 < n && Character.isWhitespace(buf[n - 1])) while (0 < n && Character.isWhitespace(buf[n - 1]))
n--; n--;
String content = RawParseUtils.decode(buf, 0, 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); return new LooseUnpeeled(otherSnapshot, name, id);
} }

Loading…
Cancel
Save