X-Git-Url: https://git.armaanb.net/?p=stagit.git;a=blobdiff_plain;f=stagit.c;h=a6cfebc043b62d54695612a0482ff097a061fb2e;hp=86c39200c2cf50340e098b5f125e6d1d42250734;hb=028c7526bac907c91ef8afc6c3ae0f6d424bd229;hpb=187daac42007c87e6af9317a20446e3b81907f63 diff --git a/stagit.c b/stagit.c index 86c3920..a6cfebc 100644 --- a/stagit.c +++ b/stagit.c @@ -56,12 +56,16 @@ static char *name = ""; static char *strippedname = ""; static char description[255]; static char cloneurl[1024]; -static int haslicense, hasreadme, hassubmodules; +static char *submodules; +static char *licensefiles[] = { "HEAD:LICENSE", "HEAD:LICENSE.md", "HEAD:COPYING" }; +static char *license; +static char *readmefiles[] = { "HEAD:README", "HEAD:README.md" }; +static char *readme; static long long nlogcommits = -1; /* < 0 indicates not used */ /* cache */ static git_oid lastoid; -static char lastoidstr[GIT_OID_HEXSZ + 2]; /* id + newline + nul byte */ +static char lastoidstr[GIT_OID_HEXSZ + 2]; /* id + newline + NUL byte */ static FILE *rcachefp, *wcachefp; static const char *cachefile; @@ -72,7 +76,7 @@ joinpath(char *buf, size_t bufsiz, const char *path, const char *path2) r = snprintf(buf, bufsiz, "%s%s%s", path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2); - if (r == -1 || (size_t)r >= bufsiz) + if (r < 0 || (size_t)r >= bufsiz) errx(1, "path truncated: '%s%s%s'", path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2); } @@ -92,6 +96,7 @@ commitinfo_getstats(struct commitinfo *ci) { struct deltainfo *di; git_diff_options opts; + git_diff_find_options fopts; const git_diff_delta *delta; const git_diff_hunk *hunk; const git_diff_line *line; @@ -109,10 +114,20 @@ commitinfo_getstats(struct commitinfo *ci) } git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION); - opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH; + opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH | + GIT_DIFF_IGNORE_SUBMODULES | + GIT_DIFF_INCLUDE_TYPECHANGE; if (git_diff_tree_to_tree(&(ci->diff), repo, ci->parent_tree, ci->commit_tree, &opts)) goto err; + if (git_diff_find_init_options(&fopts, GIT_DIFF_FIND_OPTIONS_VERSION)) + goto err; + /* find renames and copies, exact matches (no heuristic) for renames. */ + fopts.flags |= GIT_DIFF_FIND_RENAMES | GIT_DIFF_FIND_COPIES | + GIT_DIFF_FIND_EXACT_MATCH_ONLY; + if (git_diff_find_similar(ci->diff, &fopts)) + goto err; + ndeltas = git_diff_num_deltas(ci->diff); if (ndeltas && !(ci->deltas = calloc(ndeltas, sizeof(struct deltainfo *)))) err(1, "calloc"); @@ -120,6 +135,7 @@ commitinfo_getstats(struct commitinfo *ci) for (i = 0; i < ndeltas; i++) { if (git_patch_from_diff(&patch, ci->diff, i)) goto err; + if (!(di = calloc(1, sizeof(struct deltainfo)))) err(1, "calloc"); di->patch = patch; @@ -358,12 +374,15 @@ writeheader(FILE *fp, const char *title) fprintf(fp, "Log | ", relpath); fprintf(fp, "Files | ", relpath); fprintf(fp, "Refs", relpath); - if (hassubmodules) - fprintf(fp, " | Submodules", relpath); - if (hasreadme) - fprintf(fp, " | README", relpath); - if (haslicense) - fprintf(fp, " | LICENSE", relpath); + if (submodules) + fprintf(fp, " | Submodules", + relpath, submodules); + if (readme) + fprintf(fp, " | README", + relpath, readme); + if (license) + fprintf(fp, " | LICENSE", + relpath, license); fputs("\n