Merge branch 'ta/config-set-1'
Use the new caching config-set API in git_config() calls. * ta/config-set-1: add tests for `git_config_get_string_const()` add a test for semantic errors in config files rewrite git_config() to use the config-set API config: add `git_die_config()` to the config-set API change `git_config()` return value to void add line number and file name info to `config_set` config.c: fix accuracy of line number in errors config.c: mark error and warnings strings for translation
This commit is contained in:
commit
7f346e9d73
@ -155,6 +155,19 @@ as well as retrieval for the queried variable, including:
|
|||||||
Similar to `git_config_get_string`, but expands `~` or `~user` into
|
Similar to `git_config_get_string`, but expands `~` or `~user` into
|
||||||
the user's home directory when found at the beginning of the path.
|
the user's home directory when found at the beginning of the path.
|
||||||
|
|
||||||
|
`git_die_config(const char *key, const char *err, ...)`::
|
||||||
|
|
||||||
|
First prints the error message specified by the caller in `err` and then
|
||||||
|
dies printing the line number and the file name of the highest priority
|
||||||
|
value for the configuration variable `key`.
|
||||||
|
|
||||||
|
`void git_die_config_linenr(const char *key, const char *filename, int linenr)`::
|
||||||
|
|
||||||
|
Helper function which formats the die error message according to the
|
||||||
|
parameters entered. Used by `git_die_config()`. It can be used by callers
|
||||||
|
handling `git_config_get_value_multi()` to print the correct error message
|
||||||
|
for the desired value.
|
||||||
|
|
||||||
See test-config.c for usage examples.
|
See test-config.c for usage examples.
|
||||||
|
|
||||||
Value Parsing Helpers
|
Value Parsing Helpers
|
||||||
|
5
branch.c
5
branch.c
@ -161,10 +161,7 @@ int read_branch_desc(struct strbuf *buf, const char *branch_name)
|
|||||||
strbuf_addf(&name, "branch.%s.description", branch_name);
|
strbuf_addf(&name, "branch.%s.description", branch_name);
|
||||||
cb.config_name = name.buf;
|
cb.config_name = name.buf;
|
||||||
cb.value = NULL;
|
cb.value = NULL;
|
||||||
if (git_config(read_branch_desc_cb, &cb) < 0) {
|
git_config(read_branch_desc_cb, &cb);
|
||||||
strbuf_release(&name);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (cb.value)
|
if (cb.value)
|
||||||
strbuf_addstr(buf, cb.value);
|
strbuf_addstr(buf, cb.value);
|
||||||
strbuf_release(&name);
|
strbuf_release(&name);
|
||||||
|
34
cache.h
34
cache.h
@ -8,6 +8,7 @@
|
|||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
#include "string-list.h"
|
||||||
|
|
||||||
#include SHA1_HEADER
|
#include SHA1_HEADER
|
||||||
#ifndef git_SHA_CTX
|
#ifndef git_SHA_CTX
|
||||||
@ -1296,7 +1297,7 @@ extern int git_config_from_buf(config_fn_t fn, const char *name,
|
|||||||
const char *buf, size_t len, void *data);
|
const char *buf, size_t len, void *data);
|
||||||
extern void git_config_push_parameter(const char *text);
|
extern void git_config_push_parameter(const char *text);
|
||||||
extern int git_config_from_parameters(config_fn_t fn, void *data);
|
extern int git_config_from_parameters(config_fn_t fn, void *data);
|
||||||
extern int git_config(config_fn_t fn, void *);
|
extern void git_config(config_fn_t fn, void *);
|
||||||
extern int git_config_with_options(config_fn_t fn, void *,
|
extern int git_config_with_options(config_fn_t fn, void *,
|
||||||
struct git_config_source *config_source,
|
struct git_config_source *config_source,
|
||||||
int respect_includes);
|
int respect_includes);
|
||||||
@ -1353,9 +1354,32 @@ extern int parse_config_key(const char *var,
|
|||||||
const char **subsection, int *subsection_len,
|
const char **subsection, int *subsection_len,
|
||||||
const char **key);
|
const char **key);
|
||||||
|
|
||||||
|
struct config_set_element {
|
||||||
|
struct hashmap_entry ent;
|
||||||
|
char *key;
|
||||||
|
struct string_list value_list;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct configset_list_item {
|
||||||
|
struct config_set_element *e;
|
||||||
|
int value_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the contents of the list are ordered according to their
|
||||||
|
* position in the config files and order of parsing the files.
|
||||||
|
* (i.e. key-value pair at the last position of .git/config will
|
||||||
|
* be at the last item of the list)
|
||||||
|
*/
|
||||||
|
struct configset_list {
|
||||||
|
struct configset_list_item *items;
|
||||||
|
unsigned int nr, alloc;
|
||||||
|
};
|
||||||
|
|
||||||
struct config_set {
|
struct config_set {
|
||||||
struct hashmap config_hash;
|
struct hashmap config_hash;
|
||||||
int hash_initialized;
|
int hash_initialized;
|
||||||
|
struct configset_list list;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void git_configset_init(struct config_set *cs);
|
extern void git_configset_init(struct config_set *cs);
|
||||||
@ -1385,6 +1409,14 @@ extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest);
|
|||||||
extern int git_config_get_maybe_bool(const char *key, int *dest);
|
extern int git_config_get_maybe_bool(const char *key, int *dest);
|
||||||
extern int git_config_get_pathname(const char *key, const char **dest);
|
extern int git_config_get_pathname(const char *key, const char **dest);
|
||||||
|
|
||||||
|
struct key_value_info {
|
||||||
|
const char *filename;
|
||||||
|
int linenr;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern NORETURN void git_die_config(const char *key, const char *err, ...) __attribute__((format(printf, 2, 3)));
|
||||||
|
extern NORETURN void git_die_config_linenr(const char *key, const char *filename, int linenr);
|
||||||
|
|
||||||
extern int committer_ident_sufficiently_given(void);
|
extern int committer_ident_sufficiently_given(void);
|
||||||
extern int author_ident_sufficiently_given(void);
|
extern int author_ident_sufficiently_given(void);
|
||||||
|
|
||||||
|
152
config.c
152
config.c
@ -35,12 +35,6 @@ struct config_source {
|
|||||||
long (*do_ftell)(struct config_source *c);
|
long (*do_ftell)(struct config_source *c);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct config_set_element {
|
|
||||||
struct hashmap_entry ent;
|
|
||||||
char *key;
|
|
||||||
struct string_list value_list;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct config_source *cf;
|
static struct config_source *cf;
|
||||||
|
|
||||||
static int zlib_compression_seen;
|
static int zlib_compression_seen;
|
||||||
@ -252,6 +246,7 @@ static int get_next_char(void)
|
|||||||
cf->linenr++;
|
cf->linenr++;
|
||||||
if (c == EOF) {
|
if (c == EOF) {
|
||||||
cf->eof = 1;
|
cf->eof = 1;
|
||||||
|
cf->linenr++;
|
||||||
c = '\n';
|
c = '\n';
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
@ -327,6 +322,7 @@ static int get_value(config_fn_t fn, void *data, struct strbuf *name)
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
char *value;
|
char *value;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Get the full name */
|
/* Get the full name */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -349,7 +345,15 @@ static int get_value(config_fn_t fn, void *data, struct strbuf *name)
|
|||||||
if (!value)
|
if (!value)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return fn(name->buf, value, data);
|
/*
|
||||||
|
* We already consumed the \n, but we need linenr to point to
|
||||||
|
* the line we just parsed during the call to fn to get
|
||||||
|
* accurate line number in error messages.
|
||||||
|
*/
|
||||||
|
cf->linenr--;
|
||||||
|
ret = fn(name->buf, value, data);
|
||||||
|
cf->linenr++;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_extended_base_var(struct strbuf *name, int c)
|
static int get_extended_base_var(struct strbuf *name, int c)
|
||||||
@ -465,9 +469,9 @@ static int git_parse_source(config_fn_t fn, void *data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cf->die_on_error)
|
if (cf->die_on_error)
|
||||||
die("bad config file line %d in %s", cf->linenr, cf->name);
|
die(_("bad config file line %d in %s"), cf->linenr, cf->name);
|
||||||
else
|
else
|
||||||
return error("bad config file line %d in %s", cf->linenr, cf->name);
|
return error(_("bad config file line %d in %s"), cf->linenr, cf->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_unit_factor(const char *end, uintmax_t *val)
|
static int parse_unit_factor(const char *end, uintmax_t *val)
|
||||||
@ -583,9 +587,9 @@ static void die_bad_number(const char *name, const char *value)
|
|||||||
value = "";
|
value = "";
|
||||||
|
|
||||||
if (cf && cf->name)
|
if (cf && cf->name)
|
||||||
die("bad numeric config value '%s' for '%s' in %s: %s",
|
die(_("bad numeric config value '%s' for '%s' in %s: %s"),
|
||||||
value, name, cf->name, reason);
|
value, name, cf->name, reason);
|
||||||
die("bad numeric config value '%s' for '%s': %s", value, name, reason);
|
die(_("bad numeric config value '%s' for '%s': %s"), value, name, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_config_int(const char *name, const char *value)
|
int git_config_int(const char *name, const char *value)
|
||||||
@ -670,7 +674,7 @@ int git_config_pathname(const char **dest, const char *var, const char *value)
|
|||||||
return config_error_nonbool(var);
|
return config_error_nonbool(var);
|
||||||
*dest = expand_user_path(value);
|
*dest = expand_user_path(value);
|
||||||
if (!*dest)
|
if (!*dest)
|
||||||
die("Failed to expand user dir in: '%s'", value);
|
die(_("failed to expand user dir in: '%s'"), value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -748,7 +752,7 @@ static int git_default_core_config(const char *var, const char *value)
|
|||||||
if (level == -1)
|
if (level == -1)
|
||||||
level = Z_DEFAULT_COMPRESSION;
|
level = Z_DEFAULT_COMPRESSION;
|
||||||
else if (level < 0 || level > Z_BEST_COMPRESSION)
|
else if (level < 0 || level > Z_BEST_COMPRESSION)
|
||||||
die("bad zlib compression level %d", level);
|
die(_("bad zlib compression level %d"), level);
|
||||||
zlib_compression_level = level;
|
zlib_compression_level = level;
|
||||||
zlib_compression_seen = 1;
|
zlib_compression_seen = 1;
|
||||||
return 0;
|
return 0;
|
||||||
@ -759,7 +763,7 @@ static int git_default_core_config(const char *var, const char *value)
|
|||||||
if (level == -1)
|
if (level == -1)
|
||||||
level = Z_DEFAULT_COMPRESSION;
|
level = Z_DEFAULT_COMPRESSION;
|
||||||
else if (level < 0 || level > Z_BEST_COMPRESSION)
|
else if (level < 0 || level > Z_BEST_COMPRESSION)
|
||||||
die("bad zlib compression level %d", level);
|
die(_("bad zlib compression level %d"), level);
|
||||||
core_compression_level = level;
|
core_compression_level = level;
|
||||||
core_compression_seen = 1;
|
core_compression_seen = 1;
|
||||||
if (!zlib_compression_seen)
|
if (!zlib_compression_seen)
|
||||||
@ -881,7 +885,7 @@ static int git_default_core_config(const char *var, const char *value)
|
|||||||
else if (!strcmp(value, "link"))
|
else if (!strcmp(value, "link"))
|
||||||
object_creation_mode = OBJECT_CREATION_USES_HARDLINKS;
|
object_creation_mode = OBJECT_CREATION_USES_HARDLINKS;
|
||||||
else
|
else
|
||||||
die("Invalid mode for object creation: %s", value);
|
die(_("invalid mode for object creation: %s"), value);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1181,7 +1185,7 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
|
|||||||
|
|
||||||
switch (git_config_from_parameters(fn, data)) {
|
switch (git_config_from_parameters(fn, data)) {
|
||||||
case -1: /* error */
|
case -1: /* error */
|
||||||
die("unable to parse command-line config");
|
die(_("unable to parse command-line config"));
|
||||||
break;
|
break;
|
||||||
case 0: /* found nothing */
|
case 0: /* found nothing */
|
||||||
break;
|
break;
|
||||||
@ -1228,9 +1232,48 @@ int git_config_with_options(config_fn_t fn, void *data,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_config(config_fn_t fn, void *data)
|
static void git_config_raw(config_fn_t fn, void *data)
|
||||||
{
|
{
|
||||||
return git_config_with_options(fn, data, NULL, 1);
|
if (git_config_with_options(fn, data, NULL, 1) < 0)
|
||||||
|
/*
|
||||||
|
* git_config_with_options() normally returns only
|
||||||
|
* positive values, as most errors are fatal, and
|
||||||
|
* non-fatal potential errors are guarded by "if"
|
||||||
|
* statements that are entered only when no error is
|
||||||
|
* possible.
|
||||||
|
*
|
||||||
|
* If we ever encounter a non-fatal error, it means
|
||||||
|
* something went really wrong and we should stop
|
||||||
|
* immediately.
|
||||||
|
*/
|
||||||
|
die(_("unknown error occured while reading the configuration files"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
|
||||||
|
{
|
||||||
|
int i, value_index;
|
||||||
|
struct string_list *values;
|
||||||
|
struct config_set_element *entry;
|
||||||
|
struct configset_list *list = &cs->list;
|
||||||
|
struct key_value_info *kv_info;
|
||||||
|
|
||||||
|
for (i = 0; i < list->nr; i++) {
|
||||||
|
entry = list->items[i].e;
|
||||||
|
value_index = list->items[i].value_index;
|
||||||
|
values = &entry->value_list;
|
||||||
|
if (fn(entry->key, values->items[value_index].string, data) < 0) {
|
||||||
|
kv_info = values->items[value_index].util;
|
||||||
|
git_die_config_linenr(entry->key, kv_info->filename, kv_info->linenr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void git_config_check_init(void);
|
||||||
|
|
||||||
|
void git_config(config_fn_t fn, void *data)
|
||||||
|
{
|
||||||
|
git_config_check_init();
|
||||||
|
configset_iter(&the_config_set, fn, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct config_set_element *configset_find_element(struct config_set *cs, const char *key)
|
static struct config_set_element *configset_find_element(struct config_set *cs, const char *key)
|
||||||
@ -1258,6 +1301,10 @@ static struct config_set_element *configset_find_element(struct config_set *cs,
|
|||||||
static int configset_add_value(struct config_set *cs, const char *key, const char *value)
|
static int configset_add_value(struct config_set *cs, const char *key, const char *value)
|
||||||
{
|
{
|
||||||
struct config_set_element *e;
|
struct config_set_element *e;
|
||||||
|
struct string_list_item *si;
|
||||||
|
struct configset_list_item *l_item;
|
||||||
|
struct key_value_info *kv_info = xmalloc(sizeof(*kv_info));
|
||||||
|
|
||||||
e = configset_find_element(cs, key);
|
e = configset_find_element(cs, key);
|
||||||
/*
|
/*
|
||||||
* Since the keys are being fed by git_config*() callback mechanism, they
|
* Since the keys are being fed by git_config*() callback mechanism, they
|
||||||
@ -1270,7 +1317,22 @@ static int configset_add_value(struct config_set *cs, const char *key, const cha
|
|||||||
string_list_init(&e->value_list, 1);
|
string_list_init(&e->value_list, 1);
|
||||||
hashmap_add(&cs->config_hash, e);
|
hashmap_add(&cs->config_hash, e);
|
||||||
}
|
}
|
||||||
string_list_append_nodup(&e->value_list, value ? xstrdup(value) : NULL);
|
si = string_list_append_nodup(&e->value_list, value ? xstrdup(value) : NULL);
|
||||||
|
|
||||||
|
ALLOC_GROW(cs->list.items, cs->list.nr + 1, cs->list.alloc);
|
||||||
|
l_item = &cs->list.items[cs->list.nr++];
|
||||||
|
l_item->e = e;
|
||||||
|
l_item->value_index = e->value_list.nr - 1;
|
||||||
|
|
||||||
|
if (cf) {
|
||||||
|
kv_info->filename = strintern(cf->name);
|
||||||
|
kv_info->linenr = cf->linenr;
|
||||||
|
} else {
|
||||||
|
/* for values read from `git_config_from_parameters()` */
|
||||||
|
kv_info->filename = NULL;
|
||||||
|
kv_info->linenr = -1;
|
||||||
|
}
|
||||||
|
si->util = kv_info;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1285,6 +1347,9 @@ void git_configset_init(struct config_set *cs)
|
|||||||
{
|
{
|
||||||
hashmap_init(&cs->config_hash, (hashmap_cmp_fn)config_set_element_cmp, 0);
|
hashmap_init(&cs->config_hash, (hashmap_cmp_fn)config_set_element_cmp, 0);
|
||||||
cs->hash_initialized = 1;
|
cs->hash_initialized = 1;
|
||||||
|
cs->list.nr = 0;
|
||||||
|
cs->list.alloc = 0;
|
||||||
|
cs->list.items = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void git_configset_clear(struct config_set *cs)
|
void git_configset_clear(struct config_set *cs)
|
||||||
@ -1297,10 +1362,14 @@ void git_configset_clear(struct config_set *cs)
|
|||||||
hashmap_iter_init(&cs->config_hash, &iter);
|
hashmap_iter_init(&cs->config_hash, &iter);
|
||||||
while ((entry = hashmap_iter_next(&iter))) {
|
while ((entry = hashmap_iter_next(&iter))) {
|
||||||
free(entry->key);
|
free(entry->key);
|
||||||
string_list_clear(&entry->value_list, 0);
|
string_list_clear(&entry->value_list, 1);
|
||||||
}
|
}
|
||||||
hashmap_free(&cs->config_hash, 1);
|
hashmap_free(&cs->config_hash, 1);
|
||||||
cs->hash_initialized = 0;
|
cs->hash_initialized = 0;
|
||||||
|
free(cs->list.items);
|
||||||
|
cs->list.nr = 0;
|
||||||
|
cs->list.alloc = 0;
|
||||||
|
cs->list.items = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int config_set_callback(const char *key, const char *value, void *cb)
|
static int config_set_callback(const char *key, const char *value, void *cb)
|
||||||
@ -1419,7 +1488,7 @@ static void git_config_check_init(void)
|
|||||||
if (the_config_set.hash_initialized)
|
if (the_config_set.hash_initialized)
|
||||||
return;
|
return;
|
||||||
git_configset_init(&the_config_set);
|
git_configset_init(&the_config_set);
|
||||||
git_config(config_set_callback, &the_config_set);
|
git_config_raw(config_set_callback, &the_config_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
void git_config_clear(void)
|
void git_config_clear(void)
|
||||||
@ -1443,8 +1512,12 @@ const struct string_list *git_config_get_value_multi(const char *key)
|
|||||||
|
|
||||||
int git_config_get_string_const(const char *key, const char **dest)
|
int git_config_get_string_const(const char *key, const char **dest)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
git_config_check_init();
|
git_config_check_init();
|
||||||
return git_configset_get_string_const(&the_config_set, key, dest);
|
ret = git_configset_get_string_const(&the_config_set, key, dest);
|
||||||
|
if (ret < 0)
|
||||||
|
git_die_config(key, NULL);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_config_get_string(const char *key, char **dest)
|
int git_config_get_string(const char *key, char **dest)
|
||||||
@ -1485,8 +1558,39 @@ int git_config_get_maybe_bool(const char *key, int *dest)
|
|||||||
|
|
||||||
int git_config_get_pathname(const char *key, const char **dest)
|
int git_config_get_pathname(const char *key, const char **dest)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
git_config_check_init();
|
git_config_check_init();
|
||||||
return git_configset_get_pathname(&the_config_set, key, dest);
|
ret = git_configset_get_pathname(&the_config_set, key, dest);
|
||||||
|
if (ret < 0)
|
||||||
|
git_die_config(key, NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
NORETURN
|
||||||
|
void git_die_config_linenr(const char *key, const char *filename, int linenr)
|
||||||
|
{
|
||||||
|
if (!filename)
|
||||||
|
die(_("unable to parse '%s' from command-line config"), key);
|
||||||
|
else
|
||||||
|
die(_("bad config variable '%s' in file '%s' at line %d"),
|
||||||
|
key, filename, linenr);
|
||||||
|
}
|
||||||
|
|
||||||
|
NORETURN __attribute__((format(printf, 2, 3)))
|
||||||
|
void git_die_config(const char *key, const char *err, ...)
|
||||||
|
{
|
||||||
|
const struct string_list *values;
|
||||||
|
struct key_value_info *kv_info;
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
va_list params;
|
||||||
|
va_start(params, err);
|
||||||
|
vreportf("error: ", err, params);
|
||||||
|
va_end(params);
|
||||||
|
}
|
||||||
|
values = git_config_get_value_multi(key);
|
||||||
|
kv_info = values->items[values->nr - 1].util;
|
||||||
|
git_die_config_linenr(key, kv_info->filename, kv_info->linenr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1522,7 +1626,7 @@ static int store_aux(const char *key, const char *value, void *cb)
|
|||||||
case KEY_SEEN:
|
case KEY_SEEN:
|
||||||
if (matches(key, value)) {
|
if (matches(key, value)) {
|
||||||
if (store.seen == 1 && store.multi_replace == 0) {
|
if (store.seen == 1 && store.multi_replace == 0) {
|
||||||
warning("%s has multiple values", key);
|
warning(_("%s has multiple values"), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
ALLOC_GROW(store.offset, store.seen + 1,
|
ALLOC_GROW(store.offset, store.seen + 1,
|
||||||
|
@ -119,6 +119,16 @@ test_expect_success 'find integer value for a key' '
|
|||||||
check_config get_int lamb.chop 65
|
check_config get_int lamb.chop 65
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'find string value for a key' '
|
||||||
|
check_config get_string case.baz hask &&
|
||||||
|
check_config expect_code 1 get_string case.ba "Value not found for \"case.ba\""
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'check line error when NULL string is queried' '
|
||||||
|
test_expect_code 128 test-config get_string case.foo 2>result &&
|
||||||
|
test_i18ngrep "fatal: .*case\.foo.*\.git/config.*line 7" result
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'find integer if value is non parse-able' '
|
test_expect_success 'find integer if value is non parse-able' '
|
||||||
check_config expect_code 128 get_int lamb.head
|
check_config expect_code 128 get_int lamb.head
|
||||||
'
|
'
|
||||||
@ -197,4 +207,15 @@ test_expect_success 'proper error on error in custom config files' '
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'check line errors for malformed values' '
|
||||||
|
mv .git/config .git/config.old &&
|
||||||
|
test_when_finished "mv .git/config.old .git/config" &&
|
||||||
|
cat >.git/config <<-\EOF &&
|
||||||
|
[alias]
|
||||||
|
br
|
||||||
|
EOF
|
||||||
|
test_expect_code 128 git br 2>result &&
|
||||||
|
test_i18ngrep "fatal: .*alias\.br.*\.git/config.*line 2" result
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -79,7 +79,7 @@ test_expect_success 'non-integer config parsing' '
|
|||||||
test_expect_success 'negative integer config parsing' '
|
test_expect_success 'negative integer config parsing' '
|
||||||
git config diff.context -1 &&
|
git config diff.context -1 &&
|
||||||
test_must_fail git diff 2>output &&
|
test_must_fail git diff 2>output &&
|
||||||
test_i18ngrep "bad config file" output
|
test_i18ngrep "bad config variable" output
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '-U0 is valid, so is diff.context=0' '
|
test_expect_success '-U0 is valid, so is diff.context=0' '
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
*
|
*
|
||||||
* get_bool -> print bool value for the entered key or die
|
* get_bool -> print bool value for the entered key or die
|
||||||
*
|
*
|
||||||
|
* get_string -> print string value for the entered key or die
|
||||||
|
*
|
||||||
* configset_get_value -> returns value with the highest priority for the entered key
|
* configset_get_value -> returns value with the highest priority for the entered key
|
||||||
* from a config_set constructed from files entered as arguments.
|
* from a config_set constructed from files entered as arguments.
|
||||||
*
|
*
|
||||||
@ -84,6 +86,14 @@ int main(int argc, char **argv)
|
|||||||
printf("Value not found for \"%s\"\n", argv[2]);
|
printf("Value not found for \"%s\"\n", argv[2]);
|
||||||
goto exit1;
|
goto exit1;
|
||||||
}
|
}
|
||||||
|
} else if (argc == 3 && !strcmp(argv[1], "get_string")) {
|
||||||
|
if (!git_config_get_string_const(argv[2], &v)) {
|
||||||
|
printf("%s\n", v);
|
||||||
|
goto exit0;
|
||||||
|
} else {
|
||||||
|
printf("Value not found for \"%s\"\n", argv[2]);
|
||||||
|
goto exit1;
|
||||||
|
}
|
||||||
} else if (!strcmp(argv[1], "configset_get_value")) {
|
} else if (!strcmp(argv[1], "configset_get_value")) {
|
||||||
for (i = 3; i < argc; i++) {
|
for (i = 3; i < argc; i++) {
|
||||||
int err;
|
int err;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user