Pular para o conteúdo
Development

O scan que se ofereceu para importar a si mesmo

Por Victor Da Luz
taurirustdev-loggreenhouse

O Greenhouse tem uma regra à qual eu sempre volto: nada é deletado, e nada é movido sem perguntar antes. Então, quando construí a peça que permite apontar o app para uma pasta onde você já tem projetos, em vez de uma pasta vazia e nova, o lado do engine foi desenhado da mesma forma. Ele escaneia a pasta, mostra o que encontrou, e só toca no disco depois que você diz sim.

Essa metade do engine na verdade foi construída semanas atrás, numa sessão diferente, e marcada como concluída. Essa semana, finalmente conectei ela a uma tela de verdade. E em cerca de cinco minutos testando de verdade, ela encontrou a si mesma.

O scan que escaneou a si mesmo

Apontei o scanner de importação para um vault recém-inicializado, a estrutura de pastas que o Greenhouse cria automaticamente para você, antes mesmo de você ter adicionado um único projeto. O scan voltou com nove resultados. Nove pastas que ele queria que eu atribuísse a um estágio do pipeline. Havia exatamente um projeto naquele vault: nenhum. Cada resultado era a própria estrutura interna do Greenhouse, a pasta de ideias, a pasta do vault, cada pasta de estágio que ele mesmo tinha acabado de criar.

A função de escaneamento em si estava correta. Ela faz exatamente uma tarefa: listar subpastas, pular qualquer coisa oculta. .greenhouse começa com ponto, então essa foi pulada corretamente. Mas nenhuma das pastas internas de trabalho do próprio app começa com ponto. Elas não são ocultas, são só internas. O scanner não tinha como saber que “interno” e “oculto” não são a mesma coisa, porque ninguém nunca tinha pedido para ele saber a diferença, o único teste que ele já tinha recebido era uma pasta cheia de subpastas de projeto comuns e genéricas. Um scan de um vault já inicializado era um cenário que simplesmente nunca tinha aparecido antes, porque nada nunca tinha chamado esse código com um vault real como entrada.

A correção é quase chata: a função de escaneamento genérica continua genérica, sem opinião nenhuma sobre o que é um “vault”. Uma camada acima, onde a configuração real já está carregada, construí a lista de exclusão, a pasta de ideias, a pasta do vault, cada estágio configurado, e filtrei ali em vez disso. Mantenha a ferramenta burra burra; deixe a camada inteligente ser inteligente.

A segunda versão do mesmo erro

Depois de corrigir isso, comecei a testar o que acontece depois que você realmente importa alguma coisa. Atribua uma pasta a um estágio, clique no botão, veja ela aparecer na sua lista de projetos. Então, por hábito, voltei e rodei o scan de novo.

A pasta que eu tinha acabado de importar ainda estava nos resultados. Se oferecendo para ser importada de novo.

Essa aqui teve uma explicação mais limpa quando pensei a respeito: importar uma pasta nunca a move. Isso é deliberado, o ponto inteiro é que nada rearranja fisicamente seus arquivos sem sua autorização. Mas uma listagem de pastas simples não tem como saber que “essa pasta agora está rastreada no banco de dados.” Ela só vê uma pasta, sentada exatamente onde sempre esteve, indistinguível de uma que nunca foi tocada. Detectar uma coisa e agir sobre uma coisa eram duas operações completamente separadas que não conversavam entre si, e eu só tinha construído um lado dessa conversa.

Mesmo formato de correção do primeiro bug: a camada que já tem tanto os resultados do scan quanto o banco de dados aberto checa cada candidato contra o que já está rastreado, e silenciosamente descarta os que já estão. O scanner genérico continua sem precisar saber nada sobre bancos de dados.

O que realmente provou que funcionou

Os dois eram o tipo de bug que um teste mockado passaria batido, porque um mock só retorna o que você mandou ele retornar, ele não consegue descobrir que suas suposições sobre “pasta vazia” ou “já importada” não batem com a realidade. Então o último passo foi rodar a coisa de verdade: uma pasta de vault real, semeada com duas subpastas reais, conduzida através do app compilado de verdade, sem simulação em nenhuma camada. Escanear, confirmar que as duas pastas aparecem. Importar uma de verdade. Checar que um arquivo real caiu no disco, não só uma linha no banco. Escanear de novo, confirmar que a importada sumiu e a outra não. Recarregar o dashboard, confirmar que o projeto importado está lá como um card de verdade, clicável.

Cada um desses passos era uma chance de um dos dois bugs ainda estar escondido ali. Nenhum estava, no fim, mas eu não teria confiado nisso sem ver acontecer de verdade.

Leitura relacionada

Development

A pasta que ficou parada

Uma revisão de código encontrou um invariante que a feature de adotar/importar do Greenhouse quebrava silenciosamente, e a correção que tornou tudo chato de novo.

Ler
Development

Três portas que nunca foram trancadas

Um CSP nulo, um valor de config unido a um caminho de arquivo sem checagem, e um seletor de vault que aceitaria seu diretório home, nada quebrado ainda, tudo destrancado.

Ler

Você também pode achar útil

Proton

Proton Mail

E-mail criptografado de ponta a ponta, com arquitetura de acesso zero.

Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).

Saiba mais
RackNerd

RackNerd VPS

Hospedagem VPS econômica para serviços leves que funcionam continuamente.

Como afiliado da RackNerd, ganho com compras qualificadas.

Saiba mais
Airalo

eSIM Airalo

eSIM de dados local para viagens - sem necessidade de trocar um SIM físico.

Este é meu link de indicação da Airalo. Você recebe um desconto no seu primeiro eSIM e eu ganho crédito da Airalo para o meu.

Saiba mais