summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSun He <sunheehnus@gmail.com>2014-03-05 20:13:34 +0800
committerSun He <sunheehnus@gmail.com>2014-03-05 20:13:34 +0800
commit45d2e8dc4687b5da6e872fbfa960ea7cff3b3867 (patch)
tree331cc642cb691aaed411ba785a0f0b87a84471aa
parent66d9e0461c7c0d8ec3fdb23b192399c6eb05e9a9 (diff)
downloadlibgit2-45d2e8dc4687b5da6e872fbfa960ea7cff3b3867.tar.gz
Add the --shortstat flag to examples/diff.c
-rw-r--r--PROJECTS.md2
-rw-r--r--examples/diff.c52
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");
+}