X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=show-diff.c;h=2ff0bd4ea636db2ad54e9ff34e1d70ac7a9a98f0;hb=6ca25ed331c57576a82c83f43040f4071671b1a7;hp=42359339bd4519f35ab00b5c33acf91263678fc3;hpb=ff69ab9ad87d839e381b1e4abfe45032d18bada7;p=git.git diff --git a/show-diff.c b/show-diff.c index 42359339..2ff0bd4e 100644 --- a/show-diff.c +++ b/show-diff.c @@ -7,6 +7,8 @@ static char *diff_cmd = "diff -L 'a/%s' -L 'b/%s' "; static char *diff_opts = "-p -u"; +static char *diff_arg_forward = " - '%s'"; +static char *diff_arg_reverse = " '%s' -"; static void prepare_diff_cmd(void) { @@ -32,9 +34,6 @@ static void prepare_diff_cmd(void) * name ==> name ==> 'name' * a b ==> a b ==> 'a b' * a'b ==> a'\''b ==> 'a'\''b' - * - * NOTE! The returned memory belongs to this function so - * do not free it. */ static char *sq_expand(char *src) { @@ -63,12 +62,12 @@ static char *sq_expand(char *src) } static void show_differences(char *name, char *label, void *old_contents, - unsigned long long old_size) + unsigned long long old_size, int reverse) { - static char *diff_arg = " - '%s'"; FILE *f; char *name_sq = sq_expand(name); char *label_sq = (name != label) ? sq_expand(label) : name_sq; + char *diff_arg = reverse ? diff_arg_reverse : diff_arg_forward; int cmd_size = strlen(name_sq) + strlen(label_sq) * 2 + strlen(diff_cmd) + strlen(diff_opts) + strlen(diff_arg); char *cmd = malloc(cmd_size); @@ -88,7 +87,7 @@ static void show_differences(char *name, char *label, void *old_contents, free(cmd); } -static void show_diff_empty(struct cache_entry *ce) +static void show_diff_empty(struct cache_entry *ce, int reverse) { char *old; unsigned long int size; @@ -100,7 +99,7 @@ static void show_diff_empty(struct cache_entry *ce) sha1_to_hex(ce->sha1)); return; } - show_differences("/dev/null", ce->name, old, size); + show_differences("/dev/null", ce->name, old, size, reverse); } static const char *show_diff_usage = "show-diff [-q] [-s] [-z] [paths...]"; @@ -125,11 +124,14 @@ int main(int argc, char **argv) int silent = 0; int silent_on_nonexisting_files = 0; int machine_readable = 0; + int reverse = 0; int entries = read_cache(); int i; while (1 < argc && argv[1][0] == '-') { - if (!strcmp(argv[1], "-s")) + if (!strcmp(argv[1], "-R")) + reverse = 1; + else if (!strcmp(argv[1], "-s")) silent_on_nonexisting_files = silent = 1; else if (!strcmp(argv[1], "-q")) silent_on_nonexisting_files = 1; @@ -181,7 +183,7 @@ int main(int argc, char **argv) else { printf("%s: %s\n", ce->name, strerror(errno)); if (errno == ENOENT) - show_diff_empty(ce); + show_diff_empty(ce, reverse); } continue; } @@ -202,7 +204,8 @@ int main(int argc, char **argv) error("unable to read blob object for %s (%s)", ce->name, sha1_to_hex(ce->sha1)); else - show_differences(ce->name, ce->name, old, size); + show_differences(ce->name, ce->name, old, size, + reverse); free(old); } return 0;