On Wed, Aug 23, 2017 at 5:36 AM, Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> wrote: > This is the result of single_worktree flag never being set (no way to up > until now). To get objects from current index only, set single_worktree. > > The other add_index_objects_to_pending's caller is mark_reachable_objects() > (e.g. "git prune") which also mark objects from all indexes. > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- > revision.c | 21 +++++++++++++++++++++ > t/t5304-prune.sh | 9 +++++++++ > 2 files changed, 30 insertions(+) > > diff --git a/revision.c b/revision.c > index 6c46ad6c8a..f35cb49af5 100644 > --- a/revision.c > +++ b/revision.c > @@ -19,6 +19,7 @@ > #include "dir.h" > #include "cache-tree.h" > #include "bisect.h" > +#include "worktree.h" > > volatile show_early_output_fn_t show_early_output; > > @@ -1290,8 +1291,28 @@ static void do_add_index_objects_to_pending(struct rev_info *revs, > > void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags) > { > + struct worktree **worktrees, **p; > + > read_cache(); > do_add_index_objects_to_pending(revs, &the_index); > + > + if (revs->single_worktree) > + return; > + > + worktrees = get_worktrees(0); > + for (p = worktrees; *p; p++) { > + struct worktree *wt = *p; > + struct index_state istate = { NULL }; > + > + if (wt->is_current) > + continue; /* current index already taken care of */ > + > + if (read_index_from(&istate, > + worktree_git_path(wt, "index")) > 0) > + do_add_index_objects_to_pending(revs, &istate); > + discard_index(&istate); > + } > + free_worktrees(worktrees); > } The commit (message and code) looks acceptable and easy to read. I wonder though if another approach would be more feasible: * factor out anything after the early return into a new function "add_wt_index_objects_to_pending", maybe? * introduce a new function for_each_wt_except_current(function, callback_cookie) such that this code could use this predefined iterator. (I have the impression I have seen this code pattern before, hence it may be useful to have such a foreach function; we have foreach functions already for various ref things, string list items, reflogs, and soon submodule lists) > > static int add_parents_only(struct rev_info *revs, const char *arg_, int flags, > diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh > index 133b5842b1..cba45c7be9 100755 > --- a/t/t5304-prune.sh > +++ b/t/t5304-prune.sh > @@ -283,4 +283,13 @@ test_expect_success 'prune: handle alternate object database' ' > git -C B prune > ' > > +test_expect_success 'prune: handle index in multiple worktrees' ' > + git worktree add second-worktree && > + echo "new blob for second-worktree" >second-worktree/blob && > + git -C second-worktree add blob && > + git prune --expire=now && > + git -C second-worktree show :blob >actual && > + test_cmp second-worktree/blob actual > +' > + > test_done > -- > 2.11.0.157.gd943d85 >