fpf-cli 1.6.33 → 1.6.35
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.
- package/README.md +1 -0
- package/fpf +144 -44
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -98,6 +98,7 @@ Installed packages are marked with `*` in the result list.
|
|
|
98
98
|
- `FPF_DYNAMIC_RELOAD`: `always` (default), `single`, or `never`
|
|
99
99
|
- Live reload uses `change:reload` by default for reliability (`ctrl-r` uses the same reload command).
|
|
100
100
|
- Set `FPF_DYNAMIC_RELOAD_TRANSPORT=ipc` to opt into `--listen` + IPC query notifications on supported `fzf` builds.
|
|
101
|
+
- Set `FPF_LOADING_INDICATOR=0` to disable the pre-search loading spinner.
|
|
101
102
|
- `FPF_RELOAD_MIN_CHARS`: minimum query length before live reload (default `2`)
|
|
102
103
|
- `FPF_RELOAD_DEBOUNCE`: reload debounce seconds (default `0.12`)
|
|
103
104
|
- `FPF_DISABLE_INSTALLED_CACHE=1` disables installed-package marker cache
|
package/fpf
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
|
|
5
5
|
SCRIPT_NAME="fpf"
|
|
6
|
-
SCRIPT_VERSION="1.6.
|
|
6
|
+
SCRIPT_VERSION="1.6.35"
|
|
7
7
|
TMP_ROOT="${TMPDIR:-/tmp}/fpf"
|
|
8
8
|
SESSION_TMP_ROOT=""
|
|
9
9
|
HELP_FILE=""
|
|
10
10
|
KBINDS_FILE=""
|
|
11
11
|
CACHE_FORMAT_VERSION="1"
|
|
12
12
|
CACHE_ROOT=""
|
|
13
|
+
LOADING_INDICATOR_PID=""
|
|
13
14
|
|
|
14
15
|
ACTION="search"
|
|
15
16
|
MANAGER_OVERRIDE=""
|
|
@@ -27,6 +28,72 @@ log() {
|
|
|
27
28
|
printf "%s\n" "$*" >&2
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
loading_indicator_enabled() {
|
|
32
|
+
local indicator_setting=""
|
|
33
|
+
|
|
34
|
+
indicator_setting="$(trim_whitespace "${FPF_LOADING_INDICATOR:-1}")"
|
|
35
|
+
indicator_setting="$(printf "%s" "${indicator_setting}" | tr '[:upper:]' '[:lower:]')"
|
|
36
|
+
|
|
37
|
+
case "${indicator_setting}" in
|
|
38
|
+
0|false|no|off)
|
|
39
|
+
return 1
|
|
40
|
+
;;
|
|
41
|
+
esac
|
|
42
|
+
|
|
43
|
+
[[ -t 2 ]]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
start_loading_indicator() {
|
|
47
|
+
local message="${1:-Loading}"
|
|
48
|
+
|
|
49
|
+
if [[ -n "${LOADING_INDICATOR_PID}" ]]; then
|
|
50
|
+
stop_loading_indicator
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
loading_indicator_enabled || return 0
|
|
54
|
+
|
|
55
|
+
(
|
|
56
|
+
trap 'exit 0' TERM INT
|
|
57
|
+
local frames='|/-\'
|
|
58
|
+
local frame_index=0
|
|
59
|
+
while true; do
|
|
60
|
+
printf "\r\033[2K%s [%s]" "${message}" "${frames:frame_index:1}" >&2
|
|
61
|
+
frame_index=$(((frame_index + 1) % 4))
|
|
62
|
+
sleep 0.1
|
|
63
|
+
done
|
|
64
|
+
) &
|
|
65
|
+
LOADING_INDICATOR_PID="$!"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
stop_loading_indicator() {
|
|
69
|
+
if [[ -z "${LOADING_INDICATOR_PID}" ]]; then
|
|
70
|
+
return 0
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
kill "${LOADING_INDICATOR_PID}" >/dev/null 2>&1 || true
|
|
74
|
+
wait "${LOADING_INDICATOR_PID}" >/dev/null 2>&1 || true
|
|
75
|
+
LOADING_INDICATOR_PID=""
|
|
76
|
+
|
|
77
|
+
if loading_indicator_enabled; then
|
|
78
|
+
printf "\r\033[2K" >&2
|
|
79
|
+
fi
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
run_with_loading_indicator() {
|
|
83
|
+
local message="$1"
|
|
84
|
+
shift
|
|
85
|
+
|
|
86
|
+
start_loading_indicator "${message}"
|
|
87
|
+
if "$@"; then
|
|
88
|
+
stop_loading_indicator
|
|
89
|
+
return 0
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
local status="$?"
|
|
93
|
+
stop_loading_indicator
|
|
94
|
+
return "${status}"
|
|
95
|
+
}
|
|
96
|
+
|
|
30
97
|
die() {
|
|
31
98
|
log "Error: $*"
|
|
32
99
|
exit 1
|
|
@@ -861,6 +928,8 @@ run_preview_item_action() {
|
|
|
861
928
|
}
|
|
862
929
|
|
|
863
930
|
cleanup_session_tmp_root() {
|
|
931
|
+
stop_loading_indicator
|
|
932
|
+
|
|
864
933
|
if [[ -n "${SESSION_TMP_ROOT}" && -d "${SESSION_TMP_ROOT}" ]]; then
|
|
865
934
|
rm -rf "${SESSION_TMP_ROOT}"
|
|
866
935
|
fi
|
|
@@ -1339,7 +1408,27 @@ ensure_fzf() {
|
|
|
1339
1408
|
}
|
|
1340
1409
|
|
|
1341
1410
|
normalize_manager() {
|
|
1342
|
-
|
|
1411
|
+
local manager="$1"
|
|
1412
|
+
|
|
1413
|
+
manager="$(trim_whitespace "${manager}")"
|
|
1414
|
+
manager="$(printf "%s" "${manager}" | tr '[:upper:]' '[:lower:]')"
|
|
1415
|
+
|
|
1416
|
+
case "${manager}" in
|
|
1417
|
+
homebrew)
|
|
1418
|
+
manager="brew"
|
|
1419
|
+
;;
|
|
1420
|
+
chocolatey|chocolate)
|
|
1421
|
+
manager="choco"
|
|
1422
|
+
;;
|
|
1423
|
+
"portage (emerge)"|portage-emerge|portage)
|
|
1424
|
+
manager="emerge"
|
|
1425
|
+
;;
|
|
1426
|
+
win-get)
|
|
1427
|
+
manager="winget"
|
|
1428
|
+
;;
|
|
1429
|
+
esac
|
|
1430
|
+
|
|
1431
|
+
printf "%s" "${manager}"
|
|
1343
1432
|
}
|
|
1344
1433
|
|
|
1345
1434
|
os_release_field() {
|
|
@@ -2735,6 +2824,56 @@ collect_search_display_rows() {
|
|
|
2735
2824
|
rm -f "${merged_source_file}" "${merged_marked_file}"
|
|
2736
2825
|
}
|
|
2737
2826
|
|
|
2827
|
+
collect_installed_display_rows() {
|
|
2828
|
+
local output_file="$1"
|
|
2829
|
+
shift
|
|
2830
|
+
local managers=("$@")
|
|
2831
|
+
local part_files=()
|
|
2832
|
+
local gather_pids=()
|
|
2833
|
+
local manager
|
|
2834
|
+
local part_file
|
|
2835
|
+
local gather_pid
|
|
2836
|
+
|
|
2837
|
+
: >"${output_file}"
|
|
2838
|
+
|
|
2839
|
+
for manager in "${managers[@]-}"; do
|
|
2840
|
+
part_file="$(mktemp "${SESSION_TMP_ROOT}/part.XXXXXX")"
|
|
2841
|
+
part_files+=("${part_file}")
|
|
2842
|
+
|
|
2843
|
+
(
|
|
2844
|
+
local local_source_file
|
|
2845
|
+
local_source_file="$(mktemp "${SESSION_TMP_ROOT}/source.XXXXXX")"
|
|
2846
|
+
manager_installed_entries "${manager}" >"${local_source_file}" || true
|
|
2847
|
+
if [[ -s "${local_source_file}" ]]; then
|
|
2848
|
+
awk -F'\t' -v mgr="${manager}" '
|
|
2849
|
+
NF >= 1 {
|
|
2850
|
+
desc = $2
|
|
2851
|
+
if (desc == "") desc = "-"
|
|
2852
|
+
print mgr "\t" $1 "\t" desc
|
|
2853
|
+
}
|
|
2854
|
+
' "${local_source_file}" >"${part_file}"
|
|
2855
|
+
fi
|
|
2856
|
+
rm -f "${local_source_file}"
|
|
2857
|
+
) &
|
|
2858
|
+
gather_pids+=("$!")
|
|
2859
|
+
done
|
|
2860
|
+
|
|
2861
|
+
for gather_pid in "${gather_pids[@]-}"; do
|
|
2862
|
+
wait "${gather_pid}" || true
|
|
2863
|
+
done
|
|
2864
|
+
|
|
2865
|
+
for part_file in "${part_files[@]-}"; do
|
|
2866
|
+
if [[ -s "${part_file}" ]]; then
|
|
2867
|
+
cat "${part_file}" >>"${output_file}"
|
|
2868
|
+
fi
|
|
2869
|
+
rm -f "${part_file}"
|
|
2870
|
+
done
|
|
2871
|
+
|
|
2872
|
+
if [[ -s "${output_file}" ]]; then
|
|
2873
|
+
sort -u "${output_file}" -o "${output_file}"
|
|
2874
|
+
fi
|
|
2875
|
+
}
|
|
2876
|
+
|
|
2738
2877
|
build_dynamic_reload_command() {
|
|
2739
2878
|
local manager_override="$1"
|
|
2740
2879
|
local fallback_file="$2"
|
|
@@ -3266,48 +3405,9 @@ main() {
|
|
|
3266
3405
|
ensure_fzf "${managers[@]-}"
|
|
3267
3406
|
|
|
3268
3407
|
if [[ "${ACTION}" == "search" ]]; then
|
|
3269
|
-
collect_search_display_rows "${query}" "${display_file}" "${managers[@]-}"
|
|
3408
|
+
run_with_loading_indicator "Loading packages from ${manager_display}" collect_search_display_rows "${query}" "${display_file}" "${managers[@]-}"
|
|
3270
3409
|
else
|
|
3271
|
-
|
|
3272
|
-
local gather_pids=()
|
|
3273
|
-
local part_file
|
|
3274
|
-
local gather_pid
|
|
3275
|
-
|
|
3276
|
-
for manager in "${managers[@]-}"; do
|
|
3277
|
-
part_file="$(mktemp "${SESSION_TMP_ROOT}/part.XXXXXX")"
|
|
3278
|
-
part_files+=("${part_file}")
|
|
3279
|
-
|
|
3280
|
-
(
|
|
3281
|
-
local_source_file="$(mktemp "${SESSION_TMP_ROOT}/source.XXXXXX")"
|
|
3282
|
-
manager_installed_entries "${manager}" >"${local_source_file}" || true
|
|
3283
|
-
if [[ -s "${local_source_file}" ]]; then
|
|
3284
|
-
awk -F'\t' -v mgr="${manager}" '
|
|
3285
|
-
NF >= 1 {
|
|
3286
|
-
desc = $2
|
|
3287
|
-
if (desc == "") desc = "-"
|
|
3288
|
-
print mgr "\t" $1 "\t" desc
|
|
3289
|
-
}
|
|
3290
|
-
' "${local_source_file}" >"${part_file}"
|
|
3291
|
-
fi
|
|
3292
|
-
rm -f "${local_source_file}"
|
|
3293
|
-
) &
|
|
3294
|
-
gather_pids+=("$!")
|
|
3295
|
-
done
|
|
3296
|
-
|
|
3297
|
-
for gather_pid in "${gather_pids[@]-}"; do
|
|
3298
|
-
wait "${gather_pid}" || true
|
|
3299
|
-
done
|
|
3300
|
-
|
|
3301
|
-
for part_file in "${part_files[@]-}"; do
|
|
3302
|
-
if [[ -s "${part_file}" ]]; then
|
|
3303
|
-
cat "${part_file}" >>"${display_file}"
|
|
3304
|
-
fi
|
|
3305
|
-
rm -f "${part_file}"
|
|
3306
|
-
done
|
|
3307
|
-
|
|
3308
|
-
if [[ -s "${display_file}" ]]; then
|
|
3309
|
-
sort -u "${display_file}" -o "${display_file}"
|
|
3310
|
-
fi
|
|
3410
|
+
run_with_loading_indicator "Loading installed packages from ${manager_display}" collect_installed_display_rows "${display_file}" "${managers[@]-}"
|
|
3311
3411
|
fi
|
|
3312
3412
|
|
|
3313
3413
|
if [[ ! -s "${display_file}" ]]; then
|
|
@@ -3350,7 +3450,7 @@ main() {
|
|
|
3350
3450
|
if dynamic_reload_enabled "${#managers[@]}"; then
|
|
3351
3451
|
if [[ -n "${query}" ]]; then
|
|
3352
3452
|
reload_fallback_file="$(mktemp "${SESSION_TMP_ROOT}/reload-fallback.XXXXXX")"
|
|
3353
|
-
collect_search_display_rows "" "${reload_fallback_file}" "${managers[@]-}"
|
|
3453
|
+
run_with_loading_indicator "Preparing baseline search results" collect_search_display_rows "" "${reload_fallback_file}" "${managers[@]-}"
|
|
3354
3454
|
if [[ ! -s "${reload_fallback_file}" ]]; then
|
|
3355
3455
|
cp "${display_file}" "${reload_fallback_file}"
|
|
3356
3456
|
fi
|