icache support (-c option) - 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 1a3584e2d0689aece46d9832c91f57723296807f /scm/stagit-gopher/commit/1a3584e2d0689aece46d9832c91f57723296807f.gph bitreich.org 70 1parent ede93fa7ee0af8e6e858981e1a7e5057646487ce /scm/stagit-gopher/commit/ede93fa7ee0af8e6e858981e1a7e5057646487ce.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Sun, 1 May 2016 17:54:14 +0200 Err bitreich.org 70 i Err bitreich.org 70 icache support (-c option) Err bitreich.org 70 i Err bitreich.org 70 i"Optionally the -c cachefile option can be used to cache the entries of Err bitreich.org 70 ithe log page up to the point of the last commit. The cachefile will store Err bitreich.org 70 ithe last commit id and the entries in the HTML table." Err bitreich.org 70 i Err bitreich.org 70 ithis caches the diffstat and commits, it is an expensive operation (twss). Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M stagit.1 | 20 +++++++++++++++++--- Err bitreich.org 70 i M stagit.c | 151 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 130 insertions(+), 41 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/stagit.1 b/stagit.1 /scm/stagit-gopher/file/stagit.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd December 26, 2015 Err bitreich.org 70 i+.Dd May 1, 2016 Err bitreich.org 70 i .Dt STAGIT 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i@@ -6,12 +6,26 @@ Err bitreich.org 70 i .Nd static git page generator Err bitreich.org 70 i .Sh SYNOPSIS Err bitreich.org 70 i .Nm Err bitreich.org 70 i-.Op Ar repodir Err bitreich.org 70 i+.Op Fl c Ar cachefile Err bitreich.org 70 i+.Ar repodir Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i .Nm Err bitreich.org 70 i writes HTML pages for the repository Err bitreich.org 70 i .Ar repodir Err bitreich.org 70 i-to the current directory. The following files will be written: Err bitreich.org 70 i+to the current directory. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Optionally the Err bitreich.org 70 i+.Fl c Ar cachefile Err bitreich.org 70 i+option can be used to cache the entries of the log page up to the point of Err bitreich.org 70 i+the last commit. The Err bitreich.org 70 i+.Ar cachefile Err bitreich.org 70 i+will store the last commit id and the entries in the HTML table. It is up Err bitreich.org 70 i+to the user to make sure the state of the Err bitreich.org 70 i+.Ar cachefile Err bitreich.org 70 i+is in sync with the history of the repository, for example a Err bitreich.org 70 i+git push \-\-force can screw this up. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+The following files will be written: Err bitreich.org 70 i .Bl -tag -width Ds Err bitreich.org 70 i .It atom.xml Err bitreich.org 70 i Atom XML feed Err bitreich.org 70 1diff --git a/stagit.c b/stagit.c /scm/stagit-gopher/file/stagit.c.gph bitreich.org 70 i@@ -58,6 +58,12 @@ static char description[255]; Err bitreich.org 70 i static char cloneurl[1024]; Err bitreich.org 70 i static int haslicense, hasreadme, hassubmodules; Err bitreich.org 70 i Err bitreich.org 70 i+/* cache */ Err bitreich.org 70 i+static git_oid lastoid; Err bitreich.org 70 i+static char lastoidstr[GIT_OID_HEXSZ + 2]; /* id + newline + nul byte */ Err bitreich.org 70 i+static FILE *rcachefp, *wcachefp; Err bitreich.org 70 i+static const char *cachefile; Err bitreich.org 70 i+ Err bitreich.org 70 i void Err bitreich.org 70 i deltainfo_free(struct deltainfo *di) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -530,13 +536,43 @@ printshowfile(FILE *fp, struct commitinfo *ci) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+void Err bitreich.org 70 i+writelogline(FILE *fp, struct commitinfo *ci) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t len; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ if (ci->author) Err bitreich.org 70 i+ printtimeshort(fp, &(ci->author->when)); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ if (ci->summary) { Err bitreich.org 70 i+ fprintf(fp, "", relpath, ci->oid); Err bitreich.org 70 i+ if ((len = strlen(ci->summary)) > summarylen) { Err bitreich.org 70 i+ xmlencode(fp, ci->summary, summarylen - 1); Err bitreich.org 70 i+ fputs("…", fp); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ xmlencode(fp, ci->summary, len); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ if (ci->author) Err bitreich.org 70 i+ xmlencode(fp, ci->author->name, strlen(ci->author->name)); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ fprintf(fp, "%zu", ci->filecount); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ fprintf(fp, "+%zu", ci->addcount); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ fprintf(fp, "-%zu", ci->delcount); Err bitreich.org 70 i+ fputs("\n", fp); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i int Err bitreich.org 70 i writelog(FILE *fp, const git_oid *oid) Err bitreich.org 70 i { Err bitreich.org 70 i struct commitinfo *ci; Err bitreich.org 70 i git_revwalk *w = NULL; Err bitreich.org 70 i git_oid id; Err bitreich.org 70 i- size_t len; Err bitreich.org 70 i char path[PATH_MAX]; Err bitreich.org 70 i FILE *fpfile; Err bitreich.org 70 i int r; Err bitreich.org 70 i@@ -546,40 +582,17 @@ writelog(FILE *fp, const git_oid *oid) Err bitreich.org 70 i git_revwalk_sorting(w, GIT_SORT_TIME); Err bitreich.org 70 i git_revwalk_simplify_first_parent(w); Err bitreich.org 70 i Err bitreich.org 70 i- fputs("\n" Err bitreich.org 70 i- "" Err bitreich.org 70 i- "\n\n", fp); Err bitreich.org 70 i- Err bitreich.org 70 i while (!git_revwalk_next(&id, w)) { Err bitreich.org 70 i relpath = ""; Err bitreich.org 70 i Err bitreich.org 70 i+ if (cachefile && !memcmp(&id, &lastoid, sizeof(id))) Err bitreich.org 70 i+ break; Err bitreich.org 70 i if (!(ci = commitinfo_getbyoid(&id))) Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i- fputs("\n", fp); Err bitreich.org 70 i+ writelogline(fp, ci); Err bitreich.org 70 i+ if (cachefile) Err bitreich.org 70 i+ writelogline(wcachefp, ci); Err bitreich.org 70 i Err bitreich.org 70 i relpath = "../"; Err bitreich.org 70 i Err bitreich.org 70 i@@ -599,8 +612,6 @@ writelog(FILE *fp, const git_oid *oid) Err bitreich.org 70 i } Err bitreich.org 70 i commitinfo_free(ci); Err bitreich.org 70 i } Err bitreich.org 70 i- fputs("
DateCommit messageAuthorFiles+-
", fp); Err bitreich.org 70 i- if (ci->author) Err bitreich.org 70 i- printtimeshort(fp, &(ci->author->when)); Err bitreich.org 70 i- fputs("", fp); Err bitreich.org 70 i- if (ci->summary) { Err bitreich.org 70 i- fprintf(fp, "", relpath, ci->oid); Err bitreich.org 70 i- if ((len = strlen(ci->summary)) > summarylen) { Err bitreich.org 70 i- xmlencode(fp, ci->summary, summarylen - 1); Err bitreich.org 70 i- fputs("…", fp); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- xmlencode(fp, ci->summary, len); Err bitreich.org 70 i- } Err bitreich.org 70 i- fputs("", fp); Err bitreich.org 70 i- } Err bitreich.org 70 i- fputs("", fp); Err bitreich.org 70 i- if (ci->author) Err bitreich.org 70 i- xmlencode(fp, ci->author->name, strlen(ci->author->name)); Err bitreich.org 70 i- fputs("", fp); Err bitreich.org 70 i- fprintf(fp, "%zu", ci->filecount); Err bitreich.org 70 i- fputs("", fp); Err bitreich.org 70 i- fprintf(fp, "+%zu", ci->addcount); Err bitreich.org 70 i- fputs("", fp); Err bitreich.org 70 i- fprintf(fp, "-%zu", ci->delcount); Err bitreich.org 70 i- fputs("
", fp); Err bitreich.org 70 i- Err bitreich.org 70 i git_revwalk_free(w); Err bitreich.org 70 i Err bitreich.org 70 i relpath = ""; Err bitreich.org 70 i@@ -1005,6 +1016,13 @@ joinpath(char *buf, size_t bufsiz, const char *path, const char *path2) Err bitreich.org 70 i path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+void Err bitreich.org 70 i+usage(char *argv0) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(stderr, "%s [-c cachefile] repodir\n", argv0); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i int Err bitreich.org 70 i main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -1013,12 +1031,23 @@ main(int argc, char *argv[]) Err bitreich.org 70 i const git_error *e = NULL; Err bitreich.org 70 i FILE *fp, *fpread; Err bitreich.org 70 i char path[PATH_MAX], repodirabs[PATH_MAX + 1], *p; Err bitreich.org 70 i- Err bitreich.org 70 i- if (argc != 2) { Err bitreich.org 70 i- fprintf(stderr, "%s \n", argv[0]); Err bitreich.org 70 i- return 1; Err bitreich.org 70 i+ char tmppath[64] = "cache.XXXXXXXXXXXX", buf[BUFSIZ]; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ int i, fd; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 1; i < argc; i++) { Err bitreich.org 70 i+ if (argv[i][0] != '-') { Err bitreich.org 70 i+ if (repodir) Err bitreich.org 70 i+ usage(argv[0]); Err bitreich.org 70 i+ repodir = argv[i]; Err bitreich.org 70 i+ } else if (argv[i][1] == 'c') { Err bitreich.org 70 i+ if (i + 1 >= argc) Err bitreich.org 70 i+ usage(argv[0]); Err bitreich.org 70 i+ cachefile = argv[++i]; Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i- repodir = argv[1]; Err bitreich.org 70 i+ if (!repodir) Err bitreich.org 70 i+ usage(argv[0]); Err bitreich.org 70 i Err bitreich.org 70 i if (!realpath(repodir, repodirabs)) Err bitreich.org 70 i err(1, "realpath"); Err bitreich.org 70 i@@ -1088,9 +1117,51 @@ main(int argc, char *argv[]) Err bitreich.org 70 i /* log for HEAD */ Err bitreich.org 70 i fp = efopen("log.html", "w"); Err bitreich.org 70 i relpath = ""; Err bitreich.org 70 i- writeheader(fp, "Log"); Err bitreich.org 70 i mkdir("commit", 0755); Err bitreich.org 70 i- writelog(fp, head); Err bitreich.org 70 i+ writeheader(fp, "Log"); Err bitreich.org 70 i+ fputs("\n" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ "\n\n", fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (cachefile) { Err bitreich.org 70 i+ /* read from cache file (does not need to exist) */ Err bitreich.org 70 i+ if ((rcachefp = fopen(cachefile, "r"))) { Err bitreich.org 70 i+ if (!fgets(lastoidstr, sizeof(lastoidstr), rcachefp)) Err bitreich.org 70 i+ errx(1, "%s: no object id", cachefile); Err bitreich.org 70 i+ if (git_oid_fromstr(&lastoid, lastoidstr)) Err bitreich.org 70 i+ errx(1, "%s: invalid object id", cachefile); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* write log to (temporary) cache */ Err bitreich.org 70 i+ if ((fd = mkstemp(tmppath)) == -1) Err bitreich.org 70 i+ err(1, "mkstemp"); Err bitreich.org 70 i+ if (!(wcachefp = fdopen(fd, "w"))) Err bitreich.org 70 i+ err(1, "fdopen"); Err bitreich.org 70 i+ /* write last commit id (HEAD) */ Err bitreich.org 70 i+ git_oid_tostr(buf, sizeof(buf), head); Err bitreich.org 70 i+ fprintf(wcachefp, "%s\n", buf); Err bitreich.org 70 i+ Err bitreich.org 70 i+ writelog(fp, head); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (rcachefp) { Err bitreich.org 70 i+ /* append previous log to log.html and the new cache */ Err bitreich.org 70 i+ while (!feof(rcachefp)) { Err bitreich.org 70 i+ n = fread(buf, 1, sizeof(buf), rcachefp); Err bitreich.org 70 i+ if (ferror(rcachefp)) Err bitreich.org 70 i+ err(1, "fread"); Err bitreich.org 70 i+ if (fwrite(buf, 1, n, fp) != n) Err bitreich.org 70 i+ err(1, "fwrite"); Err bitreich.org 70 i+ if (fwrite(buf, 1, n, wcachefp) != n) Err bitreich.org 70 i+ err(1, "fwrite"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fclose(rcachefp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fclose(wcachefp); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ writelog(fp, head); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("
DateCommit messageAuthorFiles+-
", 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@@ -1113,6 +1184,10 @@ main(int argc, char *argv[]) Err bitreich.org 70 i writeatom(fp); Err bitreich.org 70 i fclose(fp); Err bitreich.org 70 i Err bitreich.org 70 i+ /* rename new cache file on success */ Err bitreich.org 70 i+ if (cachefile && rename(tmppath, cachefile)) Err bitreich.org 70 i+ err(1, "rename: '%s' to '%s'", tmppath, cachefile); Err bitreich.org 70 i+ Err bitreich.org 70 i /* cleanup */ Err bitreich.org 70 i git_repository_free(repo); Err bitreich.org 70 i git_libgit2_shutdown(); Err bitreich.org 70 .