fpf-cli 1.4.0 → 1.5.0

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 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -83,4 +83,5 @@ On Windows (Git Bash / MSYS / Cygwin), default auto mode uses installed Windows
83
83
  ## Notes
84
84
 
85
85
  - Requires: `bash` + `fzf`
86
+ - If `fzf` is missing, `fpf` can prompt to auto-install it using a compatible detected manager.
86
87
  - Root managers (`apt`, `dnf`, `pacman`, `zypper`, `emerge`, `snap`) use `sudo` when needed.
package/fpf CHANGED
@@ -106,6 +106,128 @@ manager_command_ready() {
106
106
  esac
107
107
  }
108
108
 
109
+ manager_can_install_fzf() {
110
+ local manager="$1"
111
+ case "${manager}" in
112
+ apt|dnf|pacman|zypper|emerge|brew|winget|choco|scoop|snap)
113
+ return 0
114
+ ;;
115
+ *)
116
+ return 1
117
+ ;;
118
+ esac
119
+ }
120
+
121
+ install_fzf_with_manager() {
122
+ local manager="$1"
123
+
124
+ case "${manager}" in
125
+ apt)
126
+ run_as_root apt-get install -y fzf
127
+ ;;
128
+ dnf)
129
+ run_as_root dnf install -y fzf
130
+ ;;
131
+ pacman)
132
+ run_as_root pacman -S --needed fzf
133
+ ;;
134
+ zypper)
135
+ run_as_root zypper --non-interactive install --auto-agree-with-licenses fzf
136
+ ;;
137
+ emerge)
138
+ run_as_root emerge --ask=n app-shells/fzf
139
+ ;;
140
+ brew)
141
+ brew install fzf
142
+ ;;
143
+ winget)
144
+ winget install --id junegunn.fzf --exact --source winget --accept-package-agreements --accept-source-agreements --disable-interactivity ||
145
+ winget install --id fzf --exact --source winget --accept-package-agreements --accept-source-agreements --disable-interactivity
146
+ ;;
147
+ choco)
148
+ choco install fzf -y
149
+ ;;
150
+ scoop)
151
+ scoop install fzf
152
+ ;;
153
+ snap)
154
+ run_as_root snap install fzf
155
+ ;;
156
+ *)
157
+ return 1
158
+ ;;
159
+ esac
160
+ }
161
+
162
+ build_fzf_bootstrap_candidates() {
163
+ local seen=""
164
+ local manager
165
+
166
+ for manager in "$@"; do
167
+ [[ -n "${manager}" ]] || continue
168
+ manager_can_install_fzf "${manager}" || continue
169
+ manager_command_ready "${manager}" || continue
170
+ case " ${seen} " in
171
+ *" ${manager} "*)
172
+ continue
173
+ ;;
174
+ esac
175
+ printf "%s\n" "${manager}"
176
+ seen+=" ${manager}"
177
+ done
178
+
179
+ if [[ -n "${seen}" ]]; then
180
+ return
181
+ fi
182
+
183
+ for manager in apt dnf pacman zypper emerge brew winget choco scoop snap; do
184
+ manager_command_ready "${manager}" || continue
185
+ case " ${seen} " in
186
+ *" ${manager} "*)
187
+ continue
188
+ ;;
189
+ esac
190
+ printf "%s\n" "${manager}"
191
+ seen+=" ${manager}"
192
+ done
193
+ }
194
+
195
+ ensure_fzf() {
196
+ local candidates=()
197
+ local manager
198
+
199
+ if command_exists fzf; then
200
+ return
201
+ fi
202
+
203
+ while IFS= read -r manager; do
204
+ [[ -n "${manager}" ]] || continue
205
+ candidates+=("${manager}")
206
+ done < <(build_fzf_bootstrap_candidates "$@")
207
+
208
+ if [[ "${#candidates[@]}" -eq 0 ]]; then
209
+ die "fzf is required and no compatible manager is available to auto-install it"
210
+ fi
211
+
212
+ local candidate_labels
213
+ candidate_labels="$(join_manager_labels "${candidates[@]-}")"
214
+
215
+ if ! confirm_action "fzf is not installed. Install it now using ${candidate_labels}?"; then
216
+ die "fzf is required"
217
+ fi
218
+
219
+ for manager in "${candidates[@]-}"; do
220
+ log "Attempting fzf install with $(manager_label "${manager}")"
221
+ if install_fzf_with_manager "${manager}"; then
222
+ if command_exists fzf; then
223
+ return
224
+ fi
225
+ fi
226
+ done
227
+
228
+ die "Failed to auto-install fzf. Install fzf manually and rerun."
229
+ }
230
+
109
231
  normalize_manager() {
110
232
  printf "%s" "$1" | tr '[:upper:]' '[:lower:]'
111
233
  }
@@ -1158,7 +1280,7 @@ main() {
1158
1280
  exit 0
1159
1281
  fi
1160
1282
 
1161
- command_exists fzf || die "fzf is required"
1283
+ ensure_fzf "${managers[@]-}"
1162
1284
 
1163
1285
  local display_file
1164
1286
  display_file="$(mktemp "${TMP_ROOT}/display.XXXXXX")"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"