Merge pull request #2107 from rocky-luo/examples-diff-numstat add example for diff with --numstat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
diff --git a/examples/diff.c b/examples/diff.c
index daf5d70..abb9b71 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);
+}