[ci] more; some fixes I found

This commit is contained in:
Max Howell
2021-05-28 09:35:35 -04:00
parent f9cee2c75f
commit eb33ff8906
8 changed files with 106 additions and 70 deletions

21
.github/workflows/cd.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: CD
on:
release:
types: published
jobs:
docs:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- uses: sersoft-gmbh/swifty-docs-action@v1
with:
module-version: ${{ github.event.inputs.version }}
pods:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- run: pod trunk push --allow-warnings
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}
VERSION: ${{ github.event.inputs.version }}

View File

@@ -1,5 +1,5 @@
name: CI name: CI
on: [pull_request] on: pull_request
jobs: jobs:
smoke: smoke:
runs-on: macos-latest runs-on: macos-latest
@@ -8,39 +8,22 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- run: swift test --generate-linuxmain - run: swift test --generate-linuxmain
- run: git diff --exit-code - run: git diff --exit-code
macOS:
needs: smoke apple:
runs-on: macos-latest
strategy:
matrix:
xcode:
# - 10.3 # Swift 5.0 (doesnt work on GHA macOS image :-/)
- 11.3 # Swift 5.1
- ^11.4 # Swift 5.2
# - ^12.5 # Swift 5.4 (not yet available on GHA)
steps:
- uses: actions/checkout@v2
- name: setup-xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ matrix.xcode }}
- run: swift --version
- run: swift test --parallel
otherOS:
needs: smoke
runs-on: macos-latest runs-on: macos-latest
strategy: strategy:
matrix: matrix:
destination: destination:
- platform=iOS Simulator,OS=latest,name=iPhone 11 - platform=iOS Simulator,OS=latest,name=iPhone 12
- platform=tvOS Simulator,OS=latest,name=Apple TV - platform=tvOS Simulator,OS=latest,name=Apple TV
# - platform=watchOS Simulator,OS=latest,name=Apple Watch Series 5 - 40mm
# ^^ coming with Xcode 12.5 which is not yet available on GHA
- platform=macOS - platform=macOS
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: maxim-lobanov/setup-xcode@v1 - uses: maxim-lobanov/setup-xcode@v1
with: with:
xcode-version: 12 # Swift 5.3 xcode-version: 12.4
- run: swift --version
- run: swift package generate-xcodeproj --enable-code-coverage - run: swift package generate-xcodeproj --enable-code-coverage
- uses: sersoft-gmbh/xcodebuild-action@v1 - uses: sersoft-gmbh/xcodebuild-action@v1
with: with:
@@ -49,43 +32,31 @@ jobs:
destination: ${{ matrix.destination }} destination: ${{ matrix.destination }}
action: test action: test
- uses: codecov/codecov-action@v1 - uses: codecov/codecov-action@v1
watchOS:
needs: smoke linux-swift-4:
runs-on: macos-latest name: linux (4.2)
steps:
- uses: actions/checkout@v2
- run: swift package generate-xcodeproj
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
project: Path.swift.xcodeproj
scheme: Path.swift-Package
destination: platform=watchOS Simulator,OS=latest,name=Apple Watch Series 5 - 40mm
action: build
linux-4-2:
needs: smoke
runs-on: ubuntu-18.04 runs-on: ubuntu-18.04
steps: steps:
- uses: actions/checkout@v2
- uses: fwal/setup-swift@v1 - uses: fwal/setup-swift@v1
with: with:
swift-version: 4.2 swift-version: 4.2
- run: swift test --parallel # doesnt support code coverage - uses: actions/checkout@v2
- run: swift test --parallel
linux: linux:
needs: smoke
runs-on: ubuntu-18.04 runs-on: ubuntu-18.04
strategy: strategy:
matrix: matrix:
swift: swift:
- 5.0.3 - '5.0'
- 5.1 - '5.1'
- 5.2 - '5.2'
# - 5.3 # 1 test fails - '5.3'
# - 5.4
steps: steps:
- uses: actions/checkout@v2
- uses: fwal/setup-swift@v1 - uses: fwal/setup-swift@v1
with: with:
swift-version: ${{ matrix.swift }} swift-version: ${{ matrix.swift }}
- uses: actions/checkout@v2
- run: swift test --parallel --enable-code-coverage - run: swift test --parallel --enable-code-coverage
- name: Generate Coverage Report - name: Generate Coverage Report
run: | run: |
@@ -99,3 +70,14 @@ jobs:
- uses: codecov/codecov-action@v1 - uses: codecov/codecov-action@v1
with: with:
file: ./info.lcov file: ./info.lcov
# code coverage fails with 5.4 for some reason
linux-swift-5-4:
name: linux (5.4)
runs-on: ubuntu-18.04
steps:
- uses: fwal/setup-swift@v1
with:
swift-version: 5.4
- uses: actions/checkout@v2
- run: swift test --parallel

16
Path.swift.podspec Normal file
View File

@@ -0,0 +1,16 @@
Pod::Spec.new do |spec|
spec.name = "Path.swift"
spec.version = ENV['VERSION'] || "0.0.1"
spec.summary = "Delightful, robust, cross-platform and chainable file-pathing functions."
spec.homepage = "https://github.com/mxcl/Path.swift"
spec.license = "Unlicense"
spec.author = { "Max Howell" => "mxcl@me.com" }
spec.source = { :git => "https://github.com/mxcl/Path.swift.git", :tag => "#{spec.version}" }
spec.source_files = "Sources/*.swift"
spec.swift_versions = ['4.2', '5']
spec.module_name = 'Path'
spec.osx.deployment_target = '10.10'
spec.ios.deployment_target = '8.0'
spec.tvos.deployment_target = '9.0'
spec.watchos.deployment_target = '2.0'
end

View File

@@ -45,16 +45,13 @@ try Bundle.resources.helper.copy(into: Path.root.usr.local.bin).chmod(0o500)
We emphasize safety and correctness, just like Swift, and also (again like We emphasize safety and correctness, just like Swift, and also (again like
Swift), we provide a thoughtful and comprehensive (yet concise) API. Swift), we provide a thoughtful and comprehensive (yet concise) API.
# Support mxcl # Sponsor @mxcl
Hi, Im Max Howell and I have written a lot of open source software—generally Hi, Im Max Howell and I have written a lot of open source software—generally
a good deal of my free time 👨🏻‍💻. a good deal of my free time 👨🏻‍💻. Sponsorship helps me justify creating new open
source and maintaining it. Thank you.
<a href="https://www.patreon.com/mxcl"> [Sponsor @mxcl].
<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
</a>
[Other donation/tipping options](http://mxcl.dev/#donate)
# Handbook # Handbook
@@ -438,7 +435,7 @@ Carthage:
[badge-platforms]: https://img.shields.io/badge/platforms-macOS%20%7C%20Linux%20%7C%20iOS%20%7C%20tvOS%20%7C%20watchOS-lightgrey.svg [badge-platforms]: https://img.shields.io/badge/platforms-macOS%20%7C%20Linux%20%7C%20iOS%20%7C%20tvOS%20%7C%20watchOS-lightgrey.svg
[badge-languages]: https://img.shields.io/badge/swift-4.2%20%7C%205.0%20%7C%205.1%20%7C%205.2%20%7C%205.3-orange.svg [badge-languages]: https://img.shields.io/badge/swift-4.2%20%7C%205.x-orange.svg
[docs]: https://mxcl.dev/Path.swift/Structs/Path.html [docs]: https://mxcl.dev/Path.swift/Structs/Path.html
[badge-jazzy]: https://raw.githubusercontent.com/mxcl/Path.swift/gh-pages/badge.svg?sanitize=true [badge-jazzy]: https://raw.githubusercontent.com/mxcl/Path.swift/gh-pages/badge.svg?sanitize=true
[badge-codecov]: https://codecov.io/gh/mxcl/Path.swift/branch/master/graph/badge.svg [badge-codecov]: https://codecov.io/gh/mxcl/Path.swift/branch/master/graph/badge.svg
@@ -447,3 +444,4 @@ Carthage:
[codecov]: https://codecov.io/gh/mxcl/Path.swift [codecov]: https://codecov.io/gh/mxcl/Path.swift
[badge-version]: https://img.shields.io/cocoapods/v/Path.swift.svg?label=version [badge-version]: https://img.shields.io/cocoapods/v/Path.swift.svg?label=version
[cocoapods]: https://cocoapods.org/pods/Path.swift [cocoapods]: https://cocoapods.org/pods/Path.swift
[Sponsor @mxcl]: https://github.com/sponsors/mxcl

View File

@@ -29,7 +29,8 @@ public extension Pathish {
if overwrite, let tokind = to.type, tokind != .directory, type != .directory { if overwrite, let tokind = to.type, tokind != .directory, type != .directory {
try FileManager.default.removeItem(at: to.url) try FileManager.default.removeItem(at: to.url)
} }
#if os(Linux) && !swift(>=5.3) // check if fixed #if os(Linux)
//NOTE doing manually due to inconsistency in Linux Foundation behavior
if !overwrite, to.type != nil { if !overwrite, to.type != nil {
throw CocoaError.error(.fileWriteFileExists) throw CocoaError.error(.fileWriteFileExists)
} }
@@ -69,7 +70,8 @@ public extension Pathish {
if overwrite, let kind = rv.type, kind != .directory { if overwrite, let kind = rv.type, kind != .directory {
try FileManager.default.removeItem(at: rv.url) try FileManager.default.removeItem(at: rv.url)
} }
#if os(Linux) && !swift(>=5.3) // check if fixed #if os(Linux)
//NOTE doing manually due to inconsistency in Linux Foundation behavior
if !overwrite, rv.type != nil { if !overwrite, rv.type != nil {
throw CocoaError.error(.fileWriteFileExists) throw CocoaError.error(.fileWriteFileExists)
} }

View File

@@ -168,6 +168,7 @@ public extension Pathish {
*/ */
var parent: Path { var parent: Path {
let index = string.lastIndex(of: "/")! let index = string.lastIndex(of: "/")!
guard index != string.indices.startIndex else { return Path(string: "/") }
let substr = string[string.indices.startIndex..<index] let substr = string[string.indices.startIndex..<index]
return Path(string: String(substr)) return Path(string: String(substr))
} }

View File

@@ -192,6 +192,14 @@ class PathTests: XCTestCase {
XCTAssertEqual(Path.root/"a/foo"/"../../../bar", Path.root/"bar") XCTAssertEqual(Path.root/"a/foo"/"../../../bar", Path.root/"bar")
} }
func testParent() {
XCTAssertEqual(Path("/root/boot")!.parent.string, "/root")
XCTAssertEqual(Path("/root/boot")!.parent.parent.string, "/")
XCTAssertEqual(Path("/root/boot")!.parent.parent.parent.string, "/")
XCTAssertEqual(Path("/root")!.parent.string, "/")
XCTAssertEqual(Path("/root")!.parent.parent.string, "/")
}
func testDynamicMember() { func testDynamicMember() {
XCTAssertEqual(Path.root.Documents, Path.root/"Documents") XCTAssertEqual(Path.root.Documents, Path.root/"Documents")
@@ -199,7 +207,7 @@ class PathTests: XCTestCase {
XCTAssertEqual(a.Documents, Path.home/"foo/Documents") XCTAssertEqual(a.Documents, Path.home/"foo/Documents")
// verify use of the dynamic-member-subscript works according to our rules // verify use of the dynamic-member-subscript works according to our rules
XCTAssertEqual(Path.home[dynamicMember: "../~foo"].string, "\(Path.home.parent.string)/~foo") XCTAssertEqual(Path.home[dynamicMember: "../~foo"].string, Path(Path.home).parent.join("~foo").string)
} }
func testCopyTo() throws { func testCopyTo() throws {
@@ -380,17 +388,13 @@ class PathTests: XCTestCase {
func testTimes() throws { func testTimes() throws {
try Path.mktemp { tmpdir in try Path.mktemp { tmpdir in
let foo = try tmpdir.foo.touch()
let now1 = Date().timeIntervalSince1970.rounded(.down) let now1 = Date().timeIntervalSince1970.rounded(.down)
#if !os(Linux)
XCTAssertEqual(foo.ctime?.timeIntervalSince1970.rounded(.down), now1) //FIXME flakey
#endif
XCTAssertEqual(foo.mtime?.timeIntervalSince1970.rounded(.down), now1) //FIXME flakey
sleep(1) sleep(1)
try foo.touch() let foo = try tmpdir.foo.touch()
let now2 = Date().timeIntervalSince1970.rounded(.down) #if !os(Linux)
XCTAssertNotEqual(now1, now2) XCTAssertGreaterThan(foo.ctime?.timeIntervalSince1970.rounded(.down) ?? 0, now1) //FIXME flakey
XCTAssertEqual(foo.mtime?.timeIntervalSince1970.rounded(.down), now2) //FIXME flakey #endif
XCTAssertGreaterThan(foo.mtime?.timeIntervalSince1970.rounded(.down) ?? 0, now1) //FIXME flakey
XCTAssertNil(tmpdir.void.mtime) XCTAssertNil(tmpdir.void.mtime)
XCTAssertNil(tmpdir.void.ctime) XCTAssertNil(tmpdir.void.ctime)
@@ -454,7 +458,7 @@ class PathTests: XCTestCase {
#if os(macOS) #if os(macOS)
XCTAssertEqual(bndl.defaultSharedFrameworksPath, tmpdir.Contents.Frameworks) XCTAssertEqual(bndl.defaultSharedFrameworksPath, tmpdir.Contents.Frameworks)
XCTAssertEqual(bndl.defaultResourcesPath, tmpdir.Contents.Resources) XCTAssertEqual(bndl.defaultResourcesPath, tmpdir.Contents.Resources)
#elseif os(tvOS) || os(iOS) #elseif os(tvOS) || os(iOS) || os(watchOS)
XCTAssertEqual(bndl.defaultSharedFrameworksPath, tmpdir.Frameworks) XCTAssertEqual(bndl.defaultSharedFrameworksPath, tmpdir.Frameworks)
XCTAssertEqual(bndl.defaultResourcesPath, tmpdir) XCTAssertEqual(bndl.defaultResourcesPath, tmpdir)
#else #else
@@ -506,8 +510,19 @@ class PathTests: XCTestCase {
func testTouchThrowsIfCannotWrite() throws { func testTouchThrowsIfCannotWrite() throws {
try Path.mktemp { tmpdir in try Path.mktemp { tmpdir in
print(try FileManager.default.attributesOfItem(atPath: tmpdir.string)[.posixPermissions])
//FIXME fails in Docker image (only)
try tmpdir.chmod(0o000) try tmpdir.chmod(0o000)
let attrs = try FileManager.default.attributesOfItem(atPath: tmpdir.string)
XCTAssertEqual(attrs[.posixPermissions] as? Int, 0)
print(attrs[.posixPermissions])
XCTAssertThrowsError(try tmpdir.bar.touch()) XCTAssertThrowsError(try tmpdir.bar.touch())
XCTAssertFalse(tmpdir.bar.exists)
} }
} }

View File

@@ -47,6 +47,7 @@ extension PathTests {
("testMoveTo", testMoveTo), ("testMoveTo", testMoveTo),
("testNoUndesiredSymlinkResolution", testNoUndesiredSymlinkResolution), ("testNoUndesiredSymlinkResolution", testNoUndesiredSymlinkResolution),
("testOptionalInitializer", testOptionalInitializer), ("testOptionalInitializer", testOptionalInitializer),
("testParent", testParent),
("testPathComponents", testPathComponents), ("testPathComponents", testPathComponents),
("testReadlinkOnFileReturnsSelf", testReadlinkOnFileReturnsSelf), ("testReadlinkOnFileReturnsSelf", testReadlinkOnFileReturnsSelf),
("testReadlinkOnNonExistantFileThrows", testReadlinkOnNonExistantFileThrows), ("testReadlinkOnNonExistantFileThrows", testReadlinkOnNonExistantFileThrows),