Skip to content

Commit

Permalink
index_fd(): split into two helper functions
Browse files Browse the repository at this point in the history
Split out the case where we do not know the size of the input (hence we
read everything into a strbuf before doing anything) to index_pipe(), and
the other case where we mmap or read the whole data to index_bulk().

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed May 9, 2011
1 parent c4ce46f commit 7b41e1e
Showing 1 changed file with 31 additions and 11 deletions.
42 changes: 31 additions & 11 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -2619,22 +2619,29 @@ static int index_mem(unsigned char *sha1, void *buf, size_t size,
return ret;
}

static int index_pipe(unsigned char *sha1, int fd, enum object_type type,
const char *path, unsigned flags)
{
struct strbuf sbuf = STRBUF_INIT;
int ret;

if (strbuf_read(&sbuf, fd, 4096) >= 0)
ret = index_mem(sha1, sbuf.buf, sbuf.len, type, path, flags);
else
ret = -1;
strbuf_release(&sbuf);
return ret;
}

#define SMALL_FILE_SIZE (32*1024)

int index_fd(unsigned char *sha1, int fd, struct stat *st,
enum object_type type, const char *path, unsigned flags)
static int index_core(unsigned char *sha1, int fd, size_t size,
enum object_type type, const char *path,
unsigned flags)
{
int ret;
size_t size = xsize_t(st->st_size);

if (!S_ISREG(st->st_mode)) {
struct strbuf sbuf = STRBUF_INIT;
if (strbuf_read(&sbuf, fd, 4096) >= 0)
ret = index_mem(sha1, sbuf.buf, sbuf.len, type, path, flags);
else
ret = -1;
strbuf_release(&sbuf);
} else if (!size) {
if (!size) {
ret = index_mem(sha1, NULL, size, type, path, flags);
} else if (size <= SMALL_FILE_SIZE) {
char *buf = xmalloc(size);
Expand All @@ -2648,6 +2655,19 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st,
ret = index_mem(sha1, buf, size, type, path, flags);
munmap(buf, size);
}
return ret;
}

int index_fd(unsigned char *sha1, int fd, struct stat *st,
enum object_type type, const char *path, unsigned flags)
{
int ret;
size_t size = xsize_t(st->st_size);

if (!S_ISREG(st->st_mode))
ret = index_pipe(sha1, fd, type, path, flags);
else
ret = index_core(sha1, fd, size, type, path, flags);
close(fd);
return ret;
}
Expand Down

0 comments on commit 7b41e1e

Please sign in to comment.