-static int diff_tree(void *tree1, unsigned long size1, void *tree2, unsigned long size2, const char *base)
-{
- while (size1 | size2) {
- if (nr_paths && size1 && !interesting(tree1, size1, base)) {
- update_tree_entry(&tree1, &size1);
- continue;
- }
- if (nr_paths && size2 && !interesting(tree2, size2, base)) {
- update_tree_entry(&tree2, &size2);
- continue;
- }
- if (!size1) {
- show_file("+", tree2, size2, base);
- update_tree_entry(&tree2, &size2);
- continue;
- }
- if (!size2) {
- show_file("-", tree1, size1, base);
- update_tree_entry(&tree1, &size1);
- continue;
- }
- switch (compare_tree_entry(tree1, size1, tree2, size2, base)) {
- case -1:
- update_tree_entry(&tree1, &size1);
- continue;
- case 0:
- update_tree_entry(&tree1, &size1);
- /* Fallthrough */
- case 1:
- update_tree_entry(&tree2, &size2);
- continue;
+ /* More than one parent? */
+ if (ignore_merges && commit->parents && commit->parents->next)
+ return 0;
+
+ for (parents = commit->parents; parents; parents = parents->next) {
+ struct commit *parent = parents->item;
+ header = generate_header(name,
+ sha1_to_hex(parent->object.sha1),
+ commit->buffer);
+ diff_tree_sha1_top(parent->object.sha1, commit_sha1, "");
+ if (!header && verbose_header) {
+ header_prefix = "\ndiff-tree ";
+ /*
+ * Don't print multiple merge entries if we
+ * don't print the diffs.
+ */