diff --git a/share/functions/__fish_cache_sourced_completions.fish b/share/functions/__fish_cache_sourced_completions.fish new file mode 100644 index 000000000..41ba3bea9 --- /dev/null +++ b/share/functions/__fish_cache_sourced_completions.fish @@ -0,0 +1,45 @@ +function __fish_cache_sourced_completions + # Allow a `--name=foo` option which ends up in the filename. + argparse -s name= -- $argv + or return + + set -q argv[1] + or return 1 + + set -l cmd (command -s $argv[1]) + or begin + # If we have no command, we can't get an mtime + # and so we can't cache + # The caller can more easily retry + return 127 + end + + set -l cachedir (__fish_make_cache_dir completions) + or return + + set -l stampfile $cachedir/$argv[1].stamp + set -l compfile $cachedir/$argv[1].fish + + set -l mtime (path mtime -- $cmd) + + set -l cmtime 0 + path is -rf -- $stampfile + and read cmtime < $stampfile + + # If either the timestamp or the completion file don't exist, + # or the mtime differs, we rerun. + # + # That means we'll rerun if the command was up- or downgraded. + if path is -vrf -- $stampfile $compfile || test "$cmtime" -ne "$mtime" 2>/dev/null + $argv > $compfile + # If the command exited unsuccessfully, we assume it didn't work. + or return 2 + echo -- $mtime > $stampfile + end + + if path is -rf -- $compfile + source $compfile + return 0 + end + return 3 +end