Commit Diff


commit - e39a17e2af24e9e217862e7c5221afe33a65aa24
commit + ab6186ae7d9e4f25db5401fc5953073c1c27ce86
blob - ab321670f87d99ceb8e97a9fd709bab32f675dfe
blob + 0182edd3af82986f364ff86ab43cee6b3b88f795
--- lib/pack_create.c
+++ lib/pack_create.c
@@ -54,6 +54,7 @@ struct got_pack_meta {
 	struct got_object_id id;
 	char	*path;
 	int	obj_type;
+	off_t	size;
 	time_t	mtime;
 
 	/* The best delta we picked */
@@ -194,6 +195,7 @@ pick_deltas(struct got_pack_meta **meta, int nmeta, in
 		err = got_object_raw_open(&raw, repo, &m->id, 8192);
 		if (err)
 			goto done;
+		m->size = raw->size;
 
 		err = got_deltify_init(&m->dtab, raw->f, raw->hdrlen,
 		    raw->size + raw->hdrlen);
@@ -1119,7 +1121,7 @@ genpack(uint8_t *pack_sha1, FILE *packfile,
 	off_t nd;
 	SHA1_CTX ctx;
 	struct got_pack_meta *m;
-	struct got_raw_object *raw = NULL, *base_raw = NULL;
+	struct got_raw_object *raw = NULL;
 	FILE *delta_file = NULL;
 	char buf[32];
 	size_t outlen, n;
@@ -1189,11 +1191,7 @@ genpack(uint8_t *pack_sha1, FILE *packfile,
 				err = got_error_from_errno("fseeko");
 				goto done;
 			}
-			err = got_object_raw_open(&base_raw, repo,
-			    &m->prev->id, 8192);
-			if (err)
-				goto done;
-			err = encodedelta(m, raw, base_raw->size, delta_file);
+			err = encodedelta(m, raw, m->prev->size, delta_file);
 			if (err)
 				goto done;
 			nd = ftello(delta_file);
@@ -1201,8 +1199,6 @@ genpack(uint8_t *pack_sha1, FILE *packfile,
 				err = got_error_from_errno("fseeko");
 				goto done;
 			}
-			got_object_raw_close(base_raw);
-			base_raw = NULL;
 			if (use_offset_deltas && m->prev->off != 0) {
 				err = packhdr(&nh, buf, sizeof(buf),
 				    GOT_OBJ_TYPE_OFFSET_DELTA, nd);
@@ -1251,8 +1247,6 @@ done:
 		err = got_error_from_errno("fclose");
 	if (raw)
 		got_object_raw_close(raw);
-	if (base_raw)
-		got_object_raw_close(base_raw);
 	return err;
 }