6 int log_tree_diff_flush(struct rev_info
*opt
)
8 diffcore_std(&opt
->diffopt
);
9 if (diff_queue_is_empty()) {
10 int saved_fmt
= opt
->diffopt
.output_format
;
11 opt
->diffopt
.output_format
= DIFF_FORMAT_NO_OUTPUT
;
12 diff_flush(&opt
->diffopt
);
13 opt
->diffopt
.output_format
= saved_fmt
;
17 if (!opt
->no_commit_id
)
18 printf("%s%c", opt
->header
,
19 opt
->diffopt
.line_termination
);
22 diff_flush(&opt
->diffopt
);
26 static int diff_root_tree(struct rev_info
*opt
,
27 const unsigned char *new, const char *base
)
31 struct tree_desc empty
, real
;
33 tree
= read_object_with_reference(new, tree_type
, &real
.size
, NULL
);
35 die("unable to read root tree (%s)", sha1_to_hex(new));
40 retval
= diff_tree(&empty
, &real
, base
, &opt
->diffopt
);
42 log_tree_diff_flush(opt
);
46 static const char *generate_header(struct rev_info
*opt
,
47 const unsigned char *commit_sha1
,
48 const unsigned char *parent_sha1
,
49 const struct commit
*commit
)
51 static char this_header
[16384];
54 int abbrev
= opt
->diffopt
.abbrev
;
55 const char *msg
= commit
->buffer
;
57 if (!opt
->verbose_header
)
58 return sha1_to_hex(commit_sha1
);
62 offset
= sprintf(this_header
, "%s%s ",
64 diff_unique_abbrev(commit_sha1
, abbrev
));
65 if (commit_sha1
!= parent_sha1
)
66 offset
+= sprintf(this_header
+ offset
, "(from %s)\n",
68 ? diff_unique_abbrev(parent_sha1
, abbrev
)
71 offset
+= sprintf(this_header
+ offset
, "(from parents)\n");
72 offset
+= pretty_print_commit(opt
->commit_format
, commit
, len
,
74 sizeof(this_header
) - offset
, abbrev
);
75 if (opt
->always_show_header
) {
82 static int do_diff_combined(struct rev_info
*opt
, struct commit
*commit
)
84 unsigned const char *sha1
= commit
->object
.sha1
;
86 opt
->header
= generate_header(opt
, sha1
, sha1
, commit
);
87 opt
->header
= diff_tree_combined_merge(sha1
, opt
->header
,
88 opt
->dense_combined_merges
,
90 if (!opt
->header
&& opt
->verbose_header
)
91 opt
->header_prefix
= "\ndiff-tree ";
95 int log_tree_commit(struct rev_info
*opt
, struct commit
*commit
)
97 struct commit_list
*parents
;
98 unsigned const char *sha1
= commit
->object
.sha1
;
101 if (opt
->show_root_diff
&& !commit
->parents
) {
102 opt
->header
= generate_header(opt
, sha1
, NULL
, commit
);
103 diff_root_tree(opt
, sha1
, "");
106 /* More than one parent? */
107 if (commit
->parents
&& commit
->parents
->next
) {
108 if (opt
->ignore_merges
)
110 else if (opt
->combine_merges
)
111 return do_diff_combined(opt
, commit
);
114 for (parents
= commit
->parents
; parents
; parents
= parents
->next
) {
115 struct commit
*parent
= parents
->item
;
116 unsigned const char *psha1
= parent
->object
.sha1
;
117 opt
->header
= generate_header(opt
, sha1
, psha1
, commit
);
118 diff_tree_sha1(psha1
, sha1
, "", &opt
->diffopt
);
119 log_tree_diff_flush(opt
);
121 if (!opt
->header
&& opt
->verbose_header
)
122 opt
->header_prefix
= "\ndiff-tree ";