# shellcheck shell=dash

___x_cmd_git_all(){
    local op="$1"; shift
    case "$op" in
        push|pull|track|upload|download)
            "___x_cmd_git_all_$op" "$@"
    esac
}

___x_cmd_git_all_download(){
    ___x_cmd_git_all_track "$@"
    ___x_cmd_git_all_pull "$@"
}

___x_cmd_git_all_upload(){
    ___x_cmd_git_all_push "$@"
}

# Actuall, we would better jsut track on source.
___x_cmd_git_all_track(){
    local name="${1:-origin}"
    ___x_cmd___git_trackall "$name"
}

___x_cmd_git_all_pull(){
    [ "$#" -ne 0 ] || set -- origin

    local name=""
    for name in "$@"; do
        git:info "fetching $name"
        ___x_cmd___git_origin fetch "$name"
        git:info "pulling $name"
        ___x_cmd___git_origin pull "$name"
    done
}

___x_cmd_git_all_push(){
    # ! ___x_cmd_git_is_empty || {
    #     git:warn "___x_cmd_git_backup_push abort: Git directory is empty."
    #     return 1
    # }

    local name=""
    for name in "$@"; do
        ___x_cmd_git_all_push___one "$name";
    done
}

___x_cmd_git_all_push___one(){
    local name="${1:?Provide name or url}"

    if ! ___x_cmd___git_origin push -u "$name" --all; then
        x:warn "Push In Force: git push -u -f $name --all"
        ___x_cmd___git_origin push -u -f "$name" --all
    fi

    if ! ___x_cmd___git_origin push -u "$name" --tags; then
        x:warn "Push In Force: git push -u -f $name --tags"
        ___x_cmd___git_origin push -u -f "$name" --tags
    fi
}

