| #!/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=Source tree | |
| ### print lines in the Fuchsia and Zircon sources matching the given pattern | |
| ## usage: fx grep [options] <pattern> [-- type_filter...] | |
| ## | |
| ## Convenience wrapper around 'jiri grep' to search the Fuchsia and Zircon | |
| ## source tree and print lines matching the given pattern. | |
| ## | |
| ## Narrow your search to specific file types: | |
| ## c, cpp: C/C++ source and header files | |
| ## rs, rust: Rust source files | |
| ## py, python: Python source files | |
| ## go: Go source files | |
| ## dart: Dart source files | |
| ## fidl: FIDL source files | |
| ## service, config: Services configuration files | |
| ## cm, manifest: Component manifest files | |
| ## gn, build: GN build files | |
| ## md, doc: Documentation source files | |
| ## | |
| ## The following example searches both C++ and Python files for 'tcgetattr': | |
| ## fx grep tcgetattr -- cpp py | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $? | |
| set -e | |
| # Map supported options to list of file types | |
| SELECTED_FILE_TYPES=() | |
| get_type_list() { | |
| case $1 in | |
| 'c'|'cpp') SELECTED_FILE_TYPES+=('*.c' '*.cc' '*.cpp' '*.h' '*.hpp');; | |
| 'rs'|'rust') SELECTED_FILE_TYPES+=('*.rs');; | |
| 'py'|'python') SELECTED_FILE_TYPES+=('*.py');; | |
| 'go') SELECTED_FILE_TYPES+=('*.go');; | |
| 'dart') SELECTED_FILE_TYPES+=('*.dart');; | |
| 'fidl') SELECTED_FILE_TYPES+=('*.fidl');; | |
| 'service'|'config') SELECTED_FILE_TYPES+=('*.config');; | |
| 'cm'|'manifest') SELECTED_FILE_TYPES+=('*.cmx' '*.cml');; | |
| 'gn'|'build') SELECTED_FILE_TYPES+=('*.gn' '*.gni');; | |
| 'md'|'doc') SELECTED_FILE_TYPES+=('*.md');; | |
| *) fx-error "Unsupported file type: $1" && fx-command-help && exit 1;; | |
| esac | |
| } | |
| # Separate grep arguments from file filters | |
| COMMAND_OPTS=() | |
| while [[ $# -gt 0 ]]; do | |
| case "$1" in | |
| --help|-h) | |
| fx-command-help | |
| exit 0 | |
| ;; | |
| --) | |
| shift | |
| break | |
| ;; | |
| -*) | |
| COMMAND_OPTS+=( $1 ) | |
| shift | |
| ;; | |
| *) | |
| COMMAND_QUERY="$1" | |
| shift | |
| ;; | |
| esac | |
| done | |
| # Check arguments for a valid query pattern | |
| if [[ -z "$COMMAND_QUERY" ]]; then | |
| # No pattern argument available | |
| fx-error "grep requires a query pattern" | |
| fx-command-help | |
| exit 1 | |
| fi | |
| # Check filter arguments | |
| for i in "$@"; do | |
| get_type_list "$i" | |
| done | |
| # Build pathspec from chosen file types | |
| FILTER_ARGS=() | |
| if [[ ${#SELECTED_FILE_TYPES[@]} -ne 0 ]]; then | |
| # Search selected file types | |
| FILTER_ARGS+=(--) | |
| for i in "${SELECTED_FILE_TYPES[@]}"; do | |
| FILTER_ARGS+=( ":/**/${i}" ) | |
| done | |
| fi | |
| fx-command-run jiri grep "${COMMAND_OPTS[@]}" "${COMMAND_QUERY}" "${FILTER_ARGS[@]}" |