apply_patch drops the BOM when line 1 is replaced, and write_file rewrites CRLF and BOM files as LF without a BOM

Cerrado Apto para principiantes
#285 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
typescript
Área
tooling

Línea de trabajo

Empieza con applyHunks en src/main/tools/apply_patch.ts y write_file en src/main/tools/files.ts; después, lee las pruebas de regresión mencionadas en el issue: apply_patch.test.ts y tools.test.ts. Comprueba cómo se manejan la BOM y los finales de línea en los archivos existentes. El trabajo estará terminado cuando al reemplazar la primera línea se conserve la BOM y al sobrescribir un archivo con CRLF y BOM se conserven ambos, y pasen los casos de regresión.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug priority: medium severity: low

Found in the Oct 11 audit (at c5f5641). Follow-up to #246.

Where: src/main/tools/apply_patch.ts:133-157 (applyHunks); src/main/tools/files.ts:229-242 (write_file).

Cause:

  • The BOM is part of line 1's text. normalizeLoose trims it, so -Write-Host … matches \uFEFFWrite-Host …, and the replacement comes entirely from the + line. The #246 fix keeps the BOM only when line 1 is a context line.
  • write_file writes Buffer.from(content) as given; unlike applyEdit and applyHunks it keeps neither line endings nor the BOM.

Reproduction (confirmed on Windows):

  • b.ps1 = \uFEFFWrite-Host "héllo"\r\nline2\r\n, a patch replacing line 1 → Write-Host "hällo"\r\nline2\r\n (BOM gone).
  • Overwriting a BOM+CRLF file with write_file → LF only, no BOM.

Impact: Windows PowerShell 5.1 reads a .ps1 without a BOM as ANSI, so non-ASCII text becomes mojibake when the script runs; CRLF files show as entirely changed in diffs.

Fix: in applyHunks, add the BOM back when the original had one and the result does not. In write_file, when overwriting an existing file, convert to detectEol(before) and keep its BOM.

Regression test: "first line replaced in a BOM file" in apply_patch.test.ts; a CRLF+BOM overwrite in tools.test.ts.

Lenguaje dominante
TypeScript
Estrellas
2
Forks
2
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.