Skip to content

Commit 908963f

Browse files
supersonicbytefinestructure
authored andcommitted
Move out to a seperate method
1 parent 41823a0 commit 908963f

File tree

2 files changed

+61
-102
lines changed

2 files changed

+61
-102
lines changed

Sources/App/Commands/Ingest.swift

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,22 @@ func ingest(client: Client,
124124
Current.logger().warning("storeS3Readme failed")
125125
s3Readme = .error("\(error)")
126126
}
127+
128+
let fork: Fork?
129+
do {
130+
fork = try await getFork(on: database, metadata: metadata)
131+
} catch {
132+
fork = nil
133+
Current.logger().warning("updating forked from failed")
134+
}
127135

128136
try await updateRepository(on: database,
129137
for: repo,
130138
metadata: metadata,
131139
licenseInfo: license,
132140
readmeInfo: readme,
133-
s3Readme: s3Readme)
141+
s3Readme: s3Readme,
142+
fork: fork)
134143
return pkg
135144
}
136145

@@ -177,29 +186,15 @@ func updateRepository(on database: Database,
177186
metadata: Github.Metadata,
178187
licenseInfo: Github.License?,
179188
readmeInfo: Github.Readme?,
180-
s3Readme: S3Readme?) async throws {
189+
s3Readme: S3Readme?,
190+
fork: Fork? = nil) async throws {
181191
guard let repoMetadata = metadata.repository else {
182192
if repository.$package.value == nil {
183193
try await repository.$package.load(on: database)
184194
}
185195
throw AppError.genericError(repository.package.id,
186196
"repository metadata is nil for package \(repository.name ?? "unknown")")
187197
}
188-
189-
var fork: Fork?
190-
do {
191-
if let parentUrl = metadata.repository?.normalizedParentUrl {
192-
if let packageId = try await Package.query(on: database)
193-
.filter(\.$url, .custom("ilike"), parentUrl)
194-
.first()?.id {
195-
fork = .parentId(packageId)
196-
} else {
197-
fork = .parentURL(parentUrl)
198-
}
199-
}
200-
} catch {
201-
Current.logger().warning("updating forked from failed")
202-
}
203198

204199
repository.defaultBranch = repoMetadata.defaultBranch
205200
repository.forks = repoMetadata.forkCount
@@ -228,6 +223,20 @@ func updateRepository(on database: Database,
228223
try await repository.save(on: database)
229224
}
230225

226+
func getFork(on database: Database, metadata: Github.Metadata) async throws -> Fork? {
227+
guard let url = metadata.repository?.parent?.url,
228+
let parentUrl = URL(string: url)?.normalizedParent?.absoluteString else {
229+
return nil
230+
}
231+
232+
if let packageId = try await Package.query(on: database)
233+
.filter(\.$url, .custom("ilike"), parentUrl)
234+
.first()?.id {
235+
return .parentId(packageId)
236+
} else {
237+
return .parentURL(parentUrl)
238+
}
239+
}
231240

232241
// Helper to ensure the canonical source for these critical fields is the same in all the places where we need them
233242
private extension Github.Metadata {
@@ -241,12 +250,11 @@ private extension Github.Metadata.Repository {
241250
var repositoryName: String? { name }
242251
}
243252

244-
private extension Github.Metadata.Repository {
245-
// Returns a normalized version of the URL. Adding a `.git` if not present.
246-
var normalizedParentUrl: String? {
247-
guard let url = parent?.url else { return nil }
248-
guard !url.hasSuffix(".git") else { return url }
249-
let normalizedUrl = url + ".git"
250-
return normalizedUrl
253+
private extension URL {
254+
var normalizedParent: Self? {
255+
guard var components = URLComponents(url: self, resolvingAgainstBaseURL: false) else { return nil }
256+
if components.scheme == "http" { components.scheme = "https" }
257+
if !components.path.hasSuffix(".git") { components.path = components.path + ".git" }
258+
return components.url!
251259
}
252260
}

Tests/AppTests/IngestorTests.swift

Lines changed: 29 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ class IngestorTests: AppTestCase {
156156
html: "readme html",
157157
htmlUrl: "readme html url",
158158
imagesToCache: []),
159-
s3Readme: .cached(s3ObjectUrl: "url", githubEtag: "etag"))
159+
s3Readme: .cached(s3ObjectUrl: "url", githubEtag: "etag"),
160+
fork: .parentURL("https://github.com/foo/bar.git"))
160161

161162
// validate
162163
do {
@@ -165,6 +166,7 @@ class IngestorTests: AppTestCase {
165166
let repo = try await Repository.query(on: app.db).first().unwrap()
166167
XCTAssertEqual(repo.defaultBranch, "main")
167168
XCTAssertEqual(repo.forks, 1)
169+
XCTAssertEqual(repo.forkedFrom, .parentURL("https://github.com/foo/bar.git"))
168170
XCTAssertEqual(repo.fundingLinks, [
169171
.init(platform: .gitHub, url: "https://github.com/username"),
170172
.init(platform: .customUrl, url: "https://example.com/username1"),
@@ -598,91 +600,40 @@ class IngestorTests: AppTestCase {
598600
XCTAssertEqual(postMigrationFetchedRepo.s3Readme, .cached(s3ObjectUrl: "object-url", githubEtag: ""))
599601
}
600602

601-
func test_ingest_storeForkedFromPackageInSPI() async throws {
602-
let pkg = Package(url: "https://github.com/foo/bar.git".url,
603-
processingStage: .analysis)
604-
let forkedPkg = Package(
605-
url: "https://github.com/taz/bar.git",
606-
processingStage: .reconciliation
607-
)
608-
try await pkg.save(on: app.db)
609-
try await forkedPkg.save(on: app.db)
610-
Current.fetchMetadata = { _, owner, repository in
611-
.mock(owner: owner, repository: repository, parentUrl: "https://github.com/foo/bar.git")
612-
}
603+
func test_getFork() async throws {
604+
try await Package(id: .id0, url: "https://github.com/foo/parent.git".url, processingStage: .analysis).save(on: app.db)
605+
try await Package(url: "https://github.com/bar/forked.git", processingStage: .analysis).save(on: app.db)
613606

614-
// MUT
615-
try await ingest(client: app.client, database: app.db, mode: .limit(1))
616-
617-
guard let forkedId = forkedPkg.id else {
618-
XCTFail("Failed to get forked package id")
619-
return
607+
var metadata = Github.Metadata.mock
608+
609+
do { // test lookup when package is in the index
610+
metadata.repository?.parent = .init(url: "https://github.com/foo/parent.git")
611+
let fork = try await getFork(on: app.db, metadata: metadata)
612+
XCTAssertEqual(fork, .parentId(.id0))
620613
}
621-
622-
guard let id = pkg.id else {
623-
XCTFail("Failed to get package id")
624-
return
614+
615+
do { // test lookup when package is in the index but with different case in URL
616+
metadata.repository?.parent = .init(url: "https://github.com/Foo/Parent.git")
617+
let fork = try await getFork(on: app.db, metadata: metadata)
618+
XCTAssertEqual(fork, .parentId(.id0))
625619
}
626620

627-
let repo = try await Repository
628-
.query(on: app.db)
629-
.filter(\Repository.$package.$id == forkedId).first()
630-
631-
XCTAssertNotNil(repo?.forkedFrom)
632-
633-
XCTAssertEqual(repo?.forkedFrom, .parentId(id))
634-
635-
}
636-
637-
func test_ingest_storeForkedFromPackageNotInSPI() async throws {
638-
let forkedPkg = Package(
639-
url: "https://github.com/taz/bar.git",
640-
processingStage: .reconciliation
641-
)
642-
try await forkedPkg.save(on: app.db)
643-
Current.fetchMetadata = { _, owner, repository in
644-
.mock(owner: owner, repository: repository, parentUrl: "https://github.com/foo/bar.git")
621+
do { // test whem metadata repo url doesn't have `.git` at end
622+
metadata.repository?.parent = .init(url: "https://github.com/Foo/Parent")
623+
let fork = try await getFork(on: app.db, metadata: metadata)
624+
XCTAssertEqual(fork, .parentId(.id0))
645625
}
646626

647-
// MUT
648-
try await ingest(client: app.client, database: app.db, mode: .limit(1))
649-
650-
guard let forkedId = forkedPkg.id else {
651-
XCTFail("Failed to get forked package id")
652-
return
653-
}
654-
655-
let repo = try await Repository
656-
.query(on: app.db)
657-
.filter(\Repository.$package.$id == forkedId).first()
658-
659-
XCTAssertNotNil(repo?.forkedFrom)
660-
661-
XCTAssertEqual(repo?.forkedFrom, .parentURL("https://github.com/foo/bar.git"))
662-
}
663-
664-
func test_ingest_storeForkedFromShouldNeNil() async throws {
665-
let forkedPkg = Package(
666-
url: "https://github.com/taz/bar.git",
667-
processingStage: .reconciliation
668-
)
669-
try await forkedPkg.save(on: app.db)
670-
Current.fetchMetadata = { _, owner, repository in
671-
.mock(owner: owner, repository: repository, parentUrl: nil)
627+
do { // test lookup when package is not in the index
628+
metadata.repository?.parent = .init(url: "https://github.com/some/other.git")
629+
let fork = try await getFork(on: app.db, metadata: metadata)
630+
XCTAssertEqual(fork, .parentURL("https://github.com/some/other.git"))
672631
}
673632

674-
// MUT
675-
try await ingest(client: app.client, database: app.db, mode: .limit(1))
676-
677-
guard let forkedId = forkedPkg.id else {
678-
XCTFail("Failed to get forked package id")
679-
return
633+
do { // test lookup when parent url is nil
634+
metadata.repository?.parent = .init(url: nil)
635+
let fork = try await getFork(on: app.db, metadata: metadata)
636+
XCTAssertEqual(fork, nil)
680637
}
681-
682-
let repo = try await Repository
683-
.query(on: app.db)
684-
.filter(\Repository.$package.$id == forkedId).first()
685-
686-
XCTAssertNil(repo?.forkedFrom)
687638
}
688639
}

0 commit comments

Comments
 (0)