iadd urmoms-index, initial version - 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 7102cfd3f76ebf6f6caf774f2209000c22233d39 /scm/stagit-gopher/commit/7102cfd3f76ebf6f6caf774f2209000c22233d39.gph bitreich.org 70 1parent 372fe8d86e621b09dadb893b2153f643a70cab7f /scm/stagit-gopher/commit/372fe8d86e621b09dadb893b2153f643a70cab7f.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Sun, 20 Dec 2015 17:11:25 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd urmoms-index, initial version Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 12 +++++++++--- Err bitreich.org 70 i A urmoms-index.1 | 14 ++++++++++++++ Err bitreich.org 70 i A urmoms-index.c | 319 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 342 insertions(+), 3 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/stagit-gopher/file/Makefile.gph bitreich.org 70 i@@ -3,11 +3,14 @@ include config.mk Err bitreich.org 70 i NAME = urmoms Err bitreich.org 70 i VERSION = 0.1 Err bitreich.org 70 i SRC = \ Err bitreich.org 70 i- urmoms.c Err bitreich.org 70 i+ urmoms.c\ Err bitreich.org 70 i+ urmoms-index.c Err bitreich.org 70 i BIN = \ Err bitreich.org 70 i- urmoms Err bitreich.org 70 i+ urmoms\ Err bitreich.org 70 i+ urmoms-index Err bitreich.org 70 i MAN1 = \ Err bitreich.org 70 i- urmoms.1 Err bitreich.org 70 i+ urmoms.1\ Err bitreich.org 70 i+ urmoms-index.1 Err bitreich.org 70 i DOC = \ Err bitreich.org 70 i LICENSE\ Err bitreich.org 70 i README\ Err bitreich.org 70 i@@ -42,6 +45,9 @@ config.h: Err bitreich.org 70 i urmoms: urmoms.o Err bitreich.org 70 i ${CC} -o $@ urmoms.o ${LDFLAGS} Err bitreich.org 70 i Err bitreich.org 70 i+urmoms-index: urmoms-index.o Err bitreich.org 70 i+ ${CC} -o $@ urmoms-index.o ${LDFLAGS} Err bitreich.org 70 i+ Err bitreich.org 70 i clean: Err bitreich.org 70 i rm -f ${BIN} ${OBJ} Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/urmoms-index.1 b/urmoms-index.1 /scm/stagit-gopher/file/urmoms-index.1.gph bitreich.org 70 i@@ -0,0 +1,14 @@ Err bitreich.org 70 i+.Dd December 15, 2015 Err bitreich.org 70 i+.Dt URMOMS-INDEX 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+.Sh NAME Err bitreich.org 70 i+.Nm urmoms-index Err bitreich.org 70 i+.Nd static git page generator (repo list) 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+.Sh DESCRIPTION Err bitreich.org 70 i+.Nm Err bitreich.org 70 i+is undocumented Err bitreich.org 70 i+.Sh AUTHORS Err bitreich.org 70 i+.An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org Err bitreich.org 70 1diff --git a/urmoms-index.c b/urmoms-index.c /scm/stagit-gopher/file/urmoms-index.c.gph bitreich.org 70 i@@ -0,0 +1,319 @@ 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+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "config.h" Err bitreich.org 70 i+#include "git2.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+struct commitinfo { Err bitreich.org 70 i+ const git_oid *id; Err bitreich.org 70 i+ Err bitreich.org 70 i+ char oid[GIT_OID_HEXSZ + 1]; Err bitreich.org 70 i+ char parentoid[GIT_OID_HEXSZ + 1]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ const git_signature *author; Err bitreich.org 70 i+ const char *summary; Err bitreich.org 70 i+ const char *msg; Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_diff_stats *stats; Err bitreich.org 70 i+ git_diff *diff; Err bitreich.org 70 i+ git_commit *commit; Err bitreich.org 70 i+ git_commit *parent; Err bitreich.org 70 i+ git_tree *commit_tree; Err bitreich.org 70 i+ git_tree *parent_tree; Err bitreich.org 70 i+ Err bitreich.org 70 i+ size_t addcount; Err bitreich.org 70 i+ size_t delcount; Err bitreich.org 70 i+ size_t filecount; Err bitreich.org 70 i+}; 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+ Err bitreich.org 70 i+static char description[255] = "Repositories"; Err bitreich.org 70 i+static char name[255]; Err bitreich.org 70 i+static char owner[255]; Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+commitinfo_free(struct commitinfo *ci) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (!ci) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_diff_stats_free(ci->stats); Err bitreich.org 70 i+ git_diff_free(ci->diff); Err bitreich.org 70 i+ git_tree_free(ci->commit_tree); Err bitreich.org 70 i+ git_tree_free(ci->parent_tree); Err bitreich.org 70 i+ git_commit_free(ci->commit); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+struct commitinfo * Err bitreich.org 70 i+commitinfo_getbyoid(const git_oid *id) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct commitinfo *ci; Err bitreich.org 70 i+ git_diff_options opts; Err bitreich.org 70 i+ int error; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!(ci = calloc(1, sizeof(struct commitinfo)))) Err bitreich.org 70 i+ err(1, "calloc"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ci->id = id; Err bitreich.org 70 i+ if (git_commit_lookup(&(ci->commit), repo, id)) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* TODO: show tags when commit has it */ Err bitreich.org 70 i+ git_oid_tostr(ci->oid, sizeof(ci->oid), git_commit_id(ci->commit)); Err bitreich.org 70 i+ git_oid_tostr(ci->parentoid, sizeof(ci->parentoid), git_commit_parent_id(ci->commit, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ci->author = git_commit_author(ci->commit); Err bitreich.org 70 i+ ci->summary = git_commit_summary(ci->commit); Err bitreich.org 70 i+ ci->msg = git_commit_message(ci->commit); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((error = git_commit_tree(&(ci->commit_tree), ci->commit))) Err bitreich.org 70 i+ goto err; /* TODO: handle error */ Err bitreich.org 70 i+ if (!(error = git_commit_parent(&(ci->parent), ci->commit, 0))) { Err bitreich.org 70 i+ if ((error = git_commit_tree(&(ci->parent_tree), ci->parent))) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ ci->parent = NULL; Err bitreich.org 70 i+ ci->parent_tree = NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION); Err bitreich.org 70 i+ opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH; Err bitreich.org 70 i+ if ((error = git_diff_tree_to_tree(&(ci->diff), repo, ci->parent_tree, ci->commit_tree, &opts))) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ if (git_diff_get_stats(&(ci->stats), ci->diff)) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ Err bitreich.org 70 i+ ci->addcount = git_diff_stats_insertions(ci->stats); Err bitreich.org 70 i+ ci->delcount = git_diff_stats_deletions(ci->stats); Err bitreich.org 70 i+ ci->filecount = git_diff_stats_files_changed(ci->stats); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* TODO: show tag when commit has it */ Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ci; Err bitreich.org 70 i+ Err bitreich.org 70 i+err: Err bitreich.org 70 i+ commitinfo_free(ci); Err bitreich.org 70 i+ free(ci); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return NULL; 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+ FILE *fp; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!(fp = fopen(name, flags))) Err bitreich.org 70 i+ err(1, "fopen"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return fp; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Escape characters below as HTML 2.0 / XML 1.0. */ Err bitreich.org 70 i+void Err bitreich.org 70 i+xmlencode(FILE *fp, const char *s, size_t len) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; *s && i < len; s++, i++) { Err bitreich.org 70 i+ switch(*s) { Err bitreich.org 70 i+ case '<': fputs("<", fp); break; Err bitreich.org 70 i+ case '>': fputs(">", fp); break; Err bitreich.org 70 i+ case '\'': fputs("'", fp); break; Err bitreich.org 70 i+ case '&': fputs("&", fp); break; Err bitreich.org 70 i+ case '"': fputs(""", fp); break; Err bitreich.org 70 i+ default: fputc(*s, fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Some implementations of basename(3) return a pointer to a static Err bitreich.org 70 i+ * internal buffer (OpenBSD). Others modify the contents of `path` (POSIX). Err bitreich.org 70 i+ * This is a wrapper function that is compatible with both versions. Err bitreich.org 70 i+ * The program will error out if basename(3) failed, this can only happen Err bitreich.org 70 i+ * with the OpenBSD version. */ Err bitreich.org 70 i+char * Err bitreich.org 70 i+xbasename(const char *path) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *p, *b; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!(p = strdup(path))) Err bitreich.org 70 i+ err(1, "strdup"); Err bitreich.org 70 i+ if (!(b = basename(p))) Err bitreich.org 70 i+ err(1, "basename"); Err bitreich.org 70 i+ if (!(b = strdup(b))) Err bitreich.org 70 i+ err(1, "strdup"); Err bitreich.org 70 i+ free(p); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return b; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+printtimeformat(FILE *fp, const git_time *intime, const char *fmt) 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+ char out[32]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ t = (time_t) intime->time + (intime->offset * 60); Err bitreich.org 70 i+ intm = gmtime(&t); Err bitreich.org 70 i+ strftime(out, sizeof(out), fmt, intm); Err bitreich.org 70 i+ fputs(out, fp); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+printtimeshort(FILE *fp, const git_time *intime) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ printtimeformat(fp, intime, "%Y-%m-%d %H:%M"); 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+{ Err bitreich.org 70 i+ fputs("" Err bitreich.org 70 i+ "\n\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ "\n", fp); Err bitreich.org 70 i+ xmlencode(fp, description, strlen(description)); Err bitreich.org 70 i+ fprintf(fp, "\n\n", relpath); Err bitreich.org 70 i+ fprintf(fp, "\n", relpath); Err bitreich.org 70 i+ fputs("\n\n\n", fp); Err bitreich.org 70 i+ fprintf(fp, "\n\n" Err bitreich.org 70 i+ "\n
\"\"

%s

%s
\n", Err bitreich.org 70 i+ relpath, name, description); Err bitreich.org 70 i+ fputs("
\n
\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ "\n", 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+ return !fputs("
NameDescriptionOwnerLast commit
\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) 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+ int ret = 0; Err bitreich.org 70 i+ 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+ 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+ if (git_revwalk_next(&id, w) || Err bitreich.org 70 i+ !(ci = commitinfo_getbyoid(&id))) { Err bitreich.org 70 i+ ret = -1; Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ xmlencode(fp, name, strlen(name)); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ xmlencode(fp, description, strlen(description)); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ xmlencode(fp, owner, strlen(owner)); 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+ Err bitreich.org 70 i+err: Err bitreich.org 70 i+ git_revwalk_free(w); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return ret; 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+ const git_error *e = NULL; Err bitreich.org 70 i+ FILE *fp; Err bitreich.org 70 i+ char path[PATH_MAX], *p; Err bitreich.org 70 i+ int status; Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (argc < 2) { Err bitreich.org 70 i+ fprintf(stderr, "%s [repodir...]\n", argv[0]); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ git_libgit2_init(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ writeheader(stdout); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 1; i < argc; i++) { Err bitreich.org 70 i+ repodir = argv[i]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((status = git_repository_open_ext(&repo, repodir, Err bitreich.org 70 i+ GIT_REPOSITORY_OPEN_NO_SEARCH, NULL)) < 0) { Err bitreich.org 70 i+ e = giterr_last(); Err bitreich.org 70 i+ fprintf(stderr, "error %d/%d: %s\n", status, e->klass, e->message); Err bitreich.org 70 i+ return status; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* use directory name as name */ Err bitreich.org 70 i+ p = xbasename(repodir); Err bitreich.org 70 i+ snprintf(name, sizeof(name), "%s", p); Err bitreich.org 70 i+ free(p); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* read description or .git/description */ Err bitreich.org 70 i+ description[0] = '\0'; Err bitreich.org 70 i+ snprintf(path, sizeof(path), "%s%s%s", Err bitreich.org 70 i+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description"); Err bitreich.org 70 i+ if (!(fp = fopen(path, "r"))) { Err bitreich.org 70 i+ snprintf(path, sizeof(path), "%s%s%s", Err bitreich.org 70 i+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description"); Err bitreich.org 70 i+ fp = fopen(path, "r"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (fp) { Err bitreich.org 70 i+ if (!fgets(description, sizeof(description), fp)) Err bitreich.org 70 i+ description[0] = '\0'; Err bitreich.org 70 i+ fclose(fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* read owner or .git/owner */ Err bitreich.org 70 i+ owner[0] = '\0'; Err bitreich.org 70 i+ snprintf(path, sizeof(path), "%s%s%s", Err bitreich.org 70 i+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "owner"); Err bitreich.org 70 i+ if (!(fp = fopen(path, "r"))) { Err bitreich.org 70 i+ snprintf(path, sizeof(path), "%s%s%s", Err bitreich.org 70 i+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/owner"); Err bitreich.org 70 i+ fp = fopen(path, "r"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (fp) { Err bitreich.org 70 i+ if (!fgets(owner, sizeof(owner), fp)) Err bitreich.org 70 i+ owner[0] = '\0'; Err bitreich.org 70 i+ fclose(fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ writelog(stdout); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ writefooter(stdout); 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 i+ Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 .