Compare repository format version as parsed long

This allows repositoryies with a missing repositoryformatversion
config value to be successfully opened but still throws exceptions
when the value is a non-long or greater than zero.

git-core attempts to parse this config value as a long as well
and defaults to 0 if the value is missing.

Bug: 368697
Change-Id: I4a93117afca37e591e8e0ab4d2f2eef4273f0cc9
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
This commit is contained in:
Kevin Sawicki 2012-03-12 10:00:52 -07:00 committed by Chris Aniszczyk
parent fd0c468b7a
commit 7aeea3b27c
3 changed files with 53 additions and 8 deletions

View File

@ -44,10 +44,14 @@
package org.eclipse.jgit.storage.file;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.util.FileUtils;
import org.junit.Test;
@ -61,4 +65,47 @@ public void testShouldAutomagicallyDetectGitDirectory() throws Exception {
assertEquals(r.getDirectory(), new FileRepositoryBuilder()
.findGitDir(d).getGitDir());
}
@Test
public void emptyRepositoryFormatVersion() throws Exception {
FileRepository r = createWorkRepository();
FileBasedConfig config = r.getConfig();
config.setString(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION, "");
config.save();
new FileRepository(r.getDirectory());
}
@Test
public void invalidRepositoryFormatVersion() throws Exception {
FileRepository r = createWorkRepository();
FileBasedConfig config = r.getConfig();
config.setString(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION, "notanumber");
config.save();
try {
new FileRepository(r.getDirectory());
fail("IllegalArgumentException not thrown");
} catch (IllegalArgumentException e) {
assertNotNull(e.getMessage());
}
}
@Test
public void unknownRepositoryFormatVersion() throws Exception {
FileRepository r = createWorkRepository();
FileBasedConfig config = r.getConfig();
config.setLong(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION, 1);
config.save();
try {
new FileRepository(r.getDirectory());
fail("IOException not thrown");
} catch (IOException e) {
assertNotNull(e.getMessage());
}
}
}

View File

@ -370,9 +370,8 @@ public void test008_FailOnWrongVersion() throws IOException {
try {
new FileRepository(db.getDirectory());
fail("incorrectly opened a bad repository");
} catch (IOException ioe) {
assertTrue(ioe.getMessage().indexOf("format") > 0);
assertTrue(ioe.getMessage().indexOf(badvers) > 0);
} catch (IllegalArgumentException ioe) {
assertNotNull(ioe.getMessage());
}
}

View File

@ -181,14 +181,13 @@ public void onConfigChanged(ConfigChangedEvent event) {
getFS());
if (objectDatabase.exists()) {
final String repositoryFormatVersion = getConfig().getString(
final long repositoryFormatVersion = getConfig().getLong(
ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION);
if (!"0".equals(repositoryFormatVersion)) {
ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION, 0);
if (repositoryFormatVersion > 0)
throw new IOException(MessageFormat.format(
JGitText.get().unknownRepositoryFormat2,
repositoryFormatVersion));
}
Long.valueOf(repositoryFormatVersion)));
}
if (!isBare())