X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=show-diff.c;h=2ff0bd4ea636db2ad54e9ff34e1d70ac7a9a98f0;hb=93256315b2444601a35484f4fb76cd5723284201;hp=40bc187bdc201c6d5b7df0eb7144d98760b72bdd;hpb=8f3671dcd93b8c5ab21582752f736646c66e2249;p=git.git diff --git a/show-diff.c b/show-diff.c index 40bc187b..2ff0bd4e 100644 --- a/show-diff.c +++ b/show-diff.c @@ -5,7 +5,25 @@ */ #include "cache.h" -static char *diff_cmd = "diff -L '%s' -u -N - '%s'"; +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) +{ + /* + * Default values above are meant to match the + * Linux kernel development style. Examples of + * alternative styles you can specify via environment + * variables are: + * + * GIT_DIFF_CMD="diff -L '%s' -L '%s'" + * GIT_DIFF_OPTS="-c"; + */ + diff_cmd = getenv("GIT_DIFF_CMD") ? : diff_cmd; + diff_opts = getenv("GIT_DIFF_OPTS") ? : diff_opts; +} /* Help to copy the thing properly quoted for the shell safety. * any single quote is replaced with '\'', and the caller is @@ -16,9 +34,6 @@ static char *diff_cmd = "diff -L '%s' -u -N - '%s'"; * 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) { @@ -47,16 +62,21 @@ 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) { FILE *f; char *name_sq = sq_expand(name); char *label_sq = (name != label) ? sq_expand(label) : name_sq; - int cmd_size = strlen(name_sq) + strlen(label_sq) + strlen(diff_cmd); + 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); + int next_at; fflush(stdout); - snprintf(cmd, cmd_size, diff_cmd, label_sq, name_sq); + next_at = snprintf(cmd, cmd_size, diff_cmd, label_sq, label_sq); + next_at += snprintf(cmd+next_at, cmd_size-next_at, "%s", diff_opts); + next_at += snprintf(cmd+next_at, cmd_size-next_at, diff_arg, name_sq); f = popen(cmd, "w"); if (old_size) fwrite(old_contents, old_size, 1, f); @@ -67,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; @@ -79,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...]"; @@ -104,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; @@ -126,6 +149,7 @@ int main(int argc, char **argv) perror("read_cache"); exit(1); } + prepare_diff_cmd(); for (i = 0; i < entries; i++) { struct stat st; struct cache_entry *ce = active_cache[i]; @@ -159,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; } @@ -180,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;