On Mon, Sep 25, 2023 at 12:47:29AM +0200, Alejandro Colomar wrote:
> Similarly to `pass find --find`, this flag changes the `pass ls` command
> to use find(1) instead of tree(1).
> 
> With this flag, the output is directly usable in a subsequent call to
> `pass show`.
> 
> Examples of use:
> 
>       $ pass find --find kernel \
>         | tail -n -1 \
>         | xargs ./password-store.sh ls --find;
>       www/foss/kernel/
>       www/foss/kernel/smtp/
>       www/foss/kernel/smtp/pass
>       www/foss/kernel/bugzilla/
>       www/foss/kernel/bugzilla/url
>       www/foss/kernel/bugzilla/alx/
>       www/foss/kernel/bugzilla/alx/id
>       www/foss/kernel/bugzilla/alx/pass
> 
>       $ pass find --find kernel \
>         | tail -n -1 \
>         | xargs pass ls --find \
>         | tail -n1 \
>         | xargs pass show;
>       pw
> 
> Signed-off-by: Alejandro Colomar <[email protected]>
> ---
> 
> And here's a patch for pass ls.  These patches apply on top of the
> formatting fixes for the manual page that I sent earlier.
> 
> Cheers,
> Alex
> 
>  man/pass.1            | 15 +++++++++++++++
>  src/password-store.sh | 20 ++++++++++++++------
>  2 files changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/man/pass.1 b/man/pass.1
> index b9764c5..2f4d858 100644
> --- a/man/pass.1
> +++ b/man/pass.1
> @@ -92,6 +92,21 @@ .SH COMMANDS
>  .BR tree (1)
>  program.
>  This command is alternatively named \fBlist\fP.
> +If the
> +.I \-\-find
> +flag is used,
> +.BR find (1)
> +is used instead;
> +this is useful to be able to reuse the output as an input to
> +.IR "pass show" .
> +Here's an example:
> +.IP
> +.in +4n
> +.EX
> +$ pass ls \-\-find foo/bar/ | tail \-n1 | xargs pass show
> +.EE
> +.in
> +.TP

Oops, I accidentally duplicated the .TP.

>  .TP
>  \fBgrep\fP [\fIGREPOPTIONS\fP] \fIsearch-string\fP
>  Searches inside each decrypted password file for \fIsearch-string\fP, and 
> displays line
> diff --git a/src/password-store.sh b/src/password-store.sh
> index bf0e446..966c245 100755
> --- a/src/password-store.sh
> +++ b/src/password-store.sh
> @@ -366,11 +366,12 @@ cmd_init() {
>  }
>  
>  cmd_show() {
> -     local opts selected_line clip=0 qrcode=0
> -     opts="$($GETOPT -o q::c:: -l qrcode::,clip:: -n "$PROGRAM" -- "$@")"
> +     local opts selected_line clip=0 find=0 qrcode=0
> +     opts="$($GETOPT -o q::c:: -l qrcode::,clip::,find -n "$PROGRAM" -- 
> "$@")"
>       local err=$?
>       eval set -- "$opts"
>       while true; do case $1 in
> +             --find) find=1; shift ;;
>               -q|--qrcode) qrcode=1; selected_line="${2:-1}"; shift 2 ;;
>               -c|--clip) clip=1; selected_line="${2:-1}"; shift 2 ;;
>               --) shift; break ;;
> @@ -397,12 +398,19 @@ cmd_show() {
>                       fi
>               fi
>       elif [[ -d $PREFIX/$path ]]; then
> -             if [[ -z $path ]]; then
> -                     echo "Password Store"
> +             if [[ $find -eq 1 ]]; then
> +                     local n="$(echo "$PREFIX" | wc -c)"
> +
> +                     find -L "$PREFIX/$path" | sed '/[^\/]$/s,$,/,' | sed 
> "s/^.\{$n\}//" | sed 's,\.gpg/$,,'
>               else
> -                     echo "${path%\/}"
> +                     if [[ -z $path ]]; then
> +                             echo "Password Store"
> +                     else
> +                             echo "${path%\/}"
> +                     fi
> +
> +                     tree -N -C -l --noreport "$PREFIX/$path" 3>&- | tail -n 
> +2 | sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of 
> line, but keep colors
>               fi
> -             tree -N -C -l --noreport "$PREFIX/$path" 3>&- | tail -n +2 | 
> sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of line, 
> but keep colors
>       elif [[ -z $path ]]; then
>               die "Error: password store is empty. Try \"pass init\"."
>       else
> -- 
> 2.40.1
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to