| 965 | } |
| 966 | |
| 967 | static int stack_write_compact(struct reftable_stack *st, |
| 968 | struct reftable_writer *wr, |
| 969 | size_t first, size_t last, |
| 970 | struct reftable_log_expiry_config *config) |
| 971 | { |
| 972 | struct reftable_merged_table *mt = NULL; |
| 973 | struct reftable_iterator it = { NULL }; |
| 974 | struct reftable_ref_record ref = { NULL }; |
| 975 | struct reftable_log_record log = { NULL }; |
| 976 | size_t subtabs_len = last - first + 1; |
| 977 | uint64_t entries = 0; |
| 978 | int err = 0; |
| 979 | |
| 980 | for (size_t i = first; i <= last; i++) |
| 981 | st->stats.bytes += st->tables[i]->size; |
| 982 | err = reftable_writer_set_limits(wr, st->tables[first]->min_update_index, |
| 983 | st->tables[last]->max_update_index); |
| 984 | if (err < 0) |
| 985 | goto done; |
| 986 | |
| 987 | err = reftable_merged_table_new(&mt, st->tables + first, subtabs_len, |
| 988 | st->opts.hash_id); |
| 989 | if (err < 0) |
| 990 | goto done; |
| 991 | |
| 992 | err = merged_table_init_iter(mt, &it, REFTABLE_BLOCK_TYPE_REF); |
| 993 | if (err < 0) |
| 994 | goto done; |
| 995 | |
| 996 | err = reftable_iterator_seek_ref(&it, ""); |
| 997 | if (err < 0) |
| 998 | goto done; |
| 999 | |
| 1000 | while (1) { |
| 1001 | err = reftable_iterator_next_ref(&it, &ref); |
| 1002 | if (err > 0) { |
| 1003 | err = 0; |
| 1004 | break; |
| 1005 | } |
| 1006 | if (err < 0) |
| 1007 | goto done; |
| 1008 | |
| 1009 | if (first == 0 && reftable_ref_record_is_deletion(&ref)) { |
| 1010 | continue; |
| 1011 | } |
| 1012 | |
| 1013 | err = reftable_writer_add_ref(wr, &ref); |
| 1014 | if (err < 0) |
| 1015 | goto done; |
| 1016 | entries++; |
| 1017 | } |
| 1018 | reftable_iterator_destroy(&it); |
| 1019 | |
| 1020 | err = merged_table_init_iter(mt, &it, REFTABLE_BLOCK_TYPE_LOG); |
| 1021 | if (err < 0) |
| 1022 | goto done; |
| 1023 | |
| 1024 | err = reftable_iterator_seek_log(&it, ""); |
no test coverage detected