refs/packed-backend.c: refactor `find_reference_location()`
The function `find_reference_location()` is used to perform a binary search-like function over the contents of a repository's `$GIT_DIR/packed-refs` file. The search it implements is unlike a standard binary search in that the records it searches over are not of a fixed width, so the comparison must locate the end of a record before comparing it. Extract the core routine of `find_reference_location()` in order to implement a function in the following patch which will find the first location in the `packed-refs` file that *doesn't* match the given pattern. The behavior of `find_reference_location()` is unchanged. Co-authored-by: Jeff King <peff@peff.net> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
b269ac53c0
commit
d22d941ac0
|
@ -527,22 +527,8 @@ static int load_contents(struct snapshot *snapshot)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the place in `snapshot->buf` where the start of the record for
|
||||
* `refname` starts. If `mustexist` is true and the reference doesn't
|
||||
* exist, then return NULL. If `mustexist` is false and the reference
|
||||
* doesn't exist, then return the point where that reference would be
|
||||
* inserted, or `snapshot->eof` (which might be NULL) if it would be
|
||||
* inserted at the end of the file. In the latter mode, `refname`
|
||||
* doesn't have to be a proper reference name; for example, one could
|
||||
* search for "refs/replace/" to find the start of any replace
|
||||
* references.
|
||||
*
|
||||
* The record is sought using a binary search, so `snapshot->buf` must
|
||||
* be sorted.
|
||||
*/
|
||||
static const char *find_reference_location(struct snapshot *snapshot,
|
||||
const char *refname, int mustexist)
|
||||
static const char *find_reference_location_1(struct snapshot *snapshot,
|
||||
const char *refname, int mustexist)
|
||||
{
|
||||
/*
|
||||
* This is not *quite* a garden-variety binary search, because
|
||||
|
@ -588,6 +574,26 @@ static const char *find_reference_location(struct snapshot *snapshot,
|
|||
return lo;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the place in `snapshot->buf` where the start of the record for
|
||||
* `refname` starts. If `mustexist` is true and the reference doesn't
|
||||
* exist, then return NULL. If `mustexist` is false and the reference
|
||||
* doesn't exist, then return the point where that reference would be
|
||||
* inserted, or `snapshot->eof` (which might be NULL) if it would be
|
||||
* inserted at the end of the file. In the latter mode, `refname`
|
||||
* doesn't have to be a proper reference name; for example, one could
|
||||
* search for "refs/replace/" to find the start of any replace
|
||||
* references.
|
||||
*
|
||||
* The record is sought using a binary search, so `snapshot->buf` must
|
||||
* be sorted.
|
||||
*/
|
||||
static const char *find_reference_location(struct snapshot *snapshot,
|
||||
const char *refname, int mustexist)
|
||||
{
|
||||
return find_reference_location_1(snapshot, refname, mustexist);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a newly-allocated `snapshot` of the `packed-refs` file in
|
||||
* its current state and return it. The return value will already have
|
||||
|
|
Loading…
Reference in New Issue