#!/bin/bash
## ------------------------------------------------------------------------
##
## SPDX-License-Identifier: LGPL-2.1-or-later
## Copyright (C) 2014 - 2024 by the deal.II authors
##
## This file is part of the deal.II library.
##
## Part of the source code is dual licensed under Apache-2.0 WITH
## LLVM-exception OR LGPL-2.1-or-later. Detailed license information
## governing the source code and code contributions can be found in
## LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
##
## ------------------------------------------------------------------------

#
# This script does the same thing as contrib/utilities/indent-all but only
# reformats files which have changed (or have been added but neither
# staged/committed) since the last merge commit to the master branch.
#
# The script needs to be executed as
#   ./contrib/utilities/indent
# from the top-level directory of the source tree, or via
#   make indent
# from a build directory.
#
# The script can be invoked with DEAL_II_CLANG_FORMAT to change
# the default version of clang-format. For example:
#   DEAL_II_CLANG_FORMAT=clang-format-16.0 ./contrib/utilities/indent
# or,
#   make DEAL_II_CLANG_FORMAT="clang-format-16.0" indent
#
# Note: If the script is invoked with REPORT_ONLY=true set,
#   REPORT_ONLY=true ./contrib/utilities/indent
# or,
#   make REPORT_ONLY=true indent
# then indentation errors will only be reported without any actual file
# changes.
#

if [ ! -f contrib/utilities/indent ]; then
  echo "*** This script must be run from the top-level directory of deal.II."
  exit 1
fi

if [ ! -f contrib/utilities/indent_common.sh ]; then
  echo "*** This script requires contrib/utilities/indent_common.sh."
  exit 1
fi

source contrib/utilities/indent_common.sh

#
# Run sanity checks:
#

checks

#
# Process all source and header files:
#

process_changed "tests include source examples cmake/scripts contrib/python-bindings" ".*\.(cc|h)" format_file
process_changed "source" ".*\.inst.in" format_inst

#
# Fix permissions and convert to unix line ending if necessary:
#

process_changed "tests include source examples cmake/scripts contrib/python-bindings" \
  ".*\.(cc|h|inst.in|output.*|cmake)" fix_permissions

process_changed "doc/news/*/*" "[A-Za-z0-9]*" fix_permissions

process_changed "tests include source examples cmake/scripts contrib/python-bindings" \
  ".*\.(cc|h|inst.in|cmake)" dos_to_unix

process_changed "doc/news/*/*" "[A-Za-z0-9]*" dos_to_unix

#
# Removing trailing whitespace
#

process_changed "tests include source examples cmake/scripts contrib/python-bindings doc" \
  ".*\.(cc|h|html|dox|txt)" remove_trailing_whitespace

process_changed "doc/news/*/*" "[A-Za-z0-9]*" remove_trailing_whitespace

#
# Ensure only a single newline at end of files
#

process_changed "tests include source examples cmake/scripts contrib/python-bindings doc" \
  ".*\.(cc|h|html|dox|txt)" ensure_single_trailing_newline

process_changed "doc/news/*/*" "[A-Za-z0-9]*" ensure_single_trailing_newline
