-
Status: complete
-
Intake: req-166.md
-
Data: 2026-09-17
-
Classificação: correção incremental do transporte [REDACTED] Windows
-
Modo de autonomia: supervisionado (sem commit ou push)
Objetivo
Eliminar dup() in/out/err failed / rsync code 12 quando c2f project:sync-core ou
project:update-all parte de PHP proc_open() no Windows e atravessa Bash, rsync e SSH.
Causa comprovada
O rsync.exe 3.4.1 resolvido no [REDACTED] do Chocolatey/cwRsync e usa runtime Cygwin. O ssh.exe
resolvido primeiro dentro do Git Bash vem do Git for Windows e usa runtime MSYS2. Ao cwRsync abrir
esse [REDACTED]ível como transporte filho, a duplicação dos pipes falha.
--blocking-io, ssh -T e < /dev/null foram avaliados. Sozinhos, não removeram o dup(); o
redirecionamento de stdin também não deve ser imposto. A correção determinante é parear o cwRsync
com o OpenSSH Cygwin distribuído no mesmo pacote.
Implementação
-
project-transport.shdetecta Windows POSIX e o cwRsync/Chocolatey. -
Quando o par é encontrado, o preflight e os comandos remotos usam o
ssh.exedo pacote; o mesmo binário é montado em-e, com oknown_hostsdo perfil Windows. A ausência do cliente compatível falha cedo; runtimes não cwRsync continuam usandosshdo PATH. -
`[REDACTED] explícita a ausência de PTY no protocolo binário.
-
project_transport_run_rsync()preservaMSYS_NO_PATHCONV=1e converte somente argumentos que são caminhos locais existentes de/c/...para/cygdrive/c/..., namespace exigido pelo cwRsync. Destinos SSH e exclusões não são reescritos. -
As quatro rotas já centralizadas no BATCH-169 permanecem protegidas: três rsyncs de
sync-core-to-project.she o executor comum desynchronize-project.sh. -
ProjectSshDeployReq034Testcobre seleção do [REDACTED]ível,known_hosts, namespace Cygwin, preservação de stdin e os quatro pontos de uso. -
c2f-shell-and-windows-trapsfoi corrigida nos cinco espelhos para documentar a causa e a solução comprovadas.
Matriz de diagnóstico no Git Bash real
| Variante | Resultado |
|---|---|
Git/MSYS2 SSH + --blocking-io + -T + /dev/null |
dup() in/out/err failed, code 12 |
| OpenSSH nativo do Windows | dup() eliminado, mas stream fechou na ponte Cygwin/Win32 |
[REDACTED] do cwRsync com origem /c/... |
transporte abriu; origem inexistente, code 23 |
[REDACTED] do cwRsync + origem /cygdrive/c/... |
três transferências concluídas, exit 0 |
Validação executada
| Verificação | Resultado |
|---|---|
bash -n na biblioteca e nos dois scripts |
3/3 sem erro |
ProjectSshDeployReq034Test |
24/24, 97 asserções, exit 0 |
c2f project:sync-core [REDACTED]-local pelo Git Bash |
core + contrato runtime + CLI sincronizados; ownership restaurado; exit 0 |
| PHPUnit completo, ordem padrão | 1.179/1.179, 7.813 asserções, 4 skipped, exit 0 |
Skills .codex, .claude, .cursor, .gemini, .github |
MD5 8E41773EF817D6F590E5061479314A5A idêntico |
Ambiente da suíte PHP
A primeira rodada reproduziu os 16 erros ambientais conhecidos: pdo_sqlite/sqlite3 não
carregados e OPENSSL_CONF apontando para um XAMPP inexistente. A rodada válida usou somente
PHP_INI_SCAN_DIR temporário e o openssl.cnf da instalação WinGet; o diretório temporário foi
removido e nenhum php.ini ou .env persistente foi alterado.
Resultado
O transporte [REDACTED] para [REDACTED]-local executa com sucesso no Git Bash afetado. O lote está
pronto para revisão humana; nenhum commit ou push foi realizado.