diff options
| author | Russell Belfer <rb@github.com> | 2013-12-03 16:45:39 -0800 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2013-12-11 10:57:49 -0800 |
| commit | 96869a4edb2872934e0e167a726ab240f4270fea (patch) | |
| tree | 2d770414acef2d1d45a609e004c0aa6fa56d06d7 /src/config.c | |
| parent | 9f77b3f6f5ce6944ec49dfc666ef6b8df0af0c6b (diff) | |
| download | libgit2-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.c | 29 |
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(®ex, 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(®ex); @@ -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); |
