commit 9db65d415a148f4ac83ff7a61809965bc4867f33 from: Stefan Sperling date: Wed Mar 14 22:42:16 2018 UTC In dump_delta_chain(), don't open the packfile if it's not needed. commit - ec889268085d81afd9751a21fd0ed9ece3a824a7 commit + 9db65d415a148f4ac83ff7a61809965bc4867f33 blob - 8d1a8019c2b1bb3c2e156528186658b513812940 blob + 61c669a831956b3a22061009e31d81ad0d368210 --- lib/pack.c +++ lib/pack.c @@ -1127,15 +1127,10 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE SIMPLEQ_FOREACH(delta, &deltas->entries, entry) { uint8_t *delta_buf = NULL; size_t delta_len = 0; - FILE *delta_file; - delta_file = fopen(delta->path_packfile, "rb"); - if (delta_file == NULL) { - err = got_error_from_errno(); - goto done; - } - if (n == 0) { + FILE *delta_file; + /* Plain object types are the delta base. */ if (delta->type != GOT_OBJ_TYPE_COMMIT && delta->type != GOT_OBJ_TYPE_TREE && @@ -1145,6 +1140,12 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE 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, SEEK_SET) != 0) { fclose(delta_file); @@ -1164,6 +1165,11 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE 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_CUR) != 0) { fclose(delta_file); @@ -1182,8 +1188,7 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE delta_len, path_packfile, repo); if (err) goto done; - } else - fclose(delta_file); + } /* delta_buf is now cached */ err = got_delta_apply(base_file, delta_buf, delta_len,