commit - 6845d2847706fc21a9a908825e35495ee75ac5e8
commit + ef2bccd93f110957437a89413bd4e27853c396b6
blob - c187dc31fb4d77d7908a8334c2dc1a939230168d
blob + 94fda1c82fa2d7d311a3d61327877d216a308125
--- lib/delta.c
+++ lib/delta.c
if (delta == NULL)
return NULL;
- delta->path_packfile = strdup(path_packfile);
- if (delta->path_packfile == NULL) {
- free(delta);
- return NULL;
- }
delta->type = type;
delta->offset = offset;
delta->tslen = tslen;
void
got_delta_close(struct got_delta *delta)
{
- free(delta->path_packfile);
free(delta);
-
}
const struct got_error *
blob - 27f892a1d1f51a54cd4519bf471c326285fd47ae
blob + 2d360fffb4e36cf7edb6b21c83237eb7faaa1802
--- lib/got_delta_lib.h
+++ lib/got_delta_lib.h
struct got_delta {
SIMPLEQ_ENTRY(got_delta) entry;
- char *path_packfile;
off_t offset;
size_t tslen;
int type;
blob - 5a8a6951f9a6a2d428c127cfd94ad1c2f20be268
blob + f8b51cebf8470a34f67abea5e6fe82cd4d697f26
--- lib/pack.c
+++ lib/pack.c
static const struct got_error *
get_delta_sizes(uint64_t *base_size, uint64_t *result_size,
- struct got_delta *delta)
+ struct got_delta *delta, FILE *packfile)
{
const struct got_error *err;
uint8_t *delta_buf = NULL;
size_t delta_len = 0;
- FILE *delta_file;
- delta_file = fopen(delta->path_packfile, "rb");
- if (delta_file == NULL)
- return got_error_from_errno();
-
- if (fseeko(delta_file, delta->data_offset, SEEK_SET) != 0) {
+ if (fseeko(packfile, delta->data_offset, SEEK_SET) != 0) {
err = got_error_from_errno();
- fclose(delta_file);
return err;
}
- err = got_inflate_to_mem(&delta_buf, &delta_len, delta_file);
- fclose(delta_file);
+ err = got_inflate_to_mem(&delta_buf, &delta_len, packfile);
if (err)
return err;
}
static const struct got_error *
-get_delta_chain_max_size(uint64_t *max_size, struct got_delta_chain *deltas)
+get_delta_chain_max_size(uint64_t *max_size, struct got_delta_chain *deltas,
+ FILE *packfile)
{
struct got_delta *delta;
uint64_t base_size = 0, result_size = 0;
delta->type != GOT_OBJ_TYPE_BLOB &&
delta->type != GOT_OBJ_TYPE_TAG) {
const struct got_error *err;
- err = get_delta_sizes(&base_size, &result_size, delta);
+ err = get_delta_sizes(&base_size, &result_size, delta,
+ packfile);
if (err)
return err;
} else
static const struct got_error *
dump_delta_chain_to_file(struct got_delta_chain *deltas, FILE *outfile,
- const char *path_packfile, struct got_repository *repo)
+ FILE *packfile, const char *path_packfile, struct got_repository *repo)
{
const struct got_error *err = NULL;
struct got_delta *delta;
return got_error(GOT_ERR_BAD_DELTA_CHAIN);
/* We process small enough files entirely in memory for speed. */
- err = get_delta_chain_max_size(&max_size, deltas);
+ err = get_delta_chain_max_size(&max_size, deltas, packfile);
if (err)
return err;
if (max_size < GOT_DELTA_RESULT_SIZE_CACHED_MAX) {
size_t delta_len = 0;
if (n == 0) {
- FILE *delta_file;
size_t base_len;
/* Plain object types are the delta base. */
goto done;
}
- delta_file = fopen(delta->path_packfile, "rb");
- if (delta_file == NULL) {
- err = got_error_from_errno();
- goto done;
- }
-
- if (fseeko(delta_file, delta->offset + delta->tslen,
+ if (fseeko(packfile, delta->offset + delta->tslen,
SEEK_SET) != 0) {
- fclose(delta_file);
err = got_error_from_errno();
goto done;
}
if (base_file)
err = got_inflate_to_file(&delta_len,
- delta_file, base_file);
+ packfile, base_file);
else {
err = got_inflate_to_mem(&base_buf, &base_len,
- delta_file);
+ packfile);
if (base_len < max_size) {
uint8_t *p;
p = reallocarray(base_buf, 1, max_size);
base_buf = p;
}
}
- fclose(delta_file);
if (err)
goto done;
n++;
get_cached_delta(&delta_buf, &delta_len, delta->data_offset,
path_packfile, repo);
if (delta_buf == NULL) {
- FILE *delta_file = fopen(delta->path_packfile, "rb");
- if (delta_file == NULL) {
- err = got_error_from_errno();
- goto done;
- }
- if (fseeko(delta_file, delta->data_offset, SEEK_SET)
+ if (fseeko(packfile, delta->data_offset, SEEK_SET)
!= 0) {
- fclose(delta_file);
err = got_error_from_errno();
goto done;
}
/* Delta streams should always fit in memory. */
err = got_inflate_to_mem(&delta_buf, &delta_len,
- delta_file);
- fclose(delta_file);
+ packfile);
if (err)
goto done;
static const struct got_error *
dump_delta_chain_to_mem(uint8_t **outbuf, size_t *outlen,
- struct got_delta_chain *deltas, const char *path_packfile,
+ struct got_delta_chain *deltas, FILE *packfile, const char *path_packfile,
struct got_repository *repo)
{
const struct got_error *err = NULL;
if (SIMPLEQ_EMPTY(&deltas->entries))
return got_error(GOT_ERR_BAD_DELTA_CHAIN);
- err = get_delta_chain_max_size(&max_size, deltas);
+ err = get_delta_chain_max_size(&max_size, deltas, packfile);
if (err)
return err;
accum_buf = malloc(max_size);
size_t delta_len = 0;
if (n == 0) {
- FILE *delta_file;
size_t base_len;
/* Plain object types are the delta base. */
goto done;
}
- delta_file = fopen(delta->path_packfile, "rb");
- if (delta_file == NULL) {
- err = got_error_from_errno();
- goto done;
- }
-
- if (fseeko(delta_file, delta->offset + delta->tslen,
+ if (fseeko(packfile, delta->offset + delta->tslen,
SEEK_SET) != 0) {
- fclose(delta_file);
err = got_error_from_errno();
goto done;
}
err = got_inflate_to_mem(&base_buf, &base_len,
- delta_file);
+ packfile);
if (base_len < max_size) {
uint8_t *p;
p = reallocarray(base_buf, 1, max_size);
}
base_buf = p;
}
- fclose(delta_file);
if (err)
goto done;
n++;
get_cached_delta(&delta_buf, &delta_len, delta->data_offset,
path_packfile, repo);
if (delta_buf == NULL) {
- FILE *delta_file = fopen(delta->path_packfile, "rb");
- if (delta_file == NULL) {
- err = got_error_from_errno();
- goto done;
- }
- if (fseeko(delta_file, delta->data_offset, SEEK_SET)
+ if (fseeko(packfile, delta->data_offset, SEEK_SET)
!= 0) {
- fclose(delta_file);
err = got_error_from_errno();
goto done;
}
/* Delta streams should always fit in memory. */
err = got_inflate_to_mem(&delta_buf, &delta_len,
- delta_file);
- fclose(delta_file);
+ packfile);
if (err)
goto done;
goto done;
}
+ packfile = fopen(obj->path_packfile, "rb");
+ if (packfile == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+
if ((obj->flags & GOT_OBJ_FLAG_DELTIFIED) == 0) {
- packfile = fopen(obj->path_packfile, "rb");
- if (packfile == NULL) {
- err = got_error_from_errno();
- goto done;
- }
-
if (fseeko(packfile, obj->pack_offset, SEEK_SET) != 0) {
err = got_error_from_errno();
goto done;
err = got_inflate_to_file(&obj->size, packfile, *f);
} else
- err = dump_delta_chain_to_file(&obj->deltas, *f,
+ err = dump_delta_chain_to_file(&obj->deltas, *f, packfile,
obj->path_packfile, repo);
done:
if (packfile)
if ((obj->flags & GOT_OBJ_FLAG_PACKED) == 0)
return got_error(GOT_ERR_OBJ_NOT_PACKED);
+ packfile = fopen(obj->path_packfile, "rb");
+ if (packfile == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+
if ((obj->flags & GOT_OBJ_FLAG_DELTIFIED) == 0) {
- packfile = fopen(obj->path_packfile, "rb");
- if (packfile == NULL) {
- err = got_error_from_errno();
- goto done;
- }
-
if (fseeko(packfile, obj->pack_offset, SEEK_SET) != 0) {
err = got_error_from_errno();
goto done;
err = got_inflate_to_mem(buf, len, packfile);
} else
- err = dump_delta_chain_to_mem(buf, len, &obj->deltas,
+ err = dump_delta_chain_to_mem(buf, len, &obj->deltas, packfile,
obj->path_packfile, repo);
done:
if (packfile)