[openwrt/openwrt] cli: add support for partial completion with separator character

LEDE Commits lede-commits at lists.infradead.org
Fri Feb 28 08:36:14 PST 2025


nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/895b4e7cafc8282d7a617fd3e898ad3415f5b6b0

commit 895b4e7cafc8282d7a617fd3e898ad3415f5b6b0
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Mon Feb 24 21:22:52 2025 +0100

    cli: add support for partial completion with separator character
    
    Useful for completing long lists of possible values with common prefix
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 package/utils/cli/files/usr/sbin/cli               |  5 +++-
 .../utils/cli/files/usr/share/ucode/cli/context.uc | 31 +++++++++++++++++++++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/package/utils/cli/files/usr/sbin/cli b/package/utils/cli/files/usr/sbin/cli
index 0a763f2fdb..7d950e6adc 100755
--- a/package/utils/cli/files/usr/sbin/cli
+++ b/package/utils/cli/files/usr/sbin/cli
@@ -311,7 +311,10 @@ function completion(count) {
 				add = "    ";
 			cat = "";
 
-			add += sprintf("%-"+len+"s", entry.name);
+			let name = entry.name;
+			if (entry.incomplete)
+				name += "...";
+			add += sprintf("%-"+len+"s", name);
 			str += add;
 			x += length(add);
 
diff --git a/package/utils/cli/files/usr/share/ucode/cli/context.uc b/package/utils/cli/files/usr/share/ucode/cli/context.uc
index b3f24f77a8..53b5f57047 100644
--- a/package/utils/cli/files/usr/share/ucode/cli/context.uc
+++ b/package/utils/cli/files/usr/share/ucode/cli/context.uc
@@ -355,7 +355,36 @@ function complete_arg_list(e, ctx, arg_info, args, base_args, named_args)
 	for (let i = 0; i <= cur_idx; i++)
 		val = shift(args);
 
-	return complete_param(e, ctx, cur, val, base_args, named_args);
+	let ret = complete_param(e, ctx, cur, val, base_args, named_args);
+	if (!cur.prefix_separator)
+		return ret;
+
+	let prefix_len = length(val);
+	let vals = [];
+	let match_prefix;
+	for (let cur_val in ret.value) {
+		let cur_str = cur_val.name;
+		let cur_suffix = substr(cur_str, prefix_len);
+		let idx = index(cur_suffix, cur.prefix_separator);
+		if (idx < 0) {
+			push(vals, cur_val);
+			continue;
+		}
+
+		let cur_prefix = substr(cur_str, 0, prefix_len + idx + 1);
+		if (cur_prefix == match_prefix)
+			continue;
+
+		match_prefix = cur_prefix;
+		push(vals, {
+			...cur_val,
+			name: cur_prefix,
+			incomplete: true
+		});
+	}
+	ret.value = vals;
+
+	return ret;
 }
 
 function handle_empty_param(entry, spec, name, argv, named_args)




More information about the lede-commits mailing list