Skip to content

Commit 3d711d9

Browse files
author
Junio C Hamano
committed
shortlog -w: make wrap-line behaviour optional.
Signed-off-by: Junio C Hamano <[email protected]>
1 parent 3714e7c commit 3d711d9

File tree

2 files changed

+67
-5
lines changed

2 files changed

+67
-5
lines changed

builtin-shortlog.c

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,64 @@ static void get_from_rev(struct rev_info *rev, struct path_list *list)
277277

278278
}
279279

280+
static int parse_uint(char const **arg, int comma)
281+
{
282+
unsigned long ul;
283+
int ret;
284+
char *endp;
285+
286+
ul = strtoul(*arg, &endp, 10);
287+
if (endp != *arg && *endp && *endp != comma)
288+
return -1;
289+
ret = (int) ul;
290+
if (ret != ul)
291+
return -1;
292+
*arg = endp;
293+
if (**arg)
294+
(*arg)++;
295+
return ret;
296+
}
297+
298+
static const char wrap_arg_usage[] = "-w[<width>[,<indent1>[,<indent2>]]]";
299+
#define DEFAULT_WRAPLEN 76
300+
#define DEFAULT_INDENT1 6
301+
#define DEFAULT_INDENT2 9
302+
303+
static void parse_wrap_args(const char *arg, int *in1, int *in2, int *wrap)
304+
{
305+
arg += 2; /* skip -w */
306+
307+
*wrap = parse_uint(&arg, ',');
308+
if (*wrap < 0)
309+
die(wrap_arg_usage);
310+
*in1 = parse_uint(&arg, ',');
311+
if (*in1 < 0)
312+
die(wrap_arg_usage);
313+
*in2 = parse_uint(&arg, '\0');
314+
if (*in2 < 0)
315+
die(wrap_arg_usage);
316+
317+
if (!*wrap)
318+
*wrap = DEFAULT_WRAPLEN;
319+
if (!*in1)
320+
*in1 = DEFAULT_INDENT1;
321+
if (!*in2)
322+
*in2 = DEFAULT_INDENT2;
323+
if (*wrap &&
324+
((*in1 && *wrap <= *in1) ||
325+
(*in2 && *wrap <= *in2)))
326+
die(wrap_arg_usage);
327+
}
328+
280329
int cmd_shortlog(int argc, const char **argv, const char *prefix)
281330
{
282331
struct rev_info rev;
283332
struct path_list list = { NULL, 0, 0, 1 };
284333
int i, j, sort_by_number = 0, summary = 0;
334+
int wrap_lines = 0;
335+
int wrap = DEFAULT_WRAPLEN;
336+
int in1 = DEFAULT_INDENT1;
337+
int in2 = DEFAULT_INDENT2;
285338

286339
/* since -n is a shadowed rev argument, parse our args first */
287340
while (argc > 1) {
@@ -290,6 +343,10 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
290343
else if (!strcmp(argv[1], "-s") ||
291344
!strcmp(argv[1], "--summary"))
292345
summary = 1;
346+
else if (!prefixcmp(argv[1], "-w")) {
347+
wrap_lines = 1;
348+
parse_wrap_args(argv[1], &in1, &in2, &wrap);
349+
}
293350
else if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
294351
usage(shortlog_usage);
295352
else
@@ -325,10 +382,15 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
325382
} else {
326383
printf("%s (%d):\n", list.items[i].path, onelines->nr);
327384
for (j = onelines->nr - 1; j >= 0; j--) {
328-
int col = print_wrapped_text(onelines->items[j].path,
329-
6, 9, 76);
330-
if (col != 76)
331-
putchar('\n');
385+
const char *msg = onelines->items[j].path;
386+
387+
if (wrap_lines) {
388+
int col = print_wrapped_text(msg, in1, in2, wrap);
389+
if (col != wrap)
390+
putchar('\n');
391+
}
392+
else
393+
printf(" %s\n", msg);
332394
}
333395
putchar('\n');
334396
}

t/t4201-shortlog.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ git commit -m "$(echo "This is a very, very long first line for the commit messa
2929
echo 5 > a1
3030
git commit -m "a 12 34 56 78" a1
3131
32-
git shortlog HEAD > out
32+
git shortlog -w HEAD > out
3333
3434
cat > expect << EOF
3535
A U Thor (5):

0 commit comments

Comments
 (0)