Added folder based git fetch utility
This commit is contained in:
parent
7e851a0f9a
commit
79ed15f7ff
1 changed files with 69 additions and 0 deletions
69
multi-fetch.bashrc
Normal file
69
multi-fetch.bashrc
Normal file
|
@ -0,0 +1,69 @@
|
|||
#!/bin/bash
|
||||
# these two functions will recursively look for repos when they exist, and try to update their
|
||||
# head pointers.
|
||||
function ___doFetchCheck() {
|
||||
export IFS=$'\n'
|
||||
FMT_GRN="$(tput rev)$(tput setaf 2)"
|
||||
FMT_YLW="$(tput rev)$(tput setaf 3)"
|
||||
FMT_END="$(tput sgr0)"
|
||||
|
||||
DIR="$1"
|
||||
LEVEL=${2:-1}
|
||||
|
||||
DIR_BN="${DIR##*/}"
|
||||
git -C $DIR log -n0 2>/dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
# First try it's children in case it is a container
|
||||
FOUND=0
|
||||
if [[ $LEVEL -lt 2 ]]; then
|
||||
for DIR in $(find $DIR -mindepth 1 -maxdepth 1 -type d); do
|
||||
___doFetchCheck "$DIR" $(($LEVEL+1))
|
||||
if [[ $? -eq 0 ]]; then FOUND=1; fi
|
||||
done
|
||||
fi
|
||||
if [[ $FOUND -ne 0 ]]; then
|
||||
echo "${FMT_YLW} Skipping '$DIR_BN', not a git repo. ${FMT_END} "
|
||||
fi
|
||||
return 1
|
||||
# skipping as this isn't a valid GIT directory.
|
||||
fi
|
||||
|
||||
echo "${FMT_GRN} Fetching '$DIR_BN' ${FMT_END} "
|
||||
git -C $DIR fetch 2>/dev/null
|
||||
#BR_NAME="$(git -C $DIR branch --show-current)"
|
||||
# Check to see if we're sync'ed with the remote.
|
||||
# Test if HEAD exists
|
||||
git -C $DIR branch -r | grep /HEAD -q
|
||||
if [[ $? -eq 0 ]]; then
|
||||
TARGET_BRANCHES=($(git -C $DIR branch -r | grep -e /HEAD | sed 's_[^a-zA-Z0-9_]\+\([a-zA-Z0-9_]\+/HEAD\) .\+_\1_'))
|
||||
if [[ ${#TARGET_BRANCHES[@]} -eq 1 ]]; then
|
||||
TARGET_BRANCH=${TARGET_BRANCHES[0]}
|
||||
else
|
||||
TARGET_BRANCH=$(printf "%s\n" ${TARGET_BRANCHES[*]} | grep origin)
|
||||
fi
|
||||
else
|
||||
TARGET_BRANCH=$(git -C $DIR branch -r | grep -v -e ' ->' | \
|
||||
grep -e /main -e /develop | \
|
||||
head -1 | tr -d ' ')
|
||||
fi
|
||||
|
||||
git -C $DIR diff-index $TARGET_BRANCH --quiet
|
||||
if [[ $? -eq 1 ]]; then
|
||||
# Test to see if the tree is dirty or clean
|
||||
CHANGE_COUNT_INDEX=$(git -C $DIR diff --stat | wc -l)
|
||||
CHANGE_COUNT_TREE=$(git -C $DIR ls-files -o --exclude-standard | wc -l)
|
||||
if [[ $CHANGE_COUNT_INDEX -eq 0 && $CHANGE_COUNT_TREE -eq 0 ]]; then
|
||||
# Pull the updates if we're ready for them
|
||||
git -C $DIR pull -ff #&>/dev/null
|
||||
fi
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function -multi-fetch() {
|
||||
export IFS=$'\n'
|
||||
for DIR in $(find $REPOSITORY_SEARCH_BASE -mindepth 1 -maxdepth 1 -type d); do
|
||||
___doFetchCheck "$DIR"
|
||||
done
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue