Make "git help" sort git commands in columns

This changes "pretty_print_string_list()" to show the git commands
alphabetically in column order, which is the normal one.

Ie instead of doing

	git commands available in '/home/torvalds/bin'
	----------------------------------------------
	  add                am                 ...
	  applypatch         archimport         ...
	  cat-file           check-ref-format   ...
	...

it does

	git commands available in '/home/torvalds/bin'
	----------------------------------------------
	  add                diff-tree          ...
	  am                 fetch              ...
	  apply              fetch-pack         ...
	...

where each column is sorted.

This is how "ls" sorts things too, and since visually the columns are much
more distinct than the rows, so it _looks_ more sorted.

The "ls" command has a "-x" option that lists entries by lines (the way
git.c used to): if somebody wants to do that, the new print-out logic
could be easily accomodated to that too. Matter of taste and preference, I
guess.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Linus Torvalds 2005-12-18 12:41:10 -08:00 committed by Junio C Hamano
parent ea77e675e5
commit 112d0bafd6

21
git.c
View File

@ -85,25 +85,28 @@ static int cmdname_compare(const void *a_, const void *b_)
static void pretty_print_string_list(struct cmdname **cmdname, int longest)
{
int cols = 1;
int cols = 1, rows;
int space = longest + 1; /* min 1 SP between words */
int max_cols = term_columns() - 1; /* don't print *on* the edge */
int i;
int i, j;
if (space < max_cols)
cols = max_cols / space;
rows = (cmdname_cnt + cols - 1) / cols;
qsort(cmdname, cmdname_cnt, sizeof(*cmdname), cmdname_compare);
for (i = 0; i < cmdname_cnt; ) {
int c;
for (i = 0; i < rows; i++) {
printf(" ");
for (c = cols; c && i < cmdname_cnt; i++) {
printf("%s", cmdname[i]->name);
if (--c)
mput_char(' ', space - cmdname[i]->len);
for (j = 0; j < cols; j++) {
int n = j * rows + i;
int size = space;
if (n >= cmdname_cnt)
break;
if (j == cols-1 || n + rows >= cmdname_cnt)
size = 1;
printf("%-*s", size, cmdname[n]->name);
}
putchar('\n');
}