Use the RESULT_MUST_BE_USED attribute to assert that all users of the *_multi() API use the return values, in the preceding commit "for-each-repo" started using the return value meaningfully. This requires changing versioncmp() so that we use the "ret" versions of the return values, and don't implicitly rely on "deprecated_prereleases" being set to NULL if the key didn't exist. See 1e8697b5c4e (submodule--helper: check repo{_submodule,}_init() return values, 2022-09-01) for the introduction of RESULT_MUST_BE_USED. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> --- config.h | 6 ++++++ versioncmp.c | 22 +++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/config.h b/config.h index c88619b7dcf..a5710c5856e 100644 --- a/config.h +++ b/config.h @@ -470,6 +470,7 @@ int git_configset_add_parameters(struct config_set *cs); * The caller should not free or modify the returned pointer, as it is * owned by the cache. */ +RESULT_MUST_BE_USED int git_configset_get_value_multi(struct config_set *cs, const char *key, const struct string_list **dest); @@ -478,6 +479,7 @@ int git_configset_get_value_multi(struct config_set *cs, const char *key, * value is < 0. Use it for keys known to pass git_config_parse_key(), * i.e. those hardcoded in the code, and never user-provided keys. */ +RESULT_MUST_BE_USED int git_configset_get_knownkey_value_multi(struct config_set *cs, const char *const key, const struct string_list **dest); @@ -514,9 +516,11 @@ struct repository; void repo_config(struct repository *repo, config_fn_t fn, void *data); int repo_config_get_value(struct repository *repo, const char *key, const char **value); +RESULT_MUST_BE_USED int repo_config_get_value_multi(struct repository *repo, const char *key, const struct string_list **dest); +RESULT_MUST_BE_USED int repo_config_get_knownkey_value_multi(struct repository *repo, const char *const key, const struct string_list **dest); @@ -571,6 +575,7 @@ int git_config_get_value(const char *key, const char **value); * The caller should not free or modify the returned pointer, as it is * owned by the cache. */ +RESULT_MUST_BE_USED int git_config_get_value_multi(const char *key, const struct string_list **dest); @@ -579,6 +584,7 @@ int git_config_get_value_multi(const char *key, * git_configset_get_knownkey_value_multi() does for * git_configset_get_value_multi(). */ +RESULT_MUST_BE_USED int git_config_get_knownkey_value_multi(const char *const key, const struct string_list **dest); diff --git a/versioncmp.c b/versioncmp.c index 9064478dc4a..effe1a6a6be 100644 --- a/versioncmp.c +++ b/versioncmp.c @@ -160,19 +160,23 @@ int versioncmp(const char *s1, const char *s2) } if (!initialized) { - const struct string_list *deprecated_prereleases = NULL; + const struct string_list *deprecated_prereleases; + int prereleases_ret, deprecated_prereleases_ret; initialized = 1; - git_config_get_knownkey_value_multi("versionsort.suffix", - &prereleases); - git_config_get_value_multi("versionsort.prereleasesuffix", - &deprecated_prereleases); - - if (prereleases) { - if (deprecated_prereleases) + prereleases_ret = + git_config_get_knownkey_value_multi("versionsort.suffix", + &prereleases); + deprecated_prereleases_ret = + git_config_get_knownkey_value_multi("versionsort.prereleasesuffix", + &deprecated_prereleases); + + if (!prereleases_ret) { + if (!deprecated_prereleases_ret) warning("ignoring versionsort.prereleasesuffix because versionsort.suffix is set"); - } else + } else if (!deprecated_prereleases_ret) { prereleases = deprecated_prereleases; + } } if (prereleases && swap_prereleases(s1, s2, (const char *) p1 - s1 - 1, &diff)) -- 2.38.0.1251.g3eefdfb5e7a