Commit 80a665aa by Carlos Martín Nieto

config: really delete variables

Instead of just setting the value to NULL, which gives unwanted
results when asking for that variable after deleting it, delete the
variable from the list and re-write the file.
parent 7b2b4adf
...@@ -30,6 +30,7 @@ struct git_config_file { ...@@ -30,6 +30,7 @@ struct git_config_file {
int (*open)(struct git_config_file *); int (*open)(struct git_config_file *);
int (*get)(struct git_config_file *, const char *key, const char **value); int (*get)(struct git_config_file *, const char *key, const char **value);
int (*set)(struct git_config_file *, const char *key, const char *value); int (*set)(struct git_config_file *, const char *key, const char *value);
int (*delete)(struct git_config_file *, const char *key);
int (*foreach)(struct git_config_file *, int (*fn)(const char *, const char *, void *), void *data); int (*foreach)(struct git_config_file *, int (*fn)(const char *, const char *, void *), void *data);
void (*free)(struct git_config_file *); void (*free)(struct git_config_file *);
}; };
......
...@@ -162,7 +162,16 @@ int git_config_foreach(git_config *cfg, int (*fn)(const char *, const char *, vo ...@@ -162,7 +162,16 @@ int git_config_foreach(git_config *cfg, int (*fn)(const char *, const char *, vo
int git_config_delete(git_config *cfg, const char *name) int git_config_delete(git_config *cfg, const char *name)
{ {
return git_config_set_string(cfg, name, NULL); file_internal *internal;
git_config_file *file;
if (cfg->files.length == 0)
return git__throw(GIT_EINVALIDARGS, "Cannot delete variable; no files open in the `git_config` instance");
internal = git_vector_get(&cfg->files, 0);
file = internal->file;
return file->delete(file, name);
} }
/************** /**************
......
...@@ -404,6 +404,32 @@ static int config_get(git_config_file *cfg, const char *name, const char **out) ...@@ -404,6 +404,32 @@ static int config_get(git_config_file *cfg, const char *name, const char **out)
return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to get config value for %s", name); return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to get config value for %s", name);
} }
static int config_delete(git_config_file *cfg, const char *name)
{
cvar_t *iter, *prev;
diskfile_backend *b = (diskfile_backend *)cfg;
CVAR_LIST_FOREACH (&b->var_list, iter) {
/* This is a bit hacky because we use a singly-linked list */
if (cvar_match_name(iter, name)) {
if (CVAR_LIST_HEAD(&b->var_list) == iter)
CVAR_LIST_HEAD(&b->var_list) = CVAR_LIST_NEXT(iter);
else
CVAR_LIST_REMOVE_AFTER(prev);
git__free(iter->value);
iter->value = NULL;
config_write(b, iter);
cvar_free(iter);
return GIT_SUCCESS;
}
/* Store it for the next round */
prev = iter;
}
return git__throw(GIT_ENOTFOUND, "Variable '%s' not found", name);
}
int git_config_file__ondisk(git_config_file **out, const char *path) int git_config_file__ondisk(git_config_file **out, const char *path)
{ {
diskfile_backend *backend; diskfile_backend *backend;
...@@ -423,6 +449,7 @@ int git_config_file__ondisk(git_config_file **out, const char *path) ...@@ -423,6 +449,7 @@ int git_config_file__ondisk(git_config_file **out, const char *path)
backend->parent.open = config_open; backend->parent.open = config_open;
backend->parent.get = config_get; backend->parent.get = config_get;
backend->parent.set = config_set; backend->parent.set = config_set;
backend->parent.delete = config_delete;
backend->parent.foreach = file_foreach; backend->parent.foreach = file_foreach;
backend->parent.free = backend_free; backend->parent.free = backend_free;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment