Skip to content

Commit 14a080d

Browse files
Merge pull request #3646 from SwiftPackageIndex/issue-3469-dependency-transition-26
Issue 3469 dependency transition 26
2 parents cbd327a + c552e41 commit 14a080d

23 files changed

+239
-192
lines changed

Sources/App/Commands/Alerting.swift

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,15 @@ enum Alerting {
4242
}
4343

4444
func run(using context: CommandContext, signature: Signature) async throws {
45-
Current.setLogger(Logger(component: "alerting"))
45+
@Dependency(\.logger) var logger
46+
logger.set(to: Logger(component: "alerting"))
4647

47-
Current.logger().info("Running alerting...")
48+
logger.info("Running alerting...")
4849

4950
let timePeriod = signature.duration
5051
let limit = signature.limit ?? Alerting.defaultLimit
5152

52-
Current.logger().info("Validation time interval: \(timePeriod.hours)h, limit: \(limit)")
53+
logger.info("Validation time interval: \(timePeriod.hours)h, limit: \(limit)")
5354

5455
let builds = try await Alerting.fetchBuilds(on: context.application.db, timePeriod: timePeriod, limit: limit)
5556
try await Alerting.runBuildChecks(for: builds)
@@ -94,12 +95,14 @@ extension Alerting {
9495
// to do
9596
// - [ ] doc gen is configured but it failed
9697

97-
Current.logger().info("Build records selected: \(builds.count)")
98+
@Dependency(\.logger) var logger
99+
100+
logger.info("Build records selected: \(builds.count)")
98101
if let oldest = builds.last {
99-
Current.logger().info("Oldest selected: \(oldest.createdAt)")
102+
logger.info("Oldest selected: \(oldest.createdAt)")
100103
}
101104
if let mostRecent = builds.first {
102-
Current.logger().info("Most recent selected: \(mostRecent.createdAt)")
105+
logger.info("Most recent selected: \(mostRecent.createdAt)")
103106
}
104107
builds.validateBuildsPresent().log(check: "CHECK_BUILDS_PRESENT")
105108
builds.validatePlatformsPresent().log(check: "CHECK_BUILDS_PLATFORMS_PRESENT")
@@ -114,9 +117,11 @@ extension Alerting {
114117
}
115118

116119
static func fetchBuilds(on database: Database, timePeriod: TimeAmount, limit: Int) async throws -> [Alerting.BuildInfo] {
120+
@Dependency(\.logger) var logger
121+
117122
let start = Date.now
118123
defer {
119-
Current.logger().debug("fetchBuilds elapsed: \(Date.now.timeIntervalSince(start).rounded(decimalPlaces: 2))s")
124+
logger.debug("fetchBuilds elapsed: \(Date.now.timeIntervalSince(start).rounded(decimalPlaces: 2))s")
120125
}
121126
@Dependency(\.date.now) var now
122127
let cutoff = now.addingTimeInterval(-timePeriod.timeInterval)
@@ -187,15 +192,16 @@ extension Alerting {
187192
case failed(reasons: [String])
188193

189194
func log(check: String) {
195+
@Dependency(\.logger) var logger
190196
switch self {
191197
case .ok:
192-
Current.logger().debug("\(check) passed")
198+
logger.debug("\(check) passed")
193199
case .failed(let reasons):
194200
if reasons.count >= 5 {
195-
Current.logger().critical("\(check) failures: \(reasons.count)")
201+
logger.critical("\(check) failures: \(reasons.count)")
196202
}
197203
for reason in reasons {
198-
Current.logger().critical("\(check) failed: \(reason)")
204+
logger.critical("\(check) failed: \(reason)")
199205
}
200206
}
201207
}

Sources/App/Commands/Analyze.swift

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ enum Analyze {
3030
func run(using context: CommandContext, signature: SPICommand.Signature) async throws {
3131
let client = context.application.client
3232
let db = context.application.db
33-
Current.setLogger(Logger(component: "analyze"))
33+
@Dependency(\.logger) var logger
34+
logger.set(to: Logger(component: "analyze"))
3435

3536
Analyze.resetMetrics()
3637

@@ -39,20 +40,20 @@ enum Analyze {
3940
database: db,
4041
mode: .init(signature: signature))
4142
} catch {
42-
Current.logger().error("\(error.localizedDescription)")
43+
logger.error("\(error.localizedDescription)")
4344
}
4445

4546
do {
4647
try Analyze.trimCheckouts()
4748
} catch {
48-
Current.logger().error("\(error.localizedDescription)")
49+
logger.error("\(error.localizedDescription)")
4950
}
5051

5152
do {
5253
try await AppMetrics.push(client: client,
5354
jobName: "analyze")
5455
} catch {
55-
Current.logger().warning("\(error.localizedDescription)")
56+
logger.warning("\(error.localizedDescription)")
5657
}
5758
}
5859
}
@@ -110,19 +111,21 @@ extension Analyze {
110111
let start = DispatchTime.now().uptimeNanoseconds
111112
defer { AppMetrics.analyzeDurationSeconds?.time(since: start) }
112113

114+
@Dependency(\.logger) var logger
115+
113116
switch mode {
114117
case .id(let id):
115-
Current.logger().info("Analyzing (id: \(id)) ...")
118+
logger.info("Analyzing (id: \(id)) ...")
116119
let pkg = try await Package.fetchCandidate(database, id: id)
117120
try await analyze(client: client, database: database, packages: [pkg])
118121

119122
case .limit(let limit):
120-
Current.logger().info("Analyzing (limit: \(limit)) ...")
123+
logger.info("Analyzing (limit: \(limit)) ...")
121124
let packages = try await Package.fetchCandidates(database, for: .analysis, limit: limit)
122125
try await analyze(client: client, database: database, packages: packages)
123126

124127
case .url(let url):
125-
Current.logger().info("Analyzing (url: \(url)) ...")
128+
logger.info("Analyzing (url: \(url)) ...")
126129
let pkg = try await Package.fetchCandidate(database, url: url)
127130
try await analyze(client: client, database: database, packages: [pkg])
128131
}
@@ -140,10 +143,12 @@ extension Analyze {
140143
packages: [Joined<Package, Repository>]) async throws {
141144
AppMetrics.analyzeCandidatesCount?.set(packages.count)
142145

143-
// get or create directory
144146
@Dependency(\.fileManager) var fileManager
147+
@Dependency(\.logger) var logger
148+
149+
// get or create directory
145150
let checkoutDir = fileManager.checkoutsDirectory()
146-
Current.logger().info("Checkout directory: \(checkoutDir)")
151+
logger.info("Checkout directory: \(checkoutDir)")
147152
if !fileManager.fileExists(atPath: checkoutDir) {
148153
try await createCheckoutsDirectory(client: client, path: checkoutDir)
149154
}
@@ -170,6 +175,8 @@ extension Analyze {
170175
package: Joined<Package, Repository>) async throws {
171176
try await refreshCheckout(package: package)
172177

178+
@Dependency(\.logger) var logger
179+
173180
// 2024-10-05 sas: We need to explicitly weave dependencies into the `transaction` closure, because escaping closures strip them.
174181
// https://github.com/pointfreeco/swift-dependencies/discussions/283#discussioncomment-10846172
175182
// This might not be needed in Vapor 5 / FluentKit 2
@@ -183,7 +190,7 @@ extension Analyze {
183190
package: package)
184191
let netDeleteCount = versionDelta.toDelete.count - versionDelta.toAdd.count
185192
if netDeleteCount > 1 {
186-
Current.logger().warning("Suspicious loss of \(netDeleteCount) versions for package \(package.model.id)")
193+
logger.warning("Suspicious loss of \(netDeleteCount) versions for package \(package.model.id)")
187194
}
188195

189196
try await applyVersionDelta(on: tx, delta: versionDelta)
@@ -235,15 +242,16 @@ extension Analyze {
235242

236243
static func createCheckoutsDirectory(client: Client,
237244
path: String) async throws {
238-
Current.logger().info("Creating checkouts directory at path: \(path)")
245+
@Dependency(\.logger) var logger
246+
logger.info("Creating checkouts directory at path: \(path)")
239247
do {
240248
@Dependency(\.fileManager) var fileManager
241249
try fileManager.createDirectory(atPath: path,
242250
withIntermediateDirectories: false,
243251
attributes: nil)
244252
} catch {
245253
let error = AppError.genericError(nil, "Failed to create checkouts directory: \(error.localizedDescription)")
246-
Current.logger().report(error: error)
254+
logger.logger.report(error: error)
247255
}
248256
}
249257

@@ -254,7 +262,8 @@ extension Analyze {
254262
/// - url: url to clone from
255263
/// - Throws: Shell errors
256264
static func clone(cacheDir: String, url: String) async throws {
257-
Current.logger().info("cloning \(url) to \(cacheDir)")
265+
@Dependency(\.logger) var logger
266+
logger.info("cloning \(url) to \(cacheDir)")
258267
@Dependency(\.fileManager) var fileManager
259268
@Dependency(\.shell) var shell
260269
try await shell.run(command: .gitClone(url: URL(string: url)!, to: cacheDir),
@@ -270,13 +279,14 @@ extension Analyze {
270279
/// - Throws: Shell errors
271280
static func fetch(cacheDir: String, branch: String, url: String) async throws {
272281
@Dependency(\.fileManager) var fileManager
282+
@Dependency(\.logger) var logger
273283
@Dependency(\.shell) var shell
274-
Current.logger().info("pulling \(url) in \(cacheDir)")
284+
logger.info("pulling \(url) in \(cacheDir)")
275285
// clean up stray lock files that might have remained from aborted commands
276286
for fileName in ["HEAD.lock", "index.lock"] {
277287
let filePath = cacheDir + "/.git/\(fileName)"
278288
if fileManager.fileExists(atPath: filePath) {
279-
Current.logger().info("Removing stale \(fileName) at path: \(filePath)")
289+
logger.info("Removing stale \(fileName) at path: \(filePath)")
280290
try await shell.run(command: .removeFile(from: filePath), at: .cwd)
281291
}
282292
}
@@ -294,6 +304,7 @@ extension Analyze {
294304
/// - package: `Package` to refresh
295305
static func refreshCheckout(package: Joined<Package, Repository>) async throws {
296306
@Dependency(\.fileManager) var fileManager
307+
@Dependency(\.logger) var logger
297308
@Dependency(\.shell) var shell
298309

299310
guard let cacheDir = fileManager.cacheDirectoryPath(for: package.model) else {
@@ -313,7 +324,7 @@ extension Analyze {
313324
branch: package.repository?.defaultBranch ?? "master",
314325
url: package.model.url)
315326
} catch {
316-
Current.logger().info("fetch failed: \(error.localizedDescription)")
327+
logger.info("fetch failed: \(error.localizedDescription)")
317328
try await shell.run(command: .removeFile(from: cacheDir, arguments: ["-r", "-f"]), at: .cwd)
318329
try await clone(cacheDir: cacheDir, url: package.model.url)
319330
}
@@ -357,6 +368,8 @@ extension Analyze {
357368
static func diffVersions(client: Client,
358369
transaction: Database,
359370
package: Joined<Package, Repository>) async throws -> VersionDelta {
371+
@Dependency(\.logger) var logger
372+
360373
guard let pkgId = package.model.id else {
361374
throw AppError.genericError(nil, "PANIC: package id nil for package \(package.model.url)")
362375
}
@@ -374,7 +387,7 @@ extension Analyze {
374387
let newDiff = Version.diff(local: existing, incoming: throttled)
375388
let delta = origDiff.toAdd.count - newDiff.toAdd.count
376389
if delta > 0 {
377-
Current.logger().info("throttled \(delta) incoming revisions")
390+
logger.info("throttled \(delta) incoming revisions")
378391
AppMetrics.buildThrottleCount?.inc(delta)
379392
}
380393
return newDiff
@@ -506,12 +519,13 @@ extension Analyze {
506519
/// have processed the new version.
507520
/// - Parameter versionDelta: The version change
508521
static func carryOverDefaultBranchData(versionDelta: VersionDelta) {
522+
@Dependency(\.logger) var logger
509523
guard versionDelta.toDelete.filter(\.isBranch).count <= 1 else {
510-
Current.logger().warning("versionDelta.toDelete has more than one branch version")
524+
logger.warning("versionDelta.toDelete has more than one branch version")
511525
return
512526
}
513527
guard versionDelta.toAdd.filter(\.isBranch).count <= 1 else {
514-
Current.logger().warning("versionDelta.toAdd has more than one branch version")
528+
logger.warning("versionDelta.toAdd has more than one branch version")
515529
return
516530
}
517531
guard let oldDefaultBranch = versionDelta.toDelete.first(where: \.isBranch),
@@ -745,7 +759,8 @@ extension Analyze {
745759
package: package,
746760
versions: versions)
747761
} catch {
748-
Current.logger().warning("Social.postToFirehose failed: \(error.localizedDescription)")
762+
@Dependency(\.logger) var logger
763+
logger.warning("Social.postToFirehose failed: \(error.localizedDescription)")
749764
}
750765
}
751766

Sources/App/Commands/Common.swift

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
import Dependencies
1516
import Fluent
1617
import PostgresKit
1718
import Vapor
@@ -39,33 +40,35 @@ extension Analyze {
3940
static func updatePackages(client: Client,
4041
database: Database,
4142
results: [Result<Joined<Package, Repository>, Error>]) async throws {
43+
@Dependency(\.logger) var logger
4244
do {
4345
let total = results.count
4446
let errors = results.filter(\.isError).count
4547
let errorRate = total > 0 ? 100.0 * Double(errors) / Double(total) : 0.0
4648
switch errorRate {
4749
case 0:
48-
Current.logger().info("Updating \(total) packages for stage 'analysis'")
50+
logger.info("Updating \(total) packages for stage 'analysis'")
4951
case 0..<20:
50-
Current.logger().info("Updating \(total) packages for stage 'analysis' (errors: \(errors))")
52+
logger.info("Updating \(total) packages for stage 'analysis' (errors: \(errors))")
5153
default:
52-
Current.logger().critical("updatePackages: unusually high error rate: \(errors)/\(total) = \(errorRate)%")
54+
logger.critical("updatePackages: unusually high error rate: \(errors)/\(total) = \(errorRate)%")
5355
}
5456
}
5557
for result in results {
5658
do {
5759
try await updatePackage(client: client, database: database, result: result)
5860
} catch {
59-
Current.logger().critical("updatePackage failed: \(error)")
61+
logger.critical("updatePackage failed: \(error)")
6062
}
6163
}
6264

63-
Current.logger().debug("updateStatus ops: \(results.count)")
65+
logger.debug("updateStatus ops: \(results.count)")
6466
}
6567

6668
static func updatePackage(client: Client,
6769
database: Database,
6870
result: Result<Joined<Package, Repository>, Error>) async throws {
71+
@Dependency(\.logger) var logger
6972
switch result {
7073
case .success(let res):
7174
try await res.package.update(on: database, status: .ok, stage: .analysis)
@@ -76,16 +79,16 @@ extension Analyze {
7679
// Escalate database errors to critical
7780
let error = error as! PSQLError
7881
let msg = error.serverInfo?[.message] ?? String(reflecting: error)
79-
Current.logger().critical("\(msg)")
82+
logger.critical("\(msg)")
8083
try await recordError(database: database, error: error)
8184

8285
case let .failure(error) where error is DatabaseError:
8386
// Escalate database errors to critical
84-
Current.logger().critical("\(String(reflecting: error))")
87+
logger.critical("\(String(reflecting: error))")
8588
try await recordError(database: database, error: error)
8689

8790
case let .failure(error):
88-
Current.logger().report(error: error)
91+
logger.report(error: error)
8992
try await recordError(database: database, error: error)
9093
}
9194
}
@@ -128,13 +131,14 @@ extension Ingestion {
128131
database: Database,
129132
result: Result<Joined<Package, Repository>, Ingestion.Error>,
130133
stage: Package.ProcessingStage) async throws {
134+
@Dependency(\.logger) var logger
131135
switch result {
132136
case .success(let res):
133137
// for newly ingested package leave status == .new in order to fast-track analysis
134138
let updatedStatus: Package.Status = res.package.status == .new ? .new : .ok
135139
try await res.package.update(on: database, status: updatedStatus, stage: stage)
136140
case .failure(let failure):
137-
Current.logger().log(level: failure.level, "\(failure)")
141+
logger.log(level: failure.level, "\(failure)")
138142
try await Package.update(for: failure.packageId, on: database, status: failure.status, stage: stage)
139143
}
140144
}

0 commit comments

Comments
 (0)