Skip to content

Commit 4a88ae1

Browse files
authored
Don't require .git suffix in repo URL (#3089)
Motivation: Git URLs don't always include `.git` suffix, but the logic for constructing GitHub API URL incorrectly requires it. Modification: Update regex to make `.git` suffix optional. Result: Git URLs with or without `.git` suffix are accepted.
1 parent feef75d commit 4a88ae1

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

Sources/PackageCollections/Providers/GitHubPackageMetadataProvider.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ struct GitHubPackageMetadataProvider: PackageMetadataProvider {
3939
return callback(.failure(Errors.invalidReferenceType(reference)))
4040
}
4141
guard let baseURL = self.apiURL(reference.path) else {
42-
return callback(.failure(Errors.invalidGitUrl(reference.path)))
42+
return callback(.failure(Errors.invalidGitURL(reference.path)))
4343
}
4444

4545
let metadataURL = baseURL
@@ -147,7 +147,7 @@ struct GitHubPackageMetadataProvider: PackageMetadataProvider {
147147

148148
internal func apiURL(_ url: String) -> Foundation.URL? {
149149
do {
150-
let regex = try NSRegularExpression(pattern: #"([^/@]+)[:/]([^:/]+)/([^/]+)\.git$"#, options: .caseInsensitive)
150+
let regex = try NSRegularExpression(pattern: #"([^/@]+)[:/]([^:/]+)/([^/.]+)(\.git)?$"#, options: .caseInsensitive)
151151
if let match = regex.firstMatch(in: url, options: [], range: NSRange(location: 0, length: url.count)) {
152152
if let hostRange = Range(match.range(at: 1), in: url),
153153
let ownerRange = Range(match.range(at: 2), in: url),
@@ -202,7 +202,7 @@ struct GitHubPackageMetadataProvider: PackageMetadataProvider {
202202

203203
enum Errors: Error, Equatable {
204204
case invalidReferenceType(PackageReference)
205-
case invalidGitUrl(String)
205+
case invalidGitURL(String)
206206
case invalidResponse(URL, String)
207207
case permissionDenied(URL)
208208
case invalidAuthToken(URL)

Tests/PackageCollectionsTests/GitHubPackageMetadataProviderTests.swift

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,24 @@ import TSCBasic
2020
import TSCUtility
2121

2222
class GitHubPackageMetadataProviderTests: XCTestCase {
23-
func testBaseRL() throws {
23+
func testBaseURL() throws {
2424
let apiURL = URL(string: "https://api.github.com/repos/octocat/Hello-World")
25-
2625
let provider = GitHubPackageMetadataProvider()
27-
let sshURLRetVal = provider.apiURL("[email protected]:octocat/Hello-World.git")
28-
XCTAssertEqual(apiURL, sshURLRetVal)
26+
27+
do {
28+
let sshURLRetVal = provider.apiURL("[email protected]:octocat/Hello-World.git")
29+
XCTAssertEqual(apiURL, sshURLRetVal)
30+
}
2931

30-
let httpsURLRetVal = provider.apiURL("https://github.com/octocat/Hello-World.git")
31-
XCTAssertEqual(apiURL, httpsURLRetVal)
32+
do {
33+
let httpsURLRetVal = provider.apiURL("https://github.com/octocat/Hello-World.git")
34+
XCTAssertEqual(apiURL, httpsURLRetVal)
35+
}
36+
37+
do {
38+
let httpsURLRetVal = provider.apiURL("https://github.com/octocat/Hello-World")
39+
XCTAssertEqual(apiURL, httpsURLRetVal)
40+
}
3241

3342
XCTAssertNil(provider.apiURL("bad/Hello-World.git"))
3443
}
@@ -228,7 +237,7 @@ class GitHubPackageMetadataProviderTests: XCTestCase {
228237
let provider = GitHubPackageMetadataProvider()
229238
let reference = PackageReference(repository: RepositorySpecifier(url: UUID().uuidString))
230239
XCTAssertThrowsError(try tsc_await { callback in provider.get(reference, callback: callback) }, "should throw error") { error in
231-
XCTAssertEqual(error as? GitHubPackageMetadataProvider.Errors, .invalidGitUrl(reference.path))
240+
XCTAssertEqual(error as? GitHubPackageMetadataProvider.Errors, .invalidGitURL(reference.path))
232241
}
233242
}
234243
}

0 commit comments

Comments
 (0)