iadd stagit.c - 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 ef3f1ef854936fc254da5375f69f58dad4e69ca6 /scm/stagit-gopher/commit/ef3f1ef854936fc254da5375f69f58dad4e69ca6.gph bitreich.org 70 1parent 81dd454368b40eabf62fede213626d45512150a2 /scm/stagit-gopher/commit/81dd454368b40eabf62fede213626d45512150a2.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Sat, 26 Dec 2015 21:07:47 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd stagit.c Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A stagit.c | 852 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 852 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/stagit.c b/stagit.c /scm/stagit-gopher/file/stagit.c.gph bitreich.org 70 i@@ -0,0 +1,852 @@ 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 Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "compat.h" Err bitreich.org 70 i+#include "config.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 name[255]; Err bitreich.org 70 i+static char description[255]; Err bitreich.org 70 i+static char cloneurl[1024]; Err bitreich.org 70 i+static int hasreadme, haslicense; 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+ 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; 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+ 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 dirname(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 dirname(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+xdirname(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 = dirname(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+/* 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+int Err bitreich.org 70 i+mkdirp(const char *path) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char tmp[PATH_MAX], *p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ strlcpy(tmp, path, sizeof(tmp)); Err bitreich.org 70 i+ for (p = tmp + (tmp[0] == '/'); *p; p++) { Err bitreich.org 70 i+ if (*p != '/') Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ *p = '\0'; Err bitreich.org 70 i+ if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ *p = '/'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (mkdir(tmp, S_IRWXU | S_IRWXG | S_IRWXO) < 0 && errno != EEXIST) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ return 0; 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+printtimez(FILE *fp, const git_time *intime) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ printtimeformat(fp, intime, "%Y-%m-%dT%H:%M:%SZ"); Err bitreich.org 70 i+} Err bitreich.org 70 i+ 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+ printtimeformat(fp, intime, "%a %b %e %T %Y"); 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, name, strlen(name)); Err bitreich.org 70 i+ if (description[0]) Err bitreich.org 70 i+ fputs(" - ", 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", Err bitreich.org 70 i+ name, relpath); Err bitreich.org 70 i+ fprintf(fp, "\n", relpath); Err bitreich.org 70 i+ fputs("\n\n", fp); Err bitreich.org 70 i+ if (cloneurl[0]) { Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fputs("
", fp); Err bitreich.org 70 i+ fprintf(fp, "\"\"", Err bitreich.org 70 i+ relpath, relpath); 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("
git clone ", fp); Err bitreich.org 70 i+ xmlencode(fp, cloneurl, strlen(cloneurl)); Err bitreich.org 70 i+ fputs("
\n", fp); Err bitreich.org 70 i+ fprintf(fp, "Log | ", relpath); Err bitreich.org 70 i+ fprintf(fp, "Files", 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+ fputs("
\n
\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("
\n", fp); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+writeblobhtml(FILE *fp, const git_blob *blob) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ off_t i = 0; Err bitreich.org 70 i+ size_t n = 1; Err bitreich.org 70 i+ char *nfmt = "%d\n"; Err bitreich.org 70 i+ const char *s = git_blob_rawcontent(blob); Err bitreich.org 70 i+ git_off_t len = git_blob_rawsize(blob); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("
\n", fp);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (len) {	Err	bitreich.org	70
i+                fprintf(fp, nfmt, n, n, n);	Err	bitreich.org	70
i+                while (i < len - 1) {	Err	bitreich.org	70
i+                        if (s[i] == '\n') {	Err	bitreich.org	70
i+                                n++;	Err	bitreich.org	70
i+                                fprintf(fp, nfmt, n, n, n);	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        i++;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        fputs("
\n", fp);	Err	bitreich.org	70
i+        xmlencode(fp, s, (size_t)len);	Err	bitreich.org	70
i+        fputs("
\n", fp); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+printcommit(FILE *fp, struct commitinfo *ci) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fprintf(fp, "commit %s\n", Err bitreich.org 70 i+ relpath, ci->oid, ci->oid); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ci->parentoid[0]) Err bitreich.org 70 i+ fprintf(fp, "parent %s\n", Err bitreich.org 70 i+ relpath, ci->parentoid, ci->parentoid); Err bitreich.org 70 i+ Err bitreich.org 70 i+#if 0 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", Err bitreich.org 70 i+ relpath, buf, buf); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ if (ci->author) { Err bitreich.org 70 i+ fprintf(fp, "Author: "); Err bitreich.org 70 i+ xmlencode(fp, ci->author->name, strlen(ci->author->name)); Err bitreich.org 70 i+ fprintf(fp, " <author->email, strlen(ci->author->email)); Err bitreich.org 70 i+ fputs("\">", fp); Err bitreich.org 70 i+ xmlencode(fp, ci->author->email, strlen(ci->author->email)); Err bitreich.org 70 i+ fputs(">\nDate: ", fp); Err bitreich.org 70 i+ printtime(fp, &(ci->author->when)); Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ci->msg) Err bitreich.org 70 i+ xmlencode(fp, ci->msg, strlen(ci->msg)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+printshowfile(struct commitinfo *ci) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ const git_diff_delta *delta; Err bitreich.org 70 i+ const git_diff_hunk *hunk; Err bitreich.org 70 i+ const git_diff_line *line; Err bitreich.org 70 i+ git_patch *patch; Err bitreich.org 70 i+ git_buf statsbuf; Err bitreich.org 70 i+ size_t ndeltas, nhunks, nhunklines; Err bitreich.org 70 i+ FILE *fp; Err bitreich.org 70 i+ size_t i, j, k; Err bitreich.org 70 i+ char path[PATH_MAX]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(path, sizeof(path), "commit/%s.html", ci->oid); Err bitreich.org 70 i+ /* check if file exists if so skip it */ Err bitreich.org 70 i+ if (!access(path, F_OK)) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fp = efopen(path, "w"); Err bitreich.org 70 i+ writeheader(fp); Err bitreich.org 70 i+ fputs("
\n", fp);	Err	bitreich.org	70
i+        printcommit(fp, ci);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        memset(&statsbuf, 0, sizeof(statsbuf));	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* diff stat */	Err	bitreich.org	70
i+        if (ci->stats) {	Err	bitreich.org	70
i+                if (!git_diff_stats_to_buf(&statsbuf, ci->stats,	Err	bitreich.org	70
i+                    GIT_DIFF_STATS_FULL | GIT_DIFF_STATS_SHORT, 80)) {	Err	bitreich.org	70
i+                        if (statsbuf.ptr && statsbuf.ptr[0]) {	Err	bitreich.org	70
i+                                fprintf(fp, "Diffstat:\n");	Err	bitreich.org	70
i+                                fputs(statsbuf.ptr, 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+        fputs("
", fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ndeltas = git_diff_num_deltas(ci->diff); Err bitreich.org 70 i+ for (i = 0; i < ndeltas; i++) { Err bitreich.org 70 i+ if (git_patch_from_diff(&patch, ci->diff, i)) { Err bitreich.org 70 i+ git_patch_free(patch); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } 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+ /* check binary data */ Err bitreich.org 70 i+ if (delta->flags & GIT_DIFF_FLAG_BINARY) { Err bitreich.org 70 i+ fputs("Binary files differ\n", fp); Err bitreich.org 70 i+ git_patch_free(patch); Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } 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; 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+ fprintf(fp, "+", Err bitreich.org 70 i+ j, k, j, k); Err bitreich.org 70 i+ else if (line->new_lineno == -1) Err bitreich.org 70 i+ fprintf(fp, "-", Err bitreich.org 70 i+ j, k, j, k); 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+ if (line->old_lineno == -1 || line->new_lineno == -1) Err bitreich.org 70 i+ fputs("", fp); 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+ git_buf_free(&statsbuf); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs( "
\n", fp); Err bitreich.org 70 i+ writefooter(fp); Err bitreich.org 70 i+ fclose(fp); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void 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+ size_t len; Err bitreich.org 70 i+ Err bitreich.org 70 i+ mkdir("commit", 0755); 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+ fputs("\n" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ "\n\n", fp); 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 (!(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+ Err bitreich.org 70 i+ relpath = "../"; Err bitreich.org 70 i+ printshowfile(ci); Err bitreich.org 70 i+ Err bitreich.org 70 i+ commitinfo_free(ci); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fprintf(fp, "
AgeCommit 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("
"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_revwalk_free(w); Err bitreich.org 70 i+ relpath = ""; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+printcommitatom(FILE *fp, struct commitinfo *ci) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ fputs("\n", fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fprintf(fp, "%s\n", ci->oid); Err bitreich.org 70 i+ if (ci->author) { Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ printtimez(fp, &(ci->author->when)); Err bitreich.org 70 i+ fputs("\n", fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (ci->summary) { Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ xmlencode(fp, ci->summary, strlen(ci->summary)); Err bitreich.org 70 i+ fputs("\n", fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ fprintf(fp, "commit %s\n", ci->oid); Err bitreich.org 70 i+ if (ci->parentoid[0]) Err bitreich.org 70 i+ fprintf(fp, "parent %s\n", ci->parentoid); Err bitreich.org 70 i+ Err bitreich.org 70 i+#if 0 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+ fputc('\n', fp); Err bitreich.org 70 i+ } Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ci->author) { Err bitreich.org 70 i+ fprintf(fp, "Author: "); Err bitreich.org 70 i+ xmlencode(fp, ci->author->name, strlen(ci->author->name)); Err bitreich.org 70 i+ fprintf(fp, " <"); Err bitreich.org 70 i+ xmlencode(fp, ci->author->email, strlen(ci->author->email)); Err bitreich.org 70 i+ fprintf(fp, ">\nDate: "); Err bitreich.org 70 i+ printtime(fp, &(ci->author->when)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ fputc('\n', fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ci->msg) Err bitreich.org 70 i+ xmlencode(fp, ci->msg, strlen(ci->msg)); Err bitreich.org 70 i+ fputs("\n\n", fp); Err bitreich.org 70 i+ if (ci->author) { Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ xmlencode(fp, ci->author->name, strlen(ci->author->name)); Err bitreich.org 70 i+ fputs("\n", fp); Err bitreich.org 70 i+ xmlencode(fp, ci->author->email, strlen(ci->author->email)); Err bitreich.org 70 i+ fputs("\n\n", fp); Err bitreich.org 70 i+ } 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+writeatom(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+ size_t i, m = 100; /* max */ Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("\n" Err bitreich.org 70 i+ "\n", fp); Err bitreich.org 70 i+ xmlencode(fp, name, strlen(name)); Err bitreich.org 70 i+ fputs(", branch master\n", fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ xmlencode(fp, description, strlen(description)); Err bitreich.org 70 i+ fputs("\n", fp); 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+ for (i = 0; i < m && !git_revwalk_next(&id, w); i++) { Err bitreich.org 70 i+ if (!(ci = commitinfo_getbyoid(&id))) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ printcommitatom(fp, ci); Err bitreich.org 70 i+ commitinfo_free(ci); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ git_revwalk_free(w); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("", 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+writeblob(git_object *obj, const char *filename, git_off_t filesize) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char fpath[PATH_MAX]; Err bitreich.org 70 i+ char tmp[PATH_MAX] = ""; Err bitreich.org 70 i+ char *d, *p; Err bitreich.org 70 i+ FILE *fp; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fpath, sizeof(fpath), "file/%s.html", filename); Err bitreich.org 70 i+ d = xdirname(fpath); Err bitreich.org 70 i+ if (mkdirp(d)) { Err bitreich.org 70 i+ free(d); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(d); Err bitreich.org 70 i+ Err bitreich.org 70 i+ p = fpath; Err bitreich.org 70 i+ while (*p) { Err bitreich.org 70 i+ if (*p == '/') Err bitreich.org 70 i+ strlcat(tmp, "../", sizeof(tmp)); Err bitreich.org 70 i+ p++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ relpath = tmp; Err bitreich.org 70 i+ Err bitreich.org 70 i+ fp = efopen(fpath, "w"); Err bitreich.org 70 i+ writeheader(fp); Err bitreich.org 70 i+ fputs("

", fp); Err bitreich.org 70 i+ xmlencode(fp, filename, strlen(filename)); Err bitreich.org 70 i+ fprintf(fp, " (%" PRIu32 "b)", filesize); Err bitreich.org 70 i+ fputs("


", fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (git_blob_is_binary((git_blob *)obj)) { Err bitreich.org 70 i+ fprintf(fp, "

Binary file

\n"); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ writeblobhtml(fp, (git_blob *)obj); Err bitreich.org 70 i+ if (ferror(fp)) Err bitreich.org 70 i+ err(1, "fwrite"); 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+ relpath = ""; 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+const char * Err bitreich.org 70 i+filemode(git_filemode_t m) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ static char mode[11]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ memset(mode, '-', sizeof(mode) - 1); Err bitreich.org 70 i+ mode[10] = '\0'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (S_ISREG(m)) Err bitreich.org 70 i+ mode[0] = '-'; Err bitreich.org 70 i+ else if (S_ISBLK(m)) Err bitreich.org 70 i+ mode[0] = 'b'; Err bitreich.org 70 i+ else if (S_ISCHR(m)) Err bitreich.org 70 i+ mode[0] = 'c'; Err bitreich.org 70 i+ else if (S_ISDIR(m)) Err bitreich.org 70 i+ mode[0] = 'd'; Err bitreich.org 70 i+ else if (S_ISFIFO(m)) Err bitreich.org 70 i+ mode[0] = 'p'; Err bitreich.org 70 i+ else if (S_ISLNK(m)) Err bitreich.org 70 i+ mode[0] = 'l'; Err bitreich.org 70 i+ else if (S_ISSOCK(m)) Err bitreich.org 70 i+ mode[0] = 's'; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ mode[0] = '?'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (m & S_IRUSR) mode[1] = 'r'; Err bitreich.org 70 i+ if (m & S_IWUSR) mode[2] = 'w'; Err bitreich.org 70 i+ if (m & S_IXUSR) mode[3] = 'x'; Err bitreich.org 70 i+ if (m & S_IRGRP) mode[4] = 'r'; Err bitreich.org 70 i+ if (m & S_IWGRP) mode[5] = 'w'; Err bitreich.org 70 i+ if (m & S_IXGRP) mode[6] = 'x'; Err bitreich.org 70 i+ if (m & S_IROTH) mode[7] = 'r'; Err bitreich.org 70 i+ if (m & S_IWOTH) mode[8] = 'w'; Err bitreich.org 70 i+ if (m & S_IXOTH) mode[9] = 'x'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (m & S_ISUID) mode[3] = (mode[3] == 'x') ? 's' : 'S'; Err bitreich.org 70 i+ if (m & S_ISGID) mode[6] = (mode[6] == 'x') ? 's' : 'S'; Err bitreich.org 70 i+ if (m & S_ISVTX) mode[9] = (mode[9] == 'x') ? 't' : 'T'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return mode; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+writefilestree(FILE *fp, git_tree *tree, const char *path) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ const git_tree_entry *entry = NULL; Err bitreich.org 70 i+ const char *filename; Err bitreich.org 70 i+ char filepath[PATH_MAX]; Err bitreich.org 70 i+ git_object *obj = NULL; Err bitreich.org 70 i+ git_off_t filesize; Err bitreich.org 70 i+ size_t count, i; Err bitreich.org 70 i+ int ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ count = git_tree_entrycount(tree); Err bitreich.org 70 i+ for (i = 0; i < count; i++) { Err bitreich.org 70 i+ if (!(entry = git_tree_entry_byindex(tree, i))) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ filename = git_tree_entry_name(entry); Err bitreich.org 70 i+ if (git_tree_entry_to_object(&obj, repo, entry)) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ switch (git_object_type(obj)) { Err bitreich.org 70 i+ case GIT_OBJ_BLOB: Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case GIT_OBJ_TREE: Err bitreich.org 70 i+ ret = writefilestree(fp, (git_tree *)obj, filename); Err bitreich.org 70 i+ git_object_free(obj); Err bitreich.org 70 i+ if (ret) Err bitreich.org 70 i+ return ret; Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ git_object_free(obj); Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (path[0]) { Err bitreich.org 70 i+ snprintf(filepath, sizeof(filepath), "%s/%s", path, filename); Err bitreich.org 70 i+ filename = filepath; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ filesize = git_blob_rawsize((git_blob *)obj); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ fprintf(fp, "%s", filemode(git_tree_entry_filemode(entry))); Err bitreich.org 70 i+ fprintf(fp, "", fp); Err bitreich.org 70 i+ xmlencode(fp, filename, strlen(filename)); Err bitreich.org 70 i+ fputs("", fp); Err bitreich.org 70 i+ fprintf(fp, "%" PRIu32, filesize); Err bitreich.org 70 i+ fputs("\n", fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ writeblob(obj, filename, filesize); 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+int Err bitreich.org 70 i+writefiles(FILE *fp) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ const git_oid *id; Err bitreich.org 70 i+ git_tree *tree = NULL; Err bitreich.org 70 i+ git_object *obj = NULL; Err bitreich.org 70 i+ git_commit *commit = NULL; 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+ if (git_revparse_single(&obj, repo, "HEAD")) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ id = git_object_id(obj); Err bitreich.org 70 i+ if (git_commit_lookup(&commit, repo, id)) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ if (git_commit_tree(&tree, commit)) { Err bitreich.org 70 i+ git_commit_free(commit); Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ git_commit_free(commit); Err bitreich.org 70 i+ Err bitreich.org 70 i+ writefilestree(fp, tree, ""); Err bitreich.org 70 i+ Err bitreich.org 70 i+ git_commit_free(commit); Err bitreich.org 70 i+ git_tree_free(tree); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fputs("
ModeNameSize
", 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+main(int argc, char *argv[]) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ git_object *obj = NULL; 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], *p; Err bitreich.org 70 i+ int status; 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_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+ snprintf(path, sizeof(path), "%s%s%s", Err bitreich.org 70 i+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description"); Err bitreich.org 70 i+ if (!(fpread = 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+ fpread = fopen(path, "r"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (fpread) { Err bitreich.org 70 i+ if (!fgets(description, sizeof(description), fpread)) Err bitreich.org 70 i+ description[0] = '\0'; Err bitreich.org 70 i+ fclose(fpread); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* read url or .git/url */ Err bitreich.org 70 i+ snprintf(path, sizeof(path), "%s%s%s", Err bitreich.org 70 i+ repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "url"); Err bitreich.org 70 i+ if (!(fpread = 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/url"); Err bitreich.org 70 i+ fpread = fopen(path, "r"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (fpread) { Err bitreich.org 70 i+ if (!fgets(cloneurl, sizeof(cloneurl), fpread)) Err bitreich.org 70 i+ cloneurl[0] = '\0'; Err bitreich.org 70 i+ fclose(fpread); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* check LICENSE */ Err bitreich.org 70 i+ haslicense = !git_revparse_single(&obj, repo, "HEAD:LICENSE"); Err bitreich.org 70 i+ git_object_free(obj); Err bitreich.org 70 i+ /* check README */ Err bitreich.org 70 i+ hasreadme = !git_revparse_single(&obj, repo, "HEAD:README"); Err bitreich.org 70 i+ git_object_free(obj); Err bitreich.org 70 i+ Err bitreich.org 70 i+ fp = efopen("log.html", "w"); 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"); 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+ /* Atom feed */ Err bitreich.org 70 i+ fp = efopen("atom.xml", "w"); Err bitreich.org 70 i+ writeatom(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 .