From: Junio C Hamano Date: Fri, 10 Apr 2026 23:30:40 GMT Subject: Re: [GSoC PATCH v5 2/6] repack-promisor add helper to fill promisor file after repack Message-ID: In-Reply-To: <3558bb38956b522c91057598db645eb42ffb48b2.1775861047.git.lorenzo.pegorari2002@gmail.com> LorenzoPegorari writes: > + dest_pack = parse_pack_index(repo, dest_oid.hash, dest_idx_name); parse_pack_index() has this comment: /* * Parse the pack idx file found at idx_path and create a packed_git struct * which can be used with find_pack_entry_one(). * * You probably don't want to use this function! It skips most of the normal * sanity checks (including whether we even have the matching .pack file), * and does not add the resulting packed_git struct to the internal list of * packs. You probably want add_packed_git() instead. */ struct packed_git *parse_pack_index(struct repository *r, unsigned char *sha1, const char *idx_path); The function can return NULL, but this caller does not seem to be prepared for it to return NULL (i.e., the loop introduced by the repo_for_each_pack() macro we see below, nobody assumes dest_pack could be NULL). But what pack index file are we parsing here? Isn't it already part of the running system that we should be able to find on the list of packfiles in the packfile store? Is this because we lack "find a packfile on this packfile store by name" API, because what we want to find if each of s we have appear in the particular packfile or not, and packfile_list_find_oid() is not sufficiently precise (i.e. "the object appears in one of the packfile on the list" is not what we want to know, "the object appears in this particular packfile" is)? Patrick CC'ed primarily because this part of the API and the data structures have been reshuffled to add quite a lot of abstraction since I last looked at the area. As close_pack_index(dest_pack) does not release resources held by dest_pack itself (even though the region of mmaped memory that is pointed at by its index_data member is unmapped), I think that is where the memory leak is breaking the CI jobs (see my other message). But I am not sure if the use of parse_pack_index() - close_pack_index() API is the right thing to use here. > + /* Open the .promisor dest file, and fill dest_content with its content */ > + dest_promisor_name = mkpathdup("%s-%s.promisor", packtmp, dest_hex); > + dest = xfopen(dest_promisor_name, "r+"); > + while (strbuf_getline(&line, dest) != EOF) > + strset_add(&dest_content, line.buf); > + > + repo_for_each_pack(repo, p) { > + FILE *source; > + struct stat source_stat; > + > + if (!p->pack_promisor) > + continue; > + > + if (not_repacked_basenames && > + strset_contains(not_repacked_basenames, pack_basename(p))) > + continue; > + > + strbuf_reset(&source_promisor_name); > + strbuf_addstr(&source_promisor_name, p->pack_name); > + strbuf_strip_suffix(&source_promisor_name, ".pack"); > + strbuf_addstr(&source_promisor_name, ".promisor"); > + > + if (stat(source_promisor_name.buf, &source_stat)) > + die(_("File not found: %s"), source_promisor_name.buf); > + > + source = xfopen(source_promisor_name.buf, "r"); > + > + while (strbuf_getline(&line, source) != EOF) { > + struct string_list line_sections = STRING_LIST_INIT_DUP; > + struct object_id oid; > + > + /* Split line into , and