This makes sure repack won't drop detached HEADS from $GIT_DIR/repos/

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 refs.c     | 21 +++++++++++++++++++++
 refs.h     |  1 +
 revision.c |  1 +
 3 files changed, 23 insertions(+)

diff --git a/refs.c b/refs.c
index 8ef1cb0..a9c8651 100644
--- a/refs.c
+++ b/refs.c
@@ -1740,6 +1740,27 @@ static int do_one_head_ref(const char *ref, const char 
*submodule,
        return 0;
 }
 
+int repos_head_ref_submodule(const char *submodule, each_ref_fn fn, void 
*cb_data)
+{
+       DIR *dir = opendir(git_path("repos"));
+       int ret = 0;
+       struct dirent *d;
+
+       if (!dir)
+               return ret;
+
+       while (!ret && (d = readdir(dir)) != NULL) {
+               struct strbuf sb_ref = STRBUF_INIT;
+               if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
+                       continue;
+               strbuf_addf(&sb_ref, "repos/%s/HEAD", d->d_name);
+               ret = do_one_head_ref(sb_ref.buf, submodule, fn, cb_data);
+               strbuf_release(&sb_ref);
+       }
+       closedir(dir);
+       return ret;
+}
+
 int head_ref(each_ref_fn fn, void *cb_data)
 {
        return do_one_head_ref("HEAD", NULL, fn, cb_data);
diff --git a/refs.h b/refs.h
index 87a1a79..05686e4 100644
--- a/refs.h
+++ b/refs.h
@@ -70,6 +70,7 @@ extern int for_each_glob_ref(each_ref_fn, const char 
*pattern, void *);
 extern int for_each_glob_ref_in(each_ref_fn, const char *pattern, const char* 
prefix, void *);
 
 extern int head_ref_submodule(const char *submodule, each_ref_fn fn, void 
*cb_data);
+extern int repos_head_ref_submodule(const char *submodule, each_ref_fn fn, 
void *cb_data);
 extern int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void 
*cb_data);
 extern int for_each_ref_in_submodule(const char *submodule, const char *prefix,
                each_ref_fn fn, void *cb_data);
diff --git a/revision.c b/revision.c
index 05d2d77..c4150ed 100644
--- a/revision.c
+++ b/revision.c
@@ -2004,6 +2004,7 @@ static int handle_revision_pseudo_opt(const char 
*submodule,
        if (!strcmp(arg, "--all")) {
                handle_refs(submodule, revs, *flags, for_each_ref_submodule);
                handle_refs(submodule, revs, *flags, head_ref_submodule);
+               handle_refs(submodule, revs, *flags, repos_head_ref_submodule);
                clear_ref_exclusion(&revs->ref_excludes);
        } else if (!strcmp(arg, "--branches")) {
                handle_refs(submodule, revs, *flags, 
for_each_branch_ref_submodule);
-- 
1.8.5.1.77.g42c48fa

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to