diff mbox series

remote: align columns on -v

Message ID 20230209011201.1974721-1-kolyshkin@gmail.com (mailing list archive)
State New, archived
Headers show
Series remote: align columns on -v | expand

Commit Message

Kir Kolyshkin Feb. 9, 2023, 1:12 a.m. UTC
Currently, git remote -v produces a misaligned output when some remote
names are shorter and some are longer than a tab step. For example:

giuseppe	https://github.com/giuseppe/runc (fetch)
giuseppe	https://github.com/giuseppe/runc (push)
kir	git@github.com:kolyshkin/runc.git (fetch)
kir	git@github.com:kolyshkin/runc.git (push)
lifubang	https://github.com/lifubang/runc (fetch)
lifubang	https://github.com/lifubang/runc (push)
marquiz	https://github.com/marquiz/runc (fetch)
marquiz	https://github.com/marquiz/runc (push)

Let's find the maximum width of remote and use it for alignment.
With this change in place, the output looks like this now:

giuseppe  https://github.com/giuseppe/runc (fetch)
giuseppe  https://github.com/giuseppe/runc (push)
kir       git@github.com:kolyshkin/runc.git (fetch)
kir       git@github.com:kolyshkin/runc.git (push)
lifubang  https://github.com/lifubang/runc (fetch)
lifubang  https://github.com/lifubang/runc (push)
marquiz   https://github.com/marquiz/runc (fetch)
marquiz   https://github.com/marquiz/runc (push)

[v2: use utf8_strwidth and padding, fix description]

Reported-by: Roman Dodin <dodin.roman@gmail.com>
Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
---
 builtin/remote.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/builtin/remote.c b/builtin/remote.c
index 729f6f3643..654472a87c 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -13,6 +13,7 @@ 
 #include "strvec.h"
 #include "commit-reach.h"
 #include "progress.h"
+#include "utf8.h"
 
 static const char * const builtin_remote_usage[] = {
 	"git remote [-v | --verbose]",
@@ -1245,14 +1246,26 @@  static int show_all(void)
 	result = for_each_remote(get_one_entry, &list);
 
 	if (!result) {
-		int i;
+		int i, width = 7;
+
+		if (verbose) {
+			for (i = 0; i < list.nr; i++) {
+				int w = utf8_strwidth((list.items + i)->string);
+				if (w > width)
+					width = w;
+			}
+		}
 
 		string_list_sort(&list);
 		for (i = 0; i < list.nr; i++) {
 			struct string_list_item *item = list.items + i;
-			if (verbose)
-				printf("%s\t%s\n", item->string,
+			if (verbose) {
+				int padding = width - utf8_strwidth(item->string);
+				if (padding < 0)
+					padding = 0;
+				printf("%*s%s %s\n", padding, "", item->string,
 					item->util ? (const char *)item->util : "");
+			}
 			else {
 				if (i && !strcmp((item - 1)->string, item->string))
 					continue;