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); fprintf(fp, "", relpath, relpath); @@ -365,11 +389,11 @@ writeheader(FILE *fp, const char *title) xmlencode(fp, description, strlen(description)); fputs(" | ||||||||
git clone | git clone ", fp); xmlencode(fp, cloneurl, strlen(cloneurl)); - fputs(" | |||||||
\n", fp);
fprintf(fp, "Log | ", 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 = "%7d ";
+ // 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("\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("\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(" 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("
|