Last active 6 days ago

Revision 78ca3025e28c4ad180b1032a1bb5eb9ce98b1921

update_all_git_repo.sh Raw
1#!/bin/bash
2
3usage() {
4 echo "Usage ${0} [[--ignore|-i] dir_name] [--main]"
5 echo " --help Show this help"
6 echo " --main Checkout to main branch"
7 echo " --ignore=* Ignore folders"
8 exit 1
9}
10
11find_folders() {
12 set -- ./ -name ".git" -type d
13 for IGNORE_FOLDER in ${IGNORE_FOLDERS}
14 do
15 set -- "$@" -not -path '"*/'${IGNORE_FOLDER}'/*"'
16 done
17 find $@
18}
19
20# Map long options to short ones and rebuild argv
21translated=()
22while (( $# )); do
23 case "$1" in
24 --help) translated+=("-h"); shift ;;
25 --main) translated+=("-m"); shift ;;
26 --ignore=*) translated+=("-i" "${1#*=}"); shift ;;
27 --) translated+=("--"); shift; translated+=("$@"); set -- ;;
28 *) translated+=("$1"); shift ;;
29 esac
30done
31set -- "${translated[@]}"
32
33IGNORE_FOLDERS=""
34FLAG_SWITCH_TO_MAIN=""
35
36while getopts ":hmi:" opt; do
37 case "$opt" in
38 h) usage;;
39 m) FLAG_SWITCH_TO_MAIN=1;;
40 i) IGNORE_FOLDERS="${IGNORE_FOLDERS} ${OPTARG}";;
41 :) echo "Missing arg for -$OPTARG"; usage;;
42 \?) echo "Invalid option: -$OPTARG"; usage;;
43 esac
44done
45
46for DIR in $(find_folders)
47do
48 pushd ${PWD} > /dev/null
49 echo "[DEBUG] Work with $(dirname ${DIR})"
50 cd $(dirname ${DIR})
51 if [[ -n $(git status --porcelain) ]]
52 then
53 echo "[WARN] There are uncommitted changes."
54 declare UNCOMMIT_CHANGES=1
55 git stash
56 fi
57 declare MASTER_BRANCH="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')"
58 declare CURRENT_BRANCH="$(git branch --show-current)"
59 if [[ "$MASTER_BRANCH" == "$CURRENT_BRANCH" ]]
60 then
61 git pull --all
62 git remote prune origin
63 else
64 git checkout ${MASTER_BRANCH}
65 git pull --all
66 git remote prune origin
67 if [[ -z "${FLAG_SWITCH_TO_MAIN}" ]]
68 then
69 git checkout ${CURRENT_BRANCH} || echo "[WARN] current brach has been deleted"
70 fi
71 fi
72 git branch --merged | grep -v "^*\|${MASTER_BRANCH}" | xargs -r git branch -D
73 if [ ! -z "$UNCOMMIT_CHANGES" ]
74 then
75 git stash pop
76 fi
77 unset UNCOMMIT_CHANGES MASTER_BRANCH CURRENT_BRANCH
78 popd > /dev/null
79done
80