summaryrefslogtreecommitdiff
path: root/examples/diff.c
diff options
context:
space:
mode:
authorrocky-luo <rocky-luo@outlook.com>2014-02-08 20:10:19 +0800
committerrocky-luo <rocky-luo@outlook.com>2014-02-08 20:10:19 +0800
commit4f5a3f400be638de28fb7cc5d926cc79125d52f7 (patch)
treefa62f1be640eefb43da32ed795e72cd0e16a0347 /examples/diff.c
parentf1590a18b0c0b33ad1c194f5b6f8c66cf4c882c5 (diff)
downloadlibgit2-4f5a3f400be638de28fb7cc5d926cc79125d52f7.tar.gz
add example for diff with --numstat
Diffstat (limited to 'examples/diff.c')
-rw-r--r--examples/diff.c46
1 files changed, 38 insertions, 8 deletions
diff --git a/examples/diff.c b/examples/diff.c
index daf5d7030..0a9b06453 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 *out;
+ 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(&out, diff, i),
+ "generating patch from diff", NULL);
+ check_lg2(
+ git_patch_line_stats(NULL, &nadditions, &ndeletions, out),
+ "generating the number of additions and deletions", NULL);
+ delta = git_patch_get_delta(out);
+ printf("%u %u %s\n", nadditions, ndeletions, delta->new_file.path);
+ }
+ git_patch_free(out);
+}