X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=stagit.c;h=264604eb4fffd984ff7ef47993e7ff0d4b44de84;hb=3c00e328b546283294871232e65e39b9d2b80041;hp=affa318448413fbe68c8c743be7c6fd569f0aefa;hpb=2f7e7f2503014f66607b588f32de0b1be69c28a1;p=stagit.git diff --git a/stagit.c b/stagit.c index affa318..264604e 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]) @@ -355,7 +378,8 @@ writeheader(FILE *fp, const char *title) fprintf(fp, "\n\n", relpath); fprintf(fp, "\n", name, relpath); - fprintf(fp, "\n", relpath); + fprintf(fp, "\n", relpath); + fprintf(fp, "\n", relpath); fputs("\n\n", fp); if (cloneurl[0]) { - fputs("", fp); + fputs("", fp); } fputs("
", 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) +call_py(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/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 = call_py(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("", 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/stagit/syntax.css", strcat(cwd, "/syntax.css")); + strcpy(cwd, getcwd(cwd, sizeof(cwd))); + cp("/usr/local/share/stagit/style.min.css", strcat(cwd, "/style.min.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+-