shell.pushd does not restore the working directory after an exception

Ouverte Adaptée aux débutants
#92,225 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
88/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
python
Domaine
tooling

Piste de recherche

Commencez dans utils/swift_build_support, où swift_build_support.shell.pushd() est défini, et reproduisez le problème avec l’extrait Python fourni en utilisant PYTHONPATH=utils/swift_build_support python3 repro.py. Vérifiez le nettoyage après yield et assurez-vous que le répertoire de travail capturé est restauré lorsque le contexte lève une exception ; c’est terminé lorsque la vérification finale de la restauration affiche True.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

triage needed
Description

swift_build_support.shell.pushd() restores the previous working directory only after a normal exit from the context. If code inside the context raises, the process remains in the pushed directory. Any later error handling or cleanup that uses relative paths then runs from the wrong location.

Reproduction
import os
import tempfile

from swift_build_support import shell

start = os.getcwd()
target = tempfile.mkdtemp()

try:
    with shell.pushd(target, echo=False):
        raise RuntimeError("boom")
except RuntimeError:
    pass

print("start:", start)
print("after:", os.getcwd())
print("restored:", os.getcwd() == start)

Run with PYTHONPATH=utils/swift_build_support python3 repro.py. The final line prints restored: False.

Expected behavior

pushd() should restore the directory it captured on entry even when the context exits by raising an exception.

Environment

Swift repository main at d2a794410e16d9699afd72d24e0a26ed51bcd9c5
Python 3.9.6
Darwin 25.6.0 arm64

Additional information

The context manager's cleanup runs after yield but is not protected by a finally block.

Langage dominant
Swift
Étoiles
70.4k
Forks
10.8k
Merge moyen
2 j 2 h
PR mergées (30 j)
461

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de swiftlang/swift

Toutes les issues de swiftlang/swift

Issues similaires

Plus d'issues Swift

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.