python / python/cpython

Path.chmod() silently fails on Windows when archive bit is cleared and follow_symlinks=True

Abierto
#140,774 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

OS-windows stdlib topic-pathlib type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
36k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

Bug description:

Expected behavior:

  • Path.chmod(stat.S_IWRITE | stat.S_IREAD) should clear the read-only attribute regardless of archive bit state
  • Path.chmod(stat.S_IWRITE | stat.S_IREAD) should match os.chmod() behavior

Actual behavior:

  • When archive bit is cleared, Path.chmod(stat.S_IWRITE | stat.S_IREAD) silently fails to clear read-only
  • When archive bit is set, it works correctly
  • Path.chmod(stat.S_IWRITE | stat.S_IREAD, follow_symlinks=False) always works
import os
import stat
import subprocess
from pathlib import Path


def is_read_only(file: str | os.PathLike) -> bool:
    return os.stat(file).st_file_attributes & stat.FILE_ATTRIBUTE_READONLY > 0


test_file = Path('test.txt')
test_file.touch()

subprocess.run(f'attrib -a +r {test_file}', check=True)
print(f'Initial (no archive): Read Only: {is_read_only(test_file)}')

test_file.chmod(stat.S_IWRITE | stat.S_IREAD)
print(f'After chmod(follow_symlinks=True): Read Only: {is_read_only(test_file)}')

test_file.chmod(stat.S_IWRITE | stat.S_IREAD, follow_symlinks=False)
print(f'After chmod(follow_symlinks=False): {is_read_only(test_file)}')

subprocess.run(f'attrib +a +r {test_file}', check=True)
print(f'Initial (archive): Read Only: {is_read_only(test_file)}')

test_file.chmod(stat.S_IWRITE | stat.S_IREAD)
print(f'After chmod(follow_symlinks=True): Read Only: {is_read_only(test_file)}')

test_file.chmod(stat.S_IWRITE | stat.S_IREAD, follow_symlinks=False)
print(f'After chmod(follow_symlinks=False): {is_read_only(test_file)}')

Output

Initial (no archive): Read Only: True
After chmod(follow_symlinks=True): Read Only: True
After chmod(follow_symlinks=False): False
Initial (archive): Read Only: True
After chmod(follow_symlinks=True): Read Only: False
After chmod(follow_symlinks=False): False
CPython versions tested on:

3.14

Operating systems tested on:

Windows

Linked PRs
  • gh-142018
  • gh-154852

Guía de contribución

Abrir la guía de contribución

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.

Línea de trabajo

Comienza ejecutando el reproductor de casos de Windows proporcionado para Path.chmod() con y sin el bit de archivo, y después compara follow_symlinks=True con el comportamiento de os.chmod(). Revisa el trabajo enlazado en gh-142018 y gh-154852 antes de continuar. Se considera terminado cuando el atributo de solo lectura se elimine de forma coherente en ambos estados del bit de archivo.

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

Evaluación

Stack tecnológico
python
Área
operating-systems
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.