Hi Guys

I really like pass, but a feature that I'm missing is to quickly fetch a
password if I have a nested structure. For example, I have my passwords
sorted into a lot of subfolders. Now usually the password file's name is
still unique, but nested somewhere deep.

So I've hacked up an extension for the "show" command that allows
searching for a password file within the tree structure. The attached
patch allows for matching anywhere inside the path to the file using Awk.

Please have a look and let me know what you think. Note that I'm not
really a shell dev, so this may still be quite buggy..


Best,
David

-- 
Adfinis SyGroup AG     | David Vogt, Bereichsleiter Software-Entwicklung
Keltenstrasse 98       | CH-3018 Bern

PGP ID 23F1F230 | Tel. +41 (0) 31 550 31 11 | Direct +41 (0)31 550 31 12
PGP fingerprint : 4E62 977E BA2C EC6A 8346  127B FDC9 6CFA 23F1 F230
From 2725b5dbb3caf939a1baa3c9a433fabb05926200 Mon Sep 17 00:00:00 2001
From: David Vogt <[email protected]>
Date: Mon, 28 Sep 2015 10:20:38 +0200
Subject: [PATCH] Implement fuzzy finding for the "show" subcommand.

If you pass in "-z" or --fuzzy as a parameter to "show", you can
match any file in your password store instead of having to pass
the whole path. This may be more convenient than tab-completing.
---
 src/password-store.sh | 41 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/password-store.sh b/src/password-store.sh
index d535a74..a4660e2 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -223,9 +223,12 @@ cmd_usage() {
 	        List passwords.
 	    $PROGRAM find pass-names...
 	    	List passwords that match pass-names.
-	    $PROGRAM [show] [--clip,-c] pass-name
+	    $PROGRAM [show] [--clip,-c] [--fuzzy,-z] pass-name
 	        Show existing password and optionally put it on the clipboard.
 	        If put on the clipboard, it will be cleared in $CLIP_TIME seconds.
+	        If -z or --fuzzy is given, the pass-name will be searched for,
+	        so instead of passing in 'foo/bar/baz', you can just give 'baz'
+	        (provided that 'baz' is unique).
 	    $PROGRAM grep search-string
 	        Search for password files containing search-string when decrypted.
 	    $PROGRAM insert [--echo,-e | --multiline,-m] [--force,-f] pass-name
@@ -257,6 +260,28 @@ cmd_usage() {
 	_EOF
 }
 
+find_fuzzy_if() {
+	local path="$1"
+	local fuzzy="$2"
+
+	if [[ -z "$path" ]]; then
+		return
+	fi
+
+	if [[ "$fuzzy" -ne 1 ]]; then
+		echo "$path"
+		return
+	fi
+
+	echo "Fuzzy matching *$1*" >&2
+	(
+		cd "$PREFIX"
+		find . -path ./.git -prune -o -type f \
+			| awk "/$path/ "'{ $file=substr($0, 3, length($0)-6); print $file }'
+	)
+	exit
+}
+
 cmd_init() {
 	local opts id_path=""
 	opts="$($GETOPT -o p: -l path: -n "$PROGRAM" -- "$@")"
@@ -294,18 +319,20 @@ cmd_init() {
 }
 
 cmd_show() {
-	local opts clip=0
-	opts="$($GETOPT -o c -l clip -n "$PROGRAM" -- "$@")"
+	local opts fuzzy=0 clip=0
+	opts="$($GETOPT -o c,z -l clip,fuzzy -n "$PROGRAM" -- "$@")"
 	local err=$?
 	eval set -- "$opts"
-	while true; do case $1 in
-		-c|--clip) clip=1; shift ;;
+	while true; do case "$1" in
+		-c|--clip)  clip=1;  shift; ;;
+		-z|--fuzzy) fuzzy=1; shift; ;;
 		--) shift; break ;;
 	esac done
 
-	[[ $err -ne 0 ]] && die "Usage: $PROGRAM $COMMAND [--clip,-c] [pass-name]"
+	[[ $err -ne 0 ]] && die "Usage: $PROGRAM $COMMAND [--clip,-c] [--fuzzy,-z] [pass-name]"
+
+	local path="$(find_fuzzy_if "$1" $fuzzy)"
 
-	local path="$1"
 	local passfile="$PREFIX/$path.gpg"
 	check_sneaky_paths "$path"
 	if [[ -f $passfile ]]; then
-- 
2.5.2

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Password-Store mailing list
[email protected]
http://lists.zx2c4.com/mailman/listinfo/password-store

Reply via email to