diff mbox series

[02/36] cli: Add a command to show cmdline history

Message ID 20230919180918.2904313-3-sjg@chromium.org
State Superseded
Delegated to: Tom Rini
Headers show
Series expo: Support editing lines of text | expand

Commit Message

Simon Glass Sept. 19, 2023, 6:08 p.m. UTC
There is a function for this but it is never used. Showing the history is
a useful feature, so add a new 'history' command.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 cmd/Kconfig               |  7 ++++
 cmd/Makefile              |  1 +
 cmd/history.c             | 23 +++++++++++++
 common/cli_readline.c     |  4 +--
 doc/usage/cmd/history.rst | 68 +++++++++++++++++++++++++++++++++++++++
 doc/usage/index.rst       |  1 +
 include/cli.h             |  3 ++
 test/cmd/Makefile         |  1 +
 test/cmd/history.c        | 49 ++++++++++++++++++++++++++++
 9 files changed, 154 insertions(+), 3 deletions(-)
 create mode 100644 cmd/history.c
 create mode 100644 doc/usage/cmd/history.rst
 create mode 100644 test/cmd/history.c
diff mbox series

Patch

diff --git a/cmd/Kconfig b/cmd/Kconfig
index 3f14923b5ef..0f35f7f6ec6 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -176,6 +176,13 @@  config CMD_FWU_METADATA
 	help
 	  Command to read the metadata and dump it's contents
 
+config CMD_HISTORY
+	bool "history"
+	depends on CMDLINE_EDITING
+	help
+	  Show the command-line history, i.e. a list of commands that are in
+	  the history buffer.
+
 config CMD_LICENSE
 	bool "license"
 	select BUILD_BIN2C
diff --git a/cmd/Makefile b/cmd/Makefile
index 9bebf321c39..971f78a7fbd 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -91,6 +91,7 @@  obj-$(CONFIG_CMD_FUSE) += fuse.o
 obj-$(CONFIG_CMD_FWU_METADATA) += fwu_mdata.o
 obj-$(CONFIG_CMD_GETTIME) += gettime.o
 obj-$(CONFIG_CMD_GPIO) += gpio.o
+obj-$(CONFIG_CMD_HISTORY) += history.o
 obj-$(CONFIG_CMD_HVC) += smccc.o
 obj-$(CONFIG_CMD_I2C) += i2c.o
 obj-$(CONFIG_CMD_IOTRACE) += iotrace.o
diff --git a/cmd/history.c b/cmd/history.c
new file mode 100644
index 00000000000..b6bf4670b1c
--- /dev/null
+++ b/cmd/history.c
@@ -0,0 +1,23 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2023 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <command.h>
+#include <cli.h>
+
+static int do_history(struct cmd_tbl *cmdtp, int flag, int argc,
+		      char *const argv[])
+{
+	cread_print_hist_list();
+
+	return 0;
+}
+
+U_BOOT_CMD(
+	history,	CONFIG_SYS_MAXARGS,	1,	do_history,
+	"print command history",
+	""
+);
diff --git a/common/cli_readline.c b/common/cli_readline.c
index 9a7c268719d..f3ba76a62ec 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -160,8 +160,7 @@  static char *hist_next(void)
 	return ret;
 }
 
-#ifndef CONFIG_CMDLINE_EDITING
-static void cread_print_hist_list(void)
+void cread_print_hist_list(void)
 {
 	int i;
 	unsigned long n;
@@ -179,7 +178,6 @@  static void cread_print_hist_list(void)
 		i++;
 	}
 }
-#endif /* CONFIG_CMDLINE_EDITING */
 
 #define BEGINNING_OF_LINE() {			\
 	while (num) {				\
diff --git a/doc/usage/cmd/history.rst b/doc/usage/cmd/history.rst
new file mode 100644
index 00000000000..7d5a87babb2
--- /dev/null
+++ b/doc/usage/cmd/history.rst
@@ -0,0 +1,68 @@ 
+.. SPDX-License-Identifier: GPL-2.0+:
+
+history command
+===============
+
+Synopis
+-------
+
+::
+
+    history
+
+Description
+-----------
+
+The *history* command shows a list of previously entered commands on the
+command line. When U-Boot starts, this it is initially empty. Each new command
+entered is added to the list.
+
+Normally these commands can be accessed by pressing the `up arrow` and
+`down arrow` keys, which cycle through the list. The `history` command provides
+a simple way to view the list.
+
+Example
+-------
+
+This example shows entering three commands, then `history`. Note that `history`
+itself is added to the list.
+
+::
+
+    => bootflow scan -l
+    Scanning for bootflows in all bootdevs
+    Seq  Method       State   Uclass    Part  Name                      Filename
+    ---  -----------  ------  --------  ----  ------------------------  ----------------
+    Scanning global bootmeth 'firmware0':
+    Hunting with: simple_bus
+    Found 2 extension board(s).
+    Scanning bootdev 'mmc2.bootdev':
+    Scanning bootdev 'mmc1.bootdev':
+      0  extlinux     ready   mmc          1  mmc1.bootdev.part_1       /extlinux/extlinux.conf
+    No more bootdevs
+    ---  -----------  ------  --------  ----  ------------------------  ----------------
+    (1 bootflow, 1 valid)
+    => bootflow select 0
+    => bootflow info
+    Name:      mmc1.bootdev.part_1
+    Device:    mmc1.bootdev
+    Block dev: mmc1.blk
+    Method:    extlinux
+    State:     ready
+    Partition: 1
+    Subdir:    (none)
+    Filename:  /extlinux/extlinux.conf
+    Buffer:    aebdea0
+    Size:      253 (595 bytes)
+    OS:        Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)
+    Cmdline:   (none)
+    Logo:      (none)
+    FDT:       <NULL>
+    Error:     0
+    => history
+    bootflow scan -l
+    bootflow select 0
+    bootflow info
+    history
+    =>
+
diff --git a/doc/usage/index.rst b/doc/usage/index.rst
index fa702920faa..98b4719c408 100644
--- a/doc/usage/index.rst
+++ b/doc/usage/index.rst
@@ -67,6 +67,7 @@  Shell commands
    cmd/fwu_mdata
    cmd/gpio
    cmd/gpt
+   cmd/history
    cmd/host
    cmd/imxtract
    cmd/load
diff --git a/include/cli.h b/include/cli.h
index 094a6602d70..ac09c80c784 100644
--- a/include/cli.h
+++ b/include/cli.h
@@ -229,4 +229,7 @@  void cli_ch_init(struct cli_ch_state *cch);
  */
 int cli_ch_process(struct cli_ch_state *cch, int ichar);
 
+/** cread_print_hist_list() - Print the command-line history list */
+void cread_print_hist_list(void);
+
 #endif
diff --git a/test/cmd/Makefile b/test/cmd/Makefile
index 6e3d7e919ef..8d70ac510a5 100644
--- a/test/cmd/Makefile
+++ b/test/cmd/Makefile
@@ -14,6 +14,7 @@  obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o
 obj-$(CONFIG_CMD_BDI) += bdinfo.o
 obj-$(CONFIG_CMD_FDT) += fdt.o
 obj-$(CONFIG_CONSOLE_TRUETYPE) += font.o
+obj-$(CONFIG_CMD_HISTORY) += history.o
 obj-$(CONFIG_CMD_LOADM) += loadm.o
 obj-$(CONFIG_CMD_MEM_SEARCH) += mem_search.o
 ifdef CONFIG_CMD_PCI
diff --git a/test/cmd/history.c b/test/cmd/history.c
new file mode 100644
index 00000000000..06517fcdbb5
--- /dev/null
+++ b/test/cmd/history.c
@@ -0,0 +1,49 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for history command
+ *
+ * Copyright 2023 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <cli.h>
+#include <command.h>
+#include <test/lib.h>
+#include <test/test.h>
+#include <test/ut.h>
+
+static int lib_test_history(struct unit_test_state *uts)
+{
+	static const char cmd1[] = "setenv fred hello";
+	static const char cmd2[] = "print fred";
+
+	/* running commands directly does not add to history */
+	ut_assertok(run_command(cmd1, 0));
+	ut_assert_console_end();
+	ut_assertok(run_command("history", 0));
+	ut_assert_console_end();
+
+	/* enter commands via the console */
+	console_in_puts(cmd1);
+	console_in_puts("\n");
+	ut_asserteq(strlen(cmd1), cli_readline(""));
+	ut_assert_nextline(cmd1);
+
+	console_in_puts(cmd2);
+	console_in_puts("\n");
+	ut_asserteq(strlen(cmd2), cli_readline(""));
+	ut_assert_nextline(cmd2);
+
+	ut_assertok(run_command("print fred", 0));
+	ut_assert_nextline("fred=hello");
+	ut_assert_console_end();
+
+	ut_assertok(run_command("history", 0));
+	ut_assert_nextline(cmd1);
+	ut_assert_nextline(cmd2);
+	ut_assert_console_end();
+
+	return 0;
+}
+LIB_TEST(lib_test_history, UT_TESTF_CONSOLE_REC);