streaming: allow open_istream() to handle any repo
Some callers of open_istream() at archive-tar.c and archive-zip.c are capable of working on arbitrary repositories but the repo struct is not passed down to open_istream(), which uses the_repository internally. For now, that's not a problem since the said callers are only being called with the_repository. But to be consistent and avoid future problems, let's allow open_istream() to receive a struct repository and use that instead of the_repository. This parameter addition will also be used in a future patch to make sha1-file.c:check_object_signature() be able to work on arbitrary repos. Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5ec9b8accd
commit
c8123e72f6
@ -112,7 +112,7 @@ static void write_trailer(void)
|
|||||||
* queues up writes, so that all our write(2) calls write exactly one
|
* queues up writes, so that all our write(2) calls write exactly one
|
||||||
* full block; pads writes to RECORDSIZE
|
* full block; pads writes to RECORDSIZE
|
||||||
*/
|
*/
|
||||||
static int stream_blocked(const struct object_id *oid)
|
static int stream_blocked(struct repository *r, const struct object_id *oid)
|
||||||
{
|
{
|
||||||
struct git_istream *st;
|
struct git_istream *st;
|
||||||
enum object_type type;
|
enum object_type type;
|
||||||
@ -120,7 +120,7 @@ static int stream_blocked(const struct object_id *oid)
|
|||||||
char buf[BLOCKSIZE];
|
char buf[BLOCKSIZE];
|
||||||
ssize_t readlen;
|
ssize_t readlen;
|
||||||
|
|
||||||
st = open_istream(oid, &type, &sz, NULL);
|
st = open_istream(r, oid, &type, &sz, NULL);
|
||||||
if (!st)
|
if (!st)
|
||||||
return error(_("cannot stream blob %s"), oid_to_hex(oid));
|
return error(_("cannot stream blob %s"), oid_to_hex(oid));
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -324,7 +324,7 @@ static int write_tar_entry(struct archiver_args *args,
|
|||||||
if (buffer)
|
if (buffer)
|
||||||
write_blocked(buffer, size);
|
write_blocked(buffer, size);
|
||||||
else
|
else
|
||||||
err = stream_blocked(oid);
|
err = stream_blocked(args->repo, oid);
|
||||||
}
|
}
|
||||||
free(buffer);
|
free(buffer);
|
||||||
return err;
|
return err;
|
||||||
|
@ -345,7 +345,8 @@ static int write_zip_entry(struct archiver_args *args,
|
|||||||
|
|
||||||
if (S_ISREG(mode) && type == OBJ_BLOB && !args->convert &&
|
if (S_ISREG(mode) && type == OBJ_BLOB && !args->convert &&
|
||||||
size > big_file_threshold) {
|
size > big_file_threshold) {
|
||||||
stream = open_istream(oid, &type, &size, NULL);
|
stream = open_istream(args->repo, oid, &type, &size,
|
||||||
|
NULL);
|
||||||
if (!stream)
|
if (!stream)
|
||||||
return error(_("cannot stream blob %s"),
|
return error(_("cannot stream blob %s"),
|
||||||
oid_to_hex(oid));
|
oid_to_hex(oid));
|
||||||
|
@ -757,7 +757,8 @@ static int check_collison(struct object_entry *entry)
|
|||||||
|
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
data.entry = entry;
|
data.entry = entry;
|
||||||
data.st = open_istream(&entry->idx.oid, &type, &size, NULL);
|
data.st = open_istream(the_repository, &entry->idx.oid, &type, &size,
|
||||||
|
NULL);
|
||||||
if (!data.st)
|
if (!data.st)
|
||||||
return -1;
|
return -1;
|
||||||
if (size != entry->size || type != entry->type)
|
if (size != entry->size || type != entry->type)
|
||||||
|
@ -303,7 +303,8 @@ static unsigned long write_no_reuse_object(struct hashfile *f, struct object_ent
|
|||||||
if (!usable_delta) {
|
if (!usable_delta) {
|
||||||
if (oe_type(entry) == OBJ_BLOB &&
|
if (oe_type(entry) == OBJ_BLOB &&
|
||||||
oe_size_greater_than(&to_pack, entry, big_file_threshold) &&
|
oe_size_greater_than(&to_pack, entry, big_file_threshold) &&
|
||||||
(st = open_istream(&entry->idx.oid, &type, &size, NULL)) != NULL)
|
(st = open_istream(the_repository, &entry->idx.oid, &type,
|
||||||
|
&size, NULL)) != NULL)
|
||||||
buf = NULL;
|
buf = NULL;
|
||||||
else {
|
else {
|
||||||
buf = read_object_file(&entry->idx.oid, &type, &size);
|
buf = read_object_file(&entry->idx.oid, &type, &size);
|
||||||
|
@ -986,7 +986,7 @@ int check_object_signature(const struct object_id *oid, void *map,
|
|||||||
return !oideq(oid, &real_oid) ? -1 : 0;
|
return !oideq(oid, &real_oid) ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
st = open_istream(oid, &obj_type, &size, NULL);
|
st = open_istream(the_repository, oid, &obj_type, &size, NULL);
|
||||||
if (!st)
|
if (!st)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
28
streaming.c
28
streaming.c
@ -16,6 +16,7 @@ enum input_source {
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*open_istream_fn)(struct git_istream *,
|
typedef int (*open_istream_fn)(struct git_istream *,
|
||||||
|
struct repository *,
|
||||||
struct object_info *,
|
struct object_info *,
|
||||||
const struct object_id *,
|
const struct object_id *,
|
||||||
enum object_type *);
|
enum object_type *);
|
||||||
@ -29,8 +30,8 @@ struct stream_vtbl {
|
|||||||
|
|
||||||
#define open_method_decl(name) \
|
#define open_method_decl(name) \
|
||||||
int open_istream_ ##name \
|
int open_istream_ ##name \
|
||||||
(struct git_istream *st, struct object_info *oi, \
|
(struct git_istream *st, struct repository *r, \
|
||||||
const struct object_id *oid, \
|
struct object_info *oi, const struct object_id *oid, \
|
||||||
enum object_type *type)
|
enum object_type *type)
|
||||||
|
|
||||||
#define close_method_decl(name) \
|
#define close_method_decl(name) \
|
||||||
@ -108,7 +109,8 @@ ssize_t read_istream(struct git_istream *st, void *buf, size_t sz)
|
|||||||
return st->vtbl->read(st, buf, sz);
|
return st->vtbl->read(st, buf, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum input_source istream_source(const struct object_id *oid,
|
static enum input_source istream_source(struct repository *r,
|
||||||
|
const struct object_id *oid,
|
||||||
enum object_type *type,
|
enum object_type *type,
|
||||||
struct object_info *oi)
|
struct object_info *oi)
|
||||||
{
|
{
|
||||||
@ -117,7 +119,7 @@ static enum input_source istream_source(const struct object_id *oid,
|
|||||||
|
|
||||||
oi->typep = type;
|
oi->typep = type;
|
||||||
oi->sizep = &size;
|
oi->sizep = &size;
|
||||||
status = oid_object_info_extended(the_repository, oid, oi, 0);
|
status = oid_object_info_extended(r, oid, oi, 0);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
return stream_error;
|
return stream_error;
|
||||||
|
|
||||||
@ -133,22 +135,23 @@ static enum input_source istream_source(const struct object_id *oid,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct git_istream *open_istream(const struct object_id *oid,
|
struct git_istream *open_istream(struct repository *r,
|
||||||
|
const struct object_id *oid,
|
||||||
enum object_type *type,
|
enum object_type *type,
|
||||||
unsigned long *size,
|
unsigned long *size,
|
||||||
struct stream_filter *filter)
|
struct stream_filter *filter)
|
||||||
{
|
{
|
||||||
struct git_istream *st;
|
struct git_istream *st;
|
||||||
struct object_info oi = OBJECT_INFO_INIT;
|
struct object_info oi = OBJECT_INFO_INIT;
|
||||||
const struct object_id *real = lookup_replace_object(the_repository, oid);
|
const struct object_id *real = lookup_replace_object(r, oid);
|
||||||
enum input_source src = istream_source(real, type, &oi);
|
enum input_source src = istream_source(r, real, type, &oi);
|
||||||
|
|
||||||
if (src < 0)
|
if (src < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
st = xmalloc(sizeof(*st));
|
st = xmalloc(sizeof(*st));
|
||||||
if (open_istream_tbl[src](st, &oi, real, type)) {
|
if (open_istream_tbl[src](st, r, &oi, real, type)) {
|
||||||
if (open_istream_incore(st, &oi, real, type)) {
|
if (open_istream_incore(st, r, &oi, real, type)) {
|
||||||
free(st);
|
free(st);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -338,8 +341,7 @@ static struct stream_vtbl loose_vtbl = {
|
|||||||
|
|
||||||
static open_method_decl(loose)
|
static open_method_decl(loose)
|
||||||
{
|
{
|
||||||
st->u.loose.mapped = map_loose_object(the_repository,
|
st->u.loose.mapped = map_loose_object(r, oid, &st->u.loose.mapsize);
|
||||||
oid, &st->u.loose.mapsize);
|
|
||||||
if (!st->u.loose.mapped)
|
if (!st->u.loose.mapped)
|
||||||
return -1;
|
return -1;
|
||||||
if ((unpack_loose_header(&st->z,
|
if ((unpack_loose_header(&st->z,
|
||||||
@ -499,7 +501,7 @@ static struct stream_vtbl incore_vtbl = {
|
|||||||
|
|
||||||
static open_method_decl(incore)
|
static open_method_decl(incore)
|
||||||
{
|
{
|
||||||
st->u.incore.buf = read_object_file_extended(the_repository, oid, type, &st->size, 0);
|
st->u.incore.buf = read_object_file_extended(r, oid, type, &st->size, 0);
|
||||||
st->u.incore.read_ptr = 0;
|
st->u.incore.read_ptr = 0;
|
||||||
st->vtbl = &incore_vtbl;
|
st->vtbl = &incore_vtbl;
|
||||||
|
|
||||||
@ -520,7 +522,7 @@ int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter
|
|||||||
ssize_t kept = 0;
|
ssize_t kept = 0;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
st = open_istream(oid, &type, &sz, filter);
|
st = open_istream(the_repository, oid, &type, &sz, filter);
|
||||||
if (!st) {
|
if (!st) {
|
||||||
if (filter)
|
if (filter)
|
||||||
free_stream_filter(filter);
|
free_stream_filter(filter);
|
||||||
|
@ -8,7 +8,9 @@
|
|||||||
/* opaque */
|
/* opaque */
|
||||||
struct git_istream;
|
struct git_istream;
|
||||||
|
|
||||||
struct git_istream *open_istream(const struct object_id *, enum object_type *, unsigned long *, struct stream_filter *);
|
struct git_istream *open_istream(struct repository *, const struct object_id *,
|
||||||
|
enum object_type *, unsigned long *,
|
||||||
|
struct stream_filter *);
|
||||||
int close_istream(struct git_istream *);
|
int close_istream(struct git_istream *);
|
||||||
ssize_t read_istream(struct git_istream *, void *, size_t);
|
ssize_t read_istream(struct git_istream *, void *, size_t);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user