diff --git a/PROJECTS.md b/PROJECTS.md index 050a51cfb..d97c3329a 100644 --- a/PROJECTS.md +++ b/PROJECTS.md @@ -28,8 +28,6 @@ These are good small projects to get started with libgit2. core Git command and add a missing command-line option. There are many gaps right now and this helps demonstrate how to use the library. Here are some specific ideas: - * Add the `--shortstat` flag to `examples/diff.c` based on the work - that was done to add `--numstat` already. * Fix the `examples/diff.c` implementation of the `-B` (a.k.a. `--break-rewrites`) command line option to actually look for the optional `[][/]` configuration values. There is an diff --git a/examples/diff.c b/examples/diff.c index 65c618882..6f68e8305 100644 --- a/examples/diff.c +++ b/examples/diff.c @@ -40,6 +40,7 @@ struct opts { int color; int cached; int numstat; + int shortstat; git_diff_format_t format; const char *treeish1; const char *treeish2; @@ -51,6 +52,7 @@ static void parse_opts(struct opts *o, int argc, char *argv[]); static int color_printer( const git_diff_delta*, const git_diff_hunk*, const git_diff_line*, void*); static void diff_print_numstat(git_diff *diff); +static void diff_print_shortstat(git_diff *diff); int main(int argc, char *argv[]) { @@ -59,7 +61,7 @@ int main(int argc, char *argv[]) git_diff *diff; struct opts o = { GIT_DIFF_OPTIONS_INIT, GIT_DIFF_FIND_OPTIONS_INIT, - -1, 0, 0, GIT_DIFF_FORMAT_PATCH, NULL, NULL, "." + -1, 0, 0, 0, GIT_DIFF_FORMAT_PATCH, NULL, NULL, "." }; git_threads_init(); @@ -121,6 +123,8 @@ int main(int argc, char *argv[]) if (o.numstat == 1) diff_print_numstat(diff); + else if (o.shortstat == 1) + diff_print_shortstat(diff); else { if (o.color >= 0) fputs(colors[0], stdout); @@ -240,6 +244,8 @@ static void parse_opts(struct opts *o, int argc, char *argv[]) o->diffopts.flags |= GIT_DIFF_MINIMAL; else if (!strcmp(a, "--numstat")) o->numstat = 1; + else if (!strcmp(a, "--shortstat")) + o->shortstat = 1; else if (match_uint16_arg( &o->findopts.rename_threshold, &args, "-M") || match_uint16_arg( @@ -293,3 +299,47 @@ static void diff_print_numstat(git_diff *diff) git_patch_free(patch); } } + +/** Display diff output with "--shortstat".*/ +static void diff_print_shortstat(git_diff *diff) +{ + git_patch *patch; + size_t d, ndeltas = git_diff_num_deltas(diff); + size_t nadditions, ndeletions; + long nadditions_sum, ndeletions_sum; + + nadditions_sum = 0; + ndeletions_sum = 0; + + for (d = 0; d < ndeltas; d++){ + check_lg2( + git_patch_from_diff(&patch, diff, d), + "generating patch from diff", NULL); + + check_lg2( + git_patch_line_stats(NULL, &nadditions, &ndeletions, patch), + "generating the number of additions and deletions", NULL); + + nadditions_sum += nadditions; + ndeletions_sum += ndeletions; + + git_patch_free(patch); + } + + if (ndeltas) { + + printf(" %ld ", (long)ndeltas); + printf("%s", 1==ndeltas ? "file changed" : "files changed"); + + if(nadditions_sum) { + printf(", %ld ",nadditions_sum); + printf("%s", 1==nadditions_sum ? "insertion(+)" : "insertions(+)"); + } + + if(ndeletions_sum) { + printf(", %ld ",ndeletions_sum); + printf("%s", 1==ndeletions_sum ? "deletion(-)" : "deletions(-)"); + } + printf("\n"); + } +}