fpf-cli 1.6.5 → 1.6.6
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/fpf +122 -45
- package/package.json +1 -1
package/fpf
CHANGED
|
@@ -494,6 +494,9 @@ parse_args() {
|
|
|
494
494
|
-U|--update)
|
|
495
495
|
ACTION="update"
|
|
496
496
|
;;
|
|
497
|
+
--feed-search)
|
|
498
|
+
ACTION="feed-search"
|
|
499
|
+
;;
|
|
497
500
|
-ap|--apt)
|
|
498
501
|
MANAGER_OVERRIDE="apt"
|
|
499
502
|
;;
|
|
@@ -946,6 +949,74 @@ mark_installed_packages() {
|
|
|
946
949
|
rm -f "${installed_file}"
|
|
947
950
|
}
|
|
948
951
|
|
|
952
|
+
collect_search_display_rows() {
|
|
953
|
+
local query="$1"
|
|
954
|
+
local output_file="$2"
|
|
955
|
+
shift 2
|
|
956
|
+
local managers=("$@")
|
|
957
|
+
|
|
958
|
+
: >"${output_file}"
|
|
959
|
+
|
|
960
|
+
local part_files=()
|
|
961
|
+
local gather_pids=()
|
|
962
|
+
local manager
|
|
963
|
+
local part_file
|
|
964
|
+
local gather_pid
|
|
965
|
+
|
|
966
|
+
for manager in "${managers[@]-}"; do
|
|
967
|
+
part_file="$(mktemp "${TMP_ROOT}/part.XXXXXX")"
|
|
968
|
+
part_files+=("${part_file}")
|
|
969
|
+
|
|
970
|
+
(
|
|
971
|
+
local_source_file="$(mktemp "${TMP_ROOT}/source.XXXXXX")"
|
|
972
|
+
local_marked_file="$(mktemp "${TMP_ROOT}/marked.XXXXXX")"
|
|
973
|
+
manager_search_entries "${manager}" "${query}" >"${local_source_file}" || true
|
|
974
|
+
if [[ -s "${local_source_file}" ]]; then
|
|
975
|
+
mark_installed_packages "${manager}" "${local_source_file}" "${local_marked_file}"
|
|
976
|
+
awk -F'\t' -v mgr="${manager}" '
|
|
977
|
+
NF >= 1 {
|
|
978
|
+
desc = $2
|
|
979
|
+
if (desc == "") desc = "-"
|
|
980
|
+
print mgr "\t" $1 "\t" desc
|
|
981
|
+
}
|
|
982
|
+
' "${local_marked_file}" >"${part_file}"
|
|
983
|
+
fi
|
|
984
|
+
rm -f "${local_source_file}" "${local_marked_file}"
|
|
985
|
+
) &
|
|
986
|
+
gather_pids+=("$!")
|
|
987
|
+
done
|
|
988
|
+
|
|
989
|
+
for gather_pid in "${gather_pids[@]-}"; do
|
|
990
|
+
wait "${gather_pid}" || true
|
|
991
|
+
done
|
|
992
|
+
|
|
993
|
+
for part_file in "${part_files[@]-}"; do
|
|
994
|
+
if [[ -s "${part_file}" ]]; then
|
|
995
|
+
cat "${part_file}" >>"${output_file}"
|
|
996
|
+
fi
|
|
997
|
+
rm -f "${part_file}"
|
|
998
|
+
done
|
|
999
|
+
|
|
1000
|
+
if [[ -s "${output_file}" ]]; then
|
|
1001
|
+
sort -u "${output_file}" -o "${output_file}"
|
|
1002
|
+
fi
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
build_dynamic_reload_command() {
|
|
1006
|
+
local manager_override="$1"
|
|
1007
|
+
local script_path="${BASH_SOURCE[0]}"
|
|
1008
|
+
|
|
1009
|
+
if [[ "${script_path}" != /* ]]; then
|
|
1010
|
+
script_path="$(pwd)/${script_path}"
|
|
1011
|
+
fi
|
|
1012
|
+
|
|
1013
|
+
if [[ -n "${manager_override}" ]]; then
|
|
1014
|
+
printf "%q --feed-search --manager %q -- {q} 2>/dev/null || true" "${script_path}" "${manager_override}"
|
|
1015
|
+
else
|
|
1016
|
+
printf "%q --feed-search -- {q} 2>/dev/null || true" "${script_path}"
|
|
1017
|
+
fi
|
|
1018
|
+
}
|
|
1019
|
+
|
|
949
1020
|
manager_preview_command() {
|
|
950
1021
|
local manager="$1"
|
|
951
1022
|
|
|
@@ -1218,11 +1289,13 @@ run_fuzzy_selector() {
|
|
|
1218
1289
|
local query="$1"
|
|
1219
1290
|
local input_file="$2"
|
|
1220
1291
|
local header_line="$3"
|
|
1292
|
+
local reload_cmd="${4:-}"
|
|
1221
1293
|
local preview_cmd
|
|
1222
1294
|
|
|
1223
1295
|
preview_cmd='bash -c '\''mgr="$1"; pkg="$2"; case "$mgr" in apt) apt-cache show "$pkg" 2>/dev/null; printf "\n"; dpkg -L "$pkg" 2>/dev/null ;; dnf) dnf info "$pkg" 2>/dev/null; printf "\n"; rpm -ql "$pkg" 2>/dev/null ;; pacman) pacman -Si "$pkg" 2>/dev/null; printf "\n"; pacman -Fl "$pkg" 2>/dev/null | awk "{print \$2}" ;; zypper) zypper --non-interactive info "$pkg" 2>/dev/null ;; emerge) emerge --search --color=n "$pkg" 2>/dev/null ;; brew) brew info "$pkg" 2>/dev/null ;; winget) winget show --id "$pkg" --exact --source winget --accept-source-agreements --disable-interactivity 2>/dev/null ;; choco) choco info "$pkg" 2>/dev/null ;; scoop) scoop info "$pkg" 2>/dev/null ;; snap) snap info "$pkg" 2>/dev/null ;; flatpak) flatpak info "$pkg" 2>/dev/null || flatpak remote-info flathub "$pkg" 2>/dev/null ;; npm) npm view "$pkg" 2>/dev/null ;; bun) bun info "$pkg" 2>/dev/null || npm view "$pkg" 2>/dev/null ;; esac'\'' _ {1} {2}'
|
|
1224
1296
|
|
|
1225
|
-
|
|
1297
|
+
local -a fzf_args=()
|
|
1298
|
+
fzf_args=(-q "${query}" -m \
|
|
1226
1299
|
--delimiter=$'\t' \
|
|
1227
1300
|
--with-nth=1,2,3 \
|
|
1228
1301
|
--preview="${preview_cmd}" \
|
|
@@ -1237,8 +1310,15 @@ run_fuzzy_selector() {
|
|
|
1237
1310
|
--bind=ctrl-h:preview:"cat ${HELP_FILE}" \
|
|
1238
1311
|
--bind='ctrl-/:change-preview-window(hidden|)' \
|
|
1239
1312
|
--bind=ctrl-n:next-selected,ctrl-b:prev-selected \
|
|
1240
|
-
--bind='focus:transform-preview-label:echo {1}: {2}'
|
|
1241
|
-
|
|
1313
|
+
--bind='focus:transform-preview-label:echo {1}: {2}')
|
|
1314
|
+
|
|
1315
|
+
if [[ -n "${reload_cmd}" ]]; then
|
|
1316
|
+
fzf_args+=(--disabled --bind="start:reload:${reload_cmd}" --bind="change:reload:${reload_cmd}")
|
|
1317
|
+
else
|
|
1318
|
+
fzf_args+=(-e)
|
|
1319
|
+
fi
|
|
1320
|
+
|
|
1321
|
+
fzf "${fzf_args[@]}" <"${input_file}"
|
|
1242
1322
|
}
|
|
1243
1323
|
|
|
1244
1324
|
main() {
|
|
@@ -1304,22 +1384,33 @@ main() {
|
|
|
1304
1384
|
exit 0
|
|
1305
1385
|
fi
|
|
1306
1386
|
|
|
1307
|
-
ensure_fzf "${managers[@]-}"
|
|
1308
|
-
|
|
1309
1387
|
local display_file
|
|
1310
1388
|
display_file="$(mktemp "${TMP_ROOT}/display.XXXXXX")"
|
|
1311
1389
|
: >"${display_file}"
|
|
1312
1390
|
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1391
|
+
if [[ "${ACTION}" == "feed-search" ]]; then
|
|
1392
|
+
collect_search_display_rows "${query}" "${display_file}" "${managers[@]-}"
|
|
1393
|
+
if [[ -s "${display_file}" ]]; then
|
|
1394
|
+
cat "${display_file}"
|
|
1395
|
+
fi
|
|
1396
|
+
rm -f "${display_file}"
|
|
1397
|
+
exit 0
|
|
1398
|
+
fi
|
|
1317
1399
|
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1400
|
+
ensure_fzf "${managers[@]-}"
|
|
1401
|
+
|
|
1402
|
+
if [[ "${ACTION}" == "search" ]]; then
|
|
1403
|
+
collect_search_display_rows "${query}" "${display_file}" "${managers[@]-}"
|
|
1404
|
+
else
|
|
1405
|
+
local part_files=()
|
|
1406
|
+
local gather_pids=()
|
|
1407
|
+
local part_file
|
|
1408
|
+
local gather_pid
|
|
1409
|
+
|
|
1410
|
+
for manager in "${managers[@]-}"; do
|
|
1411
|
+
part_file="$(mktemp "${TMP_ROOT}/part.XXXXXX")"
|
|
1412
|
+
part_files+=("${part_file}")
|
|
1321
1413
|
|
|
1322
|
-
if [[ "${ACTION}" == "list" || "${ACTION}" == "remove" ]]; then
|
|
1323
1414
|
(
|
|
1324
1415
|
local_source_file="$(mktemp "${TMP_ROOT}/source.XXXXXX")"
|
|
1325
1416
|
manager_installed_entries "${manager}" >"${local_source_file}" || true
|
|
@@ -1335,41 +1426,22 @@ main() {
|
|
|
1335
1426
|
rm -f "${local_source_file}"
|
|
1336
1427
|
) &
|
|
1337
1428
|
gather_pids+=("$!")
|
|
1338
|
-
|
|
1339
|
-
fi
|
|
1429
|
+
done
|
|
1340
1430
|
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
manager_search_entries "${manager}" "${query}" >"${local_source_file}" || true
|
|
1345
|
-
if [[ -s "${local_source_file}" ]]; then
|
|
1346
|
-
mark_installed_packages "${manager}" "${local_source_file}" "${local_marked_file}"
|
|
1347
|
-
awk -F'\t' -v mgr="${manager}" '
|
|
1348
|
-
NF >= 1 {
|
|
1349
|
-
desc = $2
|
|
1350
|
-
if (desc == "") desc = "-"
|
|
1351
|
-
print mgr "\t" $1 "\t" desc
|
|
1352
|
-
}
|
|
1353
|
-
' "${local_marked_file}" >"${part_file}"
|
|
1354
|
-
fi
|
|
1355
|
-
rm -f "${local_source_file}" "${local_marked_file}"
|
|
1356
|
-
) &
|
|
1357
|
-
gather_pids+=("$!")
|
|
1358
|
-
done
|
|
1431
|
+
for gather_pid in "${gather_pids[@]-}"; do
|
|
1432
|
+
wait "${gather_pid}" || true
|
|
1433
|
+
done
|
|
1359
1434
|
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1435
|
+
for part_file in "${part_files[@]-}"; do
|
|
1436
|
+
if [[ -s "${part_file}" ]]; then
|
|
1437
|
+
cat "${part_file}" >>"${display_file}"
|
|
1438
|
+
fi
|
|
1439
|
+
rm -f "${part_file}"
|
|
1440
|
+
done
|
|
1363
1441
|
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
cat "${part_file}" >>"${display_file}"
|
|
1442
|
+
if [[ -s "${display_file}" ]]; then
|
|
1443
|
+
sort -u "${display_file}" -o "${display_file}"
|
|
1367
1444
|
fi
|
|
1368
|
-
rm -f "${part_file}"
|
|
1369
|
-
done
|
|
1370
|
-
|
|
1371
|
-
if [[ -s "${display_file}" ]]; then
|
|
1372
|
-
sort -u "${display_file}" -o "${display_file}"
|
|
1373
1445
|
fi
|
|
1374
1446
|
|
|
1375
1447
|
if [[ ! -s "${display_file}" ]]; then
|
|
@@ -1393,8 +1465,13 @@ main() {
|
|
|
1393
1465
|
;;
|
|
1394
1466
|
esac
|
|
1395
1467
|
|
|
1468
|
+
local reload_cmd=""
|
|
1469
|
+
if [[ "${ACTION}" == "search" && -z "${query}" ]]; then
|
|
1470
|
+
reload_cmd="$(build_dynamic_reload_command "${MANAGER_OVERRIDE}")"
|
|
1471
|
+
fi
|
|
1472
|
+
|
|
1396
1473
|
local selected
|
|
1397
|
-
selected="$(run_fuzzy_selector "${query}" "${display_file}" "${header}" || true)"
|
|
1474
|
+
selected="$(run_fuzzy_selector "${query}" "${display_file}" "${header}" "${reload_cmd}" || true)"
|
|
1398
1475
|
|
|
1399
1476
|
rm -f "${display_file}"
|
|
1400
1477
|
|