Skip to content

Commit be84a97

Browse files
committed
Add support to relative paths SourceRepository checkoutPath argument
1 parent 037f0bc commit be84a97

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

Sources/SwiftDocC/SourceRepository/SourceRepository.swift

+20-11
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,42 @@
99
*/
1010

1111
import Foundation
12+
import ArgumentParser
1213

1314
/// A remote repository that hosts source code.
1415
public struct SourceRepository {
1516
/// The path at which the repository is cloned locally.
1617
public var checkoutPath: String
17-
18+
1819
/// The base URL where the service hosts the repository's contents.
1920
public var sourceServiceBaseURL: URL
20-
21+
2122
/// A function that formats a line number to be included in a URL.
2223
public var formatLineNumber: (Int) -> String
23-
24+
2425
/// Creates a source code repository.
2526
/// - Parameters:
2627
/// - checkoutPath: The path at which the repository is checked out locally and from which its symbol graphs were generated.
2728
/// - sourceServiceBaseURL: The base URL where the service hosts the repository's contents.
2829
/// - formatLineNumber: A function that formats a line number to be included in a URL.
29-
public init(
30+
public init (
3031
checkoutPath: String,
3132
sourceServiceBaseURL: URL,
3233
formatLineNumber: @escaping (Int) -> String
3334
) {
34-
self.checkoutPath = checkoutPath
35+
36+
37+
// guard FileManager.default.directoryExists(atPath: checkoutPath) else {
38+
// throw ValidationError("User provided checkout-path argument {checkoutPath} is invalid.")
39+
// }
40+
let absoluteCheckoutPath = URL(fileURLWithPath: checkoutPath).absoluteString
41+
let startIndex = absoluteCheckoutPath.index(absoluteCheckoutPath.startIndex, offsetBy: 7)
42+
43+
self.checkoutPath = String(absoluteCheckoutPath[startIndex...])
3544
self.sourceServiceBaseURL = sourceServiceBaseURL
3645
self.formatLineNumber = formatLineNumber
3746
}
38-
47+
3948
/// Formats a local source file URL to a URL hosted by the remote source code service.
4049
/// - Parameters:
4150
/// - sourceFileURL: The location of the source file on disk.
@@ -45,7 +54,7 @@ public struct SourceRepository {
4554
guard sourceFileURL.path.hasPrefix(checkoutPath) else {
4655
return nil
4756
}
48-
57+
4958
let path = sourceFileURL.path.dropFirst(checkoutPath.count).removingLeadingSlash
5059
return sourceServiceBaseURL
5160
.appendingPathComponent(path)
@@ -65,7 +74,7 @@ public extension SourceRepository {
6574
formatLineNumber: { line in "L\(line)" }
6675
)
6776
}
68-
77+
6978
/// Creates a source repository hosted by the GitLab service.
7079
/// - Parameters:
7180
/// - checkoutPath: The path of the local checkout.
@@ -77,7 +86,7 @@ public extension SourceRepository {
7786
formatLineNumber: { line in "L\(line)" }
7887
)
7988
}
80-
89+
8190
/// Creates a source repository hosted by the BitBucket service.
8291
/// - Parameters:
8392
/// - checkoutPath: The path of the local checkout.
@@ -89,7 +98,7 @@ public extension SourceRepository {
8998
formatLineNumber: { line in "lines-\(line)" }
9099
)
91100
}
92-
101+
93102
/// Creates a source repository hosted by the device's filesystem.
94103
///
95104
/// Use this source repository to format `doc-source-file://` links to files on the
@@ -98,7 +107,7 @@ public extension SourceRepository {
98107
/// This source repository uses a custom scheme to offer more control local source file navigation.
99108
static func localFilesystem() -> SourceRepository {
100109
SourceRepository(
101-
checkoutPath: "",
110+
checkoutPath: "/",
102111
// 2 slashes to specify an empty authority/host component and 1 slash to specify a base path at the root.
103112
sourceServiceBaseURL: URL(string: "doc-source-file:///")!,
104113
formatLineNumber: { line in "L\(line)" }

0 commit comments

Comments
 (0)