mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 20:02:04 +00:00
Merge pull request #3118 from libgit2/cmn/stream-size
odb: make the writestream's size a git_off_t
This commit is contained in:
commit
a6f2ceaf48
@ -247,7 +247,7 @@ GIT_EXTERN(int) git_odb_write(git_oid *out, git_odb *odb, const void *data, size
|
|||||||
* @param type type of the object that will be written
|
* @param type type of the object that will be written
|
||||||
* @return 0 if the stream was created; error code otherwise
|
* @return 0 if the stream was created; error code otherwise
|
||||||
*/
|
*/
|
||||||
GIT_EXTERN(int) git_odb_open_wstream(git_odb_stream **out, git_odb *db, size_t size, git_otype type);
|
GIT_EXTERN(int) git_odb_open_wstream(git_odb_stream **out, git_odb *db, git_off_t size, git_otype type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write to an odb stream
|
* Write to an odb stream
|
||||||
|
@ -86,8 +86,8 @@ struct git_odb_stream {
|
|||||||
unsigned int mode;
|
unsigned int mode;
|
||||||
void *hash_ctx;
|
void *hash_ctx;
|
||||||
|
|
||||||
size_t declared_size;
|
git_off_t declared_size;
|
||||||
size_t received_bytes;
|
git_off_t received_bytes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write at most `len` bytes into `buffer` and advance the stream.
|
* Write at most `len` bytes into `buffer` and advance the stream.
|
||||||
|
@ -53,7 +53,7 @@ struct git_odb_backend {
|
|||||||
git_odb_backend *, const git_oid *, const void *, size_t, git_otype);
|
git_odb_backend *, const git_oid *, const void *, size_t, git_otype);
|
||||||
|
|
||||||
int (* writestream)(
|
int (* writestream)(
|
||||||
git_odb_stream **, git_odb_backend *, size_t, git_otype);
|
git_odb_stream **, git_odb_backend *, git_off_t, git_otype);
|
||||||
|
|
||||||
int (* readstream)(
|
int (* readstream)(
|
||||||
git_odb_stream **, git_odb_backend *, const git_oid *);
|
git_odb_stream **, git_odb_backend *, const git_oid *);
|
||||||
|
@ -76,10 +76,11 @@ static int write_file_stream(
|
|||||||
int fd, error;
|
int fd, error;
|
||||||
char buffer[FILEIO_BUFSIZE];
|
char buffer[FILEIO_BUFSIZE];
|
||||||
git_odb_stream *stream = NULL;
|
git_odb_stream *stream = NULL;
|
||||||
ssize_t read_len = -1, written = 0;
|
ssize_t read_len = -1;
|
||||||
|
git_off_t written = 0;
|
||||||
|
|
||||||
if ((error = git_odb_open_wstream(
|
if ((error = git_odb_open_wstream(
|
||||||
&stream, odb, (size_t)file_size, GIT_OBJ_BLOB)) < 0)
|
&stream, odb, file_size, GIT_OBJ_BLOB)) < 0)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if ((fd = git_futils_open_ro(path)) < 0) {
|
if ((fd = git_futils_open_ro(path)) < 0) {
|
||||||
|
13
src/odb.c
13
src/odb.c
@ -50,7 +50,7 @@ static git_cache *odb_cache(git_odb *odb)
|
|||||||
|
|
||||||
static int load_alternates(git_odb *odb, const char *objects_dir, int alternate_depth);
|
static int load_alternates(git_odb *odb, const char *objects_dir, int alternate_depth);
|
||||||
|
|
||||||
int git_odb__format_object_header(char *hdr, size_t n, size_t obj_len, git_otype obj_type)
|
int git_odb__format_object_header(char *hdr, size_t n, git_off_t obj_len, git_otype obj_type)
|
||||||
{
|
{
|
||||||
const char *type_str = git_object_type2string(obj_type);
|
const char *type_str = git_object_type2string(obj_type);
|
||||||
int len = p_snprintf(hdr, n, "%s %"PRIuZ, type_str, obj_len);
|
int len = p_snprintf(hdr, n, "%s %"PRIuZ, type_str, obj_len);
|
||||||
@ -330,10 +330,15 @@ static void fake_wstream__free(git_odb_stream *_stream)
|
|||||||
git__free(stream);
|
git__free(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_fake_wstream(git_odb_stream **stream_p, git_odb_backend *backend, size_t size, git_otype type)
|
static int init_fake_wstream(git_odb_stream **stream_p, git_odb_backend *backend, git_off_t size, git_otype type)
|
||||||
{
|
{
|
||||||
fake_wstream *stream;
|
fake_wstream *stream;
|
||||||
|
|
||||||
|
if (!git__is_ssizet(size)) {
|
||||||
|
giterr_set(GITERR_ODB, "object size too large to keep in memory");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
stream = git__calloc(1, sizeof(fake_wstream));
|
stream = git__calloc(1, sizeof(fake_wstream));
|
||||||
GITERR_CHECK_ALLOC(stream);
|
GITERR_CHECK_ALLOC(stream);
|
||||||
|
|
||||||
@ -940,7 +945,7 @@ int git_odb_write(
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hash_header(git_hash_ctx *ctx, size_t size, git_otype type)
|
static void hash_header(git_hash_ctx *ctx, git_off_t size, git_otype type)
|
||||||
{
|
{
|
||||||
char header[64];
|
char header[64];
|
||||||
int hdrlen;
|
int hdrlen;
|
||||||
@ -950,7 +955,7 @@ static void hash_header(git_hash_ctx *ctx, size_t size, git_otype type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int git_odb_open_wstream(
|
int git_odb_open_wstream(
|
||||||
git_odb_stream **stream, git_odb *db, size_t size, git_otype type)
|
git_odb_stream **stream, git_odb *db, git_off_t size, git_otype type)
|
||||||
{
|
{
|
||||||
size_t i, writes = 0;
|
size_t i, writes = 0;
|
||||||
int error = GIT_ERROR;
|
int error = GIT_ERROR;
|
||||||
|
@ -49,7 +49,7 @@ int git_odb__hashobj(git_oid *id, git_rawobj *obj);
|
|||||||
/*
|
/*
|
||||||
* Format the object header such as it would appear in the on-disk object
|
* Format the object header such as it would appear in the on-disk object
|
||||||
*/
|
*/
|
||||||
int git_odb__format_object_header(char *hdr, size_t n, size_t obj_len, git_otype obj_type);
|
int git_odb__format_object_header(char *hdr, size_t n, git_off_t obj_len, git_otype obj_type);
|
||||||
/*
|
/*
|
||||||
* Hash an open file descriptor.
|
* Hash an open file descriptor.
|
||||||
* This is a performance call when the contents of a fd need to be hashed,
|
* This is a performance call when the contents of a fd need to be hashed,
|
||||||
|
@ -834,7 +834,7 @@ static void loose_backend__stream_free(git_odb_stream *_stream)
|
|||||||
git__free(stream);
|
git__free(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_backend, size_t length, git_otype type)
|
static int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_backend, git_off_t length, git_otype type)
|
||||||
{
|
{
|
||||||
loose_backend *backend;
|
loose_backend *backend;
|
||||||
loose_writestream *stream = NULL;
|
loose_writestream *stream = NULL;
|
||||||
@ -842,7 +842,7 @@ static int loose_backend__stream(git_odb_stream **stream_out, git_odb_backend *_
|
|||||||
git_buf tmp_path = GIT_BUF_INIT;
|
git_buf tmp_path = GIT_BUF_INIT;
|
||||||
int hdrlen;
|
int hdrlen;
|
||||||
|
|
||||||
assert(_backend);
|
assert(_backend && length >= 0);
|
||||||
|
|
||||||
backend = (loose_backend *)_backend;
|
backend = (loose_backend *)_backend;
|
||||||
*stream_out = NULL;
|
*stream_out = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user