#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

set -euo pipefail

# shellcheck source-path=SCRIPTDIR
source "$(dirname "${BASH_SOURCE[0]}")/lib/init.sh"

# binary-artifacts.sh -- Prevent compiled binaries from entering the repo.
#
# .gitignore catches common extensions (*.o, *.so, *.exe, *.out, etc.) but
# extensionless binaries slip through (e.g. `rust_out` from `rustc --test`).
#
# This script uses file(1) to inspect actual file content and reject:
#   - ELF executables, shared objects, and relocatables (Linux)
#   - Mach-O executables and universal binaries (macOS)
#   - PE32/PE32+ executables (Windows)
#   - WebAssembly modules, compiled Java classes, .NET assemblies
#
# Runs in two contexts:
#   pre-commit hook  -- checks filenames passed by pre-commit (--check files...)
#   CI workflow      -- checks PR diff files  (--check --ci)
#
# Exit codes: 0 = clean, 1 = binary artifacts found or error.

FILE_MODE="all"
FILES=()

while [[ $# -gt 0 ]]; do
  case "$1" in
    --check)
      shift
      ;;
    --ci)
      FILE_MODE="ci"
      shift
      ;;
    --help|-h)
      echo "Usage: $0 [--check] [--ci] [files...]"
      echo ""
      echo "File selection:"
      echo "  [none]    Check all tracked files (default)"
      echo "  --ci      Check files changed in PR (for CI)"
      echo "  [files]   Check specific files"
      exit 0
      ;;
    -*)
      echo "Unknown option: $1"
      echo "Use --help for usage information"
      exit 1
      ;;
    *)
      FILES+=("$1")
      shift
      ;;
  esac
done

get_files() {
  case "$FILE_MODE" in
    ci)
      if [ -n "${GITHUB_BASE_REF:-}" ]; then
        git fetch --no-tags --depth=1 origin "${GITHUB_BASE_REF}:${GITHUB_BASE_REF}" 2>/dev/null || true
        git diff --name-only --diff-filter=ACM "${GITHUB_BASE_REF}...HEAD"
      elif [ -n "${CI:-}" ]; then
        git diff --name-only --diff-filter=ACM HEAD~1
      else
        git ls-files
      fi
      ;;
    all)
      git ls-files
      ;;
  esac
}

if [ ${#FILES[@]} -gt 0 ]; then
  CHANGED_FILES=("${FILES[@]}")
else
  CHANGED_FILES=()
  while IFS= read -r file; do
    CHANGED_FILES+=("$file")
  done < <(get_files)
fi

if [ ${#CHANGED_FILES[@]} -eq 0 ]; then
  echo "No files to check"
  exit 0
fi

echo "Checking ${#CHANGED_FILES[@]} file(s) for binary artifacts..."

BINARY_PATTERN="ELF .* executable|ELF .* shared object|ELF .* relocatable|Mach-O .* executable|Mach-O universal binary|PE32\+ executable|PE32 executable|WebAssembly .* module|compiled Java class|\.NET assembly"

BINARY_FILES=()

for file in "${CHANGED_FILES[@]}"; do
  if [ ! -f "$file" ]; then
    continue
  fi

  file_type=$(file -b "$file" 2>/dev/null) || continue

  if echo "$file_type" | grep -qE "$BINARY_PATTERN"; then
    BINARY_FILES+=("$file")
  fi
done

if [ ${#BINARY_FILES[@]} -eq 0 ]; then
  echo "No binary artifacts found"
  exit 0
fi

echo "Found ${#BINARY_FILES[@]} binary artifact(s) that must not be committed:"
echo ""

for file in "${BINARY_FILES[@]}"; do
  file_type=$(file -b "$file" 2>/dev/null)
  echo "  $file"
  echo "    Type: $file_type"
  echo ""
done

echo "Binary artifacts (compiled executables, object files, shared libraries)"
echo "must not be checked into the repository. Remove them and add appropriate"
echo "patterns to .gitignore."
exit 1
