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.
Files changed (2) hide show
  1. package/fpf +122 -45
  2. 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
- fzf -q "${query}" -e -m \
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
- <"${input_file}"
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
- local part_files=()
1314
- local gather_pids=()
1315
- local part_file
1316
- local gather_pid
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
- for manager in "${managers[@]-}"; do
1319
- part_file="$(mktemp "${TMP_ROOT}/part.XXXXXX")"
1320
- part_files+=("${part_file}")
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
- continue
1339
- fi
1429
+ done
1340
1430
 
1341
- (
1342
- local_source_file="$(mktemp "${TMP_ROOT}/source.XXXXXX")"
1343
- local_marked_file="$(mktemp "${TMP_ROOT}/marked.XXXXXX")"
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
- for gather_pid in "${gather_pids[@]-}"; do
1361
- wait "${gather_pid}" || true
1362
- done
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
- for part_file in "${part_files[@]-}"; do
1365
- if [[ -s "${part_file}" ]]; then
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.6.5",
3
+ "version": "1.6.6",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"