X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=stagit.c;h=2d002032cd7770792de935137b4ccf4bb24372c5;hb=92dbe7e9ac04fcc6fec6b963538d059cdc8202fc;hp=affa318448413fbe68c8c743be7c6fd569f0aefa;hpb=2f7e7f2503014f66607b588f32de0b1be69c28a1;p=stagit.git diff --git a/stagit.c b/stagit.c index affa318..2d00203 100644 --- a/stagit.c +++ b/stagit.c @@ -70,6 +70,28 @@ static char lastoidstr[GIT_OID_HEXSZ + 2]; /* id + newline + NUL byte */ static FILE *rcachefp, *wcachefp; static const char *cachefile; +int cp(char fileSource[], char fileDestination[]) +{ + int c; + FILE *stream_R, *stream_W; + + stream_R = fopen(fileSource, "r"); + if (stream_R == NULL) + return -1; + stream_W = fopen(fileDestination, "w"); //create and write to file + if (stream_W == NULL) + { + fclose(stream_R); + return -2; + } + while ((c = fgetc(stream_R)) != EOF) + fputc(c, stream_W); + fclose(stream_R); + fclose(stream_W); + + return 0; +} + void joinpath(char *buf, size_t bufsiz, const char *path, const char *path2) { @@ -344,6 +366,7 @@ writeheader(FILE *fp, const char *title) fputs("\n" "\n\n" "\n" + "\n" "", fp); xmlencode(fp, title, strlen(title)); if (title[0] && strippedname[0]) @@ -356,6 +379,7 @@ writeheader(FILE *fp, const char *title) fprintf(fp, "<link rel=\"alternate\" type=\"application/atom+xml\" title=\"%s Atom Feed\" href=\"%satom.xml\" />\n", name, relpath); fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%sstyle.css\" />\n", relpath); + fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%ssyntax.css\" />\n", relpath); fputs("</head>\n<body>\n<table><tr><td>", fp); fprintf(fp, "<a href=\"../%s\"><img src=\"%slogo.png\" alt=\"\" width=\"32\" height=\"32\" /></a>", relpath, relpath); @@ -365,11 +389,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); @@ -394,35 +418,50 @@ 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> "; + // Flush HTML-file + fflush(fp); + // Copy STDOUT + int stdout_copy = dup(1); + // Redirect STDOUT + dup2(fileno(fp), 1); + + // Python Pygments script for syntax highlighting. + FILE *child = popen("/usr/local/share/doc/stagit/highlight.py", "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); + fflush(stdout); + // 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); - 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); - - return n; + return lc; } void @@ -694,11 +733,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)); @@ -788,7 +827,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(filename, fp, (git_blob *)obj); if (ferror(fp)) err(1, "fwrite"); } @@ -1129,6 +1168,13 @@ main(int argc, char *argv[]) else name = ""; + /* copy css */ + char cwd[PATH_MAX]; + strcpy(cwd, getcwd(cwd, sizeof(cwd))); + cp("/usr/local/share/doc/stagit/syntax.css", strcat(cwd, "/syntax.css")); + strcpy(cwd, getcwd(cwd, sizeof(cwd))); + cp("/usr/local/share/doc/stagit/style.css", strcat(cwd, "/style.css")); + /* strip .git suffix */ if (!(strippedname = strdup(name))) err(1, "strdup"); @@ -1188,7 +1234,7 @@ main(int argc, char *argv[]) mkdir("commit", S_IRWXU | S_IRWXG | S_IRWXO); writeheader(fp, "Log"); fputs("\n" - "" + "" "" "" "\n\n", fp);
DateCommit messageCommitAuthorFiles+-