| 2370 | }; |
| 2371 | |
| 2372 | static int write_reflog_delete_table(struct reftable_writer *writer, void *cb_data) |
| 2373 | { |
| 2374 | struct write_reflog_delete_arg *arg = cb_data; |
| 2375 | struct reftable_log_record log = {0}, tombstone = {0}; |
| 2376 | struct reftable_iterator it = {0}; |
| 2377 | uint64_t ts = reftable_stack_next_update_index(arg->stack); |
| 2378 | int ret; |
| 2379 | |
| 2380 | ret = reftable_writer_set_limits(writer, ts, ts); |
| 2381 | if (ret < 0) |
| 2382 | goto out; |
| 2383 | |
| 2384 | ret = reftable_stack_init_log_iterator(arg->stack, &it); |
| 2385 | if (ret < 0) |
| 2386 | goto out; |
| 2387 | |
| 2388 | /* |
| 2389 | * In order to delete a table we need to delete all reflog entries one |
| 2390 | * by one. This is inefficient, but the reftable format does not have a |
| 2391 | * better marker right now. |
| 2392 | */ |
| 2393 | ret = reftable_iterator_seek_log(&it, arg->refname); |
| 2394 | while (ret == 0) { |
| 2395 | ret = reftable_iterator_next_log(&it, &log); |
| 2396 | if (ret < 0) |
| 2397 | break; |
| 2398 | if (ret > 0 || strcmp(log.refname, arg->refname)) { |
| 2399 | ret = 0; |
| 2400 | break; |
| 2401 | } |
| 2402 | |
| 2403 | tombstone.refname = (char *)arg->refname; |
| 2404 | tombstone.value_type = REFTABLE_LOG_DELETION; |
| 2405 | tombstone.update_index = log.update_index; |
| 2406 | |
| 2407 | ret = reftable_writer_add_log(writer, &tombstone); |
| 2408 | } |
| 2409 | |
| 2410 | out: |
| 2411 | reftable_log_record_release(&log); |
| 2412 | reftable_iterator_destroy(&it); |
| 2413 | return ret; |
| 2414 | } |
| 2415 | |
| 2416 | static int reftable_be_delete_reflog(struct ref_store *ref_store, |
| 2417 | const char *refname) |
nothing calls this directly
no test coverage detected