wip - stagit-gopher - A git gopher frontend. (mirror) | |
git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2h… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit de699c5afe2db575e0ac94ce7f64478a6427842b | |
parent aee984022be470e18b1b085703801ae842b4e24a | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Tue, 13 Jun 2017 21:07:49 +0200 | |
wip | |
Diffstat: | |
M TODO | 8 ++++++++ | |
M stagit-index.c | 115 +++++++++++++++++------------… | |
M stagit.c | 13 ++----------- | |
3 files changed, 74 insertions(+), 62 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,3 +1,11 @@ | |
+gopher: | |
+ | |
+- align UTF-8 characters (and wide?). | |
+- update documentation: | |
+ - document new gopher-specific options. | |
+ | |
+=== | |
+ | |
performance: | |
- don't recreate files tree for HEAD each time: | |
- idea: update files in tree and commit files with timestamp of commit and | |
diff --git a/stagit-index.c b/stagit-index.c | |
@@ -26,6 +26,34 @@ static char owner[255]; | |
#endif | |
void | |
+trim(char *buf, size_t bufsiz, const char *src) | |
+{ | |
+ size_t d = 0, i, len, s; | |
+ | |
+ len = strlen(src); | |
+ for (s = 0; s < len && d < bufsiz - 1; s++) { | |
+ switch (src[s]) { | |
+ case '\t': | |
+ if (d + 8 >= bufsiz - 1) | |
+ goto end; | |
+ for (i = 0; i < 8; i++) | |
+ buf[d++] = ' '; | |
+ break; | |
+ case '|': | |
+ case '\n': | |
+ case '\r': | |
+ buf[d++] = ' '; | |
+ break; | |
+ default: | |
+ buf[d++] = src[s]; | |
+ break; | |
+ } | |
+ } | |
+end: | |
+ buf[d] = '\0'; | |
+} | |
+ | |
+void | |
joinpath(char *buf, size_t bufsiz, const char *path, const char *path2) | |
{ | |
int r; | |
@@ -37,24 +65,6 @@ joinpath(char *buf, size_t bufsiz, const char *path, const c… | |
path, path[0] && path[strlen(path) - 1] != '/' ? "/" :… | |
} | |
-/* Escape characters below as HTML 2.0 / XML 1.0. */ | |
-void | |
-xmlencode(FILE *fp, const char *s, size_t len) | |
-{ | |
- size_t i; | |
- | |
- for (i = 0; *s && i < len; s++, i++) { | |
- switch(*s) { | |
- case '<': fputs("<", fp); break; | |
- case '>': fputs(">", fp); break; | |
- case '\'': fputs("'" , fp); break; | |
- case '&': fputs("&", fp); break; | |
- case '"': fputs(""", fp); break; | |
- default: fputc(*s, fp); | |
- } | |
- } | |
-} | |
- | |
void | |
printtimeshort(FILE *fp, const git_time *intime) | |
{ | |
@@ -72,29 +82,22 @@ printtimeshort(FILE *fp, const git_time *intime) | |
void | |
writeheader(FILE *fp) | |
{ | |
- fputs("<!DOCTYPE html>\n" | |
- "<html>\n<head>\n" | |
- "<meta http-equiv=\"Content-Type\" content=\"text/html; charse… | |
- "<title>", fp); | |
- xmlencode(fp, description, strlen(description)); | |
- fprintf(fp, "</title>\n<link rel=\"icon\" type=\"image/png\" href=\"%s… | |
- fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%sstyle… | |
- fputs("</head>\n<body>\n", fp); | |
- fprintf(fp, "<table>\n<tr><td><img src=\"%slogo.png\" alt=\"\" width=\… | |
- "<td><span class=\"desc\">", relpath); | |
- xmlencode(fp, description, strlen(description)); | |
- fputs("</span></td></tr><tr><td></td><td>\n" | |
- "</td></tr>\n</table>\n<hr/>\n<div id=\"content\">\n" | |
- "<table id=\"index\"><thead>\n" | |
- "<tr><td><b>Name</b></td><td><b>Description</b></td><td><b>Own… | |
- "<td><b>Last commit</b></td></tr>" | |
- "</thead><tbody>\n", fp); | |
+ char buf[1024]; | |
+ | |
+ trim(buf, sizeof(buf), description); | |
+ if (buf[0] == 't') | |
+ fputc('t', fp); | |
+ fprintf(fp, "%s\n", buf); | |
+ | |
+ fprintf(fp, "%-25.25s ", "Name"); | |
+ fprintf(fp, "%-50.50s ", "Description"); | |
+ fprintf(fp, "%-25.25s ", "Owner"); | |
+ fprintf(fp, "%-16.16s\n", "Last commit"); | |
} | |
void | |
writefooter(FILE *fp) | |
{ | |
- fputs("</tbody>\n</table>\n</div>\n</body>\n</html>\n", fp); | |
} | |
int | |
@@ -105,6 +108,7 @@ writelog(FILE *fp) | |
git_revwalk *w = NULL; | |
git_oid id; | |
char *stripped_name = NULL, *p; | |
+ char buf[1024]; | |
int ret = 0; | |
git_revwalk_new(&w, repo); | |
@@ -127,18 +131,16 @@ writelog(FILE *fp) | |
if (!strcmp(p, ".git")) | |
*p = '\0'; | |
- fputs("<tr><td><a href=\"", fp); | |
- xmlencode(fp, stripped_name, strlen(stripped_name)); | |
- fputs("/log.html\">", fp); | |
- xmlencode(fp, stripped_name, strlen(stripped_name)); | |
- fputs("</a></td><td>", fp); | |
- xmlencode(fp, description, strlen(description)); | |
- fputs("</td><td>", fp); | |
- xmlencode(fp, owner, strlen(owner)); | |
- fputs("</td><td>", fp); | |
+ trim(buf, sizeof(buf), stripped_name); | |
+ fprintf(fp, "[1|%-25.25s ", buf); | |
+ trim(buf, sizeof(buf), description); | |
+ fprintf(fp, "%-50.50s ", buf); | |
+ trim(buf, sizeof(buf), owner); | |
+ fprintf(fp, "%-25.25s ", buf); | |
if (author) | |
printtimeshort(fp, &(author->when)); | |
- fputs("</td></tr>", fp); | |
+ trim(buf, sizeof(buf), stripped_name); | |
+ fprintf(fp, "|%s%s/log.gph|server|port]\n", relpath, buf); | |
git_commit_free(commit); | |
err: | |
@@ -148,27 +150,38 @@ err: | |
return ret; | |
} | |
+void | |
+usage(const char *argv0) | |
+{ | |
+ fprintf(stderr, "%s [repodir...]\n", argv0); | |
+ exit(1); | |
+} | |
+ | |
+ | |
int | |
main(int argc, char *argv[]) | |
{ | |
const git_error *e = NULL; | |
FILE *fp; | |
char path[PATH_MAX], repodirabs[PATH_MAX + 1]; | |
- const char *repodir; | |
+ const char *repodir = NULL; | |
int i, ret = 0; | |
if (pledge("stdio rpath", NULL) == -1) | |
err(1, "pledge"); | |
- if (argc < 2) { | |
- fprintf(stderr, "%s [repodir...]\n", argv[0]); | |
- return 1; | |
- } | |
git_libgit2_init(); | |
writeheader(stdout); | |
for (i = 1; i < argc; i++) { | |
+ if (argv[i][0] == '-') { | |
+ if (argv[i][1] != 'b' || i + 1 >= argc) | |
+ usage(argv[0]); | |
+ relpath = argv[++i]; | |
+ continue; | |
+ } | |
+ | |
repodir = argv[i]; | |
if (!realpath(repodir, repodirabs)) | |
err(1, "realpath"); | |
diff --git a/stagit.c b/stagit.c | |
@@ -251,13 +251,10 @@ xmlencode(FILE *fp, const char *s, size_t len) | |
void | |
trim(char *buf, size_t bufsiz, const char *src) | |
{ | |
- size_t d = 0, i, len, n = 0, s; | |
+ size_t d = 0, i, len, s; | |
len = strlen(src); | |
for (s = 0; s < len && d < bufsiz - 1; s++) { | |
- if (src[s] == '\n') | |
- n = 0; | |
- | |
switch (src[s]) { | |
case '\t': | |
if (d + 8 >= bufsiz - 1) | |
@@ -266,20 +263,14 @@ trim(char *buf, size_t bufsiz, const char *src) | |
buf[d++] = ' '; | |
break; | |
case '|': | |
+ case '\n': | |
case '\r': | |
buf[d++] = ' '; | |
break; | |
- case 't': | |
- if (!n && src[s] == 't') { | |
- if (d + 1 >= bufsiz - 1) | |
- goto end; | |
- buf[d++] = src[s]; | |
- } | |
default: | |
buf[d++] = src[s]; | |
break; | |
} | |
- n++; | |
} | |
end: | |
buf[d] = '\0'; |