Re: [PATCH 3/3] Rename resolve_ref() to resolve_ref_unsafe()
- From
Nguyen Thai Ngoc Duy <pclouds@gmail.com>
- Date
- Dec 11, 2011, 09:46 UTC
- Message-ID
- <CACsJy8DAjV+tczU5C17UqF4uv8MOBHx3_ZHBoJR59w_DdqVX3A@mail.gmail.com>
- In-Reply-To
- <20111210205519.GA24817@elie.hsd1.il.comcast.net>
2011/12/11 Jonathan Nieder <jrnieder@gmail.com>:
Show 19 quoted lines
> Nguyễn Thái Ngọc Duy wrote:
>
>> resolve_ref() may return a pointer to a shared buffer and can be
>> overwritten by the next resolve_ref() calls. Callers need to
>> pay attention, not to keep the pointer when the next call happens.
> [...]
>> --- a/branch.c
>> +++ b/branch.c
>> @@ -182,7 +182,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
>> const char *head;
>> unsigned char sha1[20];
>>
>> - head = resolve_ref("HEAD", sha1, 0, NULL);
>> + head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
>
> I wonder if it would make sense to have a separate function that
> maintains a shared buffer describing what HEAD resolves to, lazily
> loaded. Would invalidating the cache when appropriate be too fussy
> and subtle?If we do not execute "git update-ref" from git binary (bisect does, although on BISECT_HEAD, not HEAD) then it'd be safe to cache HEAD and invalidate it in update_ref().
-- Duy