Spaces:
Running
Running
# gh-pages cleanup script: Switches to gh-pages branch, and removes all | |
# directories that aren't listed as remote branches | |
function deslash () { | |
# Recursively build a string of a directory's parents. E.g., | |
# deslashed "feature/test/branch" returns feature/test feature | |
deslashed=$(dirname $1) | |
if [[ $deslashed =~ .*/.* ]] | |
then | |
echo $deslashed $(deslash $deslashed) | |
else | |
echo $deslashed | |
fi | |
} | |
repository=origin | |
if [[ $1 != "" ]] | |
then | |
repository=$1 | |
fi | |
# Cache current branch | |
current=$(git rev-parse --abbrev-ref HEAD) | |
# Checkout most recent gh-pages | |
git fetch --force $repository gh-pages:gh-pages | |
git checkout gh-pages | |
git clean -fdx | |
# Make an array of directories to not delete, from the list of remote branches | |
branches=$(git ls-remote --refs --quiet $repository | awk '{print $2}' | sed -e 's/refs\/heads\///') | |
# Add parent directories of branches to the exclusion list (e.g. greenkeeper/) | |
for branch in $branches; do | |
if [[ $branch =~ .*/.* ]]; then | |
branches+=" $(deslash $branch)" | |
fi | |
done | |
# Dedupe all the greenkeepers (or other duplicate parent directories) | |
branches=$(echo "${branches[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ') | |
# Remove all directories that don't have corresponding branches | |
# It would be nice if we could exclude everything in .gitignore, but we're | |
# not on the branch with the .gitignore anymore... so we can't. | |
find . -type d \ | |
\( \ | |
-path ./.git -o \ | |
-path ./node_modules \ | |
$(printf " -o -path ./%s" $branches) \ | |
\) -prune \ | |
-o -mindepth 1 -type d \ | |
-exec rm -rfv {} \; | |
# Push | |
git add -u | |
git commit -m "Remove stale directories" | |
git push $repository gh-pages | |
# Return to where we were | |
git checkout -f $current | |
exit | |