1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
#!/bin/bash
### Shell configuration and script bootstrap
#
set -e
set -u
set -o pipefail
. `dirname $0`/_bootstrap.sh
### Define the help method
#
_showHelp()
{
cat <<EOF
Purpose:
Clean the git repository in an optimal fashion.
Supported CLI arguments:
-h/--help Show this help.
Usage:
Clean the git repositry:
$0
EOF
}
_showHelpAndExit()
{
_showHelp
exit
}
### Parse the CLI arguments
#
if [[ $@ =~ [-][-]help ]]; then
_showHelpAndExit
fi
while getopts ":br:" opt; do
case "$opt" in
h)
_showHelpAndExit
;;
?)
_fatalError "Unsupported argument: '-$OPTARG'. Run '$0 -h' to list supported arguments." $LINENO
;;
*)
_fatalError "Internal error (opt=$opt)" $LINENO
;;
esac
done
### Check for fast exit
#
if _isGitStatusIgnoredClean ; then
_echo "Git directory is already queaky clean."
exit
fi
### If there is a makefile present, just use that
#
if [ -f Makefile ]; then
make gitclean
if _isGitStatusIgnoredClean ; then
_echo "SUCCESS: Git directory cleaning completed (with 'make gitclean' with existing Makefile)."
exit
fi
fi
### If `make distclean` was already run, try to clean manually
#
# To do so, just use the configured `rm` commands in the main Makefile.am file to not duplicate the code.
#
find . -name Makefile.in -delete
cat Makefile.am | awk '/^clean-local-this-dir:/{p=1}/^$/&&p{exit}p' | tail -n+2 | source /dev/stdin
cat Makefile.am | awk '/^gitclean:/{p=1}/^$/&&p{exit}p' | tail -n+2 | source /dev/stdin
if _isGitStatusIgnoredClean ; then
_echo "SUCCESS: Git directory cleaning completed (manually)."
exit
fi
_echo "WARNING: Manual cleanup wasn't through enough for some reason, here are the files that remained:"
git status --ignored --short
### Do the full configuration and cleaning
#
./bootstrap.sh
./configure --enable-everything
make gitclean
if _isGitStatusIgnoredClean ; then
_echo "SUCCESS: Git directory cleaning completed (with 'make gitclean' with a freshly generated Makefile)."
exit
fi
_echo "ERROR: The following files weren't removed:"
git status --ignored --short
_fatalError "Unable to thoroughly clean the git directory."
|