diff options
-rw-r--r-- | builtin/config.c | 7 | ||||
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | config.c | 17 | ||||
-rwxr-xr-x | t/t1300-repo-config.sh | 7 |
4 files changed, 29 insertions, 3 deletions
diff --git a/builtin/config.c b/builtin/config.c index 4010c4320a..8b182d2a9f 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -128,7 +128,8 @@ static int collect_config(const char *key_, const char *value_, void *cb) must_print_delim = 1; } if (types == TYPE_INT) - sprintf(value, "%d", git_config_int(key_, value_?value_:"")); + sprintf(value, "%"PRId64, + git_config_int64(key_, value_ ? value_ : "")); else if (types == TYPE_BOOL) vptr = git_config_bool(key_, value_) ? "true" : "false"; else if (types == TYPE_BOOL_OR_INT) { @@ -265,8 +266,8 @@ static char *normalize_value(const char *key, const char *value) else { normalized = xmalloc(64); if (types == TYPE_INT) { - int v = git_config_int(key, value); - sprintf(normalized, "%d", v); + int64_t v = git_config_int64(key, value); + sprintf(normalized, "%"PRId64, v); } else if (types == TYPE_BOOL) sprintf(normalized, "%s", @@ -1190,6 +1190,7 @@ extern int git_config_with_options(config_fn_t fn, void *, extern int git_config_early(config_fn_t fn, void *, const char *repo_config); extern int git_parse_ulong(const char *, unsigned long *); extern int git_config_int(const char *, const char *); +extern int64_t git_config_int64(const char *, const char *); extern unsigned long git_config_ulong(const char *, const char *); extern int git_config_bool_or_int(const char *, const char *, int *); extern int git_config_bool(const char *, const char *); @@ -534,6 +534,15 @@ static int git_parse_int(const char *value, int *ret) return 1; } +static int git_parse_int64(const char *value, int64_t *ret) +{ + intmax_t tmp; + if (!git_parse_signed(value, &tmp, maximum_signed_value_of_type(int64_t))) + return 0; + *ret = tmp; + return 1; +} + int git_parse_ulong(const char *value, unsigned long *ret) { uintmax_t tmp; @@ -565,6 +574,14 @@ int git_config_int(const char *name, const char *value) return ret; } +int64_t git_config_int64(const char *name, const char *value) +{ + int64_t ret; + if (!git_parse_int64(value, &ret)) + die_bad_number(name, value); + return ret; +} + unsigned long git_config_ulong(const char *name, const char *value) { unsigned long ret; diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh index 20aee6e171..b66c632621 100755 --- a/t/t1300-repo-config.sh +++ b/t/t1300-repo-config.sh @@ -652,6 +652,13 @@ test_expect_success numbers ' test_cmp expect actual ' +test_expect_success '--int is at least 64 bits' ' + git config giga.watts 121g && + echo 129922760704 >expect && + git config --int --get giga.watts >actual && + test_cmp expect actual +' + test_expect_success 'invalid unit' ' git config aninvalid.unit "1auto" && echo 1auto >expect && |