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