summaryrefslogtreecommitdiffstats
path: root/git-synk
blob: 602ea37c22044544a747b16c43008ea9bfb16bc6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#! /bin/sh

if [ $# -gt 0 ]; then GIT_REMOTE=$1; shift; fi
if [ $# -gt 0 ]; then GIT_BRANCH=$1; shift; fi
if [ $# -gt 0 ]; then USE_STASH=1; shift; fi

GIT_BASE=${GIT_BASE:-$HOME/usr/git}
GIT_REMOTE=${GIT_REMOTE:-origin}
GIT_BRANCH=${GIT_BRANCH:-master}
USE_STASH=${USE_STASH:-0}

RESET="\033[0m"
RED="\033[0;31m"
GREEN="\033[0;32m"
BROWN="\033[0;33m"
PURPLE="\033[0;35m"
CYAN="\033[0;36m"
YELLOW="\033[1;33m"

echo -e "remote: ${RED}$GIT_REMOTE${RESET}:${CYAN}$GIT_BRANCH${RESET}"
for gitdir in ${GIT_BASE}; do
    echo -e "enter ${BROWN}${gitdir}${RESET}" && cd ${gitdir} || return 1
    for dir in $(ls -1); do
        STASH=0
        [ -d ${dir} ] && [ -e ${dir}/.git/config ] || continue
        # SEARCH REMOTE
        echo -e "  enter ${BROWN}${dir}${RESET}" && cd $dir || exit 1
        git remote show ${GIT_REMOTE} >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo -e "    ${RED}${GIT_REMOTE} remote not found ${RESET}" && cd .. && continue
        fi
        # GC + CLEAN
        echo -ne "    ${CYAN}clean$RESET ... " && git gc 2>/dev/null && git diff --quiet && echo -e "${GREEN}OK${RESET}"
        if [ $? -ne 0 ]; then
            if [ $USE_STASH -eq 1 ]; then
                STASH=1
                echo -e "${RED}head is not clean, ${CYAN}git stash save${RESET}" && git stash save -q
            else
                echo -e "${RED}head is not clean, USE_STASH=0 ... ${CYAN}leave${RESET}" && cd .. && continue
            fi
        fi
        # PULL
        echo -ne "    ${CYAN}pull${RESET}: ${YELLOW}${GIT_REMOTE}${RESET}:${PURPLE}${GIT_BRANCH}${RESET} ... " && \
        git pull -q ${GIT_REMOTE} ${GIT_BRANCH} && echo -e "${GREEN}OK${RESET}"
        if [ $? -ne 0 ]; then
            echo -e "${RED}KO${RESET}" && cd .. && continue
        fi
        # PUSH
        echo -ne "    ${CYAN}push${RESET}: ${YELLOW}${GIT_REMOTE}${RESET}:${PURPLE}${GIT_BRANCH}${RESET} ... " && \
        git push -q ${GIT_REMOTE} ${GIT_BRANCH} && echo -e "${GREEN}OK${RESET}"
        if [ $? -ne 0 ]; then
            echo -e "${RED}KO${RESET}" && cd .. && continue
        fi
        if [ $STASH -eq 1 ]; then
            echo -e "    ${RED}was not clean, ${CYAN}git stash pop${RESET}" && git stash pop -q
        fi
        cd ..
    done
    echo -e "leave ${BROWN}${gitdir}${RESET}"
done