comparison sbin/fports @ 814:2310764e5c4e

fports: Implement a global "--jail/-j" option: execute the fports commands in a jail. The jail just needs to have an installed "pkg" command.
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 09 Nov 2024 00:47:05 +0100
parents 70e08ff3db45
children e2f262ec2bf4
comparison
equal deleted inserted replaced
813:70e08ff3db45 814:2310764e5c4e
21 21
22 # shellcheck disable=SC2016 # no expansion 22 # shellcheck disable=SC2016 # no expansion
23 USAGE=' 23 USAGE='
24 USAGE: fports -h|--help 24 USAGE: fports -h|--help
25 fports -V|--version 25 fports -V|--version
26 fports deptree [-l maxlevel|--maxlevel=maxlevel] [-r|--reverse] [-t|--list|--transitive] package... 26 fports [GLOBAL-OPTIONS] deptree [-l maxlevel|--maxlevel=maxlevel] [-r|--reverse] [-t|--list|--transitive] package...
27 fports detail [-A] [-b|--nofreebsd|--no-freebsd] [-f|--filter-unused] [-n|--noauto|--no-auto] [-m|--mapped] [package...] 27 fports [GLOBAL-OPTIONS] detail [-A] [-b|--nofreebsd|--no-freebsd] [-f|--filter-unused] [-n|--noauto|--no-auto] [-m|--mapped] [package...]
28 28
29 GLOBAL OPTIONS: 29 GLOBAL OPTIONS:
30 30
31 -V, --version Print the program name and version number to stdout and exit. 31 -V, --version Print the program name and version number to stdout and exit.
32 32
33 -h, --help Print this help message to stdout and exit. 33 -h, --help Print this help message to stdout and exit.
34
35 -j JAIL, --jail=JAIL
36 Execute in given jail JAIL.
34 37
35 ' 38 '
36 39
37 40
38 _p_datadir='@@DATADIR@@' 41 _p_datadir='@@DATADIR@@'
64 67
65 68
66 #: 69 #:
67 #: Implementation of the "deptree" command. 70 #: Implementation of the "deptree" command.
68 #: 71 #:
72 #: Args:
73 #: $1 (str, null): The jail to attach to
74 #: $2...: the command's options and arguments
75 #:
69 command_deptree() { 76 command_deptree() {
70 local opt_reversed opt_maxlevel opt_flat 77 local opt_jail opt_reversed opt_maxlevel opt_flat
71 # $@ 78 # $@
72 79
73 local opt 80 local opt
74 81
82 opt_jail="${1}"
83 shift
75 opt_maxlevel=0 84 opt_maxlevel=0
76 opt_reversed=no 85 opt_reversed=no
77 opt_flat=no 86 opt_flat=no
78 while getopts "l:rt-:" opt; do 87 while getopts "l:rt-:" opt; do
79 postprocess_getopts_for_long "l:rt-:" opt "maxlevel=" "reverse" "list" "transitive" "" 88 postprocess_getopts_for_long "l:rt-:" opt "maxlevel=" "reverse" "list" "transitive" ""
92 esac 101 esac
93 done 102 done
94 shift $((OPTIND-1)) 103 shift $((OPTIND-1))
95 OPTIND=1 104 OPTIND=1
96 105
106 if [ -n "${opt_jail}" ]; then
107 can_call_command "${opt_jail}" || fatal "${EX_UNAVAILABLE}" "jail \`${opt_jail}' does not exist or attaching denied"
108 fi
109
97 if checkyesno opt_reversed; then 110 if checkyesno opt_reversed; then
98 _command_deptree_reversed "${opt_maxlevel}" "${opt_flat}" "$@" 111 _command_deptree_reversed "${opt_jail}" "${opt_maxlevel}" "${opt_flat}" "$@"
99 else 112 else
100 _command_deptree_normal "${opt_maxlevel}" "${opt_flat}" "$@" 113 _command_deptree_normal "${opt_jail}" "${opt_maxlevel}" "${opt_flat}" "$@"
101 fi 114 fi
102 } 115 }
103 116
104 117
105 #: 118 #:
106 #: Implementation of printing a "normal" dependency tree 119 #: Implementation of printing a "normal" dependency tree
107 #: 120 #:
108 _command_deptree_normal() { 121 _command_deptree_normal() {
109 local maxlevel flat # $@ 122 local jail maxlevel flat # $@
110 123
111 local pkgdeps pkgqueue curdeps pkg n v flatdeps 124 local pkgdeps pkgqueue curdeps pkg n v flatdeps
112 125
113 maxlevel="${1}" 126 jail="${1}"
114 flat="${2}" 127 maxlevel="${2}"
115 shift 2 128 flat="${3}"
129 shift 3
116 130
117 # shellcheck disable=SC2034 # pkgqueue seems unused 131 # shellcheck disable=SC2034 # pkgqueue seems unused
118 pkgqueue='' 132 pkgqueue=''
119 farray_create pkgqueue # queue (array) of packages that are queued for 133 farray_create pkgqueue # queue (array) of packages that are queued for
120 # resolution 134 # resolution
121 135
122 for pkg in "$@"; do 136 for pkg in "$@"; do
123 if ! "${PKG}" query '%n' "${pkg}" 1>/dev/null 2>/dev/null ; then 137 if ! call_pkg "${opt_jail}" query '%n' "${pkg}" 1>/dev/null 2>/dev/null ; then
124 farray_release pkgqueue 138 farray_release pkgqueue
125 fatal "${EX_DATAERR}" "Package not found: ${pkg}" 139 fatal "${EX_DATAERR}" "Package not found: ${pkg}"
126 fi 140 fi
127 farray_append pkgqueue "${pkg}" 141 farray_append pkgqueue "${pkg}"
128 done 142 done
135 while IFS=$' \t\n' read -r n v; do 149 while IFS=$' \t\n' read -r n v; do
136 [ -z "${n}" ] || [ -z "${v}" ] && continue 150 [ -z "${n}" ] || [ -z "${v}" ] && continue
137 farray_append curdeps "${n}=${v}" 151 farray_append curdeps "${n}=${v}"
138 farray_append pkgqueue "${n}" 152 farray_append pkgqueue "${n}"
139 done <<EOF_01a8cebe-8659-4e32-87a4-bbce117e386b 153 done <<EOF_01a8cebe-8659-4e32-87a4-bbce117e386b
140 $(LC_ALL=C.UTF-8 "${PKG}" query '%dn %dv' "${pkg}") 154 $(call_pkg "${opt_jail}" query '%dn %dv' "${pkg}")
141 EOF_01a8cebe-8659-4e32-87a4-bbce117e386b 155 EOF_01a8cebe-8659-4e32-87a4-bbce117e386b
142 falist_set pkgdeps "${pkg}" "${curdeps}" 156 falist_set pkgdeps "${pkg}" "${curdeps}"
143 farray_release curdeps 157 farray_release curdeps
144 curdeps='' 158 curdeps=''
145 fi 159 fi
147 farray_release pkgqueue 161 farray_release pkgqueue
148 # falist_debug pkgdeps 162 # falist_debug pkgdeps
149 if checkyesno flat; then 163 if checkyesno flat; then
150 for pkg in "$@"; do 164 for pkg in "$@"; do
151 _flatten_pkgdeps flatdeps "${pkgdeps}" "${pkg}" 165 _flatten_pkgdeps flatdeps "${pkgdeps}" "${pkg}"
152 _print_flatdeps '-->' "${pkg}" "$(LC_ALL=C.UTF-8 "${PKG}" query '%v' "${pkg}")" "${flatdeps}" 166 _print_flatdeps '-->' "${pkg}" "$(call_pkg "${opt_jail}" query '%v' "${pkg}")" "${flatdeps}"
153 falist_release "${flatdeps}" 167 falist_release "${flatdeps}"
154 done 168 done
155 else 169 else
156 for pkg in "$@"; do 170 for pkg in "$@"; do
157 _print_dependency_tree 0 "${maxlevel}" '-->' "${pkg}" "$(LC_ALL=C.UTF-8 "${PKG}" query '%v' "${pkg}")" "${pkgdeps}" 171 _print_dependency_tree 0 "${maxlevel}" '-->' "${pkg}" "$(call_pkg "${opt_jail}" query '%v' "${pkg}")" "${pkgdeps}"
158 done 172 done
159 fi 173 fi
160 falist_release pkgdeps 174 falist_release pkgdeps
161 } 175 }
162 176
163 177
164 #: 178 #:
165 #: Implementation of printing a reversed dependency tree 179 #: Implementation of printing a reversed dependency tree
166 #: 180 #:
167 _command_deptree_reversed() { 181 _command_deptree_reversed() {
168 local maxlevel flat # $@ 182 local jail maxlevel flat # $@
169 183
170 local pkgdeps pkgqueue curdeps pkg n v flatdeps 184 local pkgdeps pkgqueue curdeps pkg n v flatdeps
171 185
172 maxlevel="${1}" 186 jail="${1}"
187 maxlevel="${2}"
173 # shellcheck disable=SC2034 # appears unused 188 # shellcheck disable=SC2034 # appears unused
174 flat="${2}" 189 flat="${3}"
175 shift 2 190 shift 3
176 191
177 # shellcheck disable=SC2034 # pkgqueue seems unused 192 # shellcheck disable=SC2034 # pkgqueue seems unused
178 pkgqueue='' 193 pkgqueue=''
179 farray_create pkgqueue # queue (array) of packages that are queued for 194 farray_create pkgqueue # queue (array) of packages that are queued for
180 # resolution 195 # resolution
181 196
182 for pkg in "$@"; do 197 for pkg in "$@"; do
183 if ! "${PKG}" query '%n' "${pkg}" 1>/dev/null 2>/dev/null ; then 198 if ! call_pkg "${opt_jail}" query '%n' "${pkg}" 1>/dev/null 2>/dev/null ; then
184 farray_release pkgqueue 199 farray_release pkgqueue
185 fatal "${EX_DATAERR}" "Package not found: ${pkg}" 200 fatal "${EX_DATAERR}" "Package not found: ${pkg}"
186 fi 201 fi
187 farray_append pkgqueue "${pkg}" 202 farray_append pkgqueue "${pkg}"
188 done 203 done
195 while IFS=$' \t\n' read -r n v; do 210 while IFS=$' \t\n' read -r n v; do
196 [ -z "${n}" ] || [ -z "${v}" ] && continue 211 [ -z "${n}" ] || [ -z "${v}" ] && continue
197 farray_append curdeps "${n}=${v}" 212 farray_append curdeps "${n}=${v}"
198 farray_append pkgqueue "${n}" 213 farray_append pkgqueue "${n}"
199 done <<EOF_5079e996-c6d2-4e6d-825d-53183a64ab06 214 done <<EOF_5079e996-c6d2-4e6d-825d-53183a64ab06
200 $(LC_ALL=C.UTF-8 "${PKG}" query '%rn %rv' "${pkg}") 215 $(call_pkg "${opt_jail}" query '%rn %rv' "${pkg}")
201 EOF_5079e996-c6d2-4e6d-825d-53183a64ab06 216 EOF_5079e996-c6d2-4e6d-825d-53183a64ab06
202 falist_set pkgdeps "${pkg}" "${curdeps}" 217 falist_set pkgdeps "${pkg}" "${curdeps}"
203 farray_release curdeps 218 farray_release curdeps
204 curdeps='' 219 curdeps=''
205 fi 220 fi
207 farray_release pkgqueue 222 farray_release pkgqueue
208 # falist_debug pkgdeps 223 # falist_debug pkgdeps
209 if checkyesno flat; then 224 if checkyesno flat; then
210 for pkg in "$@"; do 225 for pkg in "$@"; do
211 _flatten_pkgdeps flatdeps "${pkgdeps}" "${pkg}" 226 _flatten_pkgdeps flatdeps "${pkgdeps}" "${pkg}"
212 _print_flatdeps '<--' "${pkg}" "$(LC_ALL=C.UTF-8 "${PKG}" query '%v' "${pkg}")" "${flatdeps}" 227 _print_flatdeps '<--' "${pkg}" "$(call_pkg "${opt_jail}" query '%v' "${pkg}")" "${flatdeps}"
213 falist_release "${flatdeps}" 228 falist_release "${flatdeps}"
214 done 229 done
215 else 230 else
216 for pkg in "$@"; do 231 for pkg in "$@"; do
217 _print_dependency_tree 0 "${maxlevel}" '<--' "${pkg}" "$(LC_ALL=C.UTF-8 "${PKG}" query '%v' "${pkg}")" "${pkgdeps}" 232 _print_dependency_tree 0 "${maxlevel}" '<--' "${pkg}" "$(call_pkg "${opt_jail}" query '%v' "${pkg}")" "${pkgdeps}"
218 done 233 done
219 fi 234 fi
220 falist_release pkgdeps 235 falist_release pkgdeps
221 } 236 }
222 237
341 356
342 357
343 #: 358 #:
344 #: Implementation of the "detail" command. 359 #: Implementation of the "detail" command.
345 #: 360 #:
361 #: Args:
362 #: $1 (str, null): The jail to attach to
363 #: $2...: The command's options and arguments
364 #:
346 command_detail() { 365 command_detail() {
347 local opt_nofreebsd opt_filterunused opt_noauto opt_mapped opt_nofreebsd 366 local opt_jail opt_nofreebsd opt_filterunused opt_noauto \
367 opt_mapped opt_nofreebsd
348 # $@ 368 # $@
349 369
350 local package \ 370 local package \
351 packages do_sort idx prev_package \ 371 packages do_sort idx prev_package \
352 repositories packagemapping instver instrepo \ 372 repositories packagemapping instver instrepo \
353 repo title_printed indexfile _dummy opt acookie \ 373 repo title_printed indexfile _dummy opt acookie \
354 pkglabel pkgdescr pkgversion mapped_package 374 pkglabel pkgdescr pkgversion mapped_package
355 375
376 opt_jail="${1}"
377 shift
356 do_sort=no 378 do_sort=no
357 opt_filterunused=no 379 opt_filterunused=no
358 opt_nofreebsd=no 380 opt_nofreebsd=no
359 opt_noauto=no 381 opt_noauto=no
360 opt_mapped=no 382 opt_mapped=no
392 esac 414 esac
393 done 415 done
394 shift $((OPTIND-1)) 416 shift $((OPTIND-1))
395 OPTIND=1 417 OPTIND=1
396 418
419 if [ -n "${opt_jail}" ]; then
420 can_call_command "${opt_jail}" || fatal "${EX_UNAVAILABLE}" "jail \`${opt_jail}' does not exist or attaching denied"
421 fi
422
397 packages='' 423 packages=''
398 farray_create packages 424 farray_create packages
399 repositories='' 425 repositories=''
400 get_active_repositories repositories 426 get_active_repositories repositories "${opt_jail}"
401 packagemapping='' 427 packagemapping=''
402 init_package_mapping packagemapping 428 init_package_mapping packagemapping "${opt_jail}"
403 falist_set packagemapping "uwsginl" "uwsgi" 429 indexfile="$(get_local_index_file "${opt_jail}")"
404 indexfile="$(get_local_index_file)"
405 430
406 if checkyesno opt_nofreebsd; then 431 if checkyesno opt_nofreebsd; then
407 while IFS='|' read -r package repo; do 432 while IFS='|' read -r package repo; do
408 [ "${repo}" != 'FreeBSD' ] && farray_append packages "${package}" 433 [ "${repo}" != 'FreeBSD' ] && farray_append packages "${package}"
409 done <<EOF_1fa6f326-49e6-4b01-a7ea-52372d00df1e 434 done <<EOF_1fa6f326-49e6-4b01-a7ea-52372d00df1e
410 $(LC_ALL=C.UTF-8 "${PKG}" query '%n|%R') 435 $(call_pkg "${opt_jail}" query '%n|%R')
411 EOF_1fa6f326-49e6-4b01-a7ea-52372d00df1e 436 EOF_1fa6f326-49e6-4b01-a7ea-52372d00df1e
412 fi 437 fi
413 if checkyesno opt_noauto; then 438 if checkyesno opt_noauto; then
414 for package in $(LC_ALL=C.UTF-8 "${PKG}" query -e '%a = 0' '%n'); do 439 for package in $(call_pkg "${opt_jail}" query -e '%a = 0' '%n'); do
415 farray_append packages "${package}" 440 farray_append packages "${package}"
416 done 441 done
417 fi 442 fi
418 if checkyesno opt_mapped; then 443 if checkyesno opt_mapped; then
419 acookie="$(falist_cookie_first packagemapping)" 444 acookie="$(falist_cookie_first packagemapping)"
429 454
430 idx=1 455 idx=1
431 prev_package='' # to skip duplicate packages 456 prev_package='' # to skip duplicate packages
432 while farray_tryget package packages "${idx}"; do 457 while farray_tryget package packages "${idx}"; do
433 if [ "${prev_package}" != "${package}" ]; then 458 if [ "${prev_package}" != "${package}" ]; then
434 _package_max_detail "${package}" "${packagemapping}" "${repositories}" "${indexfile}" "${opt_filterunused}" 459 _package_max_detail "${package}" "${packagemapping}" "${repositories}" "${indexfile}" "${opt_filterunused}" "${opt_jail}"
435 prev_package="${package}" 460 prev_package="${package}"
436 fi 461 fi
437 idx=$((idx + 1)) 462 idx=$((idx + 1))
438 done 463 done
439 464
440 falist_release "${packagemapping}" 465 falist_release "${packagemapping}"
441 farray_release "${repositories}" 466 farray_release "${repositories}"
442 farray_release "${packages}" 467 farray_release "${packages}"
443 } 468 }
444 469
453 #: $2 (alist): The 478 #: $2 (alist): The
454 #: $3 (array): The array with all the configured/active repositories 479 #: $3 (array): The array with all the configured/active repositories
455 #: $4 (str, null): The local index file if it exists 480 #: $4 (str, null): The local index file if it exists
456 #: $5 (bool): Flag whether to suppress details for repositories that do 481 #: $5 (bool): Flag whether to suppress details for repositories that do
457 #: not contain the package `$1` 482 #: not contain the package `$1`
483 #: $6 (str, null): The jail where the packages live
458 #: 484 #:
459 _package_max_detail() { 485 _package_max_detail() {
460 local package packagemapping repositories indexfile opt_filterunused 486 local package packagemapping repositories indexfile \
487 opt_filterunused opt_jail
461 488
462 local instver instrepo repo title_printed _dummy \ 489 local instver instrepo repo title_printed _dummy \
463 pkglabel pkgdescr pkgversion mapped_package 490 pkglabel pkgdescr pkgversion mapped_package
464 491
465 package="${1}" 492 package="${1}"
466 packagemapping="${2}" 493 packagemapping="${2}"
467 repositories="${3}" 494 repositories="${3}"
468 indexfile="${4}" 495 indexfile="${4}"
469 opt_filterunused="${5}" 496 opt_filterunused="${5}"
497 opt_jail="${6}"
470 498
471 # shellcheck disable=SC2034 # appears unused 499 # shellcheck disable=SC2034 # appears unused
472 title_printed=no 500 title_printed=no
473 IFS='|' read -r instver instrepo <<EOF_e9bd7819-b4c5-4a86-b984-f5226db58cb1 501 IFS='|' read -r instver instrepo <<EOF_e9bd7819-b4c5-4a86-b984-f5226db58cb1
474 $(LC_ALL=C.UTF-8 "${PKG}" query '%v|%R' "${package}") 502 $(call_pkg "${opt_jail}" query '%v|%R' "${package}")
475 EOF_e9bd7819-b4c5-4a86-b984-f5226db58cb1 503 EOF_e9bd7819-b4c5-4a86-b984-f5226db58cb1
476 print_title title_printed "${package}" "${instver}" "${instrepo}" 504 print_title title_printed "${package}" "${instver}" "${instrepo}"
477 if [ -n "${indexfile}" ]; then 505 if [ -n "${indexfile}" ]; then
478 read -r _dummy pkglabel pkgdescr <<EOF_b1f225bd-d234-4a23-8a2a-40c2e5b7ff3c 506 read -r _dummy pkglabel pkgdescr <<EOF_b1f225bd-d234-4a23-8a2a-40c2e5b7ff3c
479 $(LC_ALL=C.UTF-8 "${PKG}" version -U -I -n "${package}" -v "${indexfile}") 507 $(call_pkg "${opt_jail}" version -U -I -n "${package}" -v "${indexfile}")
480 EOF_b1f225bd-d234-4a23-8a2a-40c2e5b7ff3c 508 EOF_b1f225bd-d234-4a23-8a2a-40c2e5b7ff3c
481 pkgversion="$(parse_index_file_for_package_version "${indexfile}" "${package}")" 509 pkgversion="$(parse_index_file_for_package_version "${indexfile}" "${package}" "${opt_jail}")"
482 _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" "${pkgdescr}" 510 _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" "${pkgdescr}"
483 fi 511 fi
484 farray_for_each repositories _package_repository_detail "${package}" "${opt_filterunused}" 0 512 farray_for_each repositories _package_repository_detail "${package}" "${opt_filterunused}" "${opt_jail}" 0
485 mapped_package="$(get_package_mapping "${packagemapping}" "${package}")" 513 mapped_package="$(get_package_mapping "${packagemapping}" "${package}")"
486 if [ -n "${mapped_package}" ]; then 514 if [ -n "${mapped_package}" ]; then
487 printf '%18s %s\n' "--------------->" "${mapped_package}" 515 printf '%18s %s\n' "--------------->" "${mapped_package}"
488 if [ -n "${indexfile}" ]; then 516 if [ -n "${indexfile}" ]; then
489 pkgversion="$(parse_index_file_for_package_version "${indexfile}" "${mapped_package}")" 517 pkgversion="$(parse_index_file_for_package_version "${indexfile}" "${mapped_package}" "${opt_jail}")"
490 pkglabel="$(LC_ALL=C.UTF-8 "${PKG}" version --test-version "${instver}" "${pkgversion}")" 518 pkglabel="$(call_pkg "${opt_jail}" version --test-version "${instver}" "${pkgversion}")"
491 print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" '' 19 519 print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" '' 19
492 fi 520 fi
493 farray_for_each repositories _mapped_package_repository_detail "${mapped_package}" "{instver}" "${opt_filterunused}" 19 521 farray_for_each repositories _mapped_package_repository_detail "${mapped_package}" "{instver}" "${opt_filterunused}" "${opt_jail}" 19
494 fi 522 fi
495 } 523 }
496 524
497 525
498 #: 526 #:
523 #: $1 (str): The repositories array 551 #: $1 (str): The repositories array
524 #: $2 (int): The current index 552 #: $2 (int): The current index
525 #: $3: The element value (i.e. repository name) 553 #: $3: The element value (i.e. repository name)
526 #: $4 (str): The (master) package name 554 #: $4 (str): The (master) package name
527 #: $5 (flag): The global flat whether to filter repository printing 555 #: $5 (flag): The global flat whether to filter repository printing
528 #: $6 (int, optional): The extra indent value to forward to called functions 556 #: $6 (str, null): The jail in which the package data live
557 #: $7 (int, optional): The extra indent value to forward to called functions
529 #: 558 #:
530 _package_repository_detail() { 559 _package_repository_detail() {
531 local repositories idx reponame package extraindent opt_filterunused 560 local repositories idx reponame package extraindent opt_filterunused \
561 opt_jail
532 562
533 local _dummy \ 563 local _dummy \
534 pkglabel pkgdescr pkgversion 564 pkglabel pkgdescr pkgversion
535 565
536 repositories="${1}" 566 repositories="${1}"
537 # shellcheck disable=SC2034 # appears unused (yes, accept it) 567 # shellcheck disable=SC2034 # appears unused (yes, accept it)
538 idx="${2}" 568 idx="${2}"
539 reponame="${3}" 569 reponame="${3}"
540 package="${4}" 570 package="${4}"
541 opt_filterunused="${5}" 571 opt_filterunused="${5}"
542 extraindent="${6:-0}" 572 opt_jail="${6}"
543 573 extraindent="${7:-0}"
574
544 read -r _dummy pkglabel pkgdescr <<EOF_19cf2d80-4eb9-4cda-bd4d-96b04e769206 575 read -r _dummy pkglabel pkgdescr <<EOF_19cf2d80-4eb9-4cda-bd4d-96b04e769206
545 $(LC_ALL=C.UTF-8 "${PKG}" version -U -R -r "${reponame}" -n "${package}" -v) 576 $(call_pkg "${opt_jail}" version -U -R -r "${reponame}" -n "${package}" -v)
546 EOF_19cf2d80-4eb9-4cda-bd4d-96b04e769206 577 EOF_19cf2d80-4eb9-4cda-bd4d-96b04e769206
547 pkgversion="$(LC_ALL=C.UTF-8 "${PKG}" rquery -U -r "${reponame}" '%v' "${package}")" 578 pkgversion="$(call_pkg "${opt_jail}" rquery -U -r "${reponame}" '%v' "${package}")"
548 _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" "${pkgdescr}" "${extraindent}" 579 _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" "${pkgdescr}" "${extraindent}"
549 } 580 }
550 581
551 582
552 #: 583 #:
558 #: $2 (int): The current index 589 #: $2 (int): The current index
559 #: $3: The element value (i.e. repository name) 590 #: $3: The element value (i.e. repository name)
560 #: $4 (str): The mapped package name 591 #: $4 (str): The mapped package name
561 #: $5 (str): The parent package version 592 #: $5 (str): The parent package version
562 #: $6 (flag): The global flat whether to filter repository printing 593 #: $6 (flag): The global flat whether to filter repository printing
563 #: $7 (int, optional): The extra indent value to forward to called functions 594 #: $7 (str, null): The jail where the package data live
595 #: $8 (int, optional): The extra indent value to forward to called functions
564 #: 596 #:
565 _mapped_package_repository_detail() { 597 _mapped_package_repository_detail() {
566 local repositories idx reponame package parent_pkgversion \ 598 local repositories idx reponame package parent_pkgversion \
567 opt_filterunused extraindent 599 opt_filterunused extraindent opt_jail
568 600
569 local _dummy \ 601 local _dummy \
570 pkglabel pkgversion 602 pkglabel pkgversion
571 603
572 repositories="${1}" 604 repositories="${1}"
574 idx="${2}" 606 idx="${2}"
575 reponame="${3}" 607 reponame="${3}"
576 package="${4}" 608 package="${4}"
577 parent_pkgversion="${5}" 609 parent_pkgversion="${5}"
578 opt_filterunused="${6}" 610 opt_filterunused="${6}"
579 extraindent="${7:-0}" 611 opt_jail="${7}"
580 612 extraindent="${8:-0}"
581 pkgversion="$(LC_ALL=C.UTF-8 "${PKG}" rquery -U -r "${reponame}" '%v' "${package}")" 613
582 pkglabel="$(LC_ALL=C.UTF-8 "${PKG}" version --test-version "${parent_pkgversion}" "${pkgversion}")" 614 pkgversion="$(call_pkg "${opt_jail}" rquery -U -r "${reponame}" '%v' "${package}")"
615 pkglabel="$(call_pkg "${opt_jail}" version --test-version "${parent_pkgversion}" "${pkgversion}")"
583 _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" '' "${extraindent}" 616 _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" '' "${extraindent}"
584 } 617 }
585 618
586 619
587 #: 620 #:
657 690
658 691
659 # 692 #
660 # Global option handling 693 # Global option handling
661 # 694 #
662 while getopts "Vh-:" _opt ; do 695
663 postprocess_getopts_for_long "Vh-:" _opt "version" "help" "" 696 opt_jail=''
697 while getopts "Vhj:-:" _opt ; do
698 postprocess_getopts_for_long "Vhj-:" _opt "version" "help" "jail=" ""
664 case "${_opt}" in 699 case "${_opt}" in
665 V|version) 700 V|version)
666 printf 'fports %s\n' '@@SIMPLEVERSIONSTR@@' 701 printf 'fports %s\n' '@@SIMPLEVERSIONSTR@@'
667 exit 0 702 exit 0
668 ;; 703 ;;
669 h|help) 704 h|help)
670 echo "${USAGE}" 705 echo "${USAGE}"
671 exit 0 706 exit 0
672 ;; 707 ;;
708 j|jail)
709 opt_jail="${OPTARG}"
710 ;;
673 \?) 711 \?)
674 exit 2; 712 exit 2;
675 ;; 713 ;;
676 *) 714 *)
677 fatal 2 "option handling failed" 715 fatal 2 "option handling failed"
691 729
692 case "${command}" in 730 case "${command}" in
693 '') 731 '')
694 fatal 2 "no command given";; 732 fatal 2 "no command given";;
695 deptree) 733 deptree)
696 command_deptree "$@";; 734 command_deptree "${opt_jail}" "$@";;
697 detail) 735 detail)
698 command_detail "$@";; 736 command_detail "${opt_jail}" "$@";;
699 *) 737 *)
700 fatal 2 "unknown command \`${command}'";; 738 fatal 2 "unknown command \`${command}'";;
701 esac 739 esac