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 *get_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
->use_precomputed_header
)
58 return opt
->use_precomputed_header
;
60 if (!opt
->verbose_header
)
61 return sha1_to_hex(commit_sha1
);
65 offset
= sprintf(this_header
, "%s%s ",
67 diff_unique_abbrev(commit_sha1
, abbrev
));
68 if (commit_sha1
!= parent_sha1
)
69 offset
+= sprintf(this_header
+ offset
, "(from %s)\n",
71 ? diff_unique_abbrev(parent_sha1
, abbrev
)
74 offset
+= sprintf(this_header
+ offset
, "(from parents)\n");
75 offset
+= pretty_print_commit(opt
->commit_format
, commit
, len
,
77 sizeof(this_header
) - offset
, abbrev
);
81 static const char *generate_header(struct rev_info
*opt
,
82 const unsigned char *commit_sha1
,
83 const unsigned char *parent_sha1
,
84 const struct commit
*commit
)
86 const char *header
= get_header(opt
, commit_sha1
, parent_sha1
, commit
);
88 if (opt
->always_show_header
) {
95 static int do_diff_combined(struct rev_info
*opt
, struct commit
*commit
)
97 unsigned const char *sha1
= commit
->object
.sha1
;
99 opt
->header
= generate_header(opt
, sha1
, sha1
, commit
);
100 opt
->header
= diff_tree_combined_merge(sha1
, opt
->header
,
101 opt
->dense_combined_merges
,
103 if (!opt
->header
&& opt
->verbose_header
)
104 opt
->header_prefix
= "\ndiff-tree ";
108 int log_tree_commit(struct rev_info
*opt
, struct commit
*commit
)
110 struct commit_list
*parents
;
111 unsigned const char *sha1
= commit
->object
.sha1
;
114 if (opt
->show_root_diff
&& !commit
->parents
) {
115 opt
->header
= generate_header(opt
, sha1
, NULL
, commit
);
116 diff_root_tree(opt
, sha1
, "");
119 /* More than one parent? */
120 if (commit
->parents
&& commit
->parents
->next
) {
121 if (opt
->ignore_merges
)
123 else if (opt
->combine_merges
)
124 return do_diff_combined(opt
, commit
);
127 for (parents
= commit
->parents
; parents
; parents
= parents
->next
) {
128 struct commit
*parent
= parents
->item
;
129 unsigned const char *psha1
= parent
->object
.sha1
;
130 opt
->header
= generate_header(opt
, sha1
, psha1
, commit
);
131 diff_tree_sha1(psha1
, sha1
, "", &opt
->diffopt
);
132 log_tree_diff_flush(opt
);
134 if (!opt
->header
&& opt
->verbose_header
)
135 opt
->header_prefix
= "\ndiff-tree ";