Commit a5139485f75c677d391a7ba95f56c38642b7fc4e

Ben Straub 2014-03-05T19:50:23

Merge pull request #2162 from sunheehnus/dev examples/diff:Add the shortstat flag to examples/diff.c

diff --git a/PROJECTS.md b/PROJECTS.md
index 050a51c..d97c332 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 `[<n>][/<m>]` configuration values. There is an
diff --git a/examples/diff.c b/examples/diff.c
index 65c6188..6f68e83 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");
+	}
+}