| #!/bin/bash | |
| # Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| #### CATEGORY=Build | |
| ### list packages are built | |
| ## usage: fx list-packages [--base|--cache|--universe] [--verbose] [pattern] | |
| ## | |
| ## list-packages lists the packages that the build is aware of. These are | |
| ## packages that can be rebuilt, and/or pushed to a device. | |
| ## If a pattern is supplied, only packages matching the pattern are listed. | |
| ## Note: list-packages DOES NOT list all packages that could be built, only | |
| ## those which are included in the current build configuration. | |
| ## | |
| ## --base - list only packages in base | |
| ## --cache - list only packages in cache | |
| ## --universe - list all packages | |
| ## --verbose - print package set for each listed package | |
| ## | |
| ## See https://fuchsia.dev/fuchsia-src/development/build/boards_and_products | |
| ## for more information about using these package sets. | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/updates.sh || exit $? | |
| fx-config-read | |
| base_packages_list="${FUCHSIA_BUILD_DIR}/base_packages.list" | |
| cache_packages_list="${FUCHSIA_BUILD_DIR}/cache_packages.list" | |
| universe_packages_list="${FUCHSIA_BUILD_DIR}/universe_packages.list" | |
| package_sets=() | |
| verbose=false | |
| search_query="^.*$" # Default query matches "any" to list all packages. | |
| function main { | |
| fx-standard-switches "$@" | |
| set -- "${FX_ARGV[@]}" | |
| while [[ $# -gt 0 ]]; do | |
| case "$1" in | |
| --base) | |
| package_sets+=( "${base_packages_list}" ) | |
| shift | |
| ;; | |
| --cache) | |
| package_sets+=( "${cache_packages_list}" ) | |
| shift | |
| ;; | |
| --universe) | |
| package_sets+=( "${universe_packages_list}" ) | |
| shift | |
| ;; | |
| -v|--verbose) | |
| verbose=true | |
| shift | |
| ;; | |
| -*) | |
| fx-error "Unknown argument: $1" | |
| return 1 | |
| ;; | |
| *) | |
| search_query="$1" | |
| break | |
| ;; | |
| esac | |
| done | |
| # Default to universe if no options are provided. | |
| if [[ ${#package_sets[@]} -eq 0 ]]; then | |
| package_sets+=( "${universe_packages_list}" ) | |
| fi | |
| if [[ ${#package_sets[@]} -ne 1 ]]; then | |
| fx-error "Cannot supply multiple package set filters." | |
| return 1 | |
| fi | |
| # Search the provided package set. | |
| results=($(grep "${search_query}" "${package_sets[0]}")) | |
| # Pass through a non-zero return value when no results are found. | |
| if [[ ${#results[@]} -eq 0 ]]; then | |
| return 1 | |
| fi | |
| # Verbose searches through all package sets and tags each result. | |
| if "${verbose}"; then | |
| all_packages=( "${base_packages_list}" "${cache_packages_list}" "${universe_packages_list}" ) | |
| for i in "${!results[@]}"; do | |
| package="${results[$i]}" | |
| tags=($(grep "^${package}$" "${all_packages[@]}")) | |
| for j in "${!tags[@]}"; do | |
| package_file=$(basename "${tags[$j]%:*}") | |
| tags[$j]="${package_file%_packages.list}" | |
| done | |
| results[$i]="${package} [${tags[*]}]" | |
| done | |
| fi | |
| # Print all matching patterns with discovered sets. | |
| printf '%s\n' "${results[@]}" | |
| return 0 | |
| } | |
| main "$@" |