diff options
author | Sun He <sunheehnus@gmail.com> | 2014-03-05 20:13:34 +0800 |
---|---|---|
committer | Sun He <sunheehnus@gmail.com> | 2014-03-05 20:13:34 +0800 |
commit | 45d2e8dc4687b5da6e872fbfa960ea7cff3b3867 (patch) | |
tree | 331cc642cb691aaed411ba785a0f0b87a84471aa | |
parent | 66d9e0461c7c0d8ec3fdb23b192399c6eb05e9a9 (diff) | |
download | libgit2-45d2e8dc4687b5da6e872fbfa960ea7cff3b3867.tar.gz |
Add the --shortstat flag to examples/diff.c
-rw-r--r-- | PROJECTS.md | 2 | ||||
-rw-r--r-- | examples/diff.c | 52 |
2 files changed, 51 insertions, 3 deletions
diff --git a/PROJECTS.md b/PROJECTS.md index 34ba18ace..1e2b5db6f 100644 --- a/PROJECTS.md +++ b/PROJECTS.md @@ -32,8 +32,6 @@ These are good small projects to get started with libgit2. diff API now has a flag to support it * Add the `--patience` flag to `examples/diff.c` since it is also now supported. - * 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 `[<n>][/<m>]` configuration values. There is an diff --git a/examples/diff.c b/examples/diff.c index de994ecab..98480a76b 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); @@ -236,6 +240,8 @@ static void parse_opts(struct opts *o, int argc, char *argv[]) o->diffopts.flags |= GIT_DIFF_INCLUDE_UNTRACKED; 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( @@ -289,3 +295,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"); +} |