diff options
author | Ben Straub <bs@github.com> | 2014-02-09 07:25:49 -0800 |
---|---|---|
committer | Ben Straub <bs@github.com> | 2014-02-09 07:25:49 -0800 |
commit | fb52ba19ff0a620b4fd9482132206ccb4daee8e0 (patch) | |
tree | 5ab9a2ed13735b7d5b0777a77d0bfb4e707fd0c8 | |
parent | f1590a18b0c0b33ad1c194f5b6f8c66cf4c882c5 (diff) | |
parent | 8086b78be05dbcffc80e8a87c15fc10bb7534547 (diff) | |
download | libgit2-fb52ba19ff0a620b4fd9482132206ccb4daee8e0.tar.gz |
Merge pull request #2107 from rocky-luo/examples-diff-numstat
add example for diff with --numstat
-rw-r--r-- | examples/diff.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/examples/diff.c b/examples/diff.c index daf5d7030..abb9b7103 100644 --- a/examples/diff.c +++ b/examples/diff.c @@ -39,6 +39,7 @@ struct opts { git_diff_find_options findopts; int color; int cached; + int numstat; git_diff_format_t format; const char *treeish1; const char *treeish2; @@ -49,6 +50,7 @@ struct opts { 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); int main(int argc, char *argv[]) { @@ -57,7 +59,7 @@ int main(int argc, char *argv[]) git_diff *diff; struct opts o = { GIT_DIFF_OPTIONS_INIT, GIT_DIFF_FIND_OPTIONS_INIT, - -1, 0, GIT_DIFF_FORMAT_PATCH, NULL, NULL, "." + -1, 0, 0, GIT_DIFF_FORMAT_PATCH, NULL, NULL, "." }; git_threads_init(); @@ -117,15 +119,19 @@ int main(int argc, char *argv[]) /** Generate simple output using libgit2 display helper. */ - if (o.color >= 0) - fputs(colors[0], stdout); + if (o.numstat == 1) + diff_print_numstat(diff); + else { + if (o.color >= 0) + fputs(colors[0], stdout); - check_lg2( - git_diff_print(diff, o.format, color_printer, &o.color), - "displaying diff", NULL); + check_lg2( + git_diff_print(diff, o.format, color_printer, &o.color), + "displaying diff", NULL); - if (o.color >= 0) - fputs(colors[0], stdout); + if (o.color >= 0) + fputs(colors[0], stdout); + } /** Cleanup before exiting. */ @@ -228,6 +234,8 @@ static void parse_opts(struct opts *o, int argc, char *argv[]) o->diffopts.flags |= GIT_DIFF_INCLUDE_IGNORED; else if (!strcmp(a, "--untracked")) o->diffopts.flags |= GIT_DIFF_INCLUDE_UNTRACKED; + else if (!strcmp(a, "--numstat")) + o->numstat = 1; else if (match_uint16_arg( &o->findopts.rename_threshold, &args, "-M") || match_uint16_arg( @@ -255,3 +263,25 @@ static void parse_opts(struct opts *o, int argc, char *argv[]) usage("Unknown command line argument", a); } } + +/** Display diff output with "--numstat".*/ +static void diff_print_numstat(git_diff *diff) +{ + git_patch *patch; + const git_diff_delta *delta; + size_t i; + size_t ndeltas; + size_t nadditions, ndeletions; + ndeltas = git_diff_num_deltas(diff); + for (i = 0; i < ndeltas; i++){ + check_lg2( + git_patch_from_diff(&patch, diff, i), + "generating patch from diff", NULL); + check_lg2( + git_patch_line_stats(NULL, &nadditions, &ndeletions, patch), + "generating the number of additions and deletions", NULL); + delta = git_patch_get_delta(patch); + printf("%u\t%u\t%s\n", nadditions, ndeletions, delta->new_file.path); + } + git_patch_free(patch); +} |