| tDon't fail on submodules - stagit - static git page generator | |
| git clone git://src.adamsgaard.dk/stagit | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 571076b419daec91efb5e5d39dd17066e43805bc | |
| parent 28730218c4b68e9b3a0f7ce628868bb647d97f9e | |
| Author: z3bra <willyatmailoodotorg> | |
| Date: Fri, 29 Apr 2016 01:40:30 +0200 | |
| 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: | |
| M stagit.c | 69 ++++++++++++++++++-----------… | |
| M style.css | 4 ++++ | |
| 2 files changed, 44 insertions(+), 29 deletions(-) | |
| --- | |
| diff --git a/stagit.c b/stagit.c | |
| t@@ -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; | |
| t@@ -663,29 +664,13 @@ writefilestree(FILE *fp, git_tree *tree, const char *bra… | |
| 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); | |
| t@@ -693,20 +678,46 @@ writefilestree(FILE *fp, git_tree *tree, const char *bra… | |
| 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, bran… | |
| + 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, fil… | |
| + 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… | |
| + 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; | |
| diff --git a/style.css b/style.css | |
| t@@ -58,6 +58,10 @@ table td { | |
| white-space: normal; | |
| } | |
| +a.module { | |
| + color: #777; | |
| +} | |
| + | |
| td.num { | |
| text-align: right; | |
| } |