Re: [PATCH v6 4/7] git-clean: use a git-add-interactive compatible UI
2013/5/7 Junio C Hamano : > What is this message trying to achieve? "self review"??? > > A bit puzzled Maybe I should send a new rerolled patch series after this. Yesterday I wanted to wait for a while to see suggestions and reviews from others. -- Jiang Xin -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 4/7] git-clean: use a git-add-interactive compatible UI
Jiang Xin writes: > 2013/5/7 Jiang Xin : >> Rewrite menu using a new method `list_and_choose`, which is borrowed >> from `git-add--interactive.perl`. We can reused this method later for >> more actions. >> >> Please NOTE: >> >> * Method `list_and_choose` return an array of integers, and >> * it is up to you to free the allocated memory of the array. >> * The array ends with EOF. >> * If user pressed CTRL-D (i.e. EOF), no selection returned. >> >> Signed-off-by: Jiang Xin >> --- >> builtin/clean.c | 410 >> ++-- >> 1 file changed, 367 insertions(+), 43 deletions(-) >... >> -void edit_by_patterns_cmd() >> +void pretty_print_menus(struct string_list *menu_list) >> +{ >> + struct strbuf buf = STRBUF_INIT; > unused buf should be deleted. > >> + unsigned int local_colopts = 0; >> + struct column_options copts; >> + >> + /* >> +* always enable column display, we only consult column.* >> +* about layout strategy and stuff >> +*/ > remove the above comments. > >> + local_colopts = COL_ENABLED | COL_ROW; >> + memset(&copts, 0, sizeof(copts)); >> + copts.indent = " "; >> + copts.padding = 2; >> + print_columns(menu_list, local_colopts, &copts); >> + strbuf_release(&buf); > remove strbuf_release of unused variable : buf. > >> +} >... >> + } else if (MENU_STUFF_TYPE_STRING_LIST == stuff->type) { >> + struct string_list_item *item; >> + struct strbuf buf = STRBUF_INIT; > should call strbuf_release later > ... >> + } else { >> + result = xmalloc(sizeof(int) * (nr + 1)); >> + memset(result, 0, sizeof(int) * (nr + 1)); > > Add initial for j here: What is this message trying to achieve? "self review"??? A bit puzzled -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v6 4/7] git-clean: use a git-add-interactive compatible UI
2013/5/7 Jiang Xin : > Rewrite menu using a new method `list_and_choose`, which is borrowed > from `git-add--interactive.perl`. We can reused this method later for > more actions. > > Please NOTE: > > * Method `list_and_choose` return an array of integers, and > * it is up to you to free the allocated memory of the array. > * The array ends with EOF. > * If user pressed CTRL-D (i.e. EOF), no selection returned. > > Signed-off-by: Jiang Xin > --- > builtin/clean.c | 410 > ++-- > 1 file changed, 367 insertions(+), 43 deletions(-) > > diff --git a/builtin/clean.c b/builtin/clean.c > index 6bda3..3b9f3 100644 > --- a/builtin/clean.c > +++ b/builtin/clean.c > @@ -16,6 +16,35 @@ > #include "column.h" > #include "color.h" > > +#define MENU_OPTS_SINGLETON01 > +#define MENU_OPTS_IMMEDIATE02 > +#define MENU_OPTS_LIST_ONLY04 > + > +#define MENU_RETURN_NO_LOOP10 > + > +struct menu_opts { > + const char *header; > + const char *prompt; > + int flag; > +}; > + > +enum menu_stuff_type { > + MENU_STUFF_TYPE_STRING_LIST = 1, > + MENU_STUFF_TYPE_MENU_ITEM > +}; > + > +struct menu_stuff { > + enum menu_stuff_type type; > + int nr; > + void *stuff; > +}; > + > +struct menu_item { > + char hotkey; > + char *title; > + int (*fn)(); > +}; > + > static int force = -1; /* unset */ > static int interactive; > static struct string_list del_list = STRING_LIST_INIT_DUP; > @@ -240,12 +269,284 @@ void pretty_print_dels() > copts.indent = " "; > copts.padding = 2; > print_columns(&list, colopts, &copts); > - putchar('\n'); > strbuf_release(&buf); > string_list_clear(&list, 0); > } > > -void edit_by_patterns_cmd() > +void pretty_print_menus(struct string_list *menu_list) > +{ > + struct strbuf buf = STRBUF_INIT; unused buf should be deleted. > + unsigned int local_colopts = 0; > + struct column_options copts; > + > + /* > +* always enable column display, we only consult column.* > +* about layout strategy and stuff > +*/ remove the above comments. > + local_colopts = COL_ENABLED | COL_ROW; > + memset(&copts, 0, sizeof(copts)); > + copts.indent = " "; > + copts.padding = 2; > + print_columns(menu_list, local_colopts, &copts); > + strbuf_release(&buf); remove strbuf_release of unused variable : buf. > +} > + > +void prompt_help_cmd(int singleton) > +{ > + clean_print_color(CLEAN_COLOR_HELP); > + printf_ln(singleton ? > + _("Prompt help:\n" > + "1 - select a numbered item\n" > + "foo- select item based on unique prefix\n" > + " - (empty) select nothing") : > + _("Prompt help:\n" > + "1 - select a single item\n" > + "3-5- select a range of items\n" > + "2-3,6-9- select multiple ranges\n" > + "foo- select item based on unique prefix\n" > + "-... - unselect specified items\n" > + "* - choose all items\n" > + " - (empty) finish selecting")); > + clean_print_color(CLEAN_COLOR_RESET); > +} > + > +/* > + * Implement a git-add-interactive compatible UI, which is borrowed > + * from git-add--interactive.perl. > + * > + * Return value: > + * > + * - Return an array of integers > + * - , and it is up to you to free the allocated memory. > + * - The array ends with EOF. > + * - If user pressed CTRL-D (i.e. EOF), no selection returned. > + */ > +int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff) > +{ > + static struct string_list menu_list = STRING_LIST_INIT_DUP; > + struct strbuf menu = STRBUF_INIT; > + struct strbuf choice = STRBUF_INIT; > + struct strbuf **choice_list; > + int *chosen, *result; > + char *p; > + int nr = 0; > + int i, j; > + int eof = 0; > + > + chosen = xmalloc(sizeof(int) * stuff->nr); > + memset(chosen, 0, sizeof(int) * stuff->nr); > + > + while (1) { > + int i = 0, j = 0; > + string_list_clear(&menu_list, 0); > + > + if (opts->header) { > + printf_ln("%s%s%s", > + clean_get_color(CLEAN_COLOR_HEADER), > + opts->header, > + clean_get_color(CLEAN_COLOR_RESET)); > + } > + > + /* highlight hotkey in menu */ > + if (MENU_STUFF_TYPE_MENU_ITEM == stuff->type) { > + struct menu_item *item; > + > + item = (struct menu_item *)stuff->stuff; > + for (i = 0; i < stuff->n
[PATCH v6 4/7] git-clean: use a git-add-interactive compatible UI
Rewrite menu using a new method `list_and_choose`, which is borrowed from `git-add--interactive.perl`. We can reused this method later for more actions. Please NOTE: * Method `list_and_choose` return an array of integers, and * it is up to you to free the allocated memory of the array. * The array ends with EOF. * If user pressed CTRL-D (i.e. EOF), no selection returned. Signed-off-by: Jiang Xin --- builtin/clean.c | 410 ++-- 1 file changed, 367 insertions(+), 43 deletions(-) diff --git a/builtin/clean.c b/builtin/clean.c index 6bda3..3b9f3 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -16,6 +16,35 @@ #include "column.h" #include "color.h" +#define MENU_OPTS_SINGLETON01 +#define MENU_OPTS_IMMEDIATE02 +#define MENU_OPTS_LIST_ONLY04 + +#define MENU_RETURN_NO_LOOP10 + +struct menu_opts { + const char *header; + const char *prompt; + int flag; +}; + +enum menu_stuff_type { + MENU_STUFF_TYPE_STRING_LIST = 1, + MENU_STUFF_TYPE_MENU_ITEM +}; + +struct menu_stuff { + enum menu_stuff_type type; + int nr; + void *stuff; +}; + +struct menu_item { + char hotkey; + char *title; + int (*fn)(); +}; + static int force = -1; /* unset */ static int interactive; static struct string_list del_list = STRING_LIST_INIT_DUP; @@ -240,12 +269,284 @@ void pretty_print_dels() copts.indent = " "; copts.padding = 2; print_columns(&list, colopts, &copts); - putchar('\n'); strbuf_release(&buf); string_list_clear(&list, 0); } -void edit_by_patterns_cmd() +void pretty_print_menus(struct string_list *menu_list) +{ + struct strbuf buf = STRBUF_INIT; + unsigned int local_colopts = 0; + struct column_options copts; + + /* +* always enable column display, we only consult column.* +* about layout strategy and stuff +*/ + local_colopts = COL_ENABLED | COL_ROW; + memset(&copts, 0, sizeof(copts)); + copts.indent = " "; + copts.padding = 2; + print_columns(menu_list, local_colopts, &copts); + strbuf_release(&buf); +} + +void prompt_help_cmd(int singleton) +{ + clean_print_color(CLEAN_COLOR_HELP); + printf_ln(singleton ? + _("Prompt help:\n" + "1 - select a numbered item\n" + "foo- select item based on unique prefix\n" + " - (empty) select nothing") : + _("Prompt help:\n" + "1 - select a single item\n" + "3-5- select a range of items\n" + "2-3,6-9- select multiple ranges\n" + "foo- select item based on unique prefix\n" + "-... - unselect specified items\n" + "* - choose all items\n" + " - (empty) finish selecting")); + clean_print_color(CLEAN_COLOR_RESET); +} + +/* + * Implement a git-add-interactive compatible UI, which is borrowed + * from git-add--interactive.perl. + * + * Return value: + * + * - Return an array of integers + * - , and it is up to you to free the allocated memory. + * - The array ends with EOF. + * - If user pressed CTRL-D (i.e. EOF), no selection returned. + */ +int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff) +{ + static struct string_list menu_list = STRING_LIST_INIT_DUP; + struct strbuf menu = STRBUF_INIT; + struct strbuf choice = STRBUF_INIT; + struct strbuf **choice_list; + int *chosen, *result; + char *p; + int nr = 0; + int i, j; + int eof = 0; + + chosen = xmalloc(sizeof(int) * stuff->nr); + memset(chosen, 0, sizeof(int) * stuff->nr); + + while (1) { + int i = 0, j = 0; + string_list_clear(&menu_list, 0); + + if (opts->header) { + printf_ln("%s%s%s", + clean_get_color(CLEAN_COLOR_HEADER), + opts->header, + clean_get_color(CLEAN_COLOR_RESET)); + } + + /* highlight hotkey in menu */ + if (MENU_STUFF_TYPE_MENU_ITEM == stuff->type) { + struct menu_item *item; + + item = (struct menu_item *)stuff->stuff; + for (i = 0; i < stuff->nr; i++, item++) { + p = item->title; + strbuf_addf(&menu, "%s%2d: ", chosen[i] ? "*" : " ", i+1); + for (; *p; p++) { + if (*p == item->hotkey) { + strbuf_addstr(&menu, clean_get_color(CLEAN_COLOR_PROMPT)); +