#!/bin/bash

# Copyright (c) 2010-2025, Lawrence Livermore National Security, LLC. Produced
# at the Lawrence Livermore National Laboratory. All Rights reserved. See files
# LICENSE and NOTICE for details. LLNL-CODE-806117.
#
# This file is part of the MFEM library. For more information and source code
# availability visit https://mfem.org.
#
# MFEM is free software; you can redistribute it and/or modify it under the
# terms of the BSD-3 license. We welcome feedback and contributions, see file
# CONTRIBUTING.md for details.

# Print usage information
case $1 in
   -h|-help)
      cat <<EOF

   $0 [-h|-help] {mfem_dir}

   where: {mfem_dir}  is the MFEM source directory [default value: ../..]
          -h|-help    prints this usage information and exits

   This script checks for compliance with mfem's .gitignore rules in mfem_dir.
   To be useful, the script should be run after the baseline (or similar) script.

   Example usage: $0 ../..

EOF
      exit
      ;;
esac

# Setup
cur_dir=`pwd`
mfem_dir=$1
if [ "$mfem_dir" = "" ]; then
    mfem_dir="../.."
fi
shift
cd $mfem_dir

# Verify that files removed by "make distclean" (e.g. files generated by running
# examples and miniapps) are ignored.
(git status -s | grep -v .gitignore) 1>&2

# Verify that no other files are being ignored, with the possible exception of
# OS-specific files.
make distclean
mv .gitignore .gitignore-bak
cat > .gitignore <<EOF
*.dSYM
.DS_Store
EOF
(git status -s | grep -v .gitignore) 1>&2
mv -f .gitignore-bak .gitignore

# Return to the original directory
cd $cur_dir

# Tell users what to do if the script fails
test_name="$(basename "$0")"
if [ -s "$test_name.err" ]; then
    cat >  $test_name.msg <<EOF

To correct this error, make sure that the .gitignore file is properly updated.

Generally, this file should contain exactly the files that can be generated from
the repository (via building + running) that we *do not* want in the repository.
(This way such files cannot be accidentally committed.)

In particular, make sure that:

1) All new executables and outputs from example/miniapp runs (e.g. mesh or
   solution files), are listed in .gitignore.
2) The patterns listed in .gitignore are the same as the ones that are deleted
   by 'make distclean'.
3) Nothing else is excluded from .gitignore.

Please contact a member of the MFEM team if you have questions.

EOF
fi
