irewrite in C with libgit2, first 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 415e3fdd55b2ecdf2f35680694362a4b35fd1a05 /scm/stagit-gopher/commit/415e3fdd55b2ecdf2f35680694362a4b35fd1a05.gph bitreich.org 70 1parent bda4633633a0701bbd2f7861674a8e612d961fb7 /scm/stagit-gopher/commit/bda4633633a0701bbd2f7861674a8e612d961fb7.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Sat, 5 Dec 2015 20:22:57 +0100 Err bitreich.org 70 i Err bitreich.org 70 irewrite in C with libgit2, first version Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i D urmoms | 135 ------------------------------- Err bitreich.org 70 i A urmoms.c | 222 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 222 insertions(+), 135 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/urmoms b/urmoms /scm/stagit-gopher/file/urmoms.gph bitreich.org 70 i@@ -1,135 +0,0 @@ Err bitreich.org 70 i-#!/bin/sh Err bitreich.org 70 i- Err bitreich.org 70 i-# DEBUG Err bitreich.org 70 i-#set -e -x Err bitreich.org 70 i- Err bitreich.org 70 i-usage() { Err bitreich.org 70 i- printf '%s \n' "$0" Err bitreich.org 70 i- exit 1 Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-header() { Err bitreich.org 70 i- cat < 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-${name} - ${description} 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-

${name}

Err bitreich.org 70 i-${description}
Err bitreich.org 70 i-Log | Err bitreich.org 70 i-Files | Err bitreich.org 70 i-Stats | Err bitreich.org 70 i-README | Err bitreich.org 70 i-LICENSE Err bitreich.org 70 i-
Err bitreich.org 70 i-
Err bitreich.org 70 i-
	Err	bitreich.org	70
i-!__EOF__	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-footer() {	Err	bitreich.org	70
i-        cat <	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-!__EOF__	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# usage: repodir and htmldir must be set.	Err	bitreich.org	70
i-if test x"$1" = x"" || test x"$2" = x""; then	Err	bitreich.org	70
i-        usage	Err	bitreich.org	70
i-fi	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# make absolute path to htmldir.	Err	bitreich.org	70
i-htmldir="$(readlink -f $2)"	Err	bitreich.org	70
i-mkdir -p "${htmldir}"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# repodir must be a directory to go to.	Err	bitreich.org	70
i-cd "$1" || usage	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# default index page (symlink).	Err	bitreich.org	70
i-indexpage="log.html"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# project name, if bare repo remove .git suffix.	Err	bitreich.org	70
i-name=$(basename "$(pwd)" ".git")	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# read .git/description.	Err	bitreich.org	70
i-description=""	Err	bitreich.org	70
i-test -f ".git/description" && description="$(cat '.git/description')"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# make diff for each commit (all files).	Err	bitreich.org	70
i-relpath="../"	Err	bitreich.org	70
i-mkdir -p "${htmldir}/commit"	Err	bitreich.org	70
i-git log --pretty='%H' | while read -r commit; do	Err	bitreich.org	70
i-        test -e "${htmldir}/commit/${commit}.html" && continue	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        header > "${htmldir}/commit/${commit}.html"	Err	bitreich.org	70
i-        git show --pretty=full "${commit}" | \	Err	bitreich.org	70
i-                sed -E 's@^commit (.*)$@commit \1@g' >> "${htmldir}/commit/${commit}.html"	Err	bitreich.org	70
i-        footer >> "${htmldir}/commit/${commit}.html"	Err	bitreich.org	70
i-done 	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-# make log with all commits.	Err	bitreich.org	70
i-relpath=""	Err	bitreich.org	70
i-header > "${htmldir}/log.html"	Err	bitreich.org	70
i-printf '' >> "${htmldir}/log.html"	Err	bitreich.org	70
i-git log --pretty='' >> "${htmldir}/log.html"	Err	bitreich.org	70
i-printf '
%cr%H%an%s
' >> "${htmldir}/log.html" Err bitreich.org 70 i-footer >> "${htmldir}/log.html" Err bitreich.org 70 i- Err bitreich.org 70 i-# make index with file links. Err bitreich.org 70 i-relpath="" Err bitreich.org 70 i-header >> "${htmldir}/files.html" Err bitreich.org 70 i-printf '' >> "${htmldir}/files.html" Err bitreich.org 70 i-git ls-tree -r -l master | while read -r mode type object size file; do Err bitreich.org 70 i- git log -1 --pretty='' "${file}" Err bitreich.org 70 i-done >> "${htmldir}/files.html" Err bitreich.org 70 i-printf '
ModeNameSize
'${mode}''${file}''${size}'[plain]
' >> "${htmldir}/files.html" Err bitreich.org 70 i-footer >> "${htmldir}/files.html" Err bitreich.org 70 i- Err bitreich.org 70 i-# readme page Err bitreich.org 70 i-# find README file. Err bitreich.org 70 i-relpath="" Err bitreich.org 70 i-readme="" Err bitreich.org 70 i-for f in README README.md readme.md; do Err bitreich.org 70 i- test -e "${f}" && readme="${f}" Err bitreich.org 70 i-done Err bitreich.org 70 i-# make page. Err bitreich.org 70 i-header > "${htmldir}/readme.html" Err bitreich.org 70 i-if test x"${readme}" != x""; then Err bitreich.org 70 i- cat "${readme}" >> "${htmldir}/readme.html" Err bitreich.org 70 i-else Err bitreich.org 70 i- echo "no README file found" >> "${htmldir}/readme.html" Err bitreich.org 70 i-fi Err bitreich.org 70 i-footer >> "${htmldir}/readme.html" Err bitreich.org 70 i- Err bitreich.org 70 i-# license page Err bitreich.org 70 i-# find LICENSE file. Err bitreich.org 70 i-relpath="" Err bitreich.org 70 i-license="" Err bitreich.org 70 i-for f in LICENSE LICENSE.md; do Err bitreich.org 70 i- test -e "${f}" && license="${f}" Err bitreich.org 70 i-done Err bitreich.org 70 i-# make page. Err bitreich.org 70 i-header > "${htmldir}/license.html" Err bitreich.org 70 i-if test x"${readme}" != x""; then Err bitreich.org 70 i- cat "${license}" >> "${htmldir}/license.html" Err bitreich.org 70 i-else Err bitreich.org 70 i- echo "unknown license" >> "${htmldir}/license.html" Err bitreich.org 70 i-fi Err bitreich.org 70 i-footer >> "${htmldir}/license.html" Err bitreich.org 70 i- Err bitreich.org 70 i-# stats (authors). Err bitreich.org 70 i-relpath="" Err bitreich.org 70 i-header > "${htmldir}/stats.html" Err bitreich.org 70 i-git shortlog -n -s >> "${htmldir}/stats.html" Err bitreich.org 70 i-footer >> "${htmldir}/stats.html" Err bitreich.org 70 i- Err bitreich.org 70 i-# symlink to index page. Err bitreich.org 70 i-ln -sf "$indexpage" "${htmldir}/index.html" Err bitreich.org 70 1diff --git a/urmoms.c b/urmoms.c /scm/stagit-gopher/file/urmoms.c.gph bitreich.org 70 i@@ -0,0 +1,222 @@ 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 "git2.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+static const char *relpath = ""; Err bitreich.org 70 i+static const char *name = ""; Err bitreich.org 70 i+static const char *description = ""; Err bitreich.org 70 i+ Err bitreich.org 70 i+static const char *repodir = "."; Err bitreich.org 70 i+ Err bitreich.org 70 i+static git_repository *repo; 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+ fp = fopen(name, flags); Err bitreich.org 70 i+ if (!fp) 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+static void Err bitreich.org 70 i+printtime(FILE *fp, const git_time * intime, const char *prefix) 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+ int offset, hours, minutes; Err bitreich.org 70 i+ char sign, out[32]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ offset = intime->offset; Err bitreich.org 70 i+ if (offset < 0) { Err bitreich.org 70 i+ sign = '-'; Err bitreich.org 70 i+ offset = -offset; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ sign = '+'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ hours = offset / 60; Err bitreich.org 70 i+ minutes = offset % 60; Err bitreich.org 70 i+ Err bitreich.org 70 i+ t = (time_t) intime->time + (intime->offset * 60); Err bitreich.org 70 i+ 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+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static 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+ 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+ 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+ } 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+ 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+} 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", name, 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+ fprintf(fp, "README | ", relpath); 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+int Err bitreich.org 70 i+writelog(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+ git_commit *c = NULL; 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+ 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+ printcommit(fp, 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+ Err bitreich.org 70 i+int Err bitreich.org 70 i+writefiles(FILE *fp) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ git_index *index; Err bitreich.org 70 i+ const git_index_entry *entry; Err bitreich.org 70 i+ size_t count, i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_repository_index(&index, repo); Err bitreich.org 70 i+ Err bitreich.org 70 i+ count = git_index_entrycount(index); Err bitreich.org 70 i+ for (i = 0; i < count; i++) { Err bitreich.org 70 i+ entry = git_index_get_byindex(index, i); Err bitreich.org 70 i+ fprintf(fp, "name: %s, size: %lu, mode: %lu\n", Err bitreich.org 70 i+ entry->path, entry->file_size, entry->mode); Err bitreich.org 70 i+ } 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+writebranches(FILE *fp) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ git_branch_iterator *branchit = NULL; Err bitreich.org 70 i+ git_branch_t branchtype; Err bitreich.org 70 i+ git_reference *branchref; Err bitreich.org 70 i+ char branchbuf[BUFSIZ] = ""; Err bitreich.org 70 i+ int status; Err bitreich.org 70 i+ 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+ Err bitreich.org 70 i+ /* fprintf(fp, "branch: |%s|\n", branchbuf); */ Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_branch_iterator_free(branchit); 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+main(int argc, char *argv[]) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int status; Err bitreich.org 70 i+ const git_error *e = NULL; Err bitreich.org 70 i+ FILE *fp; 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+ } Err bitreich.org 70 i+ repodir = argv[1]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_libgit2_init(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((status = git_repository_open(&repo, repodir)) < 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+ exit(status); 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+ 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+ fp = efopen("files.html", "w+b"); Err bitreich.org 70 i+ writeheader(fp); Err bitreich.org 70 i+ writefiles(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+ /* 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 .