# shellcheck shell=dash

___x_cmd_git_sync(){
    local origin="origin"
    local clean=

    while [ $# -gt 0 ]; do
        case "$1" in
            --origin)    origin="$2";   shift 2 ;;
            --clean|-c)  clean=1;       shift 1 ;;
            *)           break ;;
        esac
    done

    ___x_cmd_git_sync_run "$origin" "$@"
}

___x_cmd_git_sync_run(){
    ___x_cmd_git_meta_isclean || {
        [ -n "$clean" ] || {
            git:error "git-sync: not clean"
            return 1
        }

        if ___x_cmd_runmode_allow_manual; then  ___x_cmd___git_origin -i   -f -d
        else                                    ___x_cmd___git_origin      -f -d
        fi
        ___x_cmd___git_origin stash
    }

    ___x_cmd___git_origin fetch "$origin"
    ___x_cmd___git_origin pull --all --tags

    local curbranch; curbranch="$(x git meta branch)"

    [ "$#" -eq 0 ] || {
        git:info "setting [current-branch=$branch] to update"
        set -- "$@" "$curbranch"
    }

    local branch; for branch in "$@"; do
        git:info "updating [branch=$branch]"
        ___x_cmd___git_origin checkout "$branch"
        ___x_cmd___git_origin pull "$origin" "$branch"
        ___x_cmd___git_origin push "$origin" "$branch"
    done

    git:info "recover to the [branch=$branch] before updating"
    ___x_cmd___git_origin checkout "$curbranch"
}
