]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packed-backend: extract snapshot allocation in `load_contents`
authorshejialuo <shejialuo@gmail.com>
Wed, 14 May 2025 15:50:35 +0000 (23:50 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 May 2025 19:32:58 +0000 (12:32 -0700)
"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>
refs/packed-backend.c

index fb91833e76d9c9cb6e514d9a1dfe21e736004d90..1da44a3d6d789d33d9e7dcbef699eb8c8ef20edd 100644 (file)
@@ -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;
-       }
-       close(fd);
 
-       snapshot->start = snapshot->buf;
-       snapshot->eof = snapshot->buf + size;
+       ret = allocate_snapshot_buffer(snapshot, fd, &st);
 
-       return 1;
+       close(fd);
+       return ret;
 }
 
 static const char *find_reference_location_1(struct snapshot *snapshot,