Fix possible InvalidObjectIdException in ObjectDirectory
ObjectDirectory.getShallowCommits should throw an IOException instead of an InvalidArgumentException if invalid SHAs are present in .git/shallow (as this file is usually edited by a human). Change-Id: Ia3a39d38f7aec4282109c7698438f0795fbec905 Signed-off-by: Marc Strapetz <marc.strapetz@syntevo.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
This commit is contained in:
parent
d3148f9410
commit
1c4b3f8c45
|
@ -47,13 +47,18 @@
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.text.MessageFormat;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.internal.JGitText;
|
||||||
import org.eclipse.jgit.junit.RepositoryTestCase;
|
import org.eclipse.jgit.junit.RepositoryTestCase;
|
||||||
import org.eclipse.jgit.lib.ConfigConstants;
|
import org.eclipse.jgit.lib.ConfigConstants;
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
|
@ -61,10 +66,15 @@
|
||||||
import org.eclipse.jgit.revwalk.RevCommit;
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
import org.eclipse.jgit.storage.file.FileBasedConfig;
|
import org.eclipse.jgit.storage.file.FileBasedConfig;
|
||||||
import org.junit.Assume;
|
import org.junit.Assume;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
public class ObjectDirectoryTest extends RepositoryTestCase {
|
public class ObjectDirectoryTest extends RepositoryTestCase {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public ExpectedException expectedEx = ExpectedException.none();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory()
|
public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
@ -171,6 +181,40 @@ public boolean accept(File dir, String name) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShallowFile()
|
||||||
|
throws Exception {
|
||||||
|
FileRepository repository = createBareRepository();
|
||||||
|
ObjectDirectory dir = repository.getObjectDatabase();
|
||||||
|
|
||||||
|
String commit = "d3148f9410b071edd4a4c85d2a43d1fa2574b0d2";
|
||||||
|
try (PrintWriter writer = new PrintWriter(
|
||||||
|
new File(repository.getDirectory(), Constants.SHALLOW))) {
|
||||||
|
writer.println(commit);
|
||||||
|
}
|
||||||
|
Set<ObjectId> shallowCommits = dir.getShallowCommits();
|
||||||
|
assertTrue(shallowCommits.remove(ObjectId.fromString(commit)));
|
||||||
|
assertTrue(shallowCommits.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShallowFileCorrupt()
|
||||||
|
throws Exception {
|
||||||
|
FileRepository repository = createBareRepository();
|
||||||
|
ObjectDirectory dir = repository.getObjectDatabase();
|
||||||
|
|
||||||
|
String commit = "X3148f9410b071edd4a4c85d2a43d1fa2574b0d2";
|
||||||
|
try (PrintWriter writer = new PrintWriter(
|
||||||
|
new File(repository.getDirectory(), Constants.SHALLOW))) {
|
||||||
|
writer.println(commit);
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedEx.expect(IOException.class);
|
||||||
|
expectedEx.expectMessage(MessageFormat
|
||||||
|
.format(JGitText.get().badShallowLine, commit));
|
||||||
|
dir.getShallowCommits();
|
||||||
|
}
|
||||||
|
|
||||||
private Collection<Callable<ObjectId>> blobInsertersForTheSameFanOutDir(
|
private Collection<Callable<ObjectId>> blobInsertersForTheSameFanOutDir(
|
||||||
final ObjectDirectory dir) {
|
final ObjectDirectory dir) {
|
||||||
Callable<ObjectId> callable = new Callable<ObjectId>() {
|
Callable<ObjectId> callable = new Callable<ObjectId>() {
|
||||||
|
|
|
@ -31,6 +31,7 @@ badGroupHeader=Bad group header
|
||||||
badObjectType=Bad object type: {0}
|
badObjectType=Bad object type: {0}
|
||||||
badRef=Bad ref: {0}: {1}
|
badRef=Bad ref: {0}: {1}
|
||||||
badSectionEntry=Bad section entry: {0}
|
badSectionEntry=Bad section entry: {0}
|
||||||
|
badShallowLine=Bad shallow line: {0}
|
||||||
bareRepositoryNoWorkdirAndIndex=Bare Repository has neither a working tree, nor an index
|
bareRepositoryNoWorkdirAndIndex=Bare Repository has neither a working tree, nor an index
|
||||||
base64InputNotProperlyPadded=Base64 input not properly padded.
|
base64InputNotProperlyPadded=Base64 input not properly padded.
|
||||||
baseLengthIncorrect=base length incorrect
|
baseLengthIncorrect=base length incorrect
|
||||||
|
|
|
@ -90,6 +90,7 @@ public static JGitText get() {
|
||||||
/***/ public String badObjectType;
|
/***/ public String badObjectType;
|
||||||
/***/ public String badRef;
|
/***/ public String badRef;
|
||||||
/***/ public String badSectionEntry;
|
/***/ public String badSectionEntry;
|
||||||
|
/***/ public String badShallowLine;
|
||||||
/***/ public String bareRepositoryNoWorkdirAndIndex;
|
/***/ public String bareRepositoryNoWorkdirAndIndex;
|
||||||
/***/ public String base64InputNotProperlyPadded;
|
/***/ public String base64InputNotProperlyPadded;
|
||||||
/***/ public String baseLengthIncorrect;
|
/***/ public String baseLengthIncorrect;
|
||||||
|
|
|
@ -690,8 +690,14 @@ Set<ObjectId> getShallowCommits() throws IOException {
|
||||||
final BufferedReader reader = open(shallowFile);
|
final BufferedReader reader = open(shallowFile);
|
||||||
try {
|
try {
|
||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null)
|
while ((line = reader.readLine()) != null) {
|
||||||
shallowCommitsIds.add(ObjectId.fromString(line));
|
try {
|
||||||
|
shallowCommitsIds.add(ObjectId.fromString(line));
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
throw new IOException(MessageFormat
|
||||||
|
.format(JGitText.get().badShallowLine, line));
|
||||||
|
}
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
reader.close();
|
reader.close();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue