- 
                Notifications
    
You must be signed in to change notification settings  - Fork 253
 
Closed
Description
Description
On Linux, when all ancestor directories do not have .swift-format, swift-format causes a infinite loop. swift-format lint and swift-format format do not work.
Steps to reproduce
Please make sure that /, /home, and /home/<user name> do not contain .swift-format.
$ cd
$ echo 'let foo:Int=0' > test.swift
$ swift format lint test.swiftExpected behavior
test.swift:1:9: warning: [Spacing] add 1 space
test.swift:1:12: warning: [Spacing] add 1 space
test.swift:1:13: warning: [Spacing] add 1 space
Actual behavior
swift-format never finishes because of a infinite loop.
Environment
I use swift-format bundled in the Swift 6.0.1 toolchain.
$ uname -a
Linux Raspberry-beetle 6.6.51+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.6.51-1+rpt2 (2024-10-01) aarch64 GNU/Linux
$ swift --version
Swift version 6.0.1 (swift-6.0.1-RELEASE)
Target: aarch64-unknown-linux-gnu
$ swift format --version
main
$ which swift-format
/home/kebo/.local/bin/swift-format
$ swiftly list
Installed release toolchains
----------------------------
Swift 6.0.1 (in use)
Installed snapshot toolchains
-----------------------------
6.0-snapshot-2024-09-17Supplement
I think that the root cause is a combination of swift-foundation's URL and swift-format's this line.
swift-foundation's URL is different from macOS's URL.
- On Linux (Swift 6.0.1)
URL(filePath: "/foo", directoryHint: .notDirectory).deletingLastPathComponent().path()- returns 
"/" 
- returns 
 URL(filePath: "/foo", directoryHint: .isDirectory).deletingLastPathComponent().path()- returns 
""(empty string) 
- returns 
 
 - On macOS 15.0.1 (Xcode 16.0)
- Both return 
"/" 
 - Both return 
 
On Linux, when I added print(self.path) to the line, self.path changed as follows.
"/foo/bar/baz""/foo/bar""/foo"""(empty string)""(empty string)""(empty string)- ... (infinite loop)
 
So self.path == "/" couldn't return true forever.
Metadata
Metadata
Assignees
Labels
No labels