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

Offen Anfängerfreundlich
#92,225 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
88/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
python
Bereich
tooling

Rechercherichtung

Beginne in utils/swift_build_support, wo swift_build_support.shell.pushd() definiert ist, und reproduziere das Problem mit dem bereitgestellten Python-Snippet unter Verwendung von PYTHONPATH=utils/swift_build_support python3 repro.py. Überprüfe die Bereinigung nach yield und stelle sicher, dass das erfasste Arbeitsverzeichnis wiederhergestellt wird, wenn der Kontext eine Exception auslöst; die Aufgabe ist erledigt, wenn die abschließende Prüfung der Wiederherstellung True ausgibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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.

Vorherrschende Sprache
Swift
Sterne
70.4k
Forks
10.8k
Ø Merge
2 T. 2 Std.
Gemergte PRs (30 T.)
461

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus swiftlang/swift

Alle Issues in swiftlang/swift

Ähnliche Issues

Weitere Issues zu Swift

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.