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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static const char *find_reference_location_1(struct snapshot *snapshot,
|
||||||
* Find the place in `snapshot->buf` where the start of the record for
|
const char *refname, int mustexist)
|
||||||
* `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)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* This is not *quite* a garden-variety binary search, because
|
* 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;
|
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
|
* Create a newly-allocated `snapshot` of the `packed-refs` file in
|
||||||
* its current state and return it. The return value will already have
|
* its current state and return it. The return value will already have
|
||||||
|
|
Loading…
Reference in New Issue