Last active 4 days ago

Revision 1dbfb059397ae4035fe14553d2c8a89d5cce591d

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