path: root/worktree.c
diff options
authorNguyễn Thái Ngọc Duy <>2017-08-23 12:36:59 (GMT)
committerJunio C Hamano <>2017-08-24 21:56:43 (GMT)
commitd0c39a49ccb5dfe7feba4325c3374d99ab123c59 (patch)
tree26324606aadeab067d1d983de881a392488fac8e /worktree.c
parent419221c1065981311b1a0f4a469d4d8a9ea09f54 (diff)
revision.c: --all adds HEAD from all worktrees
Unless single_worktree is set, --all now adds HEAD from all worktrees. Since reachable.c code does not use setup_revisions(), we need to call other_head_refs_submodule() explicitly there to have the same effect on "git prune", so that we won't accidentally delete objects needed by some other HEADs. A new FIXME is added because we would need something like int refs_other_head_refs(struct ref_store *, each_ref_fn, cb_data); in addition to other_head_refs() to handle it, which might require int get_submodule_worktrees(const char *submodule, int flags); It could be a separate topic to reduce the scope of this one. Signed-off-by: Nguyễn Thái Ngọc Duy <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'worktree.c')
1 files changed, 22 insertions, 0 deletions
diff --git a/worktree.c b/worktree.c
index e28ffbe..389e2e9 100644
--- a/worktree.c
+++ b/worktree.c
@@ -386,3 +386,25 @@ int submodule_uses_worktrees(const char *path)
return ret;
+int other_head_refs(each_ref_fn fn, void *cb_data)
+ struct worktree **worktrees, **p;
+ int ret = 0;
+ worktrees = get_worktrees(0);
+ for (p = worktrees; *p; p++) {
+ struct worktree *wt = *p;
+ struct ref_store *refs;
+ if (wt->is_current)
+ continue;
+ refs = get_worktree_ref_store(wt);
+ ret = refs_head_ref(refs, fn, cb_data);
+ if (ret)
+ break;
+ }
+ free_worktrees(worktrees);
+ return ret;