
___x_cmd_docker_cmdinfo(){
    [ $# -gt 0 ]    ||  set -- --help

    local op="$1";  shift
    case "$op" in
        -h|--help)
            ___x_cmd help -m docker cmdinfo
            return 0
            ;;

        create|update|getlist|iscreated|hascmd|exist|cat)
            ___x_cmd_docker_cmdinfo_"$op" "$@"
            ;;

        *)
            N=docker M="Unsupport subcmd -> $op" log:ret:64
            ;;
    esac
}

___x_cmd_docker_cmdinfo_create(){
    ! ___x_cmd_docker_cmdinfo_iscreated "$@" || return 0
    ___x_cmd_docker_cmdinfo_update "$@"
}

___x_cmd_docker_cmdinfo_update(){
    local image="$1"
    local cmdinfofp="${___X_CMD_ROOT_DATA}/docker/image/$image/cmdinfo"

    ___x_cmd ensurefp "$cmdinfofp"

    ___x_cmd_docker_cmdinfo_getlist "$image" >"${cmdinfofp}"
}

___x_cmd_docker_cmdinfo_getlist(){
    local image="$1"
    ___x_cmd docker run --entrypoint '' --rm -it "$image" sh -c 'find `echo "$PATH:$HOME/.x-cmd.root/bin" | tr ":" "\n"` -maxdepth 1 -executable 2>/dev/null; return 0' | \
        ___x_cmd_cmds awk -v RS="[\r]?\n" -v ORS='\n' '{ print }'
}

___x_cmd_docker_cmdinfo_iscreated(){
    local image="$1"
    local cmdinfofp="${___X_CMD_ROOT_DATA}/docker/image/$image/cmdinfo"

    [ -f "$cmdinfofp" ]
}

___x_cmd_docker_cmdinfo_hascmd(){
    ___x_cmd_docker_cmdinfo_exist "$@"
}

___x_cmd_docker_cmdinfo_cat(){
    local image="$1"
    ___x_cmd_docker_cmdinfo_create "$@" || return $?
    local cmdinfofp="${___X_CMD_ROOT_DATA}/docker/image/$image/cmdinfo"
    ___x_cmd_cmds cat "$cmdinfofp"
}

___x_cmd_docker_cmdinfo_exist(){
    local image="$1"
    local binname="${2:-ls}"
    ___x_cmd_docker_cmdinfo_create "$image" || return $?

    local cmdinfofp="${___X_CMD_ROOT_DATA}/docker/image/$image/cmdinfo"

    local awkc='
{
    cmd = $NF; sub("\\..*$", "", cmd);
    if (cmd == binname) { code=0; exit(0); }
}
END{ exit(code) ; }
'

    <"$cmdinfofp" ___x_cmd_cmds awk -v FS='/' -v RS='[\r]?\n' -v binname="$binname" -v code=1 "$awkc"
}
