All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] scripts: kconfig: implement a sort method
@ 2017-04-11 11:12 Felipe Balbi
  2017-04-11 18:53 ` Randy Dunlap
  0 siblings, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2017-04-11 11:12 UTC (permalink / raw)
  To: yann.morin.1998
  Cc: linux-kbuild, linux-kernel, Greg Kroah-Hartman, Felipe Balbi

With a growing amount of Kernel configuration, it's
getting ever more difficult to find anything on
menuconfig. Because of that, implement mergesort for
kconfig to make it a little easier for anybody
building kernels.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
---
 scripts/kconfig/lxdialog/menubox.c | 18 +++++----
 scripts/kconfig/mconf.c            | 83 +++++++++++++++++++++++++++++++++++---
 2 files changed, 89 insertions(+), 12 deletions(-)

diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c
index 11ae9ad7ac7b..d6cc04db6e60 100644
--- a/scripts/kconfig/lxdialog/menubox.c
+++ b/scripts/kconfig/lxdialog/menubox.c
@@ -162,6 +162,7 @@ static void print_buttons(WINDOW * win, int height, int width, int selected)
 	print_button(win, gettext(" Help "), y, x + 24, selected == 2);
 	print_button(win, gettext(" Save "), y, x + 36, selected == 3);
 	print_button(win, gettext(" Load "), y, x + 48, selected == 4);
+	print_button(win, gettext(" Sort "), y, x + 60, selected == 5);
 
 	wmove(win, y, x + 1 + 12 * selected);
 	wrefresh(win);
@@ -375,7 +376,7 @@ int dialog_menu(const char *title, const char *prompt,
 		case TAB:
 		case KEY_RIGHT:
 			button = ((key == KEY_LEFT ? --button : ++button) < 0)
-			    ? 4 : (button > 4 ? 0 : button);
+			    ? 5 : (button > 5 ? 0 : button);
 
 			print_buttons(dialog, height, width, button);
 			wrefresh(menu);
@@ -390,6 +391,7 @@ int dialog_menu(const char *title, const char *prompt,
 		case '?':
 		case 'z':
 		case '\n':
+		case '.':
 			/* save scroll info */
 			*s_scroll = scroll;
 			delwin(menu);
@@ -400,19 +402,21 @@ int dialog_menu(const char *title, const char *prompt,
 			case 'h':
 			case '?':
 				return 2;
+			case '.':
+				return 5;
 			case 's':
 			case 'y':
-				return 5;
-			case 'n':
 				return 6;
-			case 'm':
+			case 'n':
 				return 7;
-			case ' ':
+			case 'm':
 				return 8;
-			case '/':
+			case ' ':
 				return 9;
-			case 'z':
+			case '/':
 				return 10;
+			case 'z':
+				return 11;
 			case '\n':
 				return button;
 			}
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 315ce2c7cb9d..c4a2eb561be4 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -642,6 +642,75 @@ static void build_conf(struct menu *menu)
 	indent -= doint;
 }
 
+static int less(struct menu *a, struct menu *b)
+{
+	const char *s1 = _(menu_get_prompt(a));
+	const char *s2 = _(menu_get_prompt(b));
+
+	if (!s1)
+		return 1;
+
+	if (!s2)
+		return 0;
+
+	return strcmp(s1, s2) < 0;
+}
+
+static struct menu *merge(struct menu *a, struct menu *b)
+{
+	struct menu head;
+	struct menu *c = &head;
+
+	while (a && b) {
+		if (less(a, b)) {
+			c->next = a;
+			c = a;
+			a = a->next;
+		} else {
+			c->next = b;
+			c = b;
+			b = b->next;
+		}
+	}
+
+	c->next = a ? a : b;
+
+	return head.next;
+}
+
+static struct menu *mergesort(struct menu *c)
+{
+	struct menu *a;
+	struct menu *b;
+
+	if (!c)
+		return c;
+
+	if (c->list)
+		c->list =  mergesort(c->list);
+
+	if (!c->next)
+		return c;
+
+	a = c;
+	b = c->next;
+
+	while (b && b->next) {
+		c = c->next;
+		b = b->next->next;
+	}
+
+	b = c->next;
+	c->next = NULL;
+
+	return merge(mergesort(a), mergesort(b));
+}
+
+static struct menu *sort_conf(void)
+{
+	return mergesort(&rootmenu);
+}
+
 static void conf(struct menu *menu, struct menu *active_menu)
 {
 	struct menu *submenu;
@@ -668,6 +737,7 @@ static void conf(struct menu *menu, struct menu *active_menu)
 		res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
 				  _(menu_instructions),
 				  active_menu, &s_scroll);
+
 		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
 			break;
 		if (item_count() != 0) {
@@ -720,6 +790,9 @@ static void conf(struct menu *menu, struct menu *active_menu)
 			conf_load();
 			break;
 		case 5:
+			sort_conf();
+			break;
+		case 6:
 			if (item_is_tag('t')) {
 				if (sym_set_tristate_value(sym, yes))
 					break;
@@ -727,24 +800,24 @@ static void conf(struct menu *menu, struct menu *active_menu)
 					show_textbox(NULL, setmod_text, 6, 74);
 			}
 			break;
-		case 6:
+		case 7:
 			if (item_is_tag('t'))
 				sym_set_tristate_value(sym, no);
 			break;
-		case 7:
+		case 8:
 			if (item_is_tag('t'))
 				sym_set_tristate_value(sym, mod);
 			break;
-		case 8:
+		case 9:
 			if (item_is_tag('t'))
 				sym_toggle_tristate_value(sym);
 			else if (item_is_tag('m'))
 				conf(submenu, NULL);
 			break;
-		case 9:
+		case 10:
 			search_conf();
 			break;
-		case 10:
+		case 11:
 			show_all_options = !show_all_options;
 			break;
 		}
-- 
2.11.0.295.gd7dffce1ce

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2017-04-11 11:12 [PATCH] scripts: kconfig: implement a sort method Felipe Balbi
@ 2017-04-11 18:53 ` Randy Dunlap
  2017-04-12  7:49   ` Felipe Balbi
  0 siblings, 1 reply; 9+ messages in thread
From: Randy Dunlap @ 2017-04-11 18:53 UTC (permalink / raw)
  To: Felipe Balbi, yann.morin.1998
  Cc: linux-kbuild, linux-kernel, Greg Kroah-Hartman

On 04/11/17 04:12, Felipe Balbi wrote:
> With a growing amount of Kernel configuration, it's
> getting ever more difficult to find anything on
> menuconfig. Because of that, implement mergesort for
> kconfig to make it a little easier for anybody
> building kernels.

Search works for me, but I don't mind Sort either.

Why only menuconfig?  Is it the one that you use mostly?

Any Help text for Sort?  or is it obvious what it does?  (no)


In an 80x25 terminal (window), the < Sort > option wraps around
past column 80.

I haven't looked at the source code (lately), but I think that it
would OK to not have the (extra) spaces inside the <...> brackets.
I.e., instead of
  │        <Select>    < Exit >    < Help >    < Save >    < Load >    < Sort  
   >
just have
  │        <Select>    <Exit>    <Help>    <Save>    <Load>    <Sort>

Or the <Select> does not need to be indented as much as it is.


And BTW, Yann made kconfig an orphan today. :(


> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
> ---
>  scripts/kconfig/lxdialog/menubox.c | 18 +++++----
>  scripts/kconfig/mconf.c            | 83 +++++++++++++++++++++++++++++++++++---
>  2 files changed, 89 insertions(+), 12 deletions(-)


-- 
~Randy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2017-04-11 18:53 ` Randy Dunlap
@ 2017-04-12  7:49   ` Felipe Balbi
  2017-04-12 16:06     ` Yann E. MORIN
  0 siblings, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2017-04-12  7:49 UTC (permalink / raw)
  To: Randy Dunlap, yann.morin.1998
  Cc: linux-kbuild, linux-kernel, Greg Kroah-Hartman

[-- Attachment #1: Type: text/plain, Size: 12654 bytes --]


Hi,

Randy Dunlap <rdunlap@infradead.org> writes:
> On 04/11/17 04:12, Felipe Balbi wrote:
>> With a growing amount of Kernel configuration, it's
>> getting ever more difficult to find anything on
>> menuconfig. Because of that, implement mergesort for
>> kconfig to make it a little easier for anybody
>> building kernels.
>
> Search works for me, but I don't mind Sort either.

yes, it works. It does a different thing, though. Here's what happens
when I want to find DWC3:

/ DWC3 RET

  | Symbol: USB_DWC3 [=m]                                                      │  
  │ Type  : tristate                                                           │  
  │ Prompt: DesignWare USB3 DRD Core Support                                   │  
  │   Location:                                                                │  
  │     -> Device Drivers                                                      │  
  │ (1)   -> USB support (USB_SUPPORT [=y])                                    │  
  │   Defined at drivers/usb/dwc3/Kconfig:1                                    │  
  │   Depends on: USB_SUPPORT [=y] && (USB [=y] || USB_GADGET [=y]) && HAS_DMA │  
  │   Selects: USB_XHCI_PLATFORM [=m]                                          │  
  │                                                                            │  
  │                                                                            │  
  │ Symbol: USB_DWC3_DUAL_ROLE [=n]                                            │  
  │ Type  : boolean                                                            │  
  │ Prompt: Dual Role mode                                                     │  
  │   Location:                                                                │  
  │     -> Device Drivers                                                      │  
  │       -> USB support (USB_SUPPORT [=y])                                    │  
  │         -> DesignWare USB3 DRD Core Support (USB_DWC3 [=m])                │  
  │ (2)       -> DWC3 Mode Selection (<choice> [=y])                           │  
  │   Defined at drivers/usb/dwc3/Kconfig:41                                   │  
  │   Depends on: <choice> && (USB [=y]=y || USB [=y]=USB_DWC3 [=m]) && (USB_G │  
  │                                                                            │  
  │                                                                            │  
  │ Symbol: USB_DWC3_EXYNOS [=n]                                               │  
  │ Type  : tristate                                                           │  
  │ Prompt: Samsung Exynos Platform                                            │  
  │   Location:                                                                │  
  │     -> Device Drivers                                                      │  
  │       -> USB support (USB_SUPPORT [=y])                                    │  
  │ (3)     -> DesignWare USB3 DRD Core Support (USB_DWC3 [=m])                │  
  │   Defined at drivers/usb/dwc3/Kconfig:63                                   │  
  │   Depends on: USB_SUPPORT [=y] && USB_DWC3 [=m] && (ARCH_EXYNOS || COMPILE │  
  │                                                                            │  
  │                                                                            │  
  │ Symbol: USB_DWC3_GADGET [=y]                                               │  
  │ Type  : boolean                                                            │  
  │ Prompt: Gadget only mode                                                   │  
  │   Location:                                                                │  
  │     -> Device Drivers                                                      │  
  │       -> USB support (USB_SUPPORT [=y])                                    │  
  │         -> DesignWare USB3 DRD Core Support (USB_DWC3 [=m])                │  
  │ (4)       -> DWC3 Mode Selection (<choice> [=y])                           │  
  │   Defined at drivers/usb/dwc3/Kconfig:34                                   │  
  │   Depends on: <choice> && (USB_GADGET [=y]=y || USB_GAD

Now I know where DWC3 is defined, so I navigate to Device Driver, USB
Support and search for DesignWare USB3 DRD Core Support:

  │ │    <M>     USB Test and Measurement Class support                      │ │  
  │ │            *** NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may ***│ │  
  │ │            *** also be needed; see USB_STORAGE Help for more info ***  │ │  
  │ │    <M>     USB Mass Storage support                                    │ │  
  │ │    [ ]       USB Mass Storage verbose debug                            │ │  
  │ │    <M>       Realtek Card Reader support                               │ │  
  │ │    [*]         Realtek Card Reader autosuspend support                 │ │  
  │ │    <M>       Datafab Compact Flash Reader support                      │ │  
  │ │    <M>       Freecom USB/ATAPI Bridge support                          │ │  
  │ │    <M>       ISD-200 USB/ATA Bridge support                            │ │  
  │ │    <M>       USBAT/USBAT02-based storage support                       │ │  
  │ │    <M>       SanDisk SDDR-09 (and other SmartMedia, including DPCM) sup│ │  
  │ │    <M>       SanDisk SDDR-55 SmartMedia support                        │ │  
  │ │    <M>       Lexar Jumpshot Compact Flash Reader                       │ │  
  │ │    <M>       Olympus MAUSB-10/Fuji DPC-R1 support                      │ │  
  │ │    <M>       Support OneTouch Button on Maxtor Hard Drives             │ │  
  │ │    <M>       Support for Rio Karma music player                        │ │  
  │ │    <M>       SAT emulation on Cypress USB/ATA Bridge with ATACB        │ │  
  │ │    <M>       USB ENE card reader support                               │ │  
  │ │    <M>       USB Attached SCSI                                         │ │  
  │ │            *** USB Imaging devices ***                                 │ │  
  │ │    < >     USB Mustek MDC800 Digital Camera support                    │ │  
  │ │    < >     Microtek X6USB scanner support                              │ │  
  │ │    < >     USB/IP support                                              │ │  
  │ │    < >   Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...)    │ │  
  │ │    < >   DesignWare USB3 DRD Core Support                              │ │  
  │ │    < >   DesignWare USB2 DRD Core Support                              │ │  
  │ │    < >   ChipIdea Highspeed Dual Role Controller                       │ │  
  │ │    < >   NXP ISP 1760/1761 support                                     │ │  
  │ │          *** USB port drivers ***                                      │ │  
  │ │    <M>   USB Serial Converter support  --->                            │ │  
  │ │          *** USB Miscellaneous drivers ***                             │ │  
  │ │    < >   EMI 6|2m USB Audio interface support                          │ │  
  │ │    < >   EMI 2|6 USB Audio interface support                           │ │  
  │ │    < >   ADU devices from Ontrak Control Systems                       │ │  
  │ │    < >   USB 7-Segment LED Display                                     │ │  
  │ │    < >   USB Diamond Rio500 support                                    │ │  
  │ │    < >   USB Lego Infrared Tower support                               │ │  
  │ │    < >   USB LCD driver support                                        │ │  

Compare that to the sorted view of this same entry:

  │ │    --- USB support                                                     │ │  
  │ │    < >   ADU devices from Ontrak Control Systems                       │ │  
  │ │    < >   Apple Cinema Display support                                  │ │  
  │ │    < >   ChaosKey random number generator driver support               │ │  
  │ │    < >   ChipIdea Highspeed Dual Role Controller                       │ │  
  │ │    < >   Cypress CY7C63xxx USB driver support                          │ │  
  │ │    < >   Cypress USB thermometer driver support                        │ │  
  │ │    < >   DesignWare USB2 DRD Core Support                              │ │  
  │ │    < >   DesignWare USB3 DRD Core Support                              │ │  
  │ │    < >   EMI 2|6 USB Audio interface support                           │ │  
  │ │    < >   EMI 6|2m USB Audio interface support                          │ │  
  │ │    < >   Elan PCMCIA CardBus Adapter USB Client                        │ │  
  │ │    {M}   Functions for loading firmware on EZUSB chips                 │ │  
  │ │    < >   IO Warrior driver support                                     │ │  
  │ │    < >   Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...)    │ │  
  │ │    < >   NXP ISP 1760/1761 support                                     │ │  
  │ │    < >   PlayStation 2 Trance Vibrator driver support                  │ │  
  │ │    < >   Siemens ID USB Mouse Fingerprint sensor support               │ │  
  │ │    <*>   Support for Host-side USB                                     │ │  
  │ │    < >     BCMA usb host driver                                        │ │  
  │ │    < >     Cypress C67x00 HCD support                                  │ │  
  │ │    [*]     Dynamic USB minor allocation                                │ │  
  │ │    < >     EHCI HCD (USB 2.0) support                                  │ │  
  │ │    [*]     Enable USB persist by default                               │ │  
  │ │    < >     FOTG210 HCD support                                         │ │  
  │ │    [ ]     HCD test mode support                                       │ │  
  │ │    < >     ISP116X HCD support                                         │ │  
  │ │    < >     ISP1362 HCD support                                         │ │  
  │ │    < >     Microtek X6USB scanner support                              │ │  
  │ │            *** Miscellaneous USB options ***                           │ │  
  │ │            *** NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may ***│ │  
  │ │    < >     OHCI HCD (USB 1.1) support                                  │ │  
  │ │    [ ]     OTG support                                                 │ │  
  │ │    < >     OXU210HP HCD support                                        │ │  
  │ │    < >     R8A66597 HCD support                                        │ │  
  │ │    [ ]     Rely on OTG and EH Targeted Peripherals List                │ │  
  │ │    < >     SL811HS HCD support                                         │ │  
  │ │    < >     SSB usb host driver                                         │ │  
  │ │    < >     Support WUSB Cable Based Association (CBA)                  │ │ 

much easier to find, don't you think?

> Why only menuconfig?  Is it the one that you use mostly?

shouldn't be difficult to port to nconfig.

> Any Help text for Sort?  or is it obvious what it does?  (no)

wait, it's not obvious what "Sort" means?

> In an 80x25 terminal (window), the < Sort > option wraps around
> past column 80.

not what I see here [1]

> I haven't looked at the source code (lately), but I think that it
> would OK to not have the (extra) spaces inside the <...> brackets.
> I.e., instead of
>   │        <Select>    < Exit >    < Help >    < Save >    < Load >    < Sort  
>    >
> just have
>   │        <Select>    <Exit>    <Help>    <Save>    <Load>    <Sort>
>
> Or the <Select> does not need to be indented as much as it is.

I changed that for this very reason

> And BTW, Yann made kconfig an orphan today. :(

oh well

[1] https://imgur.com/a/qyvG6

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2017-04-12  7:49   ` Felipe Balbi
@ 2017-04-12 16:06     ` Yann E. MORIN
  2017-04-12 18:19       ` Randy Dunlap
  0 siblings, 1 reply; 9+ messages in thread
From: Yann E. MORIN @ 2017-04-12 16:06 UTC (permalink / raw)
  To: Felipe Balbi; +Cc: Randy Dunlap, linux-kbuild, linux-kernel, Greg Kroah-Hartman

Felipe, All,

On 2017-04-12 10:49 +0300, Felipe Balbi spake thusly:
> 
> Randy Dunlap <rdunlap@infradead.org> writes:
> > On 04/11/17 04:12, Felipe Balbi wrote:
> >> With a growing amount of Kernel configuration, it's
> >> getting ever more difficult to find anything on
> >> menuconfig. Because of that, implement mergesort for
> >> kconfig to make it a little easier for anybody
> >> building kernels.
> >
> > Search works for me, but I don't mind Sort either.
> 
> yes, it works. It does a different thing, though. Here's what happens
> when I want to find DWC3:
> 
> / DWC3 RET
> 
>   | Symbol: USB_DWC3 [=m]                                                      │  
>   │ Type  : tristate                                                           │  
>   │ Prompt: DesignWare USB3 DRD Core Support                                   │  
>   │   Location:                                                                │  
>   │     -> Device Drivers                                                      │  
>   │ (1)   -> USB support (USB_SUPPORT [=y])                                    │  
>   │   Defined at drivers/usb/dwc3/Kconfig:1                                    │  
>   │   Depends on: USB_SUPPORT [=y] && (USB [=y] || USB_GADGET [=y]) && HAS_DMA │  
>   │   Selects: USB_XHCI_PLATFORM [=m]                                          │  
>   │                                                                            │  
>   │                                                                            │  
>   │ Symbol: USB_DWC3_DUAL_ROLE [=n]                                            │  
>   │ Type  : boolean                                                            │  
>   │ Prompt: Dual Role mode                                                     │  
>   │   Location:                                                                │  
>   │     -> Device Drivers                                                      │  
>   │       -> USB support (USB_SUPPORT [=y])                                    │  
>   │         -> DesignWare USB3 DRD Core Support (USB_DWC3 [=m])                │  
>   │ (2)       -> DWC3 Mode Selection (<choice> [=y])                           │  
>   │   Defined at drivers/usb/dwc3/Kconfig:41                                   │  
>   │   Depends on: <choice> && (USB [=y]=y || USB [=y]=USB_DWC3 [=m]) && (USB_G │  
>   │                                                                            │  
>   │                                                                            │  
>   │ Symbol: USB_DWC3_EXYNOS [=n]                                               │  
>   │ Type  : tristate                                                           │  
>   │ Prompt: Samsung Exynos Platform                                            │  
>   │   Location:                                                                │  
>   │     -> Device Drivers                                                      │  
>   │       -> USB support (USB_SUPPORT [=y])                                    │  
>   │ (3)     -> DesignWare USB3 DRD Core Support (USB_DWC3 [=m])                │  
>   │   Defined at drivers/usb/dwc3/Kconfig:63                                   │  
>   │   Depends on: USB_SUPPORT [=y] && USB_DWC3 [=m] && (ARCH_EXYNOS || COMPILE │  
>   │                                                                            │  
>   │                                                                            │  
>   │ Symbol: USB_DWC3_GADGET [=y]                                               │  
>   │ Type  : boolean                                                            │  
>   │ Prompt: Gadget only mode                                                   │  
>   │   Location:                                                                │  
>   │     -> Device Drivers                                                      │  
>   │       -> USB support (USB_SUPPORT [=y])                                    │  
>   │         -> DesignWare USB3 DRD Core Support (USB_DWC3 [=m])                │  
>   │ (4)       -> DWC3 Mode Selection (<choice> [=y])                           │  
>   │   Defined at drivers/usb/dwc3/Kconfig:34                                   │  
>   │   Depends on: <choice> && (USB_GADGET [=y]=y || USB_GAD
> 
> Now I know where DWC3 is defined, so I navigate to Device Driver, USB
> Support and search for DesignWare USB3 DRD Core Support:

Or you just press '3' (the number between parenthesis), and that will
take you directly there.

When you then exit, you're back top the search results.

>   │ │    <M>     USB Test and Measurement Class support                      │ │  
[--SNIP unsorted menu--]
>   │ │    < >   USB LCD driver support                                        │ │  
> 
> Compare that to the sorted view of this same entry:
> 
>   │ │    --- USB support                                                     │ │  
[--SNIP sorted menu--]
>   │ │    < >     Support WUSB Cable Based Association (CBA)                  │ │ 
> 
> much easier to find, don't you think?

Arguably, the order may also make sense, for example to "group" related
items. So, <Sort> should be a toggle, so that it is possible to go back
to the unsorted, original order, IMHO...

> > Any Help text for Sort?  or is it obvious what it does?  (no)
> wait, it's not obvious what "Sort" means?

I guess that what Randy said was that in this context, it is not more
obvious than Load or Save, and they are documented in the help (but it
is not obvious how to get the help).

For example, go on the "General setup" entry, but do not enter the menu.
Now, select Help: you'll get a bit of help on how to use menuconfig.

There, Load and Save are documented, in Alternate Configuration Files.

> > In an 80x25 terminal (window), the < Sort > option wraps around
> > past column 80.
> not what I see here [1]

I see the same as Randy here:

    $ stty size
    25 80

    https://imgur.com/a/ku0sG

> > I haven't looked at the source code (lately), but I think that it
> > would OK to not have the (extra) spaces inside the <...> brackets.
> > I.e., instead of
> >   │        <Select>    < Exit >    < Help >    < Save >    < Load >    < Sort  
> >    >
> > just have
> >   │        <Select>    <Exit>    <Help>    <Save>    <Load>    <Sort>
> >
> > Or the <Select> does not need to be indented as much as it is.
> I changed that for this very reason

Or just always left-align the line, rather than center it?

> > And BTW, Yann made kconfig an orphan today. :(

Yes, I did a very bad job at being the maintainer over the past years,
so I could not really keep it any longer...

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2017-04-12 16:06     ` Yann E. MORIN
@ 2017-04-12 18:19       ` Randy Dunlap
  0 siblings, 0 replies; 9+ messages in thread
From: Randy Dunlap @ 2017-04-12 18:19 UTC (permalink / raw)
  To: Yann E. MORIN, Felipe Balbi
  Cc: linux-kbuild, linux-kernel, Greg Kroah-Hartman

On 04/12/17 09:06, Yann E. MORIN wrote:
> Felipe, All,
> 
> On 2017-04-12 10:49 +0300, Felipe Balbi spake thusly:
>>
>> Randy Dunlap <rdunlap@infradead.org> writes:
>>> On 04/11/17 04:12, Felipe Balbi wrote:
>>>> With a growing amount of Kernel configuration, it's
>>>> getting ever more difficult to find anything on
>>>> menuconfig. Because of that, implement mergesort for
>>>> kconfig to make it a little easier for anybody
>>>> building kernels.
>>>
>>> Search works for me, but I don't mind Sort either.
>>

[snip]

> 
> Arguably, the order may also make sense, for example to "group" related
> items. So, <Sort> should be a toggle, so that it is possible to go back
> to the unsorted, original order, IMHO...
> 
>>> Any Help text for Sort?  or is it obvious what it does?  (no)
>> wait, it's not obvious what "Sort" means?
> 
> I guess that what Randy said was that in this context, it is not more
> obvious than Load or Save, and they are documented in the help (but it
> is not obvious how to get the help).

Correct. and true (about how to get to the Help text).

> For example, go on the "General setup" entry, but do not enter the menu.
> Now, select Help: you'll get a bit of help on how to use menuconfig.
> 
> There, Load and Save are documented, in Alternate Configuration Files.
> 
>>> In an 80x25 terminal (window), the < Sort > option wraps around
>>> past column 80.
>> not what I see here [1]
> 
> I see the same as Randy here:
> 
>     $ stty size
>     25 80
> 
>     https://imgur.com/a/ku0sG

For some reason, Felipe's <Select> starts further to the left than mine
or Yann's does.

>>> I haven't looked at the source code (lately), but I think that it
>>> would OK to not have the (extra) spaces inside the <...> brackets.
>>> I.e., instead of
>>>   │        <Select>    < Exit >    < Help >    < Save >    < Load >    < Sort  
>>>    >
>>> just have
>>>   │        <Select>    <Exit>    <Help>    <Save>    <Load>    <Sort>
>>>
>>> Or the <Select> does not need to be indented as much as it is.
>> I changed that for this very reason

I don't see that. Is that part of the patch missing?

> Or just always left-align the line, rather than center it?

OK.


-- 
~Randy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2016-04-22  7:45   ` Felipe Balbi
@ 2016-04-22 17:03     ` Randy Dunlap
  0 siblings, 0 replies; 9+ messages in thread
From: Randy Dunlap @ 2016-04-22 17:03 UTC (permalink / raw)
  To: Felipe Balbi, Felipe Balbi, yann.morin.1998; +Cc: linux-kbuild, linux-kernel

On 04/22/16 00:45, Felipe Balbi wrote:
> 
> Hi,
> 
> Randy Dunlap <rdunlap@infradead.org> writes:
>> On 04/21/16 13:07, Felipe Balbi wrote:
>>> With a growing amount of Kernel configuration, it's
>>> getting ever more difficult to find anything on
>>> menuconfig. Because of that, implement mergesort for
>>> kconfig to make it a little easier for anybody
>>> building kernels.
>>
>> Hi,
>>
>> Please explain the problem and the solution better.  I don't
>> get it.
> 
> it's unclear to me what you don't understand from description above. Try
> to find and enable some random driver on menuconfig. Here's a
> suggestion:
> 
> "Maxim Semiconductor MAX77843 PMIC Support"
> 

yeah, I had no problem with that.  / (Search) works very well, sorted
or not.

Maybe I'm not in your target market.


> In any case, the idea is the following:
> 
> menuconfig has too many options, they are unsorted -> sort them
> 


The addition of < Sort > to the bottom menu items is displayed (partially)
in an 80-column-wide terminal window: (oh, I see, it wraps, still not good)

  ├─────────────────────────────────────────────────────────────────────────┤  
  │        <Select>    < Exit >    < Help >    < Save >    < Load >    < Sort  
   >────────────────────────────────────────────────────────────────────────┘  
    


I still think that you have an inadequate problem statement to justify
the patch.  Nothing against the patch itself.

thanks,
-- 
~Randy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2016-04-21 23:12 ` Randy Dunlap
@ 2016-04-22  7:45   ` Felipe Balbi
  2016-04-22 17:03     ` Randy Dunlap
  0 siblings, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2016-04-22  7:45 UTC (permalink / raw)
  To: Randy Dunlap, Felipe Balbi, yann.morin.1998; +Cc: linux-kbuild, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 746 bytes --]


Hi,

Randy Dunlap <rdunlap@infradead.org> writes:
> On 04/21/16 13:07, Felipe Balbi wrote:
>> With a growing amount of Kernel configuration, it's
>> getting ever more difficult to find anything on
>> menuconfig. Because of that, implement mergesort for
>> kconfig to make it a little easier for anybody
>> building kernels.
>
> Hi,
>
> Please explain the problem and the solution better.  I don't
> get it.

it's unclear to me what you don't understand from description above. Try
to find and enable some random driver on menuconfig. Here's a
suggestion:

"Maxim Semiconductor MAX77843 PMIC Support"

In any case, the idea is the following:

menuconfig has too many options, they are unsorted -> sort them

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] scripts: kconfig: implement a sort method
  2016-04-21 20:07 Felipe Balbi
@ 2016-04-21 23:12 ` Randy Dunlap
  2016-04-22  7:45   ` Felipe Balbi
  0 siblings, 1 reply; 9+ messages in thread
From: Randy Dunlap @ 2016-04-21 23:12 UTC (permalink / raw)
  To: Felipe Balbi, yann.morin.1998
  Cc: linux-kbuild, linux-kernel, balbi, Felipe Balbi

On 04/21/16 13:07, Felipe Balbi wrote:
> With a growing amount of Kernel configuration, it's
> getting ever more difficult to find anything on
> menuconfig. Because of that, implement mergesort for
> kconfig to make it a little easier for anybody
> building kernels.

Hi,

Please explain the problem and the solution better.  I don't
get it.

Thanks.

> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
> ---
> 
> let me know if you folks prefer to turn this into
> default behavior and drop the extra Sort button, I
> didn't wanna be too disruptive by default and, at
> least for now, kept Kconfig as it is and require
> user to either press '.' or move cursor to the Sort
> button and hit ENTER.
> 
> Anyway, give it a go and let me know if anybody sees
> any issues which I might have missed.
> 
>  scripts/kconfig/lxdialog/menubox.c | 18 +++++----
>  scripts/kconfig/mconf.c            | 83 +++++++++++++++++++++++++++++++++++---
>  2 files changed, 89 insertions(+), 12 deletions(-)


-- 
~Randy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] scripts: kconfig: implement a sort method
@ 2016-04-21 20:07 Felipe Balbi
  2016-04-21 23:12 ` Randy Dunlap
  0 siblings, 1 reply; 9+ messages in thread
From: Felipe Balbi @ 2016-04-21 20:07 UTC (permalink / raw)
  To: yann.morin.1998; +Cc: linux-kbuild, linux-kernel, balbi, Felipe Balbi

With a growing amount of Kernel configuration, it's
getting ever more difficult to find anything on
menuconfig. Because of that, implement mergesort for
kconfig to make it a little easier for anybody
building kernels.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
---

let me know if you folks prefer to turn this into
default behavior and drop the extra Sort button, I
didn't wanna be too disruptive by default and, at
least for now, kept Kconfig as it is and require
user to either press '.' or move cursor to the Sort
button and hit ENTER.

Anyway, give it a go and let me know if anybody sees
any issues which I might have missed.

 scripts/kconfig/lxdialog/menubox.c | 18 +++++----
 scripts/kconfig/mconf.c            | 83 +++++++++++++++++++++++++++++++++++---
 2 files changed, 89 insertions(+), 12 deletions(-)

diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c
index 11ae9ad7ac7b..d6cc04db6e60 100644
--- a/scripts/kconfig/lxdialog/menubox.c
+++ b/scripts/kconfig/lxdialog/menubox.c
@@ -162,6 +162,7 @@ static void print_buttons(WINDOW * win, int height, int width, int selected)
 	print_button(win, gettext(" Help "), y, x + 24, selected == 2);
 	print_button(win, gettext(" Save "), y, x + 36, selected == 3);
 	print_button(win, gettext(" Load "), y, x + 48, selected == 4);
+	print_button(win, gettext(" Sort "), y, x + 60, selected == 5);
 
 	wmove(win, y, x + 1 + 12 * selected);
 	wrefresh(win);
@@ -375,7 +376,7 @@ do_resize:
 		case TAB:
 		case KEY_RIGHT:
 			button = ((key == KEY_LEFT ? --button : ++button) < 0)
-			    ? 4 : (button > 4 ? 0 : button);
+			    ? 5 : (button > 5 ? 0 : button);
 
 			print_buttons(dialog, height, width, button);
 			wrefresh(menu);
@@ -390,6 +391,7 @@ do_resize:
 		case '?':
 		case 'z':
 		case '\n':
+		case '.':
 			/* save scroll info */
 			*s_scroll = scroll;
 			delwin(menu);
@@ -400,19 +402,21 @@ do_resize:
 			case 'h':
 			case '?':
 				return 2;
+			case '.':
+				return 5;
 			case 's':
 			case 'y':
-				return 5;
-			case 'n':
 				return 6;
-			case 'm':
+			case 'n':
 				return 7;
-			case ' ':
+			case 'm':
 				return 8;
-			case '/':
+			case ' ':
 				return 9;
-			case 'z':
+			case '/':
 				return 10;
+			case 'z':
+				return 11;
 			case '\n':
 				return button;
 			}
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 315ce2c7cb9d..c4a2eb561be4 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -642,6 +642,75 @@ conf_childs:
 	indent -= doint;
 }
 
+static int less(struct menu *a, struct menu *b)
+{
+	const char *s1 = _(menu_get_prompt(a));
+	const char *s2 = _(menu_get_prompt(b));
+
+	if (!s1)
+		return 1;
+
+	if (!s2)
+		return 0;
+
+	return strcmp(s1, s2) < 0;
+}
+
+static struct menu *merge(struct menu *a, struct menu *b)
+{
+	struct menu head;
+	struct menu *c = &head;
+
+	while (a && b) {
+		if (less(a, b)) {
+			c->next = a;
+			c = a;
+			a = a->next;
+		} else {
+			c->next = b;
+			c = b;
+			b = b->next;
+		}
+	}
+
+	c->next = a ? a : b;
+
+	return head.next;
+}
+
+static struct menu *mergesort(struct menu *c)
+{
+	struct menu *a;
+	struct menu *b;
+
+	if (!c)
+		return c;
+
+	if (c->list)
+		c->list =  mergesort(c->list);
+
+	if (!c->next)
+		return c;
+
+	a = c;
+	b = c->next;
+
+	while (b && b->next) {
+		c = c->next;
+		b = b->next->next;
+	}
+
+	b = c->next;
+	c->next = NULL;
+
+	return merge(mergesort(a), mergesort(b));
+}
+
+static struct menu *sort_conf(void)
+{
+	return mergesort(&rootmenu);
+}
+
 static void conf(struct menu *menu, struct menu *active_menu)
 {
 	struct menu *submenu;
@@ -668,6 +737,7 @@ static void conf(struct menu *menu, struct menu *active_menu)
 		res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
 				  _(menu_instructions),
 				  active_menu, &s_scroll);
+
 		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
 			break;
 		if (item_count() != 0) {
@@ -720,6 +790,9 @@ static void conf(struct menu *menu, struct menu *active_menu)
 			conf_load();
 			break;
 		case 5:
+			sort_conf();
+			break;
+		case 6:
 			if (item_is_tag('t')) {
 				if (sym_set_tristate_value(sym, yes))
 					break;
@@ -727,24 +800,24 @@ static void conf(struct menu *menu, struct menu *active_menu)
 					show_textbox(NULL, setmod_text, 6, 74);
 			}
 			break;
-		case 6:
+		case 7:
 			if (item_is_tag('t'))
 				sym_set_tristate_value(sym, no);
 			break;
-		case 7:
+		case 8:
 			if (item_is_tag('t'))
 				sym_set_tristate_value(sym, mod);
 			break;
-		case 8:
+		case 9:
 			if (item_is_tag('t'))
 				sym_toggle_tristate_value(sym);
 			else if (item_is_tag('m'))
 				conf(submenu, NULL);
 			break;
-		case 9:
+		case 10:
 			search_conf();
 			break;
-		case 10:
+		case 11:
 			show_all_options = !show_all_options;
 			break;
 		}
-- 
2.7.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-04-12 18:19 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-11 11:12 [PATCH] scripts: kconfig: implement a sort method Felipe Balbi
2017-04-11 18:53 ` Randy Dunlap
2017-04-12  7:49   ` Felipe Balbi
2017-04-12 16:06     ` Yann E. MORIN
2017-04-12 18:19       ` Randy Dunlap
  -- strict thread matches above, loose matches on Subject: below --
2016-04-21 20:07 Felipe Balbi
2016-04-21 23:12 ` Randy Dunlap
2016-04-22  7:45   ` Felipe Balbi
2016-04-22 17:03     ` Randy Dunlap

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.