- char type[20];
-
- if (argc != 3 || get_sha1_hex(argv[1], old) || get_sha1_hex(argv[2], new))
- usage("diff-tree <tree sha1> <tree sha1>");
- tree1 = read_sha1_file(old, type, &size1);
- if (!tree1 || strcmp(type, "tree"))
- usage("unable to read source tree");
- tree2 = read_sha1_file(new, type, &size2);
- if (!tree2 || strcmp(type, "tree"))
- usage("unable to read destination tree");
- return diff_tree(tree1, size1, tree2, size2);
+ int retval;
+
+ tree1 = read_object_with_reference(old, "tree", &size1, 0);
+ if (!tree1)
+ die("unable to read source tree (%s)", sha1_to_hex(old));
+ tree2 = read_object_with_reference(new, "tree", &size2, 0);
+ if (!tree2)
+ die("unable to read destination tree (%s)", sha1_to_hex(new));
+ retval = diff_tree(tree1, size1, tree2, size2, base);
+ free(tree1);
+ free(tree2);
+ return retval;
+}
+
+static char *diff_tree_usage = "diff-tree [-r] [-z] <tree sha1> <tree sha1>";
+
+int main(int argc, char **argv)
+{
+ unsigned char old[20], new[20];
+
+ for (;;) {
+ char *arg = argv[1];
+
+ if (!arg || *arg != '-')
+ break;
+
+ argv++;
+ argc--;
+ if (!strcmp(arg, "-r")) {
+ recursive = 1;
+ continue;
+ }
+ if (!strcmp(arg, "-p")) {
+ recursive = generate_patch = 1;
+ continue;
+ }
+ if (!strcmp(arg, "-z")) {
+ line_termination = '\0';
+ continue;
+ }
+ usage(diff_tree_usage);
+ }
+
+ if (argc < 3 || get_sha1_hex(argv[1], old) || get_sha1_hex(argv[2], new))
+ usage(diff_tree_usage);
+
+ if (argc > 3) {
+ int i;
+
+ paths = &argv[3];
+ nr_paths = argc - 3;
+ pathlens = xmalloc(nr_paths * sizeof(int));
+ for (i=0; i<nr_paths; i++)
+ pathlens[i] = strlen(paths[i]);
+ }
+
+ return diff_tree_sha1(old, new, "");