mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 17:05:49 +00:00
config: introduce git_config_rename_section()
This commit is contained in:
parent
383f164a09
commit
aba7078177
117
src/branch.c
117
src/branch.c
@ -89,86 +89,11 @@ cleanup:
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct rename_data
|
|
||||||
{
|
|
||||||
git_config *config;
|
|
||||||
const char *old_name;
|
|
||||||
const char *new_name;
|
|
||||||
} rename_data;
|
|
||||||
|
|
||||||
static int rename_config_entries_cb(
|
|
||||||
const char *var_name,
|
|
||||||
const char *value,
|
|
||||||
void *payload)
|
|
||||||
{
|
|
||||||
rename_data *data = (rename_data *)payload;
|
|
||||||
|
|
||||||
GIT_UNUSED(value);
|
|
||||||
|
|
||||||
if (data->new_name != NULL) {
|
|
||||||
git_buf name = GIT_BUF_INIT;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
if (git_buf_printf(
|
|
||||||
&name,
|
|
||||||
"branch.%s.%s",
|
|
||||||
data->new_name,
|
|
||||||
var_name + strlen("branch") + strlen(data->old_name) + 2) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
error = git_config_set_string(
|
|
||||||
data->config,
|
|
||||||
git_buf_cstr(&name),
|
|
||||||
value);
|
|
||||||
|
|
||||||
git_buf_free(&name);
|
|
||||||
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return git_config_delete(data->config, var_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int rename_branch_config_entries(
|
|
||||||
git_repository *repo,
|
|
||||||
const char *old_branch_name,
|
|
||||||
const char *new_branch_name)
|
|
||||||
{
|
|
||||||
git_config *config;
|
|
||||||
git_buf pattern = GIT_BUF_INIT;
|
|
||||||
int error = -1;
|
|
||||||
rename_data data;
|
|
||||||
|
|
||||||
git_buf_sets(&pattern, "branch\\.");
|
|
||||||
git_buf_puts_escape_regex(&pattern, old_branch_name);
|
|
||||||
git_buf_puts(&pattern, "\\..+");
|
|
||||||
if (git_buf_oom(&pattern))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (git_repository_config__weakptr(&config, repo) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
data.config = config;
|
|
||||||
data.old_name = old_branch_name;
|
|
||||||
data.new_name = new_branch_name;
|
|
||||||
|
|
||||||
if ((error = git_config_foreach_match(
|
|
||||||
config,
|
|
||||||
git_buf_cstr(&pattern),
|
|
||||||
rename_config_entries_cb, &data)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
error = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
git_buf_free(&pattern);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
int git_branch_delete(git_reference *branch)
|
int git_branch_delete(git_reference *branch)
|
||||||
{
|
{
|
||||||
int is_head;
|
int is_head;
|
||||||
|
git_buf config_section = GIT_BUF_INIT;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
assert(branch);
|
assert(branch);
|
||||||
|
|
||||||
@ -187,13 +112,23 @@ int git_branch_delete(git_reference *branch)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rename_branch_config_entries(
|
if (git_buf_printf(&config_section, "branch.%s", git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR)) < 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
if (git_config_rename_section(
|
||||||
git_reference_owner(branch),
|
git_reference_owner(branch),
|
||||||
git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR),
|
git_buf_cstr(&config_section),
|
||||||
NULL) < 0)
|
NULL) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
return git_reference_delete(branch);
|
if (git_reference_delete(branch) < 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
|
error = 0;
|
||||||
|
|
||||||
|
on_error:
|
||||||
|
git_buf_free(&config_section);
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -245,7 +180,8 @@ int git_branch_move(
|
|||||||
int force)
|
int force)
|
||||||
{
|
{
|
||||||
git_buf new_reference_name = GIT_BUF_INIT,
|
git_buf new_reference_name = GIT_BUF_INIT,
|
||||||
old_branch_name = GIT_BUF_INIT;
|
old_config_section = GIT_BUF_INIT,
|
||||||
|
new_config_section = GIT_BUF_INIT;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
assert(branch && new_branch_name);
|
assert(branch && new_branch_name);
|
||||||
@ -256,21 +192,28 @@ int git_branch_move(
|
|||||||
if ((error = git_buf_joinpath(&new_reference_name, GIT_REFS_HEADS_DIR, new_branch_name)) < 0)
|
if ((error = git_buf_joinpath(&new_reference_name, GIT_REFS_HEADS_DIR, new_branch_name)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((error = git_buf_puts(&old_branch_name, git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR))) < 0)
|
if (git_buf_printf(
|
||||||
goto cleanup;
|
&old_config_section,
|
||||||
|
"branch.%s",
|
||||||
|
git_reference_name(branch) + strlen(GIT_REFS_HEADS_DIR)) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if ((error = git_reference_rename(branch, git_buf_cstr(&new_reference_name), force)) < 0)
|
if ((error = git_reference_rename(branch, git_buf_cstr(&new_reference_name), force)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((error = rename_branch_config_entries(
|
if (git_buf_printf(&new_config_section, "branch.%s", new_branch_name) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((error = git_config_rename_section(
|
||||||
git_reference_owner(branch),
|
git_reference_owner(branch),
|
||||||
git_buf_cstr(&old_branch_name),
|
git_buf_cstr(&old_config_section),
|
||||||
new_branch_name)) < 0)
|
git_buf_cstr(&new_config_section))) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
git_buf_free(&new_reference_name);
|
git_buf_free(&new_reference_name);
|
||||||
git_buf_free(&old_branch_name);
|
git_buf_free(&old_config_section);
|
||||||
|
git_buf_free(&new_config_section);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
78
src/config.c
78
src/config.c
@ -720,3 +720,81 @@ fail_parse:
|
|||||||
giterr_set(GITERR_CONFIG, "Failed to parse '%s' as a 32-bit integer", value);
|
giterr_set(GITERR_CONFIG, "Failed to parse '%s' as a 32-bit integer", value);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct rename_data
|
||||||
|
{
|
||||||
|
git_config *config;
|
||||||
|
const char *old_name;
|
||||||
|
const char *new_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int rename_config_entries_cb(
|
||||||
|
const git_config_entry *entry,
|
||||||
|
void *payload)
|
||||||
|
{
|
||||||
|
struct rename_data *data = (struct rename_data *)payload;
|
||||||
|
|
||||||
|
if (data->new_name != NULL) {
|
||||||
|
git_buf name = GIT_BUF_INIT;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if (git_buf_printf(
|
||||||
|
&name,
|
||||||
|
"%s.%s",
|
||||||
|
data->new_name,
|
||||||
|
entry->name + strlen(data->old_name) + 1) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
error = git_config_set_string(
|
||||||
|
data->config,
|
||||||
|
git_buf_cstr(&name),
|
||||||
|
entry->value);
|
||||||
|
|
||||||
|
git_buf_free(&name);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return git_config_delete(data->config, entry->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
int git_config_rename_section(
|
||||||
|
git_repository *repo,
|
||||||
|
const char *old_section_name,
|
||||||
|
const char *new_section_name)
|
||||||
|
{
|
||||||
|
git_config *config;
|
||||||
|
git_buf pattern = GIT_BUF_INIT;
|
||||||
|
int error = -1;
|
||||||
|
struct rename_data data;
|
||||||
|
|
||||||
|
git_buf_puts_escape_regex(&pattern, old_section_name);
|
||||||
|
git_buf_puts(&pattern, "\\..+");
|
||||||
|
if (git_buf_oom(&pattern))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (git_repository_config__weakptr(&config, repo) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
data.config = config;
|
||||||
|
data.old_name = old_section_name;
|
||||||
|
data.new_name = new_section_name;
|
||||||
|
|
||||||
|
if ((error = git_config_foreach_match(
|
||||||
|
config,
|
||||||
|
git_buf_cstr(&pattern),
|
||||||
|
rename_config_entries_cb, &data)) < 0) {
|
||||||
|
giterr_set(GITERR_CONFIG,
|
||||||
|
"Cannot rename config section '%s' to '%s'",
|
||||||
|
old_section_name,
|
||||||
|
new_section_name);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
git_buf_free(&pattern);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
@ -27,4 +27,9 @@ extern int git_config_find_global_r(git_buf *global_config_path);
|
|||||||
extern int git_config_find_xdg_r(git_buf *system_config_path);
|
extern int git_config_find_xdg_r(git_buf *system_config_path);
|
||||||
extern int git_config_find_system_r(git_buf *system_config_path);
|
extern int git_config_find_system_r(git_buf *system_config_path);
|
||||||
|
|
||||||
|
extern int git_config_rename_section(
|
||||||
|
git_repository *repo,
|
||||||
|
const char *old_section_name, /* eg "branch.dummy" */
|
||||||
|
const char *new_section_name); /* NULL to drop the old section */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user