This still messes up gc/prune on an empty repo where the worktree code can't parse HEAD properly. Bummer. That code sucks for the non-worktree case. Signed-off-by: Michael J Gruber <git@xxxxxxxxxxxxxxxxxxxx> --- reachable.c | 2 +- refs.h | 1 + refs/files-backend.c | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/reachable.c b/reachable.c index ed35201..15a06a7 100644 --- a/reachable.c +++ b/reachable.c @@ -177,7 +177,7 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog, for_each_ref(add_one_ref, revs); /* detached HEAD is not included in the list above */ - head_ref(add_one_ref, revs); + head_ref_worktrees(add_one_ref, revs); /* Add all reflog info */ if (mark_reflog) diff --git a/refs.h b/refs.h index 2f3decb..c9621b4 100644 --- a/refs.h +++ b/refs.h @@ -183,6 +183,7 @@ typedef int each_ref_fn(const char *refname, * stop the iteration. */ extern int head_ref(each_ref_fn fn, void *cb_data); +extern int head_ref_worktrees(each_ref_fn fn, void *cb_data); extern int for_each_ref(each_ref_fn fn, void *cb_data); extern int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data); extern int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken); diff --git a/refs/files-backend.c b/refs/files-backend.c index 5bdb568..f020c52 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1749,6 +1749,24 @@ static int do_for_each_ref(struct ref_cache *refs, const char *base, static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data) { struct object_id oid; + int flag; + + if (submodule) { + if (resolve_gitlink_ref(submodule, "HEAD", oid.hash) == 0) + return fn("HEAD", &oid, 0, cb_data); + + return 0; + } + + if (!read_ref_full("HEAD", RESOLVE_REF_READING, oid.hash, &flag)) + return fn("HEAD", &oid, flag, cb_data); + + return 0; +} + +static int do_head_ref_worktrees(const char *submodule, each_ref_fn fn, void *cb_data) +{ + struct object_id oid; struct worktree **worktrees; int i, retval; @@ -1775,6 +1793,11 @@ int head_ref(each_ref_fn fn, void *cb_data) return do_head_ref(NULL, fn, cb_data); } +int head_ref_worktrees(each_ref_fn fn, void *cb_data) +{ + return do_head_ref_worktrees(NULL, fn, cb_data); +} + int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data) { return do_head_ref(submodule, fn, cb_data); -- 2.7.2.618.g7a61b68 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html