From 12aeec83c82641cdd4525721f5c065a7b0101dce Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 12 Jun 2009 16:23:05 -0700 Subject: [PATCH] Add getLong to RepositoryConfig This supports parsing 64 bit configuration values. We want to use it for values like core.packedGitLimit where a 64 bit JVM may want to support a very large value, well past the 2 GiB barrier. Signed-off-by: Shawn O. Pearce Signed-off-by: Robin Rosenberg --- .../org/spearce/jgit/lib/RepositoryConfigTest.java | 26 ++++++++++++++++++++++ .../src/org/spearce/jgit/lib/RepositoryConfig.java | 26 ++++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java index ed573e13..5e2328b4 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java @@ -233,6 +233,32 @@ public class RepositoryConfigTest extends RepositoryTestCase { assertFalse(c.getBoolean("s", "b", true)); } + public void testReadLong() throws IOException { + assertReadLong(1L); + assertReadLong(-1L); + assertReadLong(Long.MIN_VALUE); + assertReadLong(Long.MAX_VALUE); + assertReadLong(4L * 1024 * 1024 * 1024, "4g"); + assertReadLong(3L * 1024 * 1024, "3 m"); + assertReadLong(8L * 1024, "8 k"); + + try { + assertReadLong(-1, "1.5g"); + fail("incorrectly accepted 1.5g"); + } catch (IllegalArgumentException e) { + assertEquals("Invalid integer value: s.a=1.5g", e.getMessage()); + } + } + + private void assertReadLong(long exp) throws IOException { + assertReadLong(exp, String.valueOf(exp)); + } + + private void assertReadLong(long exp, String act) throws IOException { + final RepositoryConfig c = read("[s]\na = " + act + "\n"); + assertEquals(exp, c.getLong("s", null, "a", 0L)); + } + private RepositoryConfig read(final String content) throws IOException { final File p = writeTrashFile(getName() + ".config", content); final RepositoryConfig c = new RepositoryConfig(null, p); diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java index b8166048..a3395148 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java @@ -183,6 +183,28 @@ public class RepositoryConfig { */ public int getInt(final String section, String subsection, final String name, final int defaultValue) { + final long val = getLong(section, subsection, name, defaultValue); + if (Integer.MIN_VALUE <= val && val <= Integer.MAX_VALUE) + return (int) val; + throw new IllegalArgumentException("Integer value " + section + "." + + name + " out of range"); + } + + /** + * Obtain an integer value from the configuration. + * + * @param section + * section the key is grouped within. + * @param subsection + * subsection name, such a remote or branch name. + * @param name + * name of the key to get. + * @param defaultValue + * default value to return if no value was present. + * @return an integer value from the configuration, or defaultValue. + */ + public long getLong(final String section, String subsection, + final String name, final long defaultValue) { final String str = getString(section, subsection, name); if (str == null) return defaultValue; @@ -191,7 +213,7 @@ public class RepositoryConfig { if (n.length() == 0) return defaultValue; - int mul = 1; + long mul = 1; switch (Character.toLowerCase(n.charAt(n.length() - 1))) { case 'g': mul = 1024 * 1024 * 1024; @@ -209,7 +231,7 @@ public class RepositoryConfig { return defaultValue; try { - return mul * Integer.parseInt(n); + return mul * Long.parseLong(n); } catch (NumberFormatException nfe) { throw new IllegalArgumentException("Invalid integer value: " + section + "." + name + "=" + str); -- 2.11.4.GIT