| #!/bin/bash | 
 | # Copyright 2020 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=Other | 
 | ### execute ffx - future fx | 
 | ## See fx ffx help for more information. | 
 |  | 
 | 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 | 
 |  | 
 | # If this was invoked as `fx ffx`, we want the help output to say `fx ffx` instead | 
 | # of just `ffx`, but if something that called this already overrode the wrapper name, | 
 | # don't double-override it. Specifically, the .jiri_root/ffx script in most people's | 
 | # environment will set it for us. | 
 | FFX_WRAPPER_INVOKE=${FFX_WRAPPER_INVOKE:-fx ffx} | 
 | export FFX_WRAPPER_INVOKE | 
 |  | 
 | if is-remote-workflow-device; then | 
 |   fx-command-run host-tool ffx target add $(get-device-pair) | 
 | fi | 
 |  | 
 | # NOTE: this could be improved if it knew enough about ffx args to | 
 | # short-circuit once it hits a command, but not all global flags take arguments | 
 | # (e.g. -v, --help), so it would be hard to keep those in sync. For now we | 
 | # accept the concession that something other than the global --target flag | 
 | # being spelled exactly --target as an argument is highly unlikely. | 
 | found_target=false | 
 | args=( | 
 |   --config "sdk.root=${FUCHSIA_BUILD_DIR}" | 
 |   --config sdk.type=in-tree | 
 |   --config "repository.default=$(ffx-default-repository-name)" | 
 | ) | 
 |  | 
 | while [[ $# -gt 0 ]]; do | 
 |   arg="$1" | 
 |   args+=("$1") | 
 |   shift | 
 |  | 
 |   # Handle global flags explicitly, separating those which have parameters from | 
 |   # those that do not, searching for --target. As soon as a non-known argument | 
 |   # is discovered, pass all other flags as-is. | 
 |   # This case should be kept in sync with the ffx global flags. | 
 |   case "$arg" in | 
 |     # target special case. | 
 |     -t|--target) | 
 |       found_target=true | 
 |       args+=("$1") | 
 |       shift | 
 |       ;; | 
 |  | 
 |     # ffx global flags that have parameters. | 
 |     -c|--config|-e|--env|-T|--timeout|--machine) | 
 |       args+=("$1") | 
 |       shift | 
 |       ;; | 
 |  | 
 |     # ffx global flags that do not accept parameters. | 
 |     -v|--verbose|-h|--help) | 
 |       : | 
 |       ;; | 
 |  | 
 |     # Any other flag results in all flags being passed forward as-is and the | 
 |     # loop is terminated. | 
 |     *) | 
 |       args+=("$@") | 
 |       break | 
 |       ;; | 
 |   esac | 
 | done | 
 |  | 
 | if ! ${found_target}; then | 
 |   # Note: the quotes around get-device-raw are critical, if no fx default | 
 |   # device is set, we explicitly want to pass "" here. | 
 |   args=(--target "$(get-device-raw)" "${args[@]}") | 
 | fi | 
 |  | 
 | if [[ "${args[*]}" =~ "repository default" ]]; then | 
 |   fx-warn "Inside the Fuchsia tree, ffx has a repository specified by fx" | 
 |   fx-warn "Using default repositories via ffx repository default may have undefined behavior" | 
 |   fx-warn "See http://fxbug.dev/90067 for more information." | 
 |   fx-warn "Prefer:" | 
 |   fx-warn "   fx use" | 
 | fi | 
 |  | 
 | if [[ "${args[*]}" =~ "target default" ]]; then | 
 |   fx-warn "Inside the Fuchsia tree, ffx has a target specified by fx" | 
 |   fx-warn "Using default targets via ffx target default may have undefined behavior" | 
 |   fx-warn "See https://fxbug.dev/74963 for more information." | 
 |   fx-warn "Prefer:" | 
 |   fx-warn "   fx set-device" | 
 |   fx-warn "   fx get-device" | 
 |   fx-warn "   fx unset-device" | 
 | fi | 
 |  | 
 | fx-command-exec host-tool ffx "${args[@]}" |