iuse git_reference for tags and branches, sort branches also - 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 87360fe2526f7713c4626d04da521579141fcf68 /scm/stagit-gopher/commit/87360fe2526f7713c4626d04da521579141fcf68.gph bitreich.org 70 1parent c750958b95624fd6bd45f817e255fe19aa412534 /scm/stagit-gopher/commit/c750958b95624fd6bd45f817e255fe19aa412534.gph bitreich.org 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org bitreich.org 70 iDate: Wed, 6 Jan 2016 17:45:02 +0100 Err bitreich.org 70 i Err bitreich.org 70 iuse git_reference for tags and branches, sort branches also Err bitreich.org 70 i Err bitreich.org 70 ithis removes some lines and somewhat simplifies it Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M stagit.c | 285 ++++++++++++------------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 113 insertions(+), 172 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@@ -775,199 +775,140 @@ err: Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-writebranches(FILE *fp) Err bitreich.org 70 i+refs_cmp(const void *v1, const void *v2) Err bitreich.org 70 i { Err bitreich.org 70 i- struct commitinfo *ci; Err bitreich.org 70 i- git_branch_iterator *it = NULL; Err bitreich.org 70 i- git_branch_t branch; Err bitreich.org 70 i- git_reference *ref = NULL, *dref = NULL; Err bitreich.org 70 i- const git_oid *id = NULL; Err bitreich.org 70 i- const char *branchname = NULL; Err bitreich.org 70 i- size_t len; Err bitreich.org 70 i- int ret = -1; Err bitreich.org 70 i- Err bitreich.org 70 i- /* log for local branches */ Err bitreich.org 70 i- if (git_branch_iterator_new(&it, repo, GIT_BRANCH_LOCAL)) Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- Err bitreich.org 70 i- fputs("

Branches

\n" Err bitreich.org 70 i- "" 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_branch_next(&ref, &branch, it)) { Err bitreich.org 70 i- if (git_branch_name(&branchname, ref)) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- Err bitreich.org 70 i- id = NULL; Err bitreich.org 70 i- switch (git_reference_type(ref)) { Err bitreich.org 70 i- case GIT_REF_SYMBOLIC: Err bitreich.org 70 i- if (git_reference_resolve(&dref, ref)) Err bitreich.org 70 i- goto err; Err bitreich.org 70 i- id = git_reference_target(dref); Err bitreich.org 70 i- break; Err bitreich.org 70 i- case GIT_REF_OID: Err bitreich.org 70 i- id = git_reference_target(ref); Err bitreich.org 70 i- break; Err bitreich.org 70 i- default: Err bitreich.org 70 i- continue; Err bitreich.org 70 i- } Err bitreich.org 70 i- if (!id) Err bitreich.org 70 i- goto err; 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- relpath = ""; 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+ git_reference *r1 = (*(git_reference **)v1); Err bitreich.org 70 i+ git_reference *r2 = (*(git_reference **)v2); Err bitreich.org 70 i+ int t1, t2; Err bitreich.org 70 i Err bitreich.org 70 i- commitinfo_free(ci); Err bitreich.org 70 i- git_reference_free(ref); Err bitreich.org 70 i- git_reference_free(dref); Err bitreich.org 70 i- ref = NULL; Err bitreich.org 70 i- dref = NULL; Err bitreich.org 70 i- } Err bitreich.org 70 i- ret = 0; Err bitreich.org 70 i+ t1 = git_reference_is_branch(r1); Err bitreich.org 70 i+ t2 = git_reference_is_branch(r2); Err bitreich.org 70 i Err bitreich.org 70 i-err: Err bitreich.org 70 i- fputs("
BranchAgeCommit messageAuthorFiles+-
", fp); Err bitreich.org 70 i- xmlencode(fp, branchname, strlen(branchname)); 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- 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- } 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- git_reference_free(ref); Err bitreich.org 70 i- git_reference_free(dref); Err bitreich.org 70 i- git_branch_iterator_free(it); Err bitreich.org 70 i+ if (t1 != t2) Err bitreich.org 70 i+ return t1 - t2; Err bitreich.org 70 i Err bitreich.org 70 i- return ret; Err bitreich.org 70 i+ return strcmp(git_reference_shorthand(r1), Err bitreich.org 70 i+ git_reference_shorthand(r2)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-tagcompare(void *s1, void *s2) Err bitreich.org 70 i-{ Err bitreich.org 70 i- return strcmp(*(char **)s1, *(char **)s2); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-int Err bitreich.org 70 i-writetags(FILE *fp) Err bitreich.org 70 i+writerefs(FILE *fp) Err bitreich.org 70 i { Err bitreich.org 70 i struct commitinfo *ci; Err bitreich.org 70 i- git_strarray tagnames; Err bitreich.org 70 i- git_object *obj = NULL; Err bitreich.org 70 i- git_tag *tag = NULL; Err bitreich.org 70 i const git_oid *id = NULL; Err bitreich.org 70 i- size_t i, len; Err bitreich.org 70 i- Err bitreich.org 70 i- /* summary page with branches and tags */ Err bitreich.org 70 i- memset(&tagnames, 0, sizeof(tagnames)); Err bitreich.org 70 i- if (git_tag_list(&tagnames, repo)) Err bitreich.org 70 i+ git_object *obj = NULL; Err bitreich.org 70 i+ git_reference *dref = NULL, *r, *ref = NULL; Err bitreich.org 70 i+ git_reference_iterator *it = NULL; Err bitreich.org 70 i+ git_reference **refs = NULL; Err bitreich.org 70 i+ size_t count, i, j, len, refcount = 0; Err bitreich.org 70 i+ const char *cols[] = { "Branch", "Tag" }; /* first column title */ Err bitreich.org 70 i+ const char *titles[] = { "Branches", "Tags" }; Err bitreich.org 70 i+ const char *ids[] = { "branches", "tags" }; Err bitreich.org 70 i+ const char *name; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (git_reference_iterator_new(&it, repo)) Err bitreich.org 70 i return -1; Err bitreich.org 70 i- if (!tagnames.count) { Err bitreich.org 70 i- git_strarray_free(&tagnames); Err bitreich.org 70 i- return 0; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- /* sort names */ Err bitreich.org 70 i- qsort(tagnames.strings, tagnames.count, sizeof(char *), Err bitreich.org 70 i- (int (*)(const void *, const void *))&tagcompare); Err bitreich.org 70 i- Err bitreich.org 70 i- fputs("

Tags

\n" Err bitreich.org 70 i- "" Err bitreich.org 70 i- "" Err bitreich.org 70 i- "\n\n", fp); Err bitreich.org 70 i- Err bitreich.org 70 i- for (i = 0; i < tagnames.count; i++) { Err bitreich.org 70 i- if (git_revparse_single(&obj, repo, tagnames.strings[i])) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- id = git_object_id(obj); Err bitreich.org 70 i Err bitreich.org 70 i- /* lookup actual commit (from annotated tag etc) */ Err bitreich.org 70 i- if (!git_tag_lookup(&tag, repo, id)) { Err bitreich.org 70 i- git_object_free(obj); Err bitreich.org 70 i- obj = NULL; Err bitreich.org 70 i- if (git_tag_peel(&obj, tag)) Err bitreich.org 70 i+ for (refcount = 0; !git_reference_next(&ref, it); refcount++) { Err bitreich.org 70 i+ if (!(refs = reallocarray(refs, refcount + 1, sizeof(git_reference *)))) Err bitreich.org 70 i+ err(1, "realloc"); Err bitreich.org 70 i+ refs[refcount] = ref; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ git_reference_iterator_free(it); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* sort by type then shorthand name */ Err bitreich.org 70 i+ qsort(refs, refcount, sizeof(git_reference *), refs_cmp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (j = 0; j < 2; j++) { Err bitreich.org 70 i+ for (i = 0, count = 0; i < refcount; i++) { Err bitreich.org 70 i+ if (git_reference_is_branch(refs[i]) && j == 0) Err bitreich.org 70 i+ ; Err bitreich.org 70 i+ else if (git_reference_is_tag(refs[i]) && j == 1) Err bitreich.org 70 i+ ; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ id = NULL; Err bitreich.org 70 i+ r = NULL; Err bitreich.org 70 i+ switch (git_reference_type(refs[i])) { Err bitreich.org 70 i+ case GIT_REF_SYMBOLIC: Err bitreich.org 70 i+ if (git_reference_resolve(&dref, refs[i])) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ r = dref; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case GIT_REF_OID: Err bitreich.org 70 i+ r = refs[i]; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (!(id = git_reference_target(r))) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ if (git_reference_peel(&obj, r, GIT_OBJ_ANY)) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ if (!(id = git_object_id(obj))) Err bitreich.org 70 i+ goto err; Err bitreich.org 70 i+ if (!(ci = commitinfo_getbyoid(id))) Err bitreich.org 70 i break; Err bitreich.org 70 i- git_tag_free(tag); Err bitreich.org 70 i- tag = NULL; Err bitreich.org 70 i- id = git_object_id(obj); Err bitreich.org 70 i- } 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- relpath = ""; Err bitreich.org 70 i+ /* print header if it has an entry (first). */ Err bitreich.org 70 i+ if (++count == 1) { Err bitreich.org 70 i+ fprintf(fp, "

%s

TagAgeCommit messageAuthorFiles+-
\n" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ "" Err bitreich.org 70 i+ "\n\n", Err bitreich.org 70 i+ titles[j], ids[j], cols[j]); Err bitreich.org 70 i+ } 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+ Err bitreich.org 70 i+ commitinfo_free(ci); Err bitreich.org 70 i+ git_reference_free(dref); Err bitreich.org 70 i+ dref = NULL; 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- Err bitreich.org 70 i- commitinfo_free(ci); Err bitreich.org 70 i- git_object_free(obj); Err bitreich.org 70 i- obj = NULL; Err bitreich.org 70 i+ /* table footer */ Err bitreich.org 70 i+ if (count) Err bitreich.org 70 i+ fputs("
%sAgeCommit messageAuthorFiles+-
", fp); Err bitreich.org 70 i- xmlencode(fp, tagnames.strings[i], strlen(tagnames.strings[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+ relpath = ""; Err bitreich.org 70 i+ name = git_reference_shorthand(r); 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+ 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+ 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- 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- fputs("", fp); Err bitreich.org 70 i- git_strarray_free(&tagnames); Err bitreich.org 70 i- git_tag_free(tag); Err bitreich.org 70 i- git_object_free(obj); Err bitreich.org 70 i Err bitreich.org 70 i- return 0; Err bitreich.org 70 i-} Err bitreich.org 70 i+err: Err bitreich.org 70 i+ git_reference_free(dref); Err bitreich.org 70 i Err bitreich.org 70 i-int Err bitreich.org 70 i-writerefs(FILE *fp) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int ret; Err bitreich.org 70 i+ for (i = 0; i < refcount; i++) Err bitreich.org 70 i+ git_reference_free(refs[i]); Err bitreich.org 70 i+ free(refs); Err bitreich.org 70 i Err bitreich.org 70 i- if ((ret = writebranches(fp))) Err bitreich.org 70 i- return ret; Err bitreich.org 70 i- fputs("
", fp); Err bitreich.org 70 i- return writetags(fp); 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 .