penguin/AstroJS

Javascript framework for my blog

devtools/replace-type.sh

raw ยท 1253 bytes

#!/usr/bin/env bash
set -euo pipefail

if [ "$#" -ne 1 ]; then
  echo "usage: $0 <TypeName>"
  echo "example: $0 System.utils.IKey"
  exit 1
fi

type_name="$1"
from="type {$type_name}"
to="type {typeof $type_name}"

mapfile -t files < <(git grep -l -F "$from" -- '*.js')

if [ "${#files[@]}" -eq 0 ]; then
  echo "No matches found for: $from"
  exit 0
fi

echo "Replacing:"
echo "  $from"
echo "with:"
echo "  $to"
echo

for file in "${files[@]}"; do
  echo "============================================================"
  echo "$file"
  echo "============================================================"

  git grep -n -F "$from" -- "$file" || true
  echo

  while true; do
    read -r -p "Replace in this file? [y/N/q/a] " ans
    case "$ans" in
      y|Y)
        perl -0pi -e 's/\Q'"$from"'\E/'"$to"'/g' "$file"
        echo "patched: $file"
        break
        ;;
      a|A)
        for f in "${files[@]}"; do
          perl -0pi -e 's/\Q'"$from"'\E/'"$to"'/g' "$f"
          echo "patched: $f"
        done
        exit 0
        ;;
      q|Q)
        echo "aborted"
        exit 0
        ;;
      ""|n|N)
        echo "skipped: $file"
        break
        ;;
      *)
        echo "Use y, n, q, or a."
        ;;
    esac
  done

  echo
done