stagit

static git page generator
git clone git://git.2f30.org/stagit.git
Log | Files | Refs | README | LICENSE

commit 27397b310d2aea881f5064103bb449464329b00c
parent 43a7d4dc2ce288119e15232f2312e19c820d98c4
Author: Eivind Uggedal <eivind@uggedal.com>
Date:   Wed Dec  9 22:46:00 +0000

Write blobs to files/

This is work in progress:

- relpath is broken under files/
- mkdirp was stolen from sbase
- strlcpy wrapper might be needed

Diffstat:
urmoms.c | 101+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 65 insertions(+), 36 deletions(-)
diff --git a/urmoms.c b/urmoms.c @@ -1,6 +1,7 @@ #include <sys/stat.h> #include <err.h> +#include <errno.h> #include <inttypes.h> #include <libgen.h> #include <limits.h> @@ -123,9 +124,9 @@ writeheader(FILE *fp) fprintf(fp, "<a href=\"%slog.html\">Log</a> | ", relpath); fprintf(fp, "<a href=\"%sfiles.html\">Files</a>", relpath); if (hasreadme) - fprintf(fp, " | <a href=\"%sreadme.html\">README</a>", relpath); + fprintf(fp, " | <a href=\"%sfile/README.html\">README</a>", relpath); if (haslicense) - fprintf(fp, " | <a href=\"%slicense.html\">LICENSE</a>", relpath); + fprintf(fp, " | <a href=\"%sfile/LICENSE.html\">LICENSE</a>", relpath); fputs("</td></tr></table>\n<hr/><div id=\"content\">\n", fp); return 0; @@ -187,6 +188,25 @@ xbasename(const char *path) return b; } +int +mkdirp(const char *path) +{ + char tmp[PATH_MAX], *p; + + strlcpy(tmp, path, sizeof(tmp)); /* TODO: bring in libutil? */ + for (p = tmp + (tmp[0] == '/'); *p; p++) { + if (*p != '/') + continue; + *p = '\0'; + if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) + return -1; + *p = '/'; + } + if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) + return -1; + return 0; +} + void printtimeformat(FILE *fp, const git_time *intime, const char *fmt) { @@ -311,7 +331,7 @@ printshowfile(struct commitinfo *ci) } delta = git_patch_get_delta(patch); - fprintf(fp, "<b>diff --git a/<a href=\"%sfile/%s\">%s</a> b/<a href=\"%sfile/%s\">%s</a></b>\n", + fprintf(fp, "<b>diff --git a/<a href=\"%sfile/%s.html\">%s</a> b/<a href=\"%sfile/%s.html\">%s</a></b>\n", relpath, delta->old_file.path, delta->old_file.path, relpath, delta->new_file.path, delta->new_file.path); @@ -509,6 +529,39 @@ writeatom(FILE *fp) } int +writeblob(const char *path) +{ + char htmlpath[PATH_MAX]; + char refpath[PATH_MAX]; + char *relp; + git_object *obj = NULL; + FILE *fp; + + snprintf(htmlpath, sizeof(htmlpath), "file/%s.html", path); + snprintf(refpath, sizeof(refpath), "HEAD:%s", path); + + if (git_revparse_single(&obj, repo, refpath)) + return 1; /* TODO: handle error */ + + mkdirp(dirname(htmlpath)); + + relpath = "../"; /* TODO: dynamic relpath based on number of /'s */ + + fp = efopen(htmlpath, "w+b"); + writeheader(fp); + fputs("<pre>\n", fp); + writeblobhtml(fp, (git_blob *)obj); + if (ferror(fp)) + err(1, "fwrite"); + git_object_free(obj); + fputs("</pre>\n", fp); + writefooter(fp); + fclose(fp); + relpath = ""; + return 0; +} + +int writefiles(FILE *fp) { const git_index_entry *entry; @@ -524,15 +577,18 @@ writefiles(FILE *fp) for (i = 0; i < count; i++) { entry = git_index_get_byindex(index, i); + fputs("<tr><td>", fp); fprintf(fp, "%u", entry->mode); /* TODO: fancy print, like: "-rw-r--r--" */ fprintf(fp, "</td><td><a href=\"%sfile/", relpath); xmlencode(fp, entry->path, strlen(entry->path)); - fputs("\">", fp); + fputs(".html\">", fp); xmlencode(fp, entry->path, strlen(entry->path)); fputs("</a></td><td>", fp); fprintf(fp, "%" PRIu64, entry->file_size); fputs("</td></tr>\n", fp); + + writeblob(entry->path); } fputs("</tbody></table>", fp); @@ -543,7 +599,7 @@ writefiles(FILE *fp) int main(int argc, char *argv[]) { - git_object *obj_license = NULL, *obj_readme = NULL; + git_object *obj = NULL; const git_error *e = NULL; FILE *fp, *fpread; char path[PATH_MAX], *p; @@ -584,38 +640,11 @@ main(int argc, char *argv[]) } /* check LICENSE */ - haslicense = !git_revparse_single(&obj_license, repo, "HEAD:LICENSE"); + haslicense = !git_revparse_single(&obj, repo, "HEAD:LICENSE"); + git_object_free(obj); /* check README */ - hasreadme = !git_revparse_single(&obj_readme, repo, "HEAD:README"); - - /* read LICENSE */ - if (haslicense) { - fp = efopen("license.html", "w+b"); - writeheader(fp); - fputs("<pre>\n", fp); - writeblobhtml(fp, (git_blob *)obj_license); - git_object_free(obj_license); - if (ferror(fp)) - err(1, "fwrite"); - fputs("</pre>\n", fp); - writefooter(fp); - - fclose(fp); - } - - /* read README */ - if (hasreadme) { - fp = efopen("readme.html", "w+b"); - writeheader(fp); - fputs("<pre>\n", fp); - writeblobhtml(fp, (git_blob *)obj_readme); - git_object_free(obj_readme); - if (ferror(fp)) - err(1, "fwrite"); - fputs("</pre>\n", fp); - writefooter(fp); - fclose(fp); - } + hasreadme = !git_revparse_single(&obj, repo, "HEAD:README"); + git_object_free(obj); fp = efopen("log.html", "w+b"); writeheader(fp);