mirror of https://github.com/YOURLS/YOURLS
233 lines
4.9 KiB
Bash
Executable File
233 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
####################################################################
|
|
# This file is part of YOURLS
|
|
#
|
|
# List (and remove) unneeded files for production
|
|
#
|
|
# Run this script when adding, updating or removing a 3rd party
|
|
# library that goes in the `vendor` directory.
|
|
#
|
|
# Typical use:
|
|
#
|
|
# $ composer update --no-dev --prefer-dist
|
|
# $ ./includes/vendor/build-script/yourls-build.sh ./includes/vendor
|
|
# $ commit & push
|
|
#
|
|
####################################################################
|
|
|
|
|
|
## OPTIONS ##########################################################
|
|
|
|
# This directories in /vendor won't be cleaned up
|
|
# Must be explicit names, case sensitive, no wildcard eg "README.*"
|
|
#
|
|
PRESERVE_IN_VENDOR=(
|
|
'composer'
|
|
'build-script'
|
|
'symfony'
|
|
)
|
|
|
|
# Files & dirs to keep in each library directory
|
|
# Must be explicit names, case sensitive, no wildcard eg "README.*"
|
|
#
|
|
PRESERVE_IN_LIB=(
|
|
'src'
|
|
'library'
|
|
'lib'
|
|
'Psr'
|
|
'README.md'
|
|
'readme.md'
|
|
'certificates'
|
|
)
|
|
|
|
# Nothing to edit past this line !
|
|
|
|
|
|
## VARS #############################################################
|
|
|
|
# Default values.
|
|
TESTRUN=true
|
|
|
|
# Colors and fancyness
|
|
RED='\033[0;31m'
|
|
NORM='\033[0m'
|
|
BOLD='\033[1m'
|
|
GREEN='\033[0;32m'
|
|
PURPLE='\033[0;35m'
|
|
|
|
# Set Script Name variable
|
|
SCRIPT=`basename ${BASH_SOURCE[0]}`
|
|
|
|
|
|
## FUNCS ############################################################
|
|
|
|
# Print help
|
|
rtfm () {
|
|
echo -e "\nUsage: "
|
|
echo -e " ${BOLD}${SCRIPT}${NORM} [-dh] <directory to cleanup>"
|
|
echo -e ""
|
|
echo -e "Examples: "
|
|
echo -e " ${BOLD}${SCRIPT}${NORM} [-dh] ."
|
|
echo -e " ${BOLD}${SCRIPT}${NORM} [-dh] /some/path/to/clean"
|
|
echo -e ""
|
|
echo -e "Options:"
|
|
echo -e " ${BOLD}-h${NORM} Display this ${BOLD}H${NORM}elp message"
|
|
echo -e " ${BOLD}-d${NORM} Actually ${BOLD}D${NORM}elete files flagged by this script"
|
|
echo -e ""
|
|
exit 1
|
|
}
|
|
|
|
|
|
# in_array NEEDLE HAYSTACK
|
|
# Return 0/1
|
|
in_array () {
|
|
local e
|
|
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
|
|
return 1
|
|
}
|
|
|
|
|
|
# Cleans the mess
|
|
cleanup () {
|
|
# Return if function called with no parameter
|
|
if [ -z "$1" ]
|
|
then
|
|
return
|
|
fi
|
|
|
|
# Directory we are in
|
|
CUR=$1
|
|
|
|
# Loop over each file and delete those we don't want to keep
|
|
echo -e "${PURPLE}Cleaning: $(basename $(dirname "$CUR"))/$(basename "$CUR") ${NORM}"
|
|
for FILE in $(ls -A $CUR)
|
|
do
|
|
|
|
if in_array $FILE "${PRESERVE_IN_LIB[@]}"
|
|
then
|
|
echo -e "${GREEN}+${NORM} KEEP: $FILE"
|
|
else
|
|
echo -e "${RED}-${NORM} DEL : $FILE"
|
|
maybe_delete "${CUR}${FILE}"
|
|
fi
|
|
|
|
done;
|
|
|
|
# If directory is empty, delete
|
|
if [ ! "$(ls -A $CUR)" ]
|
|
then
|
|
echo -e "${RED}-${NORM} del : $(basename "$CUR") (empty dir)"
|
|
maybe_delete "$CUR"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
}
|
|
|
|
# Delete file if not in test run
|
|
maybe_delete () {
|
|
if [ "$TESTRUN" = false ]
|
|
then
|
|
rm -rf "$1"
|
|
fi
|
|
}
|
|
|
|
# Check the number of arguments. If none are passed, print help and exit.
|
|
args_or_die () {
|
|
if [ $1 -eq 0 ]; then
|
|
rtfm
|
|
fi
|
|
}
|
|
|
|
|
|
## WORK #############################################################
|
|
|
|
# We should have some arguments
|
|
args_or_die "$#"
|
|
|
|
# Check options
|
|
while getopts "dh" opt; do
|
|
case $opt in
|
|
d)
|
|
TESTRUN=false
|
|
;;
|
|
h)
|
|
rtfm
|
|
;;
|
|
\?)
|
|
rtfm
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND-1)) #This tells getopts to move on to the next argument.
|
|
|
|
# Again, we should have some arguments after dealing with options if any
|
|
# Yes, this isn't perfect, there should be one test. Will do.
|
|
args_or_die "$#"
|
|
|
|
# Check for valid dir
|
|
if [ ! -d "$1" ]
|
|
then
|
|
echo -e "Need a valid directory, '${RED}$1${NORM}' is not."
|
|
rtfm
|
|
else
|
|
# Resolve directory (expand '.' or '../stuff' as full path)
|
|
TARGETDIR=$(cd "$1"; pwd)
|
|
fi
|
|
|
|
# Dry run notice if applicable
|
|
if [ "$TESTRUN" = true ]
|
|
then
|
|
echo -e "Test mode. ${RED}Nothing will be deleted${NORM}.\n"
|
|
echo -e "Use with ${RED}-d${NORM} if you are OK with the proposed changes (or clean up manually).\n"
|
|
fi
|
|
|
|
|
|
# 1. Get list of all directories in target directory, except the one
|
|
# listed in PRESERVE_IN_VENDOR that we don't want to touch
|
|
#
|
|
VENDORS=($(ls -d $TARGETDIR/*/))
|
|
TEMP=(${VENDORS[@]})
|
|
|
|
for (( i=0; i<${#VENDORS[@]}; i++ ))
|
|
do
|
|
DIR=$(basename "${VENDORS[i]}")
|
|
if in_array "$DIR" "${PRESERVE_IN_VENDOR[@]}"
|
|
then
|
|
unset TEMP[$i]
|
|
fi
|
|
done
|
|
|
|
VENDORS=(${TEMP[@]})
|
|
|
|
# 2. Loop over each directory and clean up
|
|
#
|
|
for DIR in ${VENDORS[@]}
|
|
do
|
|
SUBDIRS=$(ls -d $DIR*/ 2>/dev/null)
|
|
if [ ! -z "$SUBDIRS" ]
|
|
then
|
|
# This VENDORS directory has subdirectory: process each subdir
|
|
for SUBDIR in $SUBDIRS
|
|
do
|
|
cleanup $SUBDIR
|
|
done;
|
|
else
|
|
# This directory contains no subdirectory
|
|
cleanup $DIR
|
|
fi
|
|
done
|
|
|
|
# Exit reminder
|
|
if [ "$TESTRUN" = true ]
|
|
then
|
|
echo -e "(${GREEN}Nothing has been deleted${NORM})\n"
|
|
else
|
|
echo -e "... all done $GREEN ;) $NORM\n"
|
|
fi
|
|
|
|
|
|
|