fpf-cli 1.4.0 → 1.6.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 +121 -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` auto-installs 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,126 @@ 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
+ log "fzf is missing. Auto-installing with: ${candidate_labels}"
216
+
217
+ for manager in "${candidates[@]-}"; do
218
+ log "Attempting fzf install with $(manager_label "${manager}")"
219
+ if install_fzf_with_manager "${manager}"; then
220
+ if command_exists fzf; then
221
+ return
222
+ fi
223
+ fi
224
+ done
225
+
226
+ die "Failed to auto-install fzf. Install fzf manually and rerun."
227
+ }
228
+
109
229
  normalize_manager() {
110
230
  printf "%s" "$1" | tr '[:upper:]' '[:lower:]'
111
231
  }
@@ -1158,7 +1278,7 @@ main() {
1158
1278
  exit 0
1159
1279
  fi
1160
1280
 
1161
- command_exists fzf || die "fzf is required"
1281
+ ensure_fzf "${managers[@]-}"
1162
1282
 
1163
1283
  local display_file
1164
1284
  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.6.0",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"