| #!/bin/bash | |
| # Copyright 2021 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. | |
| # This script allows a non-shell fx command to execute another command | |
| # in a manner similar to fx-command-run for shell fx commands. This script is | |
| # not intended to be used by end users directly. | |
| # | |
| # Non-shell fx commands are commands that are implemented in languages like | |
| # Dart (eg fx test, fx status) and Rust (eg vdl, ffx). If these non-shell | |
| # commands need to execute another fx command, they should not execute | |
| # 'fx <command>', as this would not carry over the global flags from the | |
| # original invocation and could trigger metrics as if the user had executed | |
| # the command, which sways usage analysis. `fx-reentry` script solves it by | |
| # executing a command directly without interpreting any global flag and | |
| # without triggering metrics, while enforcing the original environment variables | |
| # set by the original invocation. | |
| # | |
| # Usage: | |
| # | |
| # fx-reentry <fx cmd> [args] Executes the given command using fx-command-exec | |
| # | |
| # fx-reentry -f <function> [args] Executes a vars.sh function directly with the given | |
| # arguments | |
| # | |
| # | |
| # This command will fail if it is executed without the environment variables | |
| # that the main fx entry point sets. Make sure the spawned process in your | |
| # chosen language inherits the environment that the original command received. | |
| # For example, in Dart, don't specify the 'environment' argument to | |
| # Process.run in https://api.dart.dev/stable/dart-io/Process/run.html, so that | |
| # it will inherit the environment of the parent process. Other languages have | |
| # similar ways to inherit the environment. | |
| if [[ -z "${FX_ENTRY_CMD}" ]]; then | |
| echo >&2 "ERROR: $0 can only be executed from a fx command." | |
| echo >&2 "If spawning a new process from a non-shell fx command, make sure" | |
| echo >&2 "you keep the environment of the original process, so that required" | |
| echo >&2 "environment variables set in the initial 'fx' call are defined." | |
| exit 1 | |
| fi | |
| if [[ -z "${FUCHSIA_DIR}" || ! -d "${FUCHSIA_DIR}" ]]; then | |
| echo >&2 "Invalid Fuchsia root dir: ${FUCHSIA_DIR}" | |
| exit 1 | |
| fi | |
| source "${FUCHSIA_DIR}/tools/devshell/lib/vars.sh" || exit $? | |
| is_valid_function() { | |
| declare -f "$1" > /dev/null | |
| } | |
| func=false | |
| if [[ "$1" == "-f" ]]; then | |
| func=true | |
| shift | |
| fi | |
| if [[ $# -eq 0 ]]; then | |
| fx-error "No command or function specified." | |
| exit 1 | |
| fi | |
| if $func; then | |
| if ! is_valid_function "$1"; then | |
| fx-error "Invalid function: $1" | |
| fx-error "Only functions in vars.sh are valid." | |
| exit 1 | |
| fi | |
| "$@" | |
| else | |
| fx-command-exec "$@" | |
| fi |