@@ -2045,11 +2045,10 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
2045
2045
}
2046
2046
}
2047
2047
2048
- static char * pprint_rename (const char * a , const char * b )
2048
+ static void pprint_rename (struct strbuf * name , const char * a , const char * b )
2049
2049
{
2050
2050
const char * old_name = a ;
2051
2051
const char * new_name = b ;
2052
- struct strbuf name = STRBUF_INIT ;
2053
2052
int pfx_length , sfx_length ;
2054
2053
int pfx_adjust_for_slash ;
2055
2054
int len_a = strlen (a );
@@ -2059,10 +2058,10 @@ static char *pprint_rename(const char *a, const char *b)
2059
2058
int qlen_b = quote_c_style (b , NULL , NULL , 0 );
2060
2059
2061
2060
if (qlen_a || qlen_b ) {
2062
- quote_c_style (a , & name , NULL , 0 );
2063
- strbuf_addstr (& name , " => " );
2064
- quote_c_style (b , & name , NULL , 0 );
2065
- return strbuf_detach ( & name , NULL ) ;
2061
+ quote_c_style (a , name , NULL , 0 );
2062
+ strbuf_addstr (name , " => " );
2063
+ quote_c_style (b , name , NULL , 0 );
2064
+ return ;
2066
2065
}
2067
2066
2068
2067
/* Find common prefix */
@@ -2109,19 +2108,18 @@ static char *pprint_rename(const char *a, const char *b)
2109
2108
if (b_midlen < 0 )
2110
2109
b_midlen = 0 ;
2111
2110
2112
- strbuf_grow (& name , pfx_length + a_midlen + b_midlen + sfx_length + 7 );
2111
+ strbuf_grow (name , pfx_length + a_midlen + b_midlen + sfx_length + 7 );
2113
2112
if (pfx_length + sfx_length ) {
2114
- strbuf_add (& name , a , pfx_length );
2115
- strbuf_addch (& name , '{' );
2113
+ strbuf_add (name , a , pfx_length );
2114
+ strbuf_addch (name , '{' );
2116
2115
}
2117
- strbuf_add (& name , a + pfx_length , a_midlen );
2118
- strbuf_addstr (& name , " => " );
2119
- strbuf_add (& name , b + pfx_length , b_midlen );
2116
+ strbuf_add (name , a + pfx_length , a_midlen );
2117
+ strbuf_addstr (name , " => " );
2118
+ strbuf_add (name , b + pfx_length , b_midlen );
2120
2119
if (pfx_length + sfx_length ) {
2121
- strbuf_addch (& name , '}' );
2122
- strbuf_add (& name , a + len_a - sfx_length , sfx_length );
2120
+ strbuf_addch (name , '}' );
2121
+ strbuf_add (name , a + len_a - sfx_length , sfx_length );
2123
2122
}
2124
- return strbuf_detach (& name , NULL );
2125
2123
}
2126
2124
2127
2125
struct diffstat_t {
@@ -2131,6 +2129,7 @@ struct diffstat_t {
2131
2129
char * from_name ;
2132
2130
char * name ;
2133
2131
char * print_name ;
2132
+ const char * comments ;
2134
2133
unsigned is_unmerged :1 ;
2135
2134
unsigned is_binary :1 ;
2136
2135
unsigned is_renamed :1 ;
@@ -2197,23 +2196,20 @@ static void show_graph(struct strbuf *out, char ch, int cnt,
2197
2196
2198
2197
static void fill_print_name (struct diffstat_file * file )
2199
2198
{
2200
- char * pname ;
2199
+ struct strbuf pname = STRBUF_INIT ;
2201
2200
2202
2201
if (file -> print_name )
2203
2202
return ;
2204
2203
2205
- if (!file -> is_renamed ) {
2206
- struct strbuf buf = STRBUF_INIT ;
2207
- if (quote_c_style (file -> name , & buf , NULL , 0 )) {
2208
- pname = strbuf_detach (& buf , NULL );
2209
- } else {
2210
- pname = file -> name ;
2211
- strbuf_release (& buf );
2212
- }
2213
- } else {
2214
- pname = pprint_rename (file -> from_name , file -> name );
2215
- }
2216
- file -> print_name = pname ;
2204
+ if (file -> is_renamed )
2205
+ pprint_rename (& pname , file -> from_name , file -> name );
2206
+ else
2207
+ quote_c_style (file -> name , & pname , NULL , 0 );
2208
+
2209
+ if (file -> comments )
2210
+ strbuf_addf (& pname , " (%s)" , file -> comments );
2211
+
2212
+ file -> print_name = strbuf_detach (& pname , NULL );
2217
2213
}
2218
2214
2219
2215
static void print_stat_summary_inserts_deletes (struct diff_options * options ,
@@ -2797,8 +2793,7 @@ static void free_diffstat_info(struct diffstat_t *diffstat)
2797
2793
int i ;
2798
2794
for (i = 0 ; i < diffstat -> nr ; i ++ ) {
2799
2795
struct diffstat_file * f = diffstat -> files [i ];
2800
- if (f -> name != f -> print_name )
2801
- free (f -> print_name );
2796
+ free (f -> print_name );
2802
2797
free (f -> name );
2803
2798
free (f -> from_name );
2804
2799
free (f );
@@ -3248,6 +3243,32 @@ static void builtin_diff(const char *name_a,
3248
3243
return ;
3249
3244
}
3250
3245
3246
+ static char * get_compact_summary (const struct diff_filepair * p , int is_renamed )
3247
+ {
3248
+ if (!is_renamed ) {
3249
+ if (p -> status == DIFF_STATUS_ADDED ) {
3250
+ if (S_ISLNK (p -> two -> mode ))
3251
+ return "new +l" ;
3252
+ else if ((p -> two -> mode & 0777 ) == 0755 )
3253
+ return "new +x" ;
3254
+ else
3255
+ return "new" ;
3256
+ } else if (p -> status == DIFF_STATUS_DELETED )
3257
+ return "gone" ;
3258
+ }
3259
+ if (S_ISLNK (p -> one -> mode ) && !S_ISLNK (p -> two -> mode ))
3260
+ return "mode -l" ;
3261
+ else if (!S_ISLNK (p -> one -> mode ) && S_ISLNK (p -> two -> mode ))
3262
+ return "mode +l" ;
3263
+ else if ((p -> one -> mode & 0777 ) == 0644 &&
3264
+ (p -> two -> mode & 0777 ) == 0755 )
3265
+ return "mode +x" ;
3266
+ else if ((p -> one -> mode & 0777 ) == 0755 &&
3267
+ (p -> two -> mode & 0777 ) == 0644 )
3268
+ return "mode -x" ;
3269
+ return NULL ;
3270
+ }
3271
+
3251
3272
static void builtin_diffstat (const char * name_a , const char * name_b ,
3252
3273
struct diff_filespec * one ,
3253
3274
struct diff_filespec * two ,
@@ -3267,6 +3288,8 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
3267
3288
3268
3289
data = diffstat_add (diffstat , name_a , name_b );
3269
3290
data -> is_interesting = p -> status != DIFF_STATUS_UNKNOWN ;
3291
+ if (o -> flags .stat_with_summary )
3292
+ data -> comments = get_compact_summary (p , data -> is_renamed );
3270
3293
3271
3294
if (!one || !two ) {
3272
3295
data -> is_unmerged = 1 ;
@@ -4553,6 +4576,11 @@ int diff_opt_parse(struct diff_options *options,
4553
4576
else if (starts_with (arg , "--stat" ))
4554
4577
/* --stat, --stat-width, --stat-name-width, or --stat-count */
4555
4578
return stat_opt (options , av );
4579
+ else if (!strcmp (arg , "--compact-summary" )) {
4580
+ options -> flags .stat_with_summary = 1 ;
4581
+ options -> output_format |= DIFF_FORMAT_DIFFSTAT ;
4582
+ } else if (!strcmp (arg , "--no-compact-summary" ))
4583
+ options -> flags .stat_with_summary = 0 ;
4556
4584
4557
4585
/* renames options */
4558
4586
else if (starts_with (arg , "-B" ) ||
@@ -5241,10 +5269,12 @@ static void show_rename_copy(struct diff_options *opt, const char *renamecopy,
5241
5269
struct diff_filepair * p )
5242
5270
{
5243
5271
struct strbuf sb = STRBUF_INIT ;
5244
- char * names = pprint_rename (p -> one -> path , p -> two -> path );
5272
+ struct strbuf names = STRBUF_INIT ;
5273
+
5274
+ pprint_rename (& names , p -> one -> path , p -> two -> path );
5245
5275
strbuf_addf (& sb , " %s %s (%d%%)\n" ,
5246
- renamecopy , names , similarity_index (p ));
5247
- free ( names );
5276
+ renamecopy , names . buf , similarity_index (p ));
5277
+ strbuf_release ( & names );
5248
5278
emit_diff_symbol (opt , DIFF_SYMBOL_SUMMARY ,
5249
5279
sb .buf , sb .len , 0 );
5250
5280
show_mode_change (opt , p , 0 );
0 commit comments