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; package org.eclipse.jgit.storage.file;
import static org.junit.Assert.assertEquals; 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.File;
import java.io.IOException;
import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.FileUtils;
import org.junit.Test; import org.junit.Test;
@ -61,4 +65,47 @@ public void testShouldAutomagicallyDetectGitDirectory() throws Exception {
assertEquals(r.getDirectory(), new FileRepositoryBuilder() assertEquals(r.getDirectory(), new FileRepositoryBuilder()
.findGitDir(d).getGitDir()); .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 { try {
new FileRepository(db.getDirectory()); new FileRepository(db.getDirectory());
fail("incorrectly opened a bad repository"); fail("incorrectly opened a bad repository");
} catch (IOException ioe) { } catch (IllegalArgumentException ioe) {
assertTrue(ioe.getMessage().indexOf("format") > 0); assertNotNull(ioe.getMessage());
assertTrue(ioe.getMessage().indexOf(badvers) > 0);
} }
} }

View File

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