소스 검색

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>
tags/v2.1.0.201209190230-r
Christian Halstrick 11 년 전
부모
커밋
252727c4fc

+ 13
- 0
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());
}

@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;

+ 17
- 5
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);
}

Loading…
취소
저장