diff options
Diffstat (limited to 'diff-tree.c')
| -rw-r--r-- | diff-tree.c | 86 | 
1 files changed, 77 insertions, 9 deletions
| diff --git a/diff-tree.c b/diff-tree.c index c689c61c68..9e15b70642 100644 --- a/diff-tree.c +++ b/diff-tree.c @@ -1,7 +1,10 @@ +#include <ctype.h>  #include "cache.h"  #include "diff.h" +static int ignore_merges = 1;  static int recursive = 0; +static int read_stdin = 0;  static int line_termination = '\n';  static int generate_patch = 0; @@ -250,20 +253,67 @@ static int diff_tree_sha1(const unsigned char *old, const unsigned char *new, co  	return retval;  } +static int diff_tree_stdin(char *line) +{ +	int len = strlen(line); +	unsigned char commit[20], parent[20]; +	unsigned long size, offset; +	char *buf; + +	if (!len || line[len-1] != '\n') +		return -1; +	line[len-1] = 0; +	if (get_sha1_hex(line, commit)) +		return -1; +	if (isspace(line[40]) && !get_sha1_hex(line+41, parent)) { +		line[40] = ' '; +		line[81] = 0; +		printf("%s:\n", line); +		return diff_tree_sha1(parent, commit, ""); +	} +	buf = read_object_with_reference(commit, "commit", &size, NULL); +	if (!buf) +		return -1; + +	/* More than one parent? */ +	if (ignore_merges) { +		if (!memcmp(buf + 46 + 48, "parent ", 7)) +			return 0; +	} + +	line[40] = 0; +	offset = 46; +	while (offset + 48 < size && !memcmp(buf + offset, "parent ", 7)) { +		if (get_sha1_hex(buf + offset + 7, parent)) +			return -1; +		printf("%s %s:\n", line, sha1_to_hex(parent)); +		diff_tree_sha1(parent, commit, ""); +		offset += 48; +	} +	return -1; +} +  static char *diff_tree_usage = "diff-tree [-p] [-r] [-z] <tree sha1> <tree sha1>";  int main(int argc, char **argv)  { +	char line[1000];  	unsigned char old[20], new[20];  	for (;;) { -		char *arg = argv[1]; +		char *arg; +		argv++; +		argc--; +		arg = *argv;  		if (!arg || *arg != '-')  			break; -		argv++; -		argc--; +		if (!strcmp(arg, "-")) { +			argv++; +			argc--; +			break; +		}  		if (!strcmp(arg, "-r")) {  			recursive = 1;  			continue; @@ -276,21 +326,39 @@ int main(int argc, char **argv)  			line_termination = '\0';  			continue;  		} +		if (!strcmp(arg, "-m")) { +			ignore_merges = 0; +			continue; +		} +		if (!strcmp(arg, "--stdin")) { +			read_stdin = 1; +			continue; +		}  		usage(diff_tree_usage);  	} -	if (argc < 3 || get_sha1(argv[1], old) || get_sha1(argv[2], new)) -		usage(diff_tree_usage); +	if (!read_stdin) { +		if (argc < 2 || get_sha1(argv[0], old) || get_sha1(argv[1], new)) +			usage(diff_tree_usage); +		argv += 2; +		argc -= 2; +	} -	if (argc > 3) { +	if (argc > 0) {  		int i; -		paths = &argv[3]; -		nr_paths = argc - 3; +		paths = argv; +		nr_paths = argc;  		pathlens = xmalloc(nr_paths * sizeof(int));  		for (i=0; i<nr_paths; i++)  			pathlens[i] = strlen(paths[i]);  	} -	return diff_tree_sha1(old, new, ""); +	if (!read_stdin) +		return diff_tree_sha1(old, new, ""); + +	while (fgets(line, sizeof(line), stdin)) +		diff_tree_stdin(line); + +	return 0;  } | 
