#!/bin/bash
# Copyright 2018 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
### runs source formatters on modified files

## Usage: fx format-code
##           [--dry-run] [--verbose] [--all]
##           [--files=FILES,[FILES ...]]
##           [--target=GN_TARGET]
##           [--git] [--changed-lines] [-- PATTERN]
##
##   --dry-run Stops the program short of running the formatters
##   --all     Formats all code in the git repo under the current working
##             directory.
##   --args    Formats the configured build's |args.gn|
##   --files   Allows the user to specify files.  Files are comma separated.
##             Globs are dealt with by bash; fx format-code "--files=foo/*" will
##             work as expected.
##   --target  Allows the user to specify a gn target. If the template for the
##             given target is defined in a .gni file, the files to format may
##             be forwarded to another target, and specifying the target may not
##             work.  The workaround is to pass the target to which the files
##             are forwarded, instead.  Specifically, as of January 2023, you
##             can only use this with rustc binary and library targets by
##             appending ".actual" to them.
##   --git     The default; it uses `git diff` against the newest parent
##             commit in the upstream branch (or against HEAD if no such commit
##             is found).  Files that are locally modified, staged or touched by
##             any commits introduced on the local branch are formatted.
##   --changed-lines
##             Format changed lines only. Only supported on a subset of languages
##             (currently, just C++). Unsupported languages will continue to have
##             the entire file formatted. "Changes" are relative to the git
##             commit that would be used by "--git".
##   --parallel
##             Formats all files in the background rather than waiting on each one
##             before starting the next.
##             WARNING: with this flag enabled, output from multiple formatters
##             may be interleaved, and format-code will exit with status 0 even
##             if some formatters failed.
##   --verbose Print all formatting commands prior to execution.
##    -- PATTERN
##             For --all or --git, passes along -- PATTERN to `git ls-files`
##             to filter what files are affected. For example, to format all
##             rust source files use `fx format-code --all -- "*.rs"`
##
## Supported Languages: C, C++, cml, Dart, FIDL, GN, Go, Python, Rust, JSON

set -e

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?

function usage() {
  fx-command-help
}

function zap-commas() {
  printf %s "$1" | tr ',' '\n'
}

function get-diff-base() {
  local upstream=$(git rev-parse --abbrev-ref --symbolic-full-name "@{u}" 2>/dev/null)
  if [[ -z "${upstream}" ]]; then
    # Make sure upstream is always an ancestor commit.
    if git merge-base --is-ancestor origin/main HEAD; then
      upstream="origin/main"
    elif git merge-base --is-ancestor JIRI_HEAD HEAD; then
      if git merge-base --is-ancestor JIRI_HEAD origin/main; then
        # You may have some merged CLs in your checkout between JIRI_HEAD and origin/main
        upstream=$(git merge-base HEAD origin/main)
      else
        upstream="JIRI_HEAD"
      fi
    else
      upstream="HEAD"
    fi
  fi
  local local_commit=$(git rev-list HEAD ^${upstream} --  2>/dev/null | tail -1)
  if [[ -z "${local_commit}" ]]; then
    printf "HEAD"
  else
    git rev-parse "${local_commit}"^
  fi
}

# Execute a command, printing it first if VERBOSE is set.
function print-and-execute() {
  if [[ -n "${VERBOSE}" ]]; then
    echo "$@"
  fi
  "$@"
}

# Format the given C++ file.
function format-cc-file() {
  if [[ -n ${CHANGED_LINES} ]]; then
    # Only update changed lines.
    local changed_line_commands=$(git-print-changed-lines "$1" "--lines=%dF:%dL ")
    if [[ -n ${changed_line_commands} ]]; then
        print-and-execute ${CLANG_CMD} ${changed_line_commands} "$1"
    fi
  else
    # Update entire files.
    print-and-execute ${CLANG_CMD} "$1"
  fi
  # Unconditionally update header guards.
  if [[ $1 =~ .*\.h ]]; then
    print-and-execute ${FIX_HEADER_GUARDS_CMD} "$1"
  fi
}

# Run the given format command on a single file, warning if "CHANGED_LINES" is set.
function format-full-file() {
  local command="$1"
  local file="$2"
  if [ -n "${CHANGED_LINES}" ]; then
    echo "Warning: cannot format only modified lines; formatting full file ${file}" >&2
  fi
  print-and-execute ${command} "${file}"
}

# Format the given file.
function format-file() {
  filename="$(basename "$1")"
  case "${filename}" in
    *.c | *.cc | *.cpp | *.h | *.hh | *.hpp | *.proto | *.ts)
      format-cc-file "$1" ;;
    *.config) format-full-file "${JSON_FMT_CMD}" "$1" ;;
    *.json) format-full-file "${JSON_FMT_CMD}" "$1" ;;
  esac
}

# Removes leading //, resolves to absolute path, and resolves globs.  The first
# argument is a path prefix, and the remaining arguments are relative to that
# path prefix.
#
# When calling this function, it is usually a good idea to set IFS to something
# that is not likely to be contained in a filename being canonicalized (e.g.,
# IFS=$'\n')
function canonicalize() {
  local root_dir="$1"
  shift
  for fileglob in "${@}"; do
    # // means it comes from gn, [^/]* means it is relative
    if [[ "${fileglob}" = //* || "${fileglob}" = [^/]* ]]; then
      local dir="${root_dir}"/
    else
      local dir=""
    fi
    for file in "${dir}""${fileglob#"//"}"; do
      printf "${file}\n"
    done
  done
}

ARGS_GN=
DRY_RUN=
VERBOSE=
CHANGED_LINES=
PARALLEL=
FILES_SPECIFIED=

fx-config-read

GET_FILES=get_git_files
while [ $# -gt 0 ]; do
  ARG="$1"
  case "$1" in
    --args) ARGS_GN="1" ;;
    --parallel) PARALLEL="1" ;;
    --verbose) VERBOSE="1" ;;
    --dry-run) DRY_RUN="1" ;;
    --changed-lines) CHANGED_LINES="1" ;;
    --all)
      GET_FILES=get_all_files
      ;;
    --git)
      GET_FILES=get_git_files
      ;;
    --files=*)
      FILES_SPECIFIED="1"
      GET_FILES=:
      OLDIFS=$IFS && IFS=$'\n' \
      && FILES=( \
        $(canonicalize "${PWD}" $(zap-commas "${ARG#--files=}")) \
      ) \
      && IFS=$OLDIFS
      ;;
    --target=*)
      GET_FILES=:
      OLDIFS=$IFS && IFS=$'\n' \
      && FILES=( \
        $(canonicalize "${FUCHSIA_DIR}" \
          $(fx-gn desc "${FUCHSIA_BUILD_DIR}" "${ARG#--target=}" sources)) \
      ) \
      && IFS=$OLDIFS
      ;;
    --) break ;;
    *) usage && printf "Unknown flag %s\n" "${ARG}" && exit 1 ;;
  esac
  shift
done

GIT_FILTER=(
  "$@"
  ":(top,exclude)third_party/golibs/vendor"
  ":(top,exclude)third_party/rust_crates"
  ":(top,exclude)src/devices/tools/fidlgen_banjo/tests"
  ":(top,exclude)src/devices/tools/fidlgen_banjo/src/backends/templates/rust"
  ":(top,exclude)build/bazel/fuchsia_idk/validation_data"
  ":(exclude)*/goldens/*"
)

get_git_files() {
  OLDIFS=$IFS && IFS=$'\n' \
    && FILES=( \
    $(canonicalize $(git rev-parse --show-toplevel) \
      $(git diff --name-only $(get-diff-base) "${GIT_FILTER[@]}")) \
    ) \
    && IFS=$OLDIFS
}

get_all_files() {
  OLDIFS=$IFS && IFS=$'\n' && FILES=( \
    $(canonicalize "${PWD}" $(git ls-files "${GIT_FILTER[@]}")) \
  ) \
  && IFS=$OLDIFS
}

# Print lines changed in the given file.
#
# "Changes" are calculated relative to `git-diff-base`.
git-print-changed-lines() {
  # Have git run `/usr/bin/diff` on the input file.
  #
  # We in turn ask `diff` to print for each new or modified line the format
  # string in `$2`. Details about the format string can be found in the man
  # page for diff, under `--new-group-format`.
  git difftool -y \
    -x "diff --new-group-format='$2' --line-format=''" \
    $(get-diff-base) -- "$1"
}

$GET_FILES

if [[ $ARGS_GN == "1" ]]; then
  FILES+=( "${FUCHSIA_BUILD_DIR}/args.gn" )
fi

if [[ -n "${VERBOSE}" ]]; then
  printf "Files to be formatted:\n%s\n" "${FILES[@]}"
fi

readonly PY_TOOL="${FUCHSIA_DIR}/scripts/fuchsia-vendored-python"
readonly CLANG_CMD="${PREBUILT_CLANG_DIR}/bin/clang-format -style=file -fallback-style=Google -sort-includes -i"
readonly JSON_FMT_CMD="${PY_TOOL} ${FUCHSIA_DIR}/scripts/style/json-fmt.py --no-sort-keys --ignore-errors --quiet"
readonly FIX_HEADER_GUARDS_CMD="${PY_TOOL} ${FUCHSIA_DIR}/scripts/style/check-header-guards.py --fix"

# Mapping from tool name to a list of extensions for files to which the tool
# applies. Used to determine which tools to compile just-in-time based on the
# files that are being formatted.
#
# Not all supported Bash versions support associative arrays (a.k.a. hash
# tables), so instead use an array of specially-formatted strings, with keys and
# values separated by an equals sign and repeated values separated by spaces.
compiled_formatter_extensions=(
  "cmc=.cml"
  "doc-checker=.md"
  "fidl-format=.fidl"
  "formatjson5=.json5 .persist .triage"
  "gidl-format=.gidl"
)

# If a required formatter does not exist, but can be built, build it.
tool_targets=()
for entry in "${compiled_formatter_extensions[@]}"; do
  tool="${entry%%=*}"
  extensions="${entry##*=}"
  needed=false
  for file in "${FILES[@]}"; do
    for ext in ${extensions}; do
      if [[ ${file} = *${ext} ]]; then
        needed=true
      fi
    done
  done

  if $needed; then
    tool_path="$( fx-command-run list-build-artifacts --expect-one --name "${tool}" tools )"
    if [[ ! -x "${FUCHSIA_BUILD_DIR}/${tool_path}" ]]; then
      fx-info "${tool} not built; building now..."
      tool_targets+=("$tool_path")
    fi
  fi
done

if [[ ${#tool_targets[@]} -gt 0 ]]; then
  fx-command-run build "${tool_targets[@]}"
fi

[[ -n "${DRY_RUN}" ]] && exit

# Format files.
shac_files=()
for file in "${FILES[@]}"; do
  # Git reports deleted files, which we don't want to try to format
  if [[ ! -f "${file}" ]]; then
    # If files were specified on the command line rather than retrieved via Git,
    # report missing files as errors.
    if [[ -n "${FILES_SPECIFIED}" ]]; then
      fx-error "no such file: ${file}"
    fi
    continue
  fi
  shac_files+=("$file")

  if [[ -n "$PARALLEL" ]]; then
    format-file "${file}" &
  else
    format-file "${file}"
  fi
done

# shac is git-aware and determines which shac.star files to run using `git
# ls-files`. However, if the current working directory's git repo doesn't
# contain a shac.star file, then shac will fail. In that case we should fall
# back to using the shac.star file from fuchsia.git.
shac_workdir="$FUCHSIA_DIR"
if [[ "$(git rev-parse --is-inside-work-tree 2> /dev/null)" == "true" ]] && \
    [ -f "$(git rev-parse --show-toplevel)/shac.star" ]; then
  shac_workdir="$(pwd)"
fi

# TODO(https://fxbug.dev/42162946): Move all formatters into SHAC to ensure parity between
# the formatters enforced by the infrastructure and those enforced locally.
print-and-execute "${PREBUILT_SHAC}" fmt \
  --quiet \
  -C "${shac_workdir}" \
  --var fuchsia_build_dir="${FUCHSIA_BUILD_DIR#"$FUCHSIA_DIR/"}" \
  "${shac_files[@]}"

[[ -n "$PARALLEL" ]] && wait

# The last thing this script does is often the [[ -n "${hgcmd}" ]], which will
# often return a non-zero value.  So, we force the script to return 0 and rely
# on "set -e" to catch real errors.
exit 0
