-
Ray Schamp authored
Also break up find command into multiple lines
Ray Schamp authoredAlso break up find command into multiple lines
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
prune-gh-pages.sh 1.73 KiB
#!/bin/bash
# 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