fix submodule lookup in bare repos
authorkst <nil@krj.st>
Wed, 5 Aug 2020 22:11:18 +0000 (22:11 +0000)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Thu, 6 Aug 2020 16:25:27 +0000 (18:25 +0200)
git_submodule_lookup does not work without a working tree [1], so the
current approach fails to recognize any submodules in bare repos.

Instead, notice that

$ git ls-tree HEAD

lists any submodules as commit objects regardless of a working tree.
This is the only instance commit object is used in a tree, so we will
use this to check for submodules.

[1]: https://github.com/libgit2/libgit2/pull/4305/files

stagit.c

index 0377ad80674786725eb5917cca921597b5c63fa9..d5c601555e4642e9dc4291dc8b99cafc0365bfbc 100644 (file)
--- a/stagit.c
+++ b/stagit.c
@@ -976,7 +976,6 @@ int
 writefilestree(FILE *fp, git_tree *tree, const char *path)
 {
        const git_tree_entry *entry = NULL;
-       git_submodule *module = NULL;
        git_object *obj = NULL;
        git_off_t filesize;
        const char *entryname;
@@ -1029,11 +1028,11 @@ writefilestree(FILE *fp, git_tree *tree, const char *path)
                                fprintf(fp, "%juB", (uintmax_t)filesize);
                        fputs("</td></tr>\n", fp);
                        git_object_free(obj);
-               } else if (!git_submodule_lookup(&module, repo, entryname)) {
+               } else if (git_tree_entry_type(entry) == GIT_OBJ_COMMIT) {
+                       /* commit object in tree is a submodule */
                        fprintf(fp, "<tr><td>m---------</td><td><a href=\"%sfile/.gitmodules.html\">",
                                relpath);
                        xmlencode(fp, entrypath, strlen(entrypath));
-                       git_submodule_free(module);
                        fputs("</a></td><td class=\"num\" align=\"right\"></td></tr>\n", fp);
                }
        }