Last active 6 days ago

botanikanet revised this gist 6 days ago. Go to revision

1 file changed, 79 insertions

update_all_git_repo.sh(file created)

@@ -0,0 +1,79 @@
1 + #!/bin/bash
2 +
3 + usage() {
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 +
11 + find_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
21 + translated=()
22 + while (( $# )); 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
30 + done
31 + set -- "${translated[@]}"
32 +
33 + IGNORE_FOLDERS=""
34 + FLAG_SWITCH_TO_MAIN=""
35 +
36 + while 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
44 + done
45 +
46 + for DIR in $(find_folders)
47 + do
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
79 + done
Newer Older