[PATCH] show-diff.c: simplify show_diff_empty.
This patch removes the custom diff generation code from the show_diff_empty() function. Instead, just use show_differences(). This reduces the code size; but more importantly, it is needed for the later patch to give diff options. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
d0db466326
commit
8f3671dcd9
44
show-diff.c
44
show-diff.c
@ -46,19 +46,23 @@ static char *sq_expand(char *src)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_differences(char *name, void *old_contents,
|
static void show_differences(char *name, char *label, void *old_contents,
|
||||||
unsigned long long old_size)
|
unsigned long long old_size)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char *name_sq = sq_expand(name);
|
char *name_sq = sq_expand(name);
|
||||||
int cmd_size = strlen(name_sq) * 2 + strlen(diff_cmd);
|
char *label_sq = (name != label) ? sq_expand(label) : name_sq;
|
||||||
|
int cmd_size = strlen(name_sq) + strlen(label_sq) + strlen(diff_cmd);
|
||||||
char *cmd = malloc(cmd_size);
|
char *cmd = malloc(cmd_size);
|
||||||
|
|
||||||
snprintf(cmd, cmd_size, diff_cmd, name_sq, name_sq);
|
fflush(stdout);
|
||||||
|
snprintf(cmd, cmd_size, diff_cmd, label_sq, name_sq);
|
||||||
f = popen(cmd, "w");
|
f = popen(cmd, "w");
|
||||||
if (old_size)
|
if (old_size)
|
||||||
fwrite(old_contents, old_size, 1, f);
|
fwrite(old_contents, old_size, 1, f);
|
||||||
pclose(f);
|
pclose(f);
|
||||||
|
if (label_sq != name_sq)
|
||||||
|
free(label_sq);
|
||||||
free(name_sq);
|
free(name_sq);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
}
|
}
|
||||||
@ -67,8 +71,7 @@ static void show_diff_empty(struct cache_entry *ce)
|
|||||||
{
|
{
|
||||||
char *old;
|
char *old;
|
||||||
unsigned long int size;
|
unsigned long int size;
|
||||||
int lines=0;
|
unsigned char type[20];
|
||||||
unsigned char type[20], *p, *end;
|
|
||||||
|
|
||||||
old = read_sha1_file(ce->sha1, type, &size);
|
old = read_sha1_file(ce->sha1, type, &size);
|
||||||
if (! old) {
|
if (! old) {
|
||||||
@ -76,33 +79,7 @@ static void show_diff_empty(struct cache_entry *ce)
|
|||||||
sha1_to_hex(ce->sha1));
|
sha1_to_hex(ce->sha1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (size > 0) {
|
show_differences("/dev/null", ce->name, old, size);
|
||||||
int startline = 1;
|
|
||||||
int c = 0;
|
|
||||||
|
|
||||||
printf("--- %s\n", ce->name);
|
|
||||||
printf("+++ /dev/null\n");
|
|
||||||
p = old;
|
|
||||||
end = old + size;
|
|
||||||
while (p < end)
|
|
||||||
if (*p++ == '\n')
|
|
||||||
lines ++;
|
|
||||||
printf("@@ -1,%d +0,0 @@\n", lines);
|
|
||||||
p = old;
|
|
||||||
while (p < end) {
|
|
||||||
c = *p++;
|
|
||||||
if (startline) {
|
|
||||||
putchar('-');
|
|
||||||
startline = 0;
|
|
||||||
}
|
|
||||||
putchar(c);
|
|
||||||
if (c == '\n')
|
|
||||||
startline = 1;
|
|
||||||
}
|
|
||||||
if (c!='\n')
|
|
||||||
printf("\n");
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *show_diff_usage = "show-diff [-q] [-s] [-z] [paths...]";
|
static const char *show_diff_usage = "show-diff [-q] [-s] [-z] [paths...]";
|
||||||
@ -195,7 +172,6 @@ int main(int argc, char **argv)
|
|||||||
printf("%s %s%c", sha1_to_hex(ce->sha1), ce->name, 0);
|
printf("%s %s%c", sha1_to_hex(ce->sha1), ce->name, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
|
||||||
if (silent)
|
if (silent)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -204,7 +180,7 @@ int main(int argc, char **argv)
|
|||||||
error("unable to read blob object for %s (%s)",
|
error("unable to read blob object for %s (%s)",
|
||||||
ce->name, sha1_to_hex(ce->sha1));
|
ce->name, sha1_to_hex(ce->sha1));
|
||||||
else
|
else
|
||||||
show_differences(ce->name, old, size);
|
show_differences(ce->name, ce->name, old, size);
|
||||||
free(old);
|
free(old);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user