streaming: make streaming-write-entry to be more reusable
The static function in entry.c takes a cache entry and streams its blob contents to a file in the working tree. Refactor the logic to a new API function stream_blob_to_fd() that takes an object name and an open file descriptor, so that it can be reused by other callers. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
55
streaming.c
55
streaming.c
@ -489,3 +489,58 @@ static open_method_decl(incore)
|
||||
|
||||
return st->u.incore.buf ? 0 : -1;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* Users of streaming interface
|
||||
****************************************************************/
|
||||
|
||||
int stream_blob_to_fd(int fd, unsigned const char *sha1, struct stream_filter *filter,
|
||||
int can_seek)
|
||||
{
|
||||
struct git_istream *st;
|
||||
enum object_type type;
|
||||
unsigned long sz;
|
||||
ssize_t kept = 0;
|
||||
int result = -1;
|
||||
|
||||
st = open_istream(sha1, &type, &sz, filter);
|
||||
if (!st)
|
||||
return result;
|
||||
if (type != OBJ_BLOB)
|
||||
goto close_and_exit;
|
||||
for (;;) {
|
||||
char buf[1024 * 16];
|
||||
ssize_t wrote, holeto;
|
||||
ssize_t readlen = read_istream(st, buf, sizeof(buf));
|
||||
|
||||
if (!readlen)
|
||||
break;
|
||||
if (can_seek && sizeof(buf) == readlen) {
|
||||
for (holeto = 0; holeto < readlen; holeto++)
|
||||
if (buf[holeto])
|
||||
break;
|
||||
if (readlen == holeto) {
|
||||
kept += holeto;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (kept && lseek(fd, kept, SEEK_CUR) == (off_t) -1)
|
||||
goto close_and_exit;
|
||||
else
|
||||
kept = 0;
|
||||
wrote = write_in_full(fd, buf, readlen);
|
||||
|
||||
if (wrote != readlen)
|
||||
goto close_and_exit;
|
||||
}
|
||||
if (kept && (lseek(fd, kept - 1, SEEK_CUR) == (off_t) -1 ||
|
||||
write(fd, "", 1) != 1))
|
||||
goto close_and_exit;
|
||||
result = 0;
|
||||
|
||||
close_and_exit:
|
||||
close_istream(st);
|
||||
return result;
|
||||
}
|
||||
|
Reference in New Issue
Block a user