[PATCH] Reactivate show-diff patch generation

This uses the reworked diff interface to generate patches directly out
of show-diff when -p is specified. 

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Junio C Hamano 2005-04-27 09:21:00 -07:00 committed by Linus Torvalds
parent 77eb272046
commit 4a6bf9e18a

View file

@ -4,10 +4,11 @@
* Copyright (C) Linus Torvalds, 2005
*/
#include "cache.h"
#include "diff.h"
static const char *show_diff_usage = "show-diff [-q] [-s] [-z] [paths...]";
static const char *show_diff_usage = "show-diff [-q] [-s] [-z] [-p] [paths...]";
static int recursive = 0;
static int generate_patch = 0;
static int line_termination = '\n';
static int silent = 0;
static int silent_on_nonexisting_files = 0;
@ -27,27 +28,57 @@ static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt)
return 0;
}
static void show_file(const char *prefix, struct cache_entry *ce)
static void show_unmerge(const char *path)
{
printf("%s%o\t%s\t%s\t%s%c", prefix, ntohl(ce->ce_mode), "blob",
sha1_to_hex(ce->sha1), ce->name, line_termination);
if (generate_patch)
diff_unmerge(path);
else
printf("U %s%c", path, line_termination);
}
static void show_file(int pfx, struct cache_entry *ce)
{
if (generate_patch)
diff_addremove(pfx, ntohl(ce->ce_mode), ce->sha1,
ce->name, NULL);
else
printf("%c%06o\t%s\t%s\t%s%c",
pfx, ntohl(ce->ce_mode), "blob",
sha1_to_hex(ce->sha1), ce->name, line_termination);
}
static void show_modified(int oldmode, int mode,
const char *old_sha1, const char *sha1,
char *path)
{
char old_sha1_hex[41];
strcpy(old_sha1_hex, sha1_to_hex(old_sha1));
if (generate_patch)
diff_change(oldmode, mode, old_sha1, sha1, path, NULL);
else
printf("*%06o->%06o\tblob\t%s->%s\t%s%c",
oldmode, mode, old_sha1_hex, sha1_to_hex(sha1), path,
line_termination);
}
int main(int argc, char **argv)
{
static const char null_sha1_hex[] = "0000000000000000000000000000000000000000";
static const char null_sha1[20] = { 0, };
int entries = read_cache();
int i;
while (1 < argc && argv[1][0] == '-') {
if (!strcmp(argv[1], "-s"))
silent_on_nonexisting_files = silent = 1;
else if (!strcmp(argv[1], "-p"))
generate_patch = 1;
else if (!strcmp(argv[1], "-q"))
silent_on_nonexisting_files = 1;
else if (!strcmp(argv[1], "-z"))
line_termination = 0;
else if (!strcmp(argv[1], "-r"))
recursive = 1; /* No-op */
; /* no-op */
else
usage(show_diff_usage);
argv++; argc--;
@ -72,8 +103,7 @@ int main(int argc, char **argv)
continue;
if (ce_stage(ce)) {
printf("U %s%c", ce->name, line_termination);
show_unmerge(ce->name);
while (i < entries &&
!strcmp(ce->name, active_cache[i]->name))
i++;
@ -88,7 +118,7 @@ int main(int argc, char **argv)
}
if (silent_on_nonexisting_files)
continue;
show_file("-", ce);
show_file('-', ce);
continue;
}
changed = cache_match_stat(ce, &st);
@ -98,10 +128,8 @@ int main(int argc, char **argv)
oldmode = ntohl(ce->ce_mode);
mode = S_IFREG | ce_permissions(st.st_mode);
printf("*%o->%o\t%s\t%s->%s\t%s%c",
oldmode, mode, "blob",
sha1_to_hex(ce->sha1), null_sha1_hex,
ce->name, line_termination);
show_modified(oldmode, mode, ce->sha1, null_sha1,
ce->name);
}
return 0;
}