[PATCH 4/6] WIP: mess only with mark_reachable
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@drmicha.warpmail.net>
---
reachable.c | 2 +-
refs.h | 1 +
refs/files-backend.c | 23 +++++++++++++++++++++++
3 files changed, 25 insertions(+), 1 deletion(-)
Show changes to 3 files +25 −1
reachable.c, refs.h, refs/files-backend.c
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