12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #!/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
|