| #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); | |
| } |