Re: [PATCH v3 2/6] branch.c: replace `git_config()` with `git_config_get_string()`

2014-07-21 Thread Tanay Abhra


On 7/21/2014 11:29 PM, Junio C Hamano wrote:
> Tanay Abhra  writes:
> 
>> Use `git_config_get_string()` instead of `git_config()` to take advantage of
>> the config-set API which provides a cleaner control flow.
>>
>> Signed-off-by: Tanay Abhra 
>> ---
>>  branch.c | 24 
>>  1 file changed, 4 insertions(+), 20 deletions(-)
>>
>> diff --git a/branch.c b/branch.c
>> index 46e8aa8..827307f 100644
>> --- a/branch.c
>> +++ b/branch.c
>> @@ -140,33 +140,17 @@ static int setup_tracking(const char *new_ref, const 
>> char *orig_ref,
>>  return 0;
>>  }
>>  
>> -struct branch_desc_cb {
>> -const char *config_name;
>> -const char *value;
>> -};
>> -
>> -static int read_branch_desc_cb(const char *var, const char *value, void *cb)
>> -{
>> -struct branch_desc_cb *desc = cb;
>> -if (strcmp(desc->config_name, var))
>> -return 0;
>> -free((char *)desc->value);
>> -return git_config_string(&desc->value, var, value);
>> -}
>> -
>>  int read_branch_desc(struct strbuf *buf, const char *branch_name)
>>  {
>> -struct branch_desc_cb cb;
>> +const char *v = NULL;
>>  struct strbuf name = STRBUF_INIT;
>>  strbuf_addf(&name, "branch.%s.description", branch_name);
>> -cb.config_name = name.buf;
>> -cb.value = NULL;
>> -if (git_config(read_branch_desc_cb, &cb) < 0) {
>> +if (git_config_get_string(name.buf, &v)) {
>>  strbuf_release(&name);
>>  return -1;
>>  }
>> -if (cb.value)
>> -strbuf_addstr(buf, cb.value);
>> +strbuf_addstr(buf, v);
>> +free((char*)v);
> 
> In this cast, I smell an API mistake to insist an extra constness to
> the output parameter of git_config_get_string() in [3/4] of the
> previous series.  Unlike the underlying git_config_get_value(),
> which lets the caller peek into the internal cached copy, the caller
> of git_config_get_string() is given its own copy, and I do not
> offhand see a good reason to forbid the caller from modifying it.
>

I modeled git_config_get_string() on the previously existing API function
git_config_string() with the signature,
int git_config_string(const char **dest, const char *var, const char *value).

But after writing this series I do think there isn't a good reason to
keep the constness in the new function also since the dest is given
its own copy.


>>  strbuf_release(&name);
>>  return 0;
>>  }
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/6] branch.c: replace `git_config()` with `git_config_get_string()`

2014-07-21 Thread Matthieu Moy
Junio C Hamano  writes:

> Tanay Abhra  writes:
>
>> -if (cb.value)
>> -strbuf_addstr(buf, cb.value);
>> +strbuf_addstr(buf, v);
>> +free((char*)v);
>
> In this cast, I smell an API mistake to insist an extra constness to
> the output parameter of git_config_get_string() in [3/4] of the
> previous series.  Unlike the underlying git_config_get_value(),
> which lets the caller peek into the internal cached copy, the caller
> of git_config_get_string() is given its own copy, and I do not
> offhand see a good reason to forbid the caller from modifying it.

Indeed. My suggestion to change the declaration of char * variables
actually seem like a workaround for an API mistake after reading this.

(well, actually, the declaration could be modified if we think it brings
any new safety, but that should be another topic)

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/6] branch.c: replace `git_config()` with `git_config_get_string()`

2014-07-21 Thread Junio C Hamano
Tanay Abhra  writes:

> Use `git_config_get_string()` instead of `git_config()` to take advantage of
> the config-set API which provides a cleaner control flow.
>
> Signed-off-by: Tanay Abhra 
> ---
>  branch.c | 24 
>  1 file changed, 4 insertions(+), 20 deletions(-)
>
> diff --git a/branch.c b/branch.c
> index 46e8aa8..827307f 100644
> --- a/branch.c
> +++ b/branch.c
> @@ -140,33 +140,17 @@ static int setup_tracking(const char *new_ref, const 
> char *orig_ref,
>   return 0;
>  }
>  
> -struct branch_desc_cb {
> - const char *config_name;
> - const char *value;
> -};
> -
> -static int read_branch_desc_cb(const char *var, const char *value, void *cb)
> -{
> - struct branch_desc_cb *desc = cb;
> - if (strcmp(desc->config_name, var))
> - return 0;
> - free((char *)desc->value);
> - return git_config_string(&desc->value, var, value);
> -}
> -
>  int read_branch_desc(struct strbuf *buf, const char *branch_name)
>  {
> - struct branch_desc_cb cb;
> + const char *v = NULL;
>   struct strbuf name = STRBUF_INIT;
>   strbuf_addf(&name, "branch.%s.description", branch_name);
> - cb.config_name = name.buf;
> - cb.value = NULL;
> - if (git_config(read_branch_desc_cb, &cb) < 0) {
> + if (git_config_get_string(name.buf, &v)) {
>   strbuf_release(&name);
>   return -1;
>   }
> - if (cb.value)
> - strbuf_addstr(buf, cb.value);
> + strbuf_addstr(buf, v);
> + free((char*)v);

In this cast, I smell an API mistake to insist an extra constness to
the output parameter of git_config_get_string() in [3/4] of the
previous series.  Unlike the underlying git_config_get_value(),
which lets the caller peek into the internal cached copy, the caller
of git_config_get_string() is given its own copy, and I do not
offhand see a good reason to forbid the caller from modifying it.

>   strbuf_release(&name);
>   return 0;
>  }
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 2/6] branch.c: replace `git_config()` with `git_config_get_string()`

2014-07-21 Thread Tanay Abhra
Use `git_config_get_string()` instead of `git_config()` to take advantage of
the config-set API which provides a cleaner control flow.

Signed-off-by: Tanay Abhra 
---
 branch.c | 24 
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/branch.c b/branch.c
index 46e8aa8..827307f 100644
--- a/branch.c
+++ b/branch.c
@@ -140,33 +140,17 @@ static int setup_tracking(const char *new_ref, const char 
*orig_ref,
return 0;
 }
 
-struct branch_desc_cb {
-   const char *config_name;
-   const char *value;
-};
-
-static int read_branch_desc_cb(const char *var, const char *value, void *cb)
-{
-   struct branch_desc_cb *desc = cb;
-   if (strcmp(desc->config_name, var))
-   return 0;
-   free((char *)desc->value);
-   return git_config_string(&desc->value, var, value);
-}
-
 int read_branch_desc(struct strbuf *buf, const char *branch_name)
 {
-   struct branch_desc_cb cb;
+   const char *v = NULL;
struct strbuf name = STRBUF_INIT;
strbuf_addf(&name, "branch.%s.description", branch_name);
-   cb.config_name = name.buf;
-   cb.value = NULL;
-   if (git_config(read_branch_desc_cb, &cb) < 0) {
+   if (git_config_get_string(name.buf, &v)) {
strbuf_release(&name);
return -1;
}
-   if (cb.value)
-   strbuf_addstr(buf, cb.value);
+   strbuf_addstr(buf, v);
+   free((char*)v);
strbuf_release(&name);
return 0;
 }
-- 
1.9.0.GIT

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html