| #include "git-compat-util.h" |
| #include "repack.h" |
| #include "repository.h" |
| #include "run-command.h" |
| #include "string-list.h" |
| |
| int write_filtered_pack(const struct write_pack_opts *opts, |
| struct existing_packs *existing, |
| struct string_list *names) |
| { |
| struct child_process cmd = CHILD_PROCESS_INIT; |
| struct string_list_item *item; |
| FILE *in; |
| int ret; |
| const char *caret; |
| const char *pack_prefix = write_pack_opts_pack_prefix(opts); |
| |
| prepare_pack_objects(&cmd, opts->po_args, opts->destination); |
| |
| strvec_push(&cmd.args, "--stdin-packs"); |
| |
| for_each_string_list_item(item, &existing->kept_packs) |
| strvec_pushf(&cmd.args, "--keep-pack=%s", item->string); |
| |
| cmd.in = -1; |
| |
| ret = start_command(&cmd); |
| if (ret) |
| return ret; |
| |
| /* |
| * Here 'names' contains only the pack(s) that were just |
| * written, which is exactly the packs we want to keep. Also |
| * 'existing_kept_packs' already contains the packs in |
| * 'keep_pack_list'. |
| */ |
| in = xfdopen(cmd.in, "w"); |
| for_each_string_list_item(item, names) |
| fprintf(in, "^%s-%s.pack\n", pack_prefix, item->string); |
| for_each_string_list_item(item, &existing->non_kept_packs) |
| fprintf(in, "%s.pack\n", item->string); |
| for_each_string_list_item(item, &existing->cruft_packs) |
| fprintf(in, "%s.pack\n", item->string); |
| caret = opts->po_args->pack_kept_objects ? "" : "^"; |
| for_each_string_list_item(item, &existing->kept_packs) |
| fprintf(in, "%s%s.pack\n", caret, item->string); |
| fclose(in); |
| |
| return finish_pack_objects_cmd(existing->repo->hash_algo, opts, &cmd, |
| names); |
| } |