Re: [PATCH v7 3/3] worktree: add 'list' command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Michael Rappazzo <rappazzo@xxxxxxxxx> writes:

> diff --git a/builtin/worktree.c b/builtin/worktree.c
> index 71bb770..a0c0fe8 100644
> --- a/builtin/worktree.c
> +++ b/builtin/worktree.c
> @@ -8,10 +8,13 @@
>  #include "run-command.h"
>  #include "sigchain.h"
>  #include "refs.h"
> +#include "utf8.h"
> +#include "worktree.h"
>  
>  static const char * const worktree_usage[] = {
>  	N_("git worktree add [<options>] <path> <branch>"),
>  	N_("git worktree prune [<options>]"),
> +	N_("git worktree list [<options>]"),
>  	NULL
>  };
>  
> @@ -359,6 +362,64 @@ static int add(int ac, const char **av, const char *prefix)
>  	return add_worktree(path, branch, &opts);
>  }
>  
> +static int list(int ac, const char **av, const char *prefix)
> +{
> +	int no_bare = 0;
> +
> +	struct option options[] = {
> +		OPT_BOOL(0, "skip-bare", &no_bare,  N_("exclude bare worktrees from the list")),
> +		OPT__VERBOSE(&verbose, N_("include more worktree details")),
> +		OPT_END()
> +	};
> +
> +	ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
> +	if (ac)
> +		usage_with_options(worktree_usage, options);
> +	else {
> +		struct worktree_list *worktree_list = get_worktree_list();

Call that variable just "list"; you are not dealing with any other
kind of list in this code anyway.

> +		struct worktree_list *orig = worktree_list;
> +		struct strbuf sb = STRBUF_INIT;
> +		int path_maxlen = 0;
> +
> +		if (verbose) {
> +			while (worktree_list) {
> +				int cur_len = strlen(worktree_list->worktree->path);
> +				if (cur_len > path_maxlen)
> +					path_maxlen = cur_len;
> +				worktree_list = worktree_list->next ? worktree_list->next : NULL;

Ehh, (A ? A : NULL), when A is a pointer value, is equivalent to A, no?

		struct worktree_list *orig = get_worktree_list();
		struct worktree_list *list;

		for (list = orig; list; list = list->next) {
			struct worktree *worktree = list->worktree;
			int len = strlen(worktree->path);
                        if (maxlen < len)
                        	maxlen = len;
		}

It seems that "do we really need callback interface?" suggestion
really made the code simple and straight-forward.

> +		while (worktree_list) {
> +			/* if this work tree is not bare OR if bare repos are to be shown (default) */
> +			if (!worktree_list->worktree->is_bare || !no_bare) {
> +				strbuf_reset(&sb);
> +				if (!verbose)
> +					strbuf_addstr(&sb, worktree_list->worktree->path);
> +				else {
> +					int cur_len = strlen(worktree_list->worktree->path);
> +					int utf8_adj = cur_len - utf8_strwidth(worktree_list->worktree->path);
> +					strbuf_addf(&sb, "%-*s ", 1 + path_maxlen + utf8_adj, worktree_list->worktree->path);
> +					if (worktree_list->worktree->is_bare)
> +						strbuf_addstr(&sb, "(bare)");
> +					else {
> +						strbuf_addf(&sb, "%s ", find_unique_abbrev(worktree_list->worktree->head_sha1, DEFAULT_ABBREV));
> +						if (!worktree_list->worktree->is_detached)
> +							strbuf_addf(&sb, "[%s]", shorten_unambiguous_ref(worktree_list->worktree->head_ref, 0));
> +						else
> +							strbuf_addstr(&sb, "(detached HEAD)");
> +					}
> +				}
> +				printf("%s\n", sb.buf);
> +			}
> +			worktree_list = worktree_list->next ? worktree_list->next : NULL;

Would it help reduce the indentation level if you inroduced a helper
function that takes a single worktree object and does all the above?

	for (list = orig; list; list = list->next) {
		struct worktree *worktree = list->worktree;
		if (!no_bare || !worktree->is_bare)
	        	show_worktree(worktree);
	}

or something?

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]