|
1 | 1 | #include "../git-compat-util.h"
|
2 | 2 | #include "../abspath.h"
|
3 | 3 | #include "../chdir-notify.h"
|
| 4 | +#include "../dir.h" |
4 | 5 | #include "../environment.h"
|
5 | 6 | #include "../gettext.h"
|
6 | 7 | #include "../hash.h"
|
@@ -343,6 +344,56 @@ static int reftable_be_create_on_disk(struct ref_store *ref_store,
|
343 | 344 | return 0;
|
344 | 345 | }
|
345 | 346 |
|
| 347 | +static int reftable_be_remove_on_disk(struct ref_store *ref_store, |
| 348 | + struct strbuf *err) |
| 349 | +{ |
| 350 | + struct reftable_ref_store *refs = |
| 351 | + reftable_be_downcast(ref_store, REF_STORE_WRITE, "remove"); |
| 352 | + struct strbuf sb = STRBUF_INIT; |
| 353 | + int ret = 0; |
| 354 | + |
| 355 | + /* |
| 356 | + * Release the ref store such that all stacks are closed. This is |
| 357 | + * required so that the "tables.list" file is not open anymore, which |
| 358 | + * would otherwise make it impossible to remove the file on Windows. |
| 359 | + */ |
| 360 | + reftable_be_release(ref_store); |
| 361 | + |
| 362 | + strbuf_addf(&sb, "%s/reftable", refs->base.gitdir); |
| 363 | + if (remove_dir_recursively(&sb, 0) < 0) { |
| 364 | + strbuf_addf(err, "could not delete reftables: %s", |
| 365 | + strerror(errno)); |
| 366 | + ret = -1; |
| 367 | + } |
| 368 | + strbuf_reset(&sb); |
| 369 | + |
| 370 | + strbuf_addf(&sb, "%s/HEAD", refs->base.gitdir); |
| 371 | + if (unlink(sb.buf) < 0) { |
| 372 | + strbuf_addf(err, "could not delete stub HEAD: %s", |
| 373 | + strerror(errno)); |
| 374 | + ret = -1; |
| 375 | + } |
| 376 | + strbuf_reset(&sb); |
| 377 | + |
| 378 | + strbuf_addf(&sb, "%s/refs/heads", refs->base.gitdir); |
| 379 | + if (unlink(sb.buf) < 0) { |
| 380 | + strbuf_addf(err, "could not delete stub heads: %s", |
| 381 | + strerror(errno)); |
| 382 | + ret = -1; |
| 383 | + } |
| 384 | + strbuf_reset(&sb); |
| 385 | + |
| 386 | + strbuf_addf(&sb, "%s/refs", refs->base.gitdir); |
| 387 | + if (rmdir(sb.buf) < 0) { |
| 388 | + strbuf_addf(err, "could not delete refs directory: %s", |
| 389 | + strerror(errno)); |
| 390 | + ret = -1; |
| 391 | + } |
| 392 | + |
| 393 | + strbuf_release(&sb); |
| 394 | + return ret; |
| 395 | +} |
| 396 | + |
346 | 397 | struct reftable_ref_iterator {
|
347 | 398 | struct ref_iterator base;
|
348 | 399 | struct reftable_ref_store *refs;
|
@@ -2196,6 +2247,7 @@ struct ref_storage_be refs_be_reftable = {
|
2196 | 2247 | .init = reftable_be_init,
|
2197 | 2248 | .release = reftable_be_release,
|
2198 | 2249 | .create_on_disk = reftable_be_create_on_disk,
|
| 2250 | + .remove_on_disk = reftable_be_remove_on_disk, |
2199 | 2251 |
|
2200 | 2252 | .transaction_prepare = reftable_be_transaction_prepare,
|
2201 | 2253 | .transaction_finish = reftable_be_transaction_finish,
|
|
0 commit comments