fpf-cli 1.6.41 → 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 +1 -0
  2. package/fpf +123 -15
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -103,6 +103,7 @@ Installed packages are marked with `*` in the result list.
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
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)
106
107
  - `FPF_ENABLE_QUERY_CACHE`: `auto` (default), `1`, or `0` (`auto` enables query cache for `apt`, `brew`, `pacman`, and `bun`)
107
108
  - `FPF_QUERY_CACHE_TTL`: default query-cache TTL seconds for heavy manager caches (default `300`)
108
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.41"
6
+ SCRIPT_VERSION="1.6.42"
7
7
  TMP_ROOT="${TMPDIR:-/tmp}/fpf"
8
8
  SESSION_TMP_ROOT=""
9
9
  HELP_FILE=""
@@ -1037,6 +1037,110 @@ build_brew_catalog_entries() {
1037
1037
  awk -F'\t' '!seen[$1]++'
1038
1038
  }
1039
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
+
1040
1144
  ensure_search_catalog_cache() {
1041
1145
  local manager="$1"
1042
1146
  local cache_fingerprint_value
@@ -1056,18 +1160,7 @@ ensure_search_catalog_cache() {
1056
1160
 
1057
1161
  output_tmp="$(mktemp "${SESSION_TMP_ROOT}/search-catalog.XXXXXX")"
1058
1162
 
1059
- case "${manager}" in
1060
- apt)
1061
- build_apt_catalog_entries >"${output_tmp}" || true
1062
- ;;
1063
- brew)
1064
- build_brew_catalog_entries >"${output_tmp}" || true
1065
- ;;
1066
- *)
1067
- rm -f "${output_tmp}"
1068
- return 1
1069
- ;;
1070
- esac
1163
+ build_search_catalog_entries_for_manager "${manager}" >"${output_tmp}" || true
1071
1164
 
1072
1165
  if [[ -s "${output_tmp}" ]]; then
1073
1166
  cache_store_key_from_file "${cache_key}" "${cache_fingerprint_value}" "${output_tmp}"
@@ -2388,7 +2481,13 @@ manager_search_entries_uncached() {
2388
2481
 
2389
2482
  case "${manager}" in
2390
2483
  apt)
2391
- 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
2392
2491
  search_entries_from_catalog_cache "${manager}" "${effective_query}" || true
2393
2492
  else
2394
2493
  apt-cache search -- "${effective_query}" 2>/dev/null |
@@ -2450,7 +2549,16 @@ manager_search_entries_uncached() {
2450
2549
  '
2451
2550
  ;;
2452
2551
  brew)
2453
- 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
2454
2562
  {
2455
2563
  search_entries_from_catalog_cache "${manager}" "${effective_query}" || true
2456
2564
  exact_match_entry "${manager}" "${query}"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.6.41",
3
+ "version": "1.6.42",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"