X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=stagit.c;h=9a8ccd0245b1e55af35fad1dd86f3477ec779e22;hb=503398bd5f325447f7d801306222e5fc142cacae;hp=a6cfebc043b62d54695612a0482ff097a061fb2e;hpb=028c7526bac907c91ef8afc6c3ae0f6d424bd229;p=stagit.git diff --git a/stagit.c b/stagit.c index a6cfebc..9a8ccd0 100644 --- a/stagit.c +++ b/stagit.c @@ -3,12 +3,13 @@ #include #include -#include #include #include +#include #include #include #include +#include #include #include @@ -343,6 +344,7 @@ writeheader(FILE *fp, const char *title) fputs("\n" "\n\n" "\n" + "\n" "", fp); xmlencode(fp, title, strlen(title)); if (title[0] && strippedname[0]) @@ -364,11 +366,11 @@ writeheader(FILE *fp, const char *title) xmlencode(fp, description, strlen(description)); fputs("</span></td></tr>", fp); if (cloneurl[0]) { - fputs("<tr class=\"url\"><td></td><td>git clone <a href=\"", fp); + fputs("<tr class=\"url\"><td></td><td><span class=\"clone\">git clone <a href=\"", fp); xmlencode(fp, cloneurl, strlen(cloneurl)); fputs("\">", fp); xmlencode(fp, cloneurl, strlen(cloneurl)); - fputs("</a></td></tr>", fp); + fputs("</a></span></td></tr>", fp); } fputs("<tr><td></td><td>\n", fp); fprintf(fp, "<a href=\"%slog.html\">Log</a> | ", relpath); @@ -393,35 +395,51 @@ writefooter(FILE *fp) } int -writeblobhtml(FILE *fp, const git_blob *blob) +syntax_highlight(const char *filename, FILE *fp, const char *s, size_t len) { - size_t n = 0, i, prev; - const char *nfmt = "<a href=\"#l%d\" class=\"line\" id=\"l%d\">%7d</a> "; + // Copy STDOUT + int stdout_copy = dup(1); + // Redirect STDOUT + dup2(fileno(fp), 1); + + // Ruby script for syntax highlighting. + FILE *child = popen("./highlight", "w"); + if (child == NULL) { + printf("child is null: %s", strerror(errno)); + exit(1); + } + // Give filename through STDIN: + fprintf(child, "%s\n", filename); + // Give code to highlight through STDIN: + int lc; + size_t i; + for (i = 0; *s && i < len; s++, i++) { + if (*s == '\n') lc++; + fprintf(child, "%c", *s); + } + + pclose(child); + // Give back STDOUT. + dup2(stdout_copy, 1); + return lc; +} + +int +writeblobhtml(const char *filename, FILE *fp, const git_blob *blob) +{ + int lc = 0; const char *s = git_blob_rawcontent(blob); git_off_t len = git_blob_rawsize(blob); - fputs("<pre id=\"blob\">\n", fp); + fputs("<div id=\"blob\">\n", fp); if (len > 0) { - for (i = 0, prev = 0; i < (size_t)len; i++) { - if (s[i] != '\n') - continue; - n++; - fprintf(fp, nfmt, n, n, n); - xmlencode(fp, &s[prev], i - prev + 1); - prev = i + 1; - } - /* trailing data */ - if ((len - prev) > 0) { - n++; - fprintf(fp, nfmt, n, n, n); - xmlencode(fp, &s[prev], len - prev); - } + lc = syntax_highlight(filename, fp, s, len); } - fputs("</pre>\n", fp); + fputs("</div>\n", fp); - return n; + return lc; } void @@ -693,11 +711,11 @@ printcommitatom(FILE *fp, struct commitinfo *ci) xmlencode(fp, ci->summary, strlen(ci->summary)); fputs("\n", fp); } - fprintf(fp, "", + fprintf(fp, "\n", ci->oid); if (ci->author) { - fputs("", fp); + fputs("\n", fp); xmlencode(fp, ci->author->name, strlen(ci->author->name)); fputs("\n", fp); xmlencode(fp, ci->author->email, strlen(ci->author->email)); @@ -787,7 +805,7 @@ writeblob(git_object *obj, const char *fpath, const char *filename, git_off_t fi if (git_blob_is_binary((git_blob *)obj)) { fputs("

Binary file.

\n", fp); } else { - lc = writeblobhtml(fp, (git_blob *)obj); + lc = writeblobhtml(fpath, fp, (git_blob *)obj); if (ferror(fp)) err(1, "fwrite"); } @@ -1095,6 +1113,13 @@ main(int argc, char *argv[]) git_libgit2_init(); #ifdef __OpenBSD__ + if (unveil(repodir, "r") == -1) + err(1, "unveil: %s", repodir); + if (unveil(".", "rwc") == -1) + err(1, "unveil: ."); + if (cachefile && unveil(cachefile, "rwc") == -1) + err(1, "unveil: %s", cachefile); + if (cachefile) { if (pledge("stdio rpath wpath cpath fattr", NULL) == -1) err(1, "pledge"); @@ -1180,7 +1205,7 @@ main(int argc, char *argv[]) mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO); writeheader(fp, "Log"); fputs("\n" - "" + "" "" "" "\n\n", fp);
DateCommit messageCommitAuthorFiles+-