summaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-12-03 16:45:39 -0800
committerRussell Belfer <rb@github.com>2013-12-11 10:57:49 -0800
commit96869a4edb2872934e0e167a726ab240f4270fea (patch)
tree2d770414acef2d1d45a609e004c0aa6fa56d06d7 /src/config.c
parent9f77b3f6f5ce6944ec49dfc666ef6b8df0af0c6b (diff)
downloadlibgit2-96869a4edb2872934e0e167a726ab240f4270fea.tar.gz
Improve GIT_EUSER handling
This adds giterr_user_cancel to return GIT_EUSER and clear any error message that is sitting around. As a result of using that in places, we need to be more thorough with capturing errors that happen inside a callback when used internally. To help with that, this also adds giterr_capture and giterr_restore so that when we internally use a foreach-type function that clears errors and converts them to GIT_EUSER, it is easier to restore not just the return value, but the actual error message text.
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/src/config.c b/src/config.c
index 227adbc9b..3af9d58de 100644
--- a/src/config.c
+++ b/src/config.c
@@ -501,20 +501,18 @@ int git_config_backend_foreach_match(
return -1;
}
- while(!(iter->next(&entry, iter) < 0)) {
+ while (!(iter->next(&entry, iter) < 0)) {
/* skip non-matching keys if regexp was provided */
if (regexp && regexec(&regex, entry->name, 0, NULL, 0) != 0)
continue;
/* abort iterator on non-zero return value */
if (fn(entry, data)) {
- giterr_clear();
- result = GIT_EUSER;
- goto cleanup;
+ result = giterr_user_cancel();
+ break;
}
}
-cleanup:
if (regexp != NULL)
regfree(&regex);
@@ -537,9 +535,8 @@ int git_config_foreach_match(
return error;
while ((error = git_config_next(&entry, iter)) == 0) {
- if(cb(entry, payload)) {
- giterr_clear();
- error = GIT_EUSER;
+ if (cb(entry, payload)) {
+ error = giterr_user_cancel();
break;
}
}
@@ -800,9 +797,10 @@ int git_config_get_multivar_foreach(
found = 0;
while ((err = iter->next(&entry, iter)) == 0) {
found = 1;
- if(cb(entry, payload)) {
+
+ if (cb(entry, payload)) {
iter->free(iter);
- return GIT_EUSER;
+ return giterr_user_cancel();
}
}
@@ -1214,7 +1212,7 @@ struct rename_data {
git_config *config;
git_buf *name;
size_t old_len;
- int actual_error;
+ git_error_state error;
};
static int rename_config_entries_cb(
@@ -1237,9 +1235,8 @@ static int rename_config_entries_cb(
if (!error)
error = git_config_delete_entry(data->config, entry->name);
- data->actual_error = error; /* preserve actual error code */
-
- return error;
+ /* capture error message as needed, since it will become EUSER */
+ return giterr_capture(&data->error, error);
}
int git_config_rename_section(
@@ -1260,10 +1257,10 @@ int git_config_rename_section(
if ((error = git_repository_config__weakptr(&config, repo)) < 0)
goto cleanup;
+ memset(&data, 0, sizeof(data));
data.config = config;
data.name = &replace;
data.old_len = strlen(old_section_name) + 1;
- data.actual_error = 0;
if ((error = git_buf_join(&replace, '.', new_section_name, "")) < 0)
goto cleanup;
@@ -1281,7 +1278,7 @@ int git_config_rename_section(
config, git_buf_cstr(&pattern), rename_config_entries_cb, &data);
if (error == GIT_EUSER)
- error = data.actual_error;
+ error = giterr_restore(&data.error);
cleanup:
git_buf_free(&pattern);