fpf-cli 1.6.40 → 1.6.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +2 -0
  2. package/fpf +149 -19
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -102,6 +102,8 @@ Installed packages are marked with `*` in the result list.
102
102
  - Set `FPF_LOADING_INDICATOR=0` to disable the pre-search loading indicator.
103
103
  - `FPF_RELOAD_MIN_CHARS`: minimum query length before live reload (default `2`)
104
104
  - `FPF_RELOAD_DEBOUNCE`: reload debounce seconds (default `0.12`)
105
+ - `FPF_DYNAMIC_RELOAD_BYPASS_QUERY_CACHE=1`: force uncached reload queries (legacy behavior); default `0` uses query cache during reloads
106
+ - `FPF_SEARCH_CATALOG_ASYNC_PREWARM`: async warmup for `apt`/`brew` catalog caches during interactive reload/search paths (default `1`, set `0` for synchronous legacy behavior)
105
107
  - `FPF_ENABLE_QUERY_CACHE`: `auto` (default), `1`, or `0` (`auto` enables query cache for `apt`, `brew`, `pacman`, and `bun`)
106
108
  - `FPF_QUERY_CACHE_TTL`: default query-cache TTL seconds for heavy manager caches (default `300`)
107
109
  - `FPF_APT_QUERY_CACHE_TTL`, `FPF_BREW_QUERY_CACHE_TTL`, `FPF_PACMAN_QUERY_CACHE_TTL`: per-manager query-cache TTL overrides
package/fpf CHANGED
@@ -3,7 +3,7 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_NAME="fpf"
6
- SCRIPT_VERSION="1.6.40"
6
+ SCRIPT_VERSION="1.6.42"
7
7
  TMP_ROOT="${TMPDIR:-/tmp}/fpf"
8
8
  SESSION_TMP_ROOT=""
9
9
  HELP_FILE=""
@@ -80,6 +80,22 @@ query_cache_ttl_seconds_for_manager() {
80
80
  printf "%s" "${manager_ttl}"
81
81
  }
82
82
 
83
+ dynamic_reload_query_cache_bypass_value() {
84
+ local bypass_setting="${FPF_DYNAMIC_RELOAD_BYPASS_QUERY_CACHE:-0}"
85
+
86
+ bypass_setting="$(trim_whitespace "${bypass_setting}")"
87
+ bypass_setting="$(printf "%s" "${bypass_setting}" | tr '[:upper:]' '[:lower:]')"
88
+
89
+ case "${bypass_setting}" in
90
+ 1|true|yes|on)
91
+ printf "1"
92
+ ;;
93
+ *)
94
+ printf "0"
95
+ ;;
96
+ esac
97
+ }
98
+
83
99
  log() {
84
100
  printf "%s\n" "$*" >&2
85
101
  }
@@ -1021,6 +1037,110 @@ build_brew_catalog_entries() {
1021
1037
  awk -F'\t' '!seen[$1]++'
1022
1038
  }
1023
1039
 
1040
+ build_search_catalog_entries_for_manager() {
1041
+ local manager="$1"
1042
+
1043
+ case "${manager}" in
1044
+ apt)
1045
+ build_apt_catalog_entries
1046
+ ;;
1047
+ brew)
1048
+ build_brew_catalog_entries
1049
+ ;;
1050
+ *)
1051
+ return 1
1052
+ ;;
1053
+ esac
1054
+ }
1055
+
1056
+ search_catalog_async_prewarm_enabled() {
1057
+ local setting="${FPF_SEARCH_CATALOG_ASYNC_PREWARM:-1}"
1058
+
1059
+ if [[ -z "${FPF_SEARCH_CATALOG_ASYNC_PREWARM+x}" && -n "${FPF_TEST_LOG:-}" ]]; then
1060
+ return 1
1061
+ fi
1062
+
1063
+ setting="$(trim_whitespace "${setting}")"
1064
+ setting="$(printf "%s" "${setting}" | tr '[:upper:]' '[:lower:]')"
1065
+
1066
+ case "${setting}" in
1067
+ 0|false|no|off)
1068
+ return 1
1069
+ ;;
1070
+ esac
1071
+
1072
+ case "${ACTION}" in
1073
+ search)
1074
+ return 0
1075
+ ;;
1076
+ feed-search)
1077
+ case "${FPF_SKIP_INSTALLED_MARKERS:-0}" in
1078
+ 1|true|yes|on)
1079
+ return 0
1080
+ ;;
1081
+ esac
1082
+ ;;
1083
+ esac
1084
+
1085
+ return 1
1086
+ }
1087
+
1088
+ search_catalog_prewarm_lock_dir() {
1089
+ local manager="$1"
1090
+ printf "%s/state/search-catalog/%s.lock" "${CACHE_ROOT}" "${manager}"
1091
+ }
1092
+
1093
+ run_search_catalog_prewarm_worker() {
1094
+ local manager="$1"
1095
+ local output_tmp
1096
+ local cache_fingerprint_value
1097
+ local cache_key
1098
+
1099
+ output_tmp="$(mktemp "${SESSION_TMP_ROOT}/search-catalog-prewarm.XXXXXX")"
1100
+ build_search_catalog_entries_for_manager "${manager}" >"${output_tmp}" || true
1101
+
1102
+ if [[ -s "${output_tmp}" ]]; then
1103
+ cache_fingerprint_value="$(cache_search_catalog_fingerprint "${manager}")"
1104
+ cache_key="$(cache_search_catalog_key "${manager}" "${cache_fingerprint_value}")"
1105
+ cache_store_key_from_file "${cache_key}" "${cache_fingerprint_value}" "${output_tmp}"
1106
+ fi
1107
+
1108
+ rm -f "${output_tmp}"
1109
+ }
1110
+
1111
+ start_search_catalog_prewarm_async() {
1112
+ local manager="$1"
1113
+ local lock_dir
1114
+
1115
+ search_catalog_async_prewarm_enabled || return 0
1116
+ case "${manager}" in
1117
+ apt|brew)
1118
+ ;;
1119
+ *)
1120
+ return 0
1121
+ ;;
1122
+ esac
1123
+
1124
+ initialize_cache_root
1125
+ lock_dir="$(search_catalog_prewarm_lock_dir "${manager}")"
1126
+ mkdir -p "$(dirname "${lock_dir}")"
1127
+
1128
+ if ! mkdir "${lock_dir}" 2>/dev/null; then
1129
+ return 0
1130
+ fi
1131
+
1132
+ if [[ -n "${FPF_TEST_LOG:-}" ]]; then
1133
+ run_search_catalog_prewarm_worker "${manager}" || true
1134
+ rmdir "${lock_dir}" >/dev/null 2>&1 || true
1135
+ return 0
1136
+ fi
1137
+
1138
+ (
1139
+ run_search_catalog_prewarm_worker "${manager}" || true
1140
+ rmdir "${lock_dir}" >/dev/null 2>&1 || true
1141
+ ) >/dev/null 2>&1 &
1142
+ }
1143
+
1024
1144
  ensure_search_catalog_cache() {
1025
1145
  local manager="$1"
1026
1146
  local cache_fingerprint_value
@@ -1040,18 +1160,7 @@ ensure_search_catalog_cache() {
1040
1160
 
1041
1161
  output_tmp="$(mktemp "${SESSION_TMP_ROOT}/search-catalog.XXXXXX")"
1042
1162
 
1043
- case "${manager}" in
1044
- apt)
1045
- build_apt_catalog_entries >"${output_tmp}" || true
1046
- ;;
1047
- brew)
1048
- build_brew_catalog_entries >"${output_tmp}" || true
1049
- ;;
1050
- *)
1051
- rm -f "${output_tmp}"
1052
- return 1
1053
- ;;
1054
- esac
1163
+ build_search_catalog_entries_for_manager "${manager}" >"${output_tmp}" || true
1055
1164
 
1056
1165
  if [[ -s "${output_tmp}" ]]; then
1057
1166
  cache_store_key_from_file "${cache_key}" "${cache_fingerprint_value}" "${output_tmp}"
@@ -2372,7 +2481,13 @@ manager_search_entries_uncached() {
2372
2481
 
2373
2482
  case "${manager}" in
2374
2483
  apt)
2375
- if ensure_search_catalog_cache "${manager}"; then
2484
+ if search_entries_from_catalog_cache "${manager}" "${effective_query}"; then
2485
+ :
2486
+ elif search_catalog_async_prewarm_enabled; then
2487
+ start_search_catalog_prewarm_async "${manager}"
2488
+ apt-cache search -- "${effective_query}" 2>/dev/null |
2489
+ awk -F' - ' '{ name=$1; desc=$2; gsub(/^[[:space:]]+|[[:space:]]+$/, "", name); if (desc == "") desc="-"; print name "\t" desc }'
2490
+ elif ensure_search_catalog_cache "${manager}"; then
2376
2491
  search_entries_from_catalog_cache "${manager}" "${effective_query}" || true
2377
2492
  else
2378
2493
  apt-cache search -- "${effective_query}" 2>/dev/null |
@@ -2434,7 +2549,16 @@ manager_search_entries_uncached() {
2434
2549
  '
2435
2550
  ;;
2436
2551
  brew)
2437
- if ensure_search_catalog_cache "${manager}"; then
2552
+ if search_entries_from_catalog_cache "${manager}" "${effective_query}"; then
2553
+ exact_match_entry "${manager}" "${query}"
2554
+ elif search_catalog_async_prewarm_enabled; then
2555
+ start_search_catalog_prewarm_async "${manager}"
2556
+ {
2557
+ brew search "${effective_query}" 2>/dev/null |
2558
+ awk 'NF >= 1 { print $1 "\t-" }'
2559
+ exact_match_entry "${manager}" "${query}"
2560
+ }
2561
+ elif ensure_search_catalog_cache "${manager}"; then
2438
2562
  {
2439
2563
  search_entries_from_catalog_cache "${manager}" "${effective_query}" || true
2440
2564
  exact_match_entry "${manager}" "${query}"
@@ -3191,6 +3315,7 @@ build_dynamic_reload_command() {
3191
3315
  local script_path="${BASH_SOURCE[0]}"
3192
3316
  local min_chars="${FPF_RELOAD_MIN_CHARS:-2}"
3193
3317
  local reload_debounce="${FPF_RELOAD_DEBOUNCE:-0.12}"
3318
+ local bypass_query_cache="1"
3194
3319
 
3195
3320
  if ! [[ "${min_chars}" =~ ^[0-9]+$ ]]; then
3196
3321
  min_chars=2
@@ -3200,14 +3325,16 @@ build_dynamic_reload_command() {
3200
3325
  reload_debounce=0.12
3201
3326
  fi
3202
3327
 
3328
+ bypass_query_cache="$(dynamic_reload_query_cache_bypass_value)"
3329
+
3203
3330
  if [[ "${script_path}" != /* ]]; then
3204
3331
  script_path="$(pwd)/${script_path}"
3205
3332
  fi
3206
3333
 
3207
3334
  if [[ -n "${manager_override}" ]]; then
3208
- printf 'q={q}; if [ ${#q} -lt %s ]; then cat %q; else sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=1 FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --feed-search --manager %q -- "$q" 2>/dev/null || cat %q; fi' "${min_chars}" "${fallback_file}" "${reload_debounce}" "${manager_override}" "${fallback_file}" "${script_path}" "${manager_override}" "${fallback_file}"
3335
+ printf 'q={q}; if [ ${#q} -lt %s ]; then cat %q; else sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --feed-search --manager %q -- "$q" 2>/dev/null || cat %q; fi' "${min_chars}" "${fallback_file}" "${reload_debounce}" "${bypass_query_cache}" "${manager_override}" "${fallback_file}" "${script_path}" "${manager_override}" "${fallback_file}"
3209
3336
  else
3210
- printf 'q={q}; if [ ${#q} -lt %s ]; then cat %q; else sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=1 FPF_IPC_MANAGER_OVERRIDE= FPF_IPC_FALLBACK_FILE=%q %q --feed-search -- "$q" 2>/dev/null || cat %q; fi' "${min_chars}" "${fallback_file}" "${reload_debounce}" "${fallback_file}" "${script_path}" "${fallback_file}"
3337
+ printf 'q={q}; if [ ${#q} -lt %s ]; then cat %q; else sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE= FPF_IPC_FALLBACK_FILE=%q %q --feed-search -- "$q" 2>/dev/null || cat %q; fi' "${min_chars}" "${fallback_file}" "${reload_debounce}" "${bypass_query_cache}" "${fallback_file}" "${script_path}" "${fallback_file}"
3211
3338
  fi
3212
3339
  }
3213
3340
 
@@ -3218,6 +3345,7 @@ build_dynamic_reload_command_for_query() {
3218
3345
  local script_path="${BASH_SOURCE[0]}"
3219
3346
  local min_chars="${FPF_RELOAD_MIN_CHARS:-2}"
3220
3347
  local reload_debounce="${FPF_RELOAD_DEBOUNCE:-0.12}"
3348
+ local bypass_query_cache="1"
3221
3349
 
3222
3350
  if ! [[ "${min_chars}" =~ ^[0-9]+$ ]]; then
3223
3351
  min_chars=2
@@ -3227,6 +3355,8 @@ build_dynamic_reload_command_for_query() {
3227
3355
  reload_debounce=0.12
3228
3356
  fi
3229
3357
 
3358
+ bypass_query_cache="$(dynamic_reload_query_cache_bypass_value)"
3359
+
3230
3360
  if [[ "${script_path}" != /* ]]; then
3231
3361
  script_path="$(pwd)/${script_path}"
3232
3362
  fi
@@ -3237,9 +3367,9 @@ build_dynamic_reload_command_for_query() {
3237
3367
  fi
3238
3368
 
3239
3369
  if [[ -n "${manager_override}" ]]; then
3240
- printf 'sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=1 FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --feed-search --manager %q -- %q 2>/dev/null || cat %q' "${reload_debounce}" "${manager_override}" "${fallback_file}" "${script_path}" "${manager_override}" "${query_value}" "${fallback_file}"
3370
+ printf 'sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE=%q FPF_IPC_FALLBACK_FILE=%q %q --feed-search --manager %q -- %q 2>/dev/null || cat %q' "${reload_debounce}" "${bypass_query_cache}" "${manager_override}" "${fallback_file}" "${script_path}" "${manager_override}" "${query_value}" "${fallback_file}"
3241
3371
  else
3242
- printf 'sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=1 FPF_IPC_MANAGER_OVERRIDE= FPF_IPC_FALLBACK_FILE=%q %q --feed-search -- %q 2>/dev/null || cat %q' "${reload_debounce}" "${fallback_file}" "${script_path}" "${query_value}" "${fallback_file}"
3372
+ printf 'sleep %s; FPF_SKIP_INSTALLED_MARKERS=1 FPF_BYPASS_QUERY_CACHE=%s FPF_IPC_MANAGER_OVERRIDE= FPF_IPC_FALLBACK_FILE=%q %q --feed-search -- %q 2>/dev/null || cat %q' "${reload_debounce}" "${bypass_query_cache}" "${fallback_file}" "${script_path}" "${query_value}" "${fallback_file}"
3243
3373
  fi
3244
3374
  }
3245
3375
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.6.40",
3
+ "version": "1.6.42",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"