Detalhes

problema: kw bd doesn't support --remote

Basicamente , o comando para instruir o kw a dar build e deploy não funcionava quando recebia alguma flag tanto do build quanto do deploy (aparentemente isso foi feito de propósito e , como apontado pela contribuidora melissawen, very bad UX)

Minha ideia , primeiramente era fazer o kw bd aceitar as flags do deploy e depois,em um próximo patch ,aceitar flags do build,como orientado pelo David. A função "parse_build_and_deploy_options()" pega todas flags que são digitadas atráves do comando kw bd e jogam elas no limbo , retornando um erro de flag invalida, para fazer o kw bd aceitar as flags do deploy foi nessecário remover essa função e alguns tratamentos de erros dela. Resposta que obtive :

Portanto,decdidi fazer um patch que aceita as flags tanto do build quanto do deploy, com exeção das flags que não devem ser permitidas segundo o Siqueira

Assim , para fazer essa mudança tive que rerfomular a função "parse_build_and_deploy_options()" de modo que ela filtre as flags do deploy e do build , junto com seus respectivos argumentos , e coloque em duas Strings de deploy e de build

alteração :


            function parse_build_and_deploy_options()
            {
              #build options
              local long_options='help,ccache,cpu-scaling:,warnings::,save-log-to:,llvm,verbose,cflags:'
              local short_options='h,S:,w::,s:'
              local file_name_size
            
              # #deploy options
              long_options+=',remote:,local,reboot,no-reboot,modules,force,setup,
              verbose,create-package,from-package:,boot-into-new-kernel-once'
              short_option+=',r,m,f,v,p,F:,n'
            
              options="$(kw_parse "$short_options" "$long_options" "$@")"
              if [[ "$?" != 0 ]]; then
                options_values['ERROR']="$(kw_parse_get_errors 'kw bd' "$short_options" \
                  "$long_options" "$@")"
                return 22 # EINVAL
              fi
            
              while [[ "$#" -gt 0 ]]; do
                case "$1" in
                  --help | -h)
                    # build_and_deply_help "$1"
                    build_and_deploy_help "$1"
                    exit
                    ;;
                  --menu | -n)
                    build_options+="$1 "
                    shift
                    ;;
                  --cpu-scaling | -S)
                    build_options+="$1 $2 "
                    shift 2
                    ;;
                  --ccache)
                    build_options+="$1 "
                    shift
                    ;;
                  --llvm)
                    build_options+="$1 "
                    shift
                    ;;
                  --cflags)
                    build_options+="$1 $2 "
                    shift 2
                    ;;
                  --verbose)
                    build_options+="$1 "
                    deploy_options+="$1 "
                    shift
                    ;;
                  --warnings | -w)
                    # Handling optional parameter
                    if [[ "$2" =~ [0-9]+ ]]; then
                      build_options+="$1 $2 "
                      shift 2
                    else
                      build_options+="$1 "
                      shift
                    fi
                    ;;
                  --save-log-to | -s)
                    build_options+="$1 $2 "
                    shift 2
                # After this line , we have deploy options
                ;;
                  --remote)
                    deploy_options+="$1 $2 "
                    shift 2
                    ;;
                  --local)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --reboot | -r)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --no-reboot)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --modules | -m)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --force | -f)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --create-package | -p)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --from-package | -F)
                    deploy_options+="$1 $2 "
                    shift 2
                    ;;
                  --boot-into-new-kernel-once | -n)
                    deploy_options+="$1 "
                    shift
                    ;;
                  --)
                    shift
                    ;;
                  *)
                    return 22 # EINVAL
                    ;;
                esac
              done
            }
        

Pull request:

A maneira que eu testei esse PR foi absurdamente ineficiente,pois aparentemente os arquivos txt mentem para voçê, eu passava a String deploy options e a String build options para um arquivo deploy.txt e build.txt , respectivamente , lá eu análisa como os argumentos estavam formatados e com isso eu suponhava como iria funcinar se eu jogasse no kw bd

Resposta do PR:

O problema era como os espaços entre os argumentos eram tratados no meu código

          
            build_options+="$1 "
          
        

quando só existia um argumento, o argumento ficava com um espaço,o mesmo ocorria com o ultimo argumento,para resolver isso , bastava eu usar arrays no lugar de Strings como armazenador de strings,já que o espaçamento vai ser por cada elemento do array

novo método de guardar os argumentos

          
            build_options+=("$1")
          
        

Depois de duas semanas , recebo o feedback:

          
     while [[ "$#" -gt 0 ]]; do

    case "$1" in
      --help | -h)
        # build_and_deply_help "$1"
        build_and_deploy_help "$1"
        exit
        ;;
      --cpu-scaling | -S)
        build_options+=("$1" "$2")
        shift 2
        ;;
      --ccache)
        build_options+=("$1")
        shift
        ;;
      --llvm)
        build_options+=("$1")
        shift
        ;;
      --cflags)
        build_options+=("$1" "$2")
        shift 2
        ;;
      --verbose)
        build_options+=("$1")
        deploy_options+=("$1")
        shift
        ;;
      --warnings | -w)
        # Handling optional parameter
        if [[ "$2" =~ [0-9]+ ]]; then
          build_options+=("$1" "$2")
          shift 2
        else
          build_options+=("$1")
          shift
        fi
        ;;
      --save-log-to | -s)
        build_options+=("$1" "$2")
        shift 2
        #after this line only deploy options
        ;;
          
        

Basicamente , o Siqueira quer que tratamos os argumentos do kw bd dentro das funções de tratamentos de argumentos do kw b e do kw d invés de criar uma função que trata esses argumentos dentro do próprio arquivo do kw bd, pois , segundo ele , isso ficaria mais fácil de manter , já que todos argumentos do kw b, seriam automáticamente adicionados no kw bd, o mesmo com kw .

Depois de mandar o PR errado e concertar o PR, fui orientado a apagar tudo que eu fiz e fazer tudo de novo de uma maneira diferente

comecei a me questionar sobre o pensamento do siqueira , primeiro pensei , mas nem todos argumentos do kw b e do kw d ,são aceitos pelo kw bd , como o Siqueira, mencionou,certo?

Além disso , certos argumentos devem ser tratados dentro do próprio kw bd, por exemplo o kw bd --help, que deve ser chamando dentro do arquivo kw bd,pois lá , tem a função help

Mesmo com esses casos , cheguei a conclusão que dava para fazer uma gambiarrazada para resolver isso,porém quando fui tentar colocar a solução em prática,percebi que o código ficara uma completa infelicidade , para não falar outra coisa , cheio de duplicações e adicionava 100 linhas a mais, isso tornava o código completamente o oposto do que o Siqueira comentou.

A única solução que pensei foi , passar todos argumentos para a função kw b e a função kw d, e basicamente fazer o que eu fazia dentro do kw bd nessas funções,porém,eu precisaria, tratar tanto os argumentos do build quanto do deploy, em um mesmo arquivo , por exemplo, no kw b , eu teria o while tratando os casos do deploy,não só o do build, porém, somente jogando fora os argumentos do deploy. Isso não ficaria fácil de manter , pois ao adicionar novos argumentos no build , teriamos que adicionar esses mesmo argumentos dentro do while do arquivo do kw d.

Não sei se o Siqueira pensou na dificuldade de fazer isso de uma maneira otimizada ou se mesmo pensou em como fazer isso,talvez ele só tenha jogado a ideia no ar mesmo.Todavia , até o momento atual , não consegui pensar em algo otimizado para resolver isso.

Pedido de esclarecimento para o Siqueira :

Respota do Siqueira:

Entendi mais ou menos a idea que o Siquera tinha na cabeça , mas na hora de implementar essa idea é que o bicho pega! A implementação dessa idea causa diversos conflitos com a estruturação do próprio projeto, tentei diversas alternativa para ludibriar esses problemas , mas sempre surgia outro...

Um dos problemas que encontrei no caminho foi o kw parse, dentro da própria parser_build_shared eu teria que colocar as flags do deploy nas variaveis long_options e short_options, o mesmo vale para a futura função parser_deploy_shared, tal fato levaria a depência de um arquivo com outro , não queremos isso! Encontrei um jeito de burlar isso( mais ou menos) dentro do tratamento dos argumentos do parser_build_shared(), tudo que não era flag do build do caso da shared , era tratado como possível flag do deploy,armazenando essas flags em um array global e ,depois , passando para o parser_deploy_shared(). Porém, esse modo entrava em conflito com o próprio código do kd build, como a função parser_build_shared() faz parte do kw build , caso o usuário passe um flag que não comece com "--" , ou seja , invalida , essa função tem que ser responsável por retornar um erro, mas ai que vem a confusão , existem flags no deploy que precisam de argumentos obrigatórios , e esses argumentos vem no formato sem o "--" , logo , nosso while case vai identificar isso como um erro.

Ainda com duvida sobre a implementação desse pseudocódigo...