aboutsummaryrefslogtreecommitdiff
path: root/.local/share/pass-extensions/treasure.bash
diff options
context:
space:
mode:
Diffstat (limited to '.local/share/pass-extensions/treasure.bash')
-rwxr-xr-x.local/share/pass-extensions/treasure.bash47
1 files changed, 47 insertions, 0 deletions
diff --git a/.local/share/pass-extensions/treasure.bash b/.local/share/pass-extensions/treasure.bash
new file mode 100755
index 0000000..e79ec24
--- /dev/null
+++ b/.local/share/pass-extensions/treasure.bash
@@ -0,0 +1,47 @@
+#!/bin/bash
+TAB="$(printf '\t')"
+
+# TODO: add options:
+# --help to display some help
+# --list to list all the versions of a password
+
+# print error if fzf is not found
+command -v fzf > /dev/null || exec bash -c fzf || exit 1
+
+# load pass source code for accessing internals
+exit() { true ; } # disable exit command
+. "$(command -v pass)" exit # source pass source (bash)
+exit() { command exit ; } # restore exit command
+
+cd "$(pass directory)"
+
+set_git "$PWD/"
+if [ -z "$INNER_GIT_DIR" ] ; then
+ cat << "EOF" >&2
+pass-treasure only works when the password store is tracked under version
+control using git!
+EOF
+fi
+
+# create a list of all files that ever existed in the password store
+# repository, then filter empty lines (created by git log), only show file
+# names ending in .gpg, and sort the list
+repo_files_all="$(\
+ cmd_git log --all --pretty="format:" --name-only --diff-filter=A |\
+ sed '/^$/d' | sed -n '/\.gpg$/p' |\
+ sort)"
+
+IFS="$TAB" read -r date file hash < <(
+ while read -u 3 -r file ; do
+ while IFS="$TAB" read -u 4 -r hash date ; do
+ printf '%s\t%s\t%s\n' "$date" "$file" "$hash"
+ done 4< <(
+ cmd_git log --no-patch --diff-filter=ABCMRTUX --format="format:%H$TAB%ad" \
+ -- "$file"
+ echo
+ )
+ done 3< <( echo "$repo_files_all" ) | fzf --tabstop=4
+)
+
+cmd_git cat-file -p "$hash:$file" | $GPG -d "${GPG_OPTS[@]}" -
+