Skip to content

Commit

Permalink
feat: functionality improvements to util script (#112)
Browse files Browse the repository at this point in the history
pull-all-repos-in-directory enhancements:
* -q flag to make it less noisy
* -c flag so that it will do garbage collection and committed branch cleanup
* -d flag  so you can specify a top-level directory to run in

without any of these flags, behavior should be unchanged.
  • Loading branch information
deborahgu authored Feb 25, 2025
1 parent 483c6f8 commit 3b24510
Showing 1 changed file with 80 additions and 7 deletions.
87 changes: 80 additions & 7 deletions utils/pull-all-repos-in-directory.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,6 +1,41 @@
#!/bin/bash

################
GIT_CLEANUP=0
REPOSITORIES="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
DIR=$REPOSITORIES
QUIET_FLAG=""
QUIET_REDIRECT=""
UNCLEAN=()

usage()
{
echo "Usage: pull-all-repos-in-directory [ -d parent_dir ] [ -c ] [ -q ]"
echo " -d: top level directory if not location of script"
echo " parent_dir default: $REPOSITORIES"
echo " -c: git garbage collect, merged branch cleanup, etc"
echo " -q: make git be quiet"
exit 2
}

while getopts ":cqd:" opt; do
case ${opt} in
c )
GIT_CLEANUP=1
;;
q )
QUIET=1
QUIET_FLAG="--quiet"
# never redirect stderr
QUIET_REDIRECT="> /dev/null"
;;
d )
DIR=$OPTARG
;;
\? )
usage
;;
esac
done

sync_directory() {
IFS=$'\n'
Expand All @@ -9,19 +44,57 @@ sync_directory() {
do
if [ -d "$1/$REPO" ]
then
echo "Updating $1/$REPO at `date`"
if [ -d "$1/$REPO/.git" ]
if [ -e "$1/$REPO/.git" ]
then
git -C "$1/$REPO" pull
if [[ -z ${QUIET+x} ]]
then
echo "Updating $1/$REPO at `date`"
else
echo "$1/$REPO"
fi
cmd_flags=(-C "${1}/${REPO}")
if ! git "${cmd_flags[@]}" pull ${QUIET_FLAG}
then
UNCLEAN+=($REPO)
fi
if [ $GIT_CLEANUP = 1 ]
then
git ${cmd_flags[@]} gc ${QUIET_FLAG}
git ${cmd_flags[@]} remote prune origin
master_branch=$( git "${cmd_flags[@]}" symbolic-ref --short refs/remotes/origin/HEAD|cut -f2 -d'/' )
git -C "${1}/${REPO}" checkout -q ${master_branch}
for branch in $( git "${cmd_flags[@]}" for-each-ref refs/heads/ "--format=%(refname:short)")
do
mergeBase=$( git "${cmd_flags[@]}" merge-base ${master_branch} $branch)
rev=$( git "${cmd_flags[@]}" rev-parse "$branch^{tree}" )
committree=$( git "${cmd_flags[@]}" commit-tree ${rev} -p $mergeBase -m _ )
if [[ $( git "${cmd_flags[@]}" cherry ${master_branch} ${committree} ) == "-"* ]]
then
git -C "${1}/${REPO}" branch -D ${branch}
fi
$( git "${cmd_flags[@]}" checkout -q ${master_branch} )
done
if [[ -z ${QUIET+x} ]]
then
echo "Done at `date`"
fi
fi
else
sync_directory "$1/$REPO"
fi
echo "Done at `date`"
fi
done
}

REPOSITORIES="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

sync_directory $REPOSITORIES
if [[ ! -z ${QUIET+x} && ${GIT_CLEANUP} -eq 1 ]]
then
echo "WARNING: with both '-q' and '-c' the slow garbage collection on edx-platform might appear to hang. It will be fine."
fi
sync_directory $DIR

if [[ ${#UNCLEAN[@]} -gt 0 ]]
then
echo "The following directories weren't in clean state and couldn't be updated:"
echo ${UNCLEAN[@]}
fi

0 comments on commit 3b24510

Please sign in to comment.