iinitial diff support, fix log link - stagit-gopher - A git gopher frontend. (mirror) Err bitreich.org 70 hgit clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/stagit-gopher/ URL:git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/stagit-gopher/ bitreich.org 70 1Log /scm/stagit-gopher/log.gph bitreich.org 70 1Files /scm/stagit-gopher/files.gph bitreich.org 70 1Refs /scm/stagit-gopher/refs.gph bitreich.org 70 1Tags /scm/stagit-gopher/tag bitreich.org 70 1README /scm/stagit-gopher/file/README.gph bitreich.org 70 1LICENSE /scm/stagit-gopher/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit a95a439aaa7d048c25e988b0d9770f5040f0a17f /scm/stagit-gopher/commit/a95a439aaa7d048c25e988b0d9770f5040f0a17f.gph bitreich.org 70 1parent 04eeb7f000b14af31b9923ea7216edcaf0915586 /scm/stagit-gopher/commit/04eeb7f000b14af31b9923ea7216edcaf0915586.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Mon, 7 Dec 2015 14:07:58 +0100 Err bitreich.org 70 i Err bitreich.org 70 iinitial diff support, fix log link Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M urmoms.c | 244 ++++++++++++++++++++++--------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 176 insertions(+), 68 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/urmoms.c b/urmoms.c /scm/stagit-gopher/file/urmoms.c.gph bitreich.org 70 i@@ -1,3 +1,5 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -9,13 +11,48 @@ Err bitreich.org 70 i Err bitreich.org 70 i static git_repository *repo; Err bitreich.org 70 i Err bitreich.org 70 i-static const char *relpath; Err bitreich.org 70 i-static const char *repodir = "."; Err bitreich.org 70 i+static const char *relpath = ""; Err bitreich.org 70 i+static const char *repodir; Err bitreich.org 70 i Err bitreich.org 70 i static char name[255]; Err bitreich.org 70 i static char description[255]; Err bitreich.org 70 i static int hasreadme, haslicense; Err bitreich.org 70 i Err bitreich.org 70 i+int Err bitreich.org 70 i+writeheader(FILE *fp) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(fp, "" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ ""); Err bitreich.org 70 i+ fprintf(fp, "%s%s%s", name, description[0] ? " - " : "", description); Err bitreich.org 70 i+ fprintf(fp, "", relpath); Err bitreich.org 70 i+ fprintf(fp, "", Err bitreich.org 70 i+ name, relpath); Err bitreich.org 70 i+ fprintf(fp, "" Err bitreich.org 70 i+ "
"); Err bitreich.org 70 i+ fprintf(fp, "

\"\" %s

", relpath, name); Err bitreich.org 70 i+ fprintf(fp, "%s
", description); Err bitreich.org 70 i+ fprintf(fp, "Log |", relpath); Err bitreich.org 70 i+ fprintf(fp, "Files| ", relpath); Err bitreich.org 70 i+ fprintf(fp, "Stats", relpath); Err bitreich.org 70 i+ if (hasreadme) Err bitreich.org 70 i+ fprintf(fp, " | README", relpath); Err bitreich.org 70 i+ if (haslicense) Err bitreich.org 70 i+ fprintf(fp, " | LICENSE", relpath); Err bitreich.org 70 i+ fprintf(fp, "

");	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+writefooter(FILE *fp)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        fprintf(fp, "
"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i FILE * Err bitreich.org 70 i efopen(const char *name, const char *flags) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -67,8 +104,8 @@ xbasename(const char *path) Err bitreich.org 70 i return b; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static void Err bitreich.org 70 i-printtime(FILE *fp, const git_time *intime, const char *prefix) Err bitreich.org 70 i+void Err bitreich.org 70 i+printtime(FILE *fp, const git_time *intime) Err bitreich.org 70 i { Err bitreich.org 70 i struct tm *intm; Err bitreich.org 70 i time_t t; Err bitreich.org 70 i@@ -91,10 +128,10 @@ printtime(FILE *fp, const git_time *intime, const char *prefix) Err bitreich.org 70 i intm = gmtime(&t); Err bitreich.org 70 i strftime(out, sizeof(out), "%a %b %e %T %Y", intm); Err bitreich.org 70 i Err bitreich.org 70 i- fprintf(fp, "%s%s %c%02d%02d\n", prefix, out, sign, hours, minutes); Err bitreich.org 70 i+ fprintf(fp, "%s %c%02d%02d\n", out, sign, hours, minutes); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static void Err bitreich.org 70 i+void Err bitreich.org 70 i printcommit(FILE *fp, git_commit *commit) Err bitreich.org 70 i { Err bitreich.org 70 i const git_signature *sig; Err bitreich.org 70 i@@ -103,22 +140,31 @@ printcommit(FILE *fp, git_commit *commit) Err bitreich.org 70 i const char *scan, *eol; Err bitreich.org 70 i Err bitreich.org 70 i git_oid_tostr(buf, sizeof(buf), git_commit_id(commit)); Err bitreich.org 70 i- fprintf(fp, "commit %s\n", buf, buf); Err bitreich.org 70 i+ fprintf(fp, "commit %s\n", Err bitreich.org 70 i+ relpath, buf, buf); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (git_oid_tostr(buf, sizeof(buf), git_commit_parent_id(commit, 0))) Err bitreich.org 70 i+ fprintf(fp, "parent %s\n", Err bitreich.org 70 i+ relpath, buf, buf); Err bitreich.org 70 i Err bitreich.org 70 i if ((count = (int)git_commit_parentcount(commit)) > 1) { Err bitreich.org 70 i fprintf(fp, "Merge:"); Err bitreich.org 70 i for (i = 0; i < count; ++i) { Err bitreich.org 70 i git_oid_tostr(buf, 8, git_commit_parent_id(commit, i)); Err bitreich.org 70 i- fprintf(fp, " %s", buf); Err bitreich.org 70 i+ fprintf(fp, " %s", Err bitreich.org 70 i+ relpath, buf, buf); Err bitreich.org 70 i } Err bitreich.org 70 i- fprintf(fp, "\n"); Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i } Err bitreich.org 70 i if ((sig = git_commit_author(commit)) != NULL) { Err bitreich.org 70 i- fprintf(fp, "Author: %s <%s>\n", Err bitreich.org 70 i- sig->name, sig->name, sig->email); Err bitreich.org 70 i- printtime(fp, &sig->when, "Date: "); Err bitreich.org 70 i+ fprintf(fp, "Author: "); Err bitreich.org 70 i+ xmlencode(fp, sig->name, strlen(sig->name)); Err bitreich.org 70 i+ fprintf(fp, " <"); Err bitreich.org 70 i+ xmlencode(fp, sig->email, strlen(sig->email)); Err bitreich.org 70 i+ fprintf(fp, ">\nDate: "); Err bitreich.org 70 i+ printtime(fp, &sig->when); Err bitreich.org 70 i } Err bitreich.org 70 i- fprintf(fp, "\n"); Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i Err bitreich.org 70 i for (scan = git_commit_message(commit); scan && *scan;) { Err bitreich.org 70 i for (eol = scan; *eol && *eol != '\n'; ++eol) /* find eol */ Err bitreich.org 70 i@@ -127,79 +173,131 @@ printcommit(FILE *fp, git_commit *commit) Err bitreich.org 70 i fprintf(fp, " %.*s\n", (int) (eol - scan), scan); Err bitreich.org 70 i scan = *eol ? eol + 1 : NULL; Err bitreich.org 70 i } Err bitreich.org 70 i- fprintf(fp, "\n"); Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static void Err bitreich.org 70 i-printcommitdiff(FILE *fp, git_commit *commit) Err bitreich.org 70 i+void Err bitreich.org 70 i+printshowfile(git_commit *commit) Err bitreich.org 70 i { Err bitreich.org 70 i- const git_signature *sig; Err bitreich.org 70 i- char buf[GIT_OID_HEXSZ + 1]; Err bitreich.org 70 i- int i, count; Err bitreich.org 70 i- const char *scan, *eol; Err bitreich.org 70 i+ const git_diff_delta *delta = NULL; Err bitreich.org 70 i+ const git_diff_hunk *hunk = NULL; Err bitreich.org 70 i+ const git_diff_line *line = NULL; Err bitreich.org 70 i+ git_commit *parent = NULL; Err bitreich.org 70 i+ git_tree *commit_tree = NULL, *parent_tree = NULL; Err bitreich.org 70 i+ git_patch *patch = NULL; Err bitreich.org 70 i+ git_diff *diff = NULL; Err bitreich.org 70 i+ size_t i, j, k, ndeltas, nhunks = 0, nhunklines = 0; Err bitreich.org 70 i+ char buf[GIT_OID_HEXSZ + 1], path[PATH_MAX]; Err bitreich.org 70 i+ FILE *fp; Err bitreich.org 70 i+ int error; Err bitreich.org 70 i Err bitreich.org 70 i git_oid_tostr(buf, sizeof(buf), git_commit_id(commit)); Err bitreich.org 70 i- fprintf(fp, "commit %s\n", buf, buf); Err bitreich.org 70 i Err bitreich.org 70 i- if ((count = (int)git_commit_parentcount(commit)) > 1) { Err bitreich.org 70 i- fprintf(fp, "Merge:"); Err bitreich.org 70 i- for (i = 0; i < count; ++i) { Err bitreich.org 70 i- git_oid_tostr(buf, 8, git_commit_parent_id(commit, i)); Err bitreich.org 70 i- fprintf(fp, " %s", buf); Err bitreich.org 70 i+ snprintf(path, sizeof(path), "commit/%s.html", buf); Err bitreich.org 70 i+ fp = efopen(path, "w+b"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ writeheader(fp); Err bitreich.org 70 i+ printcommit(fp, commit); Err bitreich.org 70 i+ Err bitreich.org 70 i+ error = git_commit_parent(&parent, commit, 0); Err bitreich.org 70 i+ if (error) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ error = git_commit_tree(&commit_tree, commit); Err bitreich.org 70 i+ if (error) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ error = git_commit_tree(&parent_tree, parent); Err bitreich.org 70 i+ if (error) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ error = git_diff_tree_to_tree(&diff, repo, commit_tree, parent_tree, NULL); Err bitreich.org 70 i+ if (error) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* TODO: diff stat (files list and insertions/deletions) */ Err bitreich.org 70 i+ Err bitreich.org 70 i+ ndeltas = git_diff_num_deltas(diff); Err bitreich.org 70 i+ for (i = 0; i < ndeltas; i++) { Err bitreich.org 70 i+ if (git_patch_from_diff(&patch, diff, i)) { Err bitreich.org 70 i+ git_patch_free(patch); Err bitreich.org 70 i+ break; /* TODO: handle error */ Err bitreich.org 70 i } Err bitreich.org 70 i- fprintf(fp, "\n"); Err bitreich.org 70 i- } Err bitreich.org 70 i- if ((sig = git_commit_author(commit)) != NULL) { Err bitreich.org 70 i- fprintf(fp, "Author: %s <%s>\n", Err bitreich.org 70 i- sig->name, sig->name, sig->email); Err bitreich.org 70 i- printtime(fp, &sig->when, "Date: "); Err bitreich.org 70 i- } Err bitreich.org 70 i- fprintf(fp, "\n"); Err bitreich.org 70 i Err bitreich.org 70 i- for (scan = git_commit_message(commit); scan && *scan;) { Err bitreich.org 70 i- for (eol = scan; *eol && *eol != '\n'; ++eol) /* find eol */ Err bitreich.org 70 i- ; Err bitreich.org 70 i+ delta = git_patch_get_delta(patch); Err bitreich.org 70 i+ fprintf(fp, "diff --git a/%s b/%s\n", Err bitreich.org 70 i+ relpath, delta->old_file.path, delta->old_file.path, Err bitreich.org 70 i+ relpath, delta->new_file.path, delta->new_file.path); Err bitreich.org 70 i Err bitreich.org 70 i- fprintf(fp, " %.*s\n", (int) (eol - scan), scan); Err bitreich.org 70 i- scan = *eol ? eol + 1 : NULL; Err bitreich.org 70 i+#if 0 Err bitreich.org 70 i+ switch (delta->flags) { Err bitreich.org 70 i+ case GIT_DIFF_FLAG_BINARY: continue; /* TODO: binary data */ Err bitreich.org 70 i+ case GIT_DIFF_FLAG_NOT_BINARY: break; Err bitreich.org 70 i+ case GIT_DIFF_FLAG_VALID_ID: break; /* TODO: check */ Err bitreich.org 70 i+ case GIT_DIFF_FLAG_EXISTS: break; /* TODO: check */ Err bitreich.org 70 i+ } Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i+ nhunks = git_patch_num_hunks(patch); Err bitreich.org 70 i+ for (j = 0; j < nhunks; j++) { Err bitreich.org 70 i+ if (git_patch_get_hunk(&hunk, &nhunklines, patch, j)) Err bitreich.org 70 i+ break; /* TODO: handle error ? */ Err bitreich.org 70 i+ Err bitreich.org 70 i+ fprintf(fp, "%s\n", hunk->header); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (k = 0; ; k++) { Err bitreich.org 70 i+ if (git_patch_get_line_in_hunk(&line, patch, j, k)) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ if (line->old_lineno == -1) Err bitreich.org 70 i+ fputc('+', fp); Err bitreich.org 70 i+ else if (line->new_lineno == -1) Err bitreich.org 70 i+ fputc('-', fp); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ fputc(' ', fp); Err bitreich.org 70 i+ xmlencode(fp, line->content, line->content_len); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ git_patch_free(patch); Err bitreich.org 70 i } Err bitreich.org 70 i- fprintf(fp, "\n"); Err bitreich.org 70 i+ git_diff_free(diff); Err bitreich.org 70 i+ Err bitreich.org 70 i+ writefooter(fp); Err bitreich.org 70 i+ fclose(fp); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-writeheader(FILE *fp) Err bitreich.org 70 i+writelog(FILE *fp) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(fp, "" Err bitreich.org 70 i- "" Err bitreich.org 70 i- "" Err bitreich.org 70 i- ""); Err bitreich.org 70 i- fprintf(fp, "%s%s%s", name, description[0] ? " - " : "", description); Err bitreich.org 70 i- fprintf(fp, "" Err bitreich.org 70 i- "
"); Err bitreich.org 70 i- fprintf(fp, "

\"\" %s

", relpath, name); Err bitreich.org 70 i- fprintf(fp, "%s
", description); Err bitreich.org 70 i- fprintf(fp, "Log |", relpath); Err bitreich.org 70 i- fprintf(fp, "Files| ", relpath); Err bitreich.org 70 i- fprintf(fp, "Stats", relpath); Err bitreich.org 70 i- if (hasreadme) Err bitreich.org 70 i- fprintf(fp, " | README", relpath); Err bitreich.org 70 i- if (haslicense) Err bitreich.org 70 i- fprintf(fp, " | LICENSE", relpath); Err bitreich.org 70 i- fprintf(fp, "

");	Err	bitreich.org	70
i+        git_revwalk *w = NULL;	Err	bitreich.org	70
i+        git_oid id;	Err	bitreich.org	70
i+        git_commit *c = NULL;	Err	bitreich.org	70
i+        size_t i;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        return 0;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i+        mkdir("commit", 0755);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-int	Err	bitreich.org	70
i-writefooter(FILE *fp)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        fprintf(fp, "
"); Err bitreich.org 70 i+ git_revwalk_new(&w, repo); Err bitreich.org 70 i+ git_revwalk_push_head(w); Err bitreich.org 70 i+ Err bitreich.org 70 i+ i = 0; Err bitreich.org 70 i+ while (!git_revwalk_next(&id, w)) { Err bitreich.org 70 i+ if (git_commit_lookup(&c, repo, &id)) Err bitreich.org 70 i+ return 1; /* TODO: error */ Err bitreich.org 70 i+ printcommit(fp, c); Err bitreich.org 70 i+ printshowfile(c); Err bitreich.org 70 i+ git_commit_free(c); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* DEBUG */ Err bitreich.org 70 i+ i++; Err bitreich.org 70 i+ if (i > 100) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ git_revwalk_free(w); Err bitreich.org 70 i Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+#if 0 Err bitreich.org 70 i int Err bitreich.org 70 i-writelog(FILE *fp) Err bitreich.org 70 i+writeatom(FILE *fp) Err bitreich.org 70 i { Err bitreich.org 70 i git_revwalk *w = NULL; Err bitreich.org 70 i git_oid id; Err bitreich.org 70 i@@ -210,14 +308,16 @@ writelog(FILE *fp) Err bitreich.org 70 i Err bitreich.org 70 i while (!git_revwalk_next(&id, w)) { Err bitreich.org 70 i if (git_commit_lookup(&c, repo, &id)) Err bitreich.org 70 i- return 1; Err bitreich.org 70 i+ return 1; /* TODO: error */ Err bitreich.org 70 i printcommit(fp, c); Err bitreich.org 70 i+ printshowfile(c); Err bitreich.org 70 i git_commit_free(c); Err bitreich.org 70 i } Err bitreich.org 70 i git_revwalk_free(w); Err bitreich.org 70 i Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i+#endif Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i writefiles(FILE *fp) Err bitreich.org 70 i@@ -251,7 +351,9 @@ writebranches(FILE *fp) Err bitreich.org 70 i git_branch_iterator_new(&branchit, repo, GIT_BRANCH_LOCAL); Err bitreich.org 70 i Err bitreich.org 70 i while ((status = git_branch_next(&branchref, &branchtype, branchit)) == GIT_ITEROVER) { Err bitreich.org 70 i- git_reference_normalize_name(branchbuf, sizeof(branchbuf), git_reference_name(branchref), GIT_REF_FORMAT_ALLOW_ONELEVEL | GIT_REF_FORMAT_REFSPEC_SHORTHAND); Err bitreich.org 70 i+ git_reference_normalize_name(branchbuf, sizeof(branchbuf), Err bitreich.org 70 i+ git_reference_name(branchref), Err bitreich.org 70 i+ GIT_REF_FORMAT_ALLOW_ONELEVEL | GIT_REF_FORMAT_REFSPEC_SHORTHAND); Err bitreich.org 70 i Err bitreich.org 70 i /* fprintf(fp, "branch: |%s|\n", branchbuf); */ Err bitreich.org 70 i } Err bitreich.org 70 i@@ -337,12 +439,18 @@ main(int argc, char *argv[]) Err bitreich.org 70 i hasreadme = 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- fp = efopen("logs.html", "w+b"); Err bitreich.org 70 i+ fp = efopen("log.html", "w+b"); Err bitreich.org 70 i writeheader(fp); Err bitreich.org 70 i writelog(fp); Err bitreich.org 70 i writefooter(fp); Err bitreich.org 70 i fclose(fp); Err bitreich.org 70 i Err bitreich.org 70 i+#if 0 Err bitreich.org 70 i+ fp = efopen("atom.xml", "w+b"); Err bitreich.org 70 i+ writeatom(fp); Err bitreich.org 70 i+ fclose(fp); Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i fp = efopen("files.html", "w+b"); Err bitreich.org 70 i writeheader(fp); Err bitreich.org 70 i writefiles(fp); Err bitreich.org 70 .