

___x_cmd_gitb_add(){
    if [ "$#" -eq 1 ]; then
        ___x_cmd_gitb___add_one "$1"
    else
        ___x_cmd_gitb___cat_or_list "$@" | ___x_cmd_gitb___add_multi
    fi
}

___x_cmd_gitb___cat_or_list(){
    if [ "$#" -eq 0 ]; then
        ___x_cmd_cmds_cat
    elif [ "$1" = - ]; then
        ___x_cmd_cmds_cat
    else
        # TODO: make it into ___x_cmd_argslines
        local IFS="$___X_CMD_UNSEENCHAR_NEWLINE"
        printf "%s\n" "$*"
    fi
}

___x_cmd_gitb___add_multi(){
    local repo

    {
        x job failfast init "$___X_CMD_GIT_CONCURRENCY"
        while read -r repo; do
            x job failfast put x gitb add "$repo"
        done
    } | (
        x job failfast fini
    )
}

___x_cmd_gitb___add_one(){
    local target="${1:?Provide name}"

    case "$target" in
        *.git)  ;;
        *)      target="${target}.git"
    esac

    local ___X_CMD_GITB_BARE_PARSE_HOST
    local ___X_CMD_GITB_BARE_PARSE_PATH
    ___x_cmd_gitb_parse_ "$target" || {
        gitb:error "gitb___add_one: Abort for fail to parse: $target"
        return 1
    }

    local p="${___X_CMD_GITB_CACHE}/${___X_CMD_GITB_BARE_PARSE_HOST}/${___X_CMD_GITB_BARE_PARSE_PATH}"
    x ensurefp "$p"

    [ -d "$p" ] || command git clone --bare "$target" "$p"
}
