diff options
author | z3bra <willyatmailoodotorg> | 2016-04-29 01:40:30 +0200 |
---|---|---|
committer | Hiltjo Posthuma <hiltjo@codemadness.org> | 2016-04-29 12:31:39 +0200 |
commit | 571076b419daec91efb5e5d39dd17066e43805bc (patch) | |
tree | 740343c3f94560d75eace2c9c4ef324489925c3c /stagit.c | |
parent | 28730218c4b68e9b3a0f7ce628868bb647d97f9e (diff) |
Don't fail on submodules
Submodules will get listed prefixed with a '@', using a specific CSS class for
styling. The href will be set to the url of the submodule.
Filesize will appear as 0 and filemode will not be printed to avoid an awkward
mode: "?---------".
In writefilestree, we don't return anymore if an entry can't be categorized as
an object, but rather, fail if we can't retrieve its name.
Diffstat (limited to 'stagit.c')
-rw-r--r-- | stagit.c | 69 |
1 files changed, 40 insertions, 29 deletions
@@ -653,6 +653,7 @@ int writefilestree(FILE *fp, git_tree *tree, const char *branch, const char *path) { const git_tree_entry *entry = NULL; + git_submodule *module = NULL; const char *entryname; char filepath[PATH_MAX], entrypath[PATH_MAX]; git_object *obj = NULL; @@ -663,29 +664,13 @@ writefilestree(FILE *fp, git_tree *tree, const char *branch, const char *path) count = git_tree_entrycount(tree); for (i = 0; i < count; i++) { if (!(entry = git_tree_entry_byindex(tree, i)) || - git_tree_entry_to_object(&obj, repo, entry)) + !(entryname = git_tree_entry_name(entry))) return -1; - entryname = git_tree_entry_name(entry); r = snprintf(entrypath, sizeof(entrypath), "%s%s%s", path, path[0] ? "/" : "", entryname); if (r == -1 || (size_t)r >= sizeof(entrypath)) errx(1, "path truncated: '%s%s%s'", path, path[0] ? "/" : "", entryname); - switch (git_object_type(obj)) { - case GIT_OBJ_BLOB: - break; - case GIT_OBJ_TREE: - /* NOTE: recurses */ - ret = writefilestree(fp, (git_tree *)obj, branch, - entrypath); - git_object_free(obj); - if (ret) - return ret; - continue; - default: - git_object_free(obj); - continue; - } r = snprintf(filepath, sizeof(filepath), "file/%s%s%s.html", path, path[0] ? "/" : "", entryname); @@ -693,20 +678,46 @@ writefilestree(FILE *fp, git_tree *tree, const char *branch, const char *path) errx(1, "path truncated: 'file/%s%s%s.html'", path, path[0] ? "/" : "", entryname); - filesize = git_blob_rawsize((git_blob *)obj); + if (!git_tree_entry_to_object(&obj, repo, entry)) { + switch (git_object_type(obj)) { + case GIT_OBJ_BLOB: + break; + case GIT_OBJ_TREE: + /* NOTE: recurses */ + ret = writefilestree(fp, (git_tree *)obj, branch, + entrypath); + git_object_free(obj); + if (ret) + return ret; + continue; + default: + git_object_free(obj); + continue; + } - lc = writeblob(obj, filepath, entryname, filesize); + filesize = git_blob_rawsize((git_blob *)obj); + lc = writeblob(obj, filepath, entryname, filesize); - fputs("<tr><td>", fp); - fputs(filemode(git_tree_entry_filemode(entry)), fp); - fprintf(fp, "</td><td><a href=\"%s%s\">", relpath, filepath); - xmlencode(fp, entrypath, strlen(entrypath)); - fputs("</a></td><td class=\"num\">", fp); - if (showlinecount && lc > 0) - fprintf(fp, "%dL", lc); - else - fprintf(fp, "%juB", (uintmax_t)filesize); - fputs("</td></tr>\n", fp); + fputs("<tr><td>", fp); + fputs(filemode(git_tree_entry_filemode(entry)), fp); + fprintf(fp, "</td><td><a href=\"%s%s\">", relpath, filepath); + xmlencode(fp, entrypath, strlen(entrypath)); + fputs("</a></td><td class=\"num\">", fp); + if (showlinecount && lc > 0) + fprintf(fp, "%dL", lc); + else + fprintf(fp, "%juB", (uintmax_t)filesize); + fputs("</td></tr>\n", fp); + } else if (git_submodule_lookup(&module, repo, entryname) == 0) { + + fprintf(fp, "<tr><td></td><td><a class=\"module\" href=\"%s\">@", + git_submodule_url(module)); + xmlencode(fp, entrypath, strlen(entrypath)); + fprintf(fp, "</a></td><td class=\"num\">0%c", + showlinecount ? 'L' : 'B'); + git_submodule_free(module); + fputs("</td></tr>\n", fp); + } } return 0; |