packed-backend: extract snapshot allocation in load_contents
"load_contents" would choose which way to load the content of the "packed-refs". However, we cannot directly use this function when checking the consistency due to we don't want to open the file. And we also need to reuse the logic to avoid causing repetition. Let's create a new helper function "allocate_snapshot_buffer" to extract the snapshot allocation logic in "load_contents" and update the "load_contents" to align with the behavior. Suggested-by: Jeff King <peff@peff.net> Suggested-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: shejialuo <shejialuo@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
784ceccb91
commit
a0dee3f74b
@@ -517,6 +517,32 @@ static int refname_contains_nul(struct strbuf *refname)
|
||||
|
||||
#define SMALL_FILE_SIZE (32*1024)
|
||||
|
||||
static int allocate_snapshot_buffer(struct snapshot *snapshot, int fd, struct stat *st)
|
||||
{
|
||||
ssize_t bytes_read;
|
||||
size_t size;
|
||||
|
||||
size = xsize_t(st->st_size);
|
||||
if (!size)
|
||||
return 0;
|
||||
|
||||
if (mmap_strategy == MMAP_NONE || size <= SMALL_FILE_SIZE) {
|
||||
snapshot->buf = xmalloc(size);
|
||||
bytes_read = read_in_full(fd, snapshot->buf, size);
|
||||
if (bytes_read < 0 || bytes_read != size)
|
||||
die_errno("couldn't read %s", snapshot->refs->path);
|
||||
snapshot->mmapped = 0;
|
||||
} else {
|
||||
snapshot->buf = xmmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
snapshot->mmapped = 1;
|
||||
}
|
||||
|
||||
snapshot->start = snapshot->buf;
|
||||
snapshot->eof = snapshot->buf + size;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Depending on `mmap_strategy`, either mmap or read the contents of
|
||||
* the `packed-refs` file into the snapshot. Return 1 if the file
|
||||
@@ -525,10 +551,9 @@ static int refname_contains_nul(struct strbuf *refname)
|
||||
*/
|
||||
static int load_contents(struct snapshot *snapshot)
|
||||
{
|
||||
int fd;
|
||||
struct stat st;
|
||||
size_t size;
|
||||
ssize_t bytes_read;
|
||||
int ret;
|
||||
int fd;
|
||||
|
||||
fd = open(snapshot->refs->path, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
@@ -550,27 +575,11 @@ static int load_contents(struct snapshot *snapshot)
|
||||
|
||||
if (fstat(fd, &st) < 0)
|
||||
die_errno("couldn't stat %s", snapshot->refs->path);
|
||||
size = xsize_t(st.st_size);
|
||||
|
||||
if (!size) {
|
||||
close(fd);
|
||||
return 0;
|
||||
} else if (mmap_strategy == MMAP_NONE || size <= SMALL_FILE_SIZE) {
|
||||
snapshot->buf = xmalloc(size);
|
||||
bytes_read = read_in_full(fd, snapshot->buf, size);
|
||||
if (bytes_read < 0 || bytes_read != size)
|
||||
die_errno("couldn't read %s", snapshot->refs->path);
|
||||
snapshot->mmapped = 0;
|
||||
} else {
|
||||
snapshot->buf = xmmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
snapshot->mmapped = 1;
|
||||
}
|
||||
ret = allocate_snapshot_buffer(snapshot, fd, &st);
|
||||
|
||||
close(fd);
|
||||
|
||||
snapshot->start = snapshot->buf;
|
||||
snapshot->eof = snapshot->buf + size;
|
||||
|
||||
return 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const char *find_reference_location_1(struct snapshot *snapshot,
|
||||
|
||||
Reference in New Issue
Block a user