mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 12:14:16 +00:00
Merge pull request #513 from carlosmn/development
Really delete variables
This commit is contained in:
commit
3e72809b5e
@ -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 *);
|
||||||
};
|
};
|
||||||
|
11
src/config.c
11
src/config.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************
|
/**************
|
||||||
|
@ -391,15 +391,43 @@ static int config_set(git_config_file *cfg, const char *name, const char *value)
|
|||||||
static int config_get(git_config_file *cfg, const char *name, const char **out)
|
static int config_get(git_config_file *cfg, const char *name, const char **out)
|
||||||
{
|
{
|
||||||
cvar_t *var;
|
cvar_t *var;
|
||||||
|
int error = GIT_SUCCESS;
|
||||||
diskfile_backend *b = (diskfile_backend *)cfg;
|
diskfile_backend *b = (diskfile_backend *)cfg;
|
||||||
|
|
||||||
var = cvar_list_find(&b->var_list, name);
|
var = cvar_list_find(&b->var_list, name);
|
||||||
|
|
||||||
if (var == NULL || var->value == NULL)
|
if (var == NULL)
|
||||||
return git__throw(GIT_ENOTFOUND, "Variable '%s' not found", name);
|
return git__throw(GIT_ENOTFOUND, "Variable '%s' not found", name);
|
||||||
|
|
||||||
*out = var->value;
|
*out = var->value;
|
||||||
return GIT_SUCCESS;
|
|
||||||
|
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)
|
||||||
@ -421,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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user