| #!/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 |
| ## dart: Dart source files |
| ## fidl: FIDL source 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 $? |
| fx-config-read |
| |
| 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');; |
| 'dart') SELECTED_FILE_TYPES+=('*.dart');; |
| 'fidl') SELECTED_FILE_TYPES+=('*.fidl');; |
| '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[@]}" |