From: Siddharth Asthana <siddharthasthana31@gmail.com>
To: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>, git@vger.kernel.org
Cc: gitster@pobox.com, christian.couder@gmail.com, me@ttaylorr.com,
ps@pks.im, johannes.schindelin@gmx.de, l.s.r@web.de
Subject: Re: [GSoC PATCH v2 6/7] builtin/repack: add safety guards for --drop-filtered
Date: Wed, 5 Aug 2026 02:43:47 +0530 [thread overview]
Message-ID: <a81fc1be-914e-4045-87a0-cee88257fad5@gmail.com> (raw)
In-Reply-To: <20260730174153.9949-7-r.siddharth.shrimali@gmail.com>
On 30/07/26 23:11, Siddharth Shrimali wrote:
> --drop-filtered removes local promisor blobs. That is only safe when the
> repository is not mid-operation and when the blobs are not actively in
> use, so add two guards, both skipped for bare repositories which have
> neither a worktree nor an index.
>
> First, refuse to run while a merge, rebase, am, cherry-pick, revert, or
> bisect is in progress. During these operations the working tree and
> index are in an intermediate state, and rewriting packs and deleting
> objects underneath a half-finished operation is unsafe.
>
> Second, refuse to drop a blob that the current index references. Such a
Index guard looks good to me. Same idea as on the RFC.
Thanks.
Siddharth
> blob is needed by the working tree, so dropping it would only cause the
> next command that touches the worktree to lazy-fetch it straight back,
> reclaiming nothing. The offending path is reported so the user can see
> why the drop was refused.
>
> Mentored-by: Christian Couder <christian.couder@gmail.com>
> Mentored-by: Siddharth Asthana <siddharthasthana31@gmail.com>
> Signed-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>
> ---
> builtin/repack.c | 47 +++++++++++++++++++++++++++++++++
> t/t7706-repack-drop-filtered.sh | 36 +++++++++++++++++++++++++
> 2 files changed, 83 insertions(+)
>
> diff --git a/builtin/repack.c b/builtin/repack.c
> index 9a15ab1f2a..2339bcaac4 100644
> --- a/builtin/repack.c
> +++ b/builtin/repack.c
> @@ -17,6 +17,8 @@
> #include "list-objects-filter-options.h"
> #include "oidset.h"
> #include "hex.h"
> +#include "wt-status.h"
> +#include "read-cache-ll.h"
>
> #define ALL_INTO_ONE 1
> #define LOOSEN_UNREACHABLE 2
> @@ -309,6 +311,28 @@ int cmd_repack(int argc,
> if (!repo_has_promisor_remote(repo))
> die(_("--drop-filtered requires a promisor remote"));
>
> + /*
> + * refuse to drop objects while another operation is in
> + * progress. the working tree and index are in an
> + * intermediate state, and rewriting packs in a half-finished
> + * merge/rebase/cherry-pick/revert/bisect is unsafe
> + * bare repositories have no such state, so the check
> + * is skipped there
> + */
> + if (!is_bare_repository(repo)) {
> + struct wt_status_state state = { 0 };
> +
> + wt_status_get_state(repo, &state, 0);
> + if (state.merge_in_progress || state.revert_in_progress ||
> + state.rebase_in_progress ||state.bisect_in_progress ||
> + state.cherry_pick_in_progress ||state.am_in_progress||
> + state.rebase_interactive_in_progress) {
> + wt_status_state_free_buffers(&state);
> + die(_("--drop-filtered cannot be used while another operation is in progress"));
> + }
> + wt_status_state_free_buffers(&state);
> + }
> +
> write_bitmaps = 0;
>
> /*
> @@ -324,6 +348,29 @@ int cmd_repack(int argc,
> if (ret)
> goto cleanup;
>
> + /*
> + * refuse to drop blobs that the current index references.
> + * dropping such a blob would cause the very next command
> + * that touches the worktree to lazy-fetch it straight back, so
> + * the drop would reclaim nothing. bare repositories have no
> + * index, so the check is skipped there.
> + */
> + if (!is_bare_repository(repo) && oidset_size(&drop_oids)) {
> + struct index_state *istate = repo->index;
> + unsigned int i;
> +
> + if (repo_read_index(repo) < 0)
> + die(_("could not read the index"));
> +
> + for (i = 0; i < istate->cache_nr; i++) {
> + const struct cache_entry *ce = istate->cache[i];
> +
> + if (oidset_contains(&drop_oids, &ce->oid))
> + die(_("cannot drop '%s' (%s): it is referenced by the current index"),
> + ce->name, oid_to_hex(&ce->oid));
> + }
> + }
> +
> if (dry_run) {
> struct oidset_iter iter;
> const struct object_id *oid;
> diff --git a/t/t7706-repack-drop-filtered.sh b/t/t7706-repack-drop-filtered.sh
> index b3e493e851..dabed97541 100755
> --- a/t/t7706-repack-drop-filtered.sh
> +++ b/t/t7706-repack-drop-filtered.sh
> @@ -140,4 +140,40 @@ test_expect_success '--drop-filtered removes the promisor blob locally' '
> grep -q "$SMALL" present
> '
>
> +test_expect_success '--drop-filtered refuses when a merge is in progress' '
> + test_when_finished "git -C repo merge --abort || :" &&
> +
> + # creat a conflicting merge so wt_status reports it
> + git -C repo checkout -B mergebase base &&
> + echo one >repo/conflict.txt &&
> + git -C repo add conflict.txt &&
> + git -C repo commit -m one &&
> +
> + git -C repo checkout -B mergeother base &&
> + echo two >repo/conflict.txt &&
> + git -C repo add conflict.txt &&
> + git -C repo commit -m two &&
> +
> + test_must_fail git -C repo merge mergebase &&
> +
> + test_must_fail git -C repo -c repack.writeBitmaps=false \
> + repack --drop-filtered --filter=blob:limit=1k --dry-run -a 2>err &&
> + test_grep "in progress" err
> +'
> +
> +
> +test_expect_success '--drop-filtered refuses to drop an index-referenced blob' '
> + # create a large blob, add it to the index and make it a promisor object
> + # so the index references it and enumeration picks it up
> + test-tool genrandom idx 4096 >repo/tracked-big.bin &&
> + git -C repo add tracked-big.bin &&
> + OID=$(git -C repo rev-parse :tracked-big.bin) &&
> + printf "%s\n" "$OID" | pack_as_from_promisor >/dev/null &&
> + delete_object repo "$OID" &&
> +
> + test_must_fail git -C repo -c repack.writeBitmaps=false \
> + repack --drop-filtered --filter=blob:limit=1k --dry-run -a 2>err &&
> + test_grep "referenced by the current index" err
> +'
> +
> test_done
next prev parent reply other threads:[~2026-08-04 21:13 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 13:28 [RFC PATCH 0/7] repack: add --drop-filtered to reclaim space in partial clones Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 1/7] builtin/repack.c: add --drop-filtered and --dry-run options Siddharth Shrimali
2026-07-16 21:08 ` Junio C Hamano
2026-07-17 18:00 ` Siddharth Shrimali
2026-07-23 19:31 ` Siddharth Asthana
2026-07-18 12:30 ` Christian Couder
2026-07-20 10:19 ` Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 2/7] list-objects-filter: add list_objects_filter__filter_oidset() Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 3/7] repack-promisor: allow excluding objects from the rebuilt promisor pack Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 4/7] builtin/repack: enumerate promisor blobs for --drop-filtered Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 5/7] t7706: test --drop-filtered enumeration and validation Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 6/7] builtin/repack: actually drop filtered promisor blobs Siddharth Shrimali
2026-07-23 19:42 ` Siddharth Asthana
2026-07-25 19:30 ` Siddharth Shrimali
2026-07-16 13:28 ` [RFC PATCH 7/7] repack-promisor: record dropped objects in a drop log Siddharth Shrimali
2026-07-23 19:41 ` Siddharth Asthana
2026-07-25 19:35 ` Siddharth Shrimali
2026-07-23 19:26 ` [RFC PATCH 0/7] repack: add --drop-filtered to reclaim space in partial clones Siddharth Asthana
2026-07-25 19:23 ` Siddharth Shrimali
2026-07-30 17:41 ` [GSoC PATCH v2 " Siddharth Shrimali
2026-07-30 17:41 ` [GSoC PATCH v2 1/7] builtin/repack.c: add --drop-filtered and --dry-run options Siddharth Shrimali
2026-08-04 21:13 ` Siddharth Asthana
2026-07-30 17:41 ` [GSoC PATCH v2 2/7] list-objects-filter: add list_objects_filter__filter_oidset() Siddharth Shrimali
2026-07-30 17:41 ` [GSoC PATCH v2 3/7] repack-promisor: allow excluding objects from the rebuilt promisor pack Siddharth Shrimali
2026-07-30 17:41 ` [GSoC PATCH v2 4/7] builtin/repack: enumerate promisor blobs for --drop-filtered Siddharth Shrimali
2026-07-30 17:41 ` [GSoC PATCH v2 5/7] builtin/repack: actually drop filtered promisor blobs Siddharth Shrimali
2026-07-30 17:41 ` [GSoC PATCH v2 6/7] builtin/repack: add safety guards for --drop-filtered Siddharth Shrimali
2026-08-04 21:13 ` Siddharth Asthana [this message]
2026-07-30 17:41 ` [GSoC PATCH v2 7/7] Documentation/git-repack: document --drop-filtered and --dry-run Siddharth Shrimali
2026-07-31 15:33 ` [GSoC PATCH v2 0/7] repack: add --drop-filtered to reclaim space in partial clones Junio C Hamano
2026-08-01 18:19 ` Siddharth Shrimali
2026-08-02 2:18 ` Junio C Hamano
2026-08-02 11:28 ` Siddharth Shrimali
2026-08-04 21:12 ` Siddharth Asthana
2026-08-06 11:21 ` [GSoC PATCH v3 " Siddharth Shrimali
2026-08-06 11:21 ` [GSoC PATCH v3 1/7] builtin/repack.c: add --drop-filtered and --dry-run options Siddharth Shrimali
2026-08-06 11:21 ` [GSoC PATCH v3 2/7] list-objects-filter: add list_objects_filter__filter_oidset() Siddharth Shrimali
2026-08-06 11:21 ` [GSoC PATCH v3 3/7] repack-promisor: allow excluding objects from the rebuilt promisor pack Siddharth Shrimali
2026-08-06 11:21 ` [GSoC PATCH v3 4/7] builtin/repack: enumerate promisor blobs for --drop-filtered Siddharth Shrimali
2026-08-06 11:22 ` [GSoC PATCH v3 5/7] builtin/repack: actually drop filtered promisor blobs Siddharth Shrimali
2026-08-06 11:22 ` [GSoC PATCH v3 6/7] builtin/repack: add guards for --drop-filtered Siddharth Shrimali
2026-08-06 11:22 ` [GSoC PATCH v3 7/7] Documentation/git-repack: document --drop-filtered and --dry-run Siddharth Shrimali
2026-08-06 21:34 ` [GSoC PATCH v3 0/7] repack: add --drop-filtered to reclaim space in partial clones Junio C Hamano
2026-08-06 22:19 ` Junio C Hamano
2026-08-07 9:06 ` Siddharth Shrimali
2026-08-07 20:52 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a81fc1be-914e-4045-87a0-cee88257fad5@gmail.com \
--to=siddharthasthana31@gmail.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=l.s.r@web.de \
--cc=me@ttaylorr.com \
--cc=ps@pks.im \
--cc=r.siddharth.shrimali@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.