Read from repository configs instead of hardcoding repos/arch for update

This commit is contained in:
2024-11-16 00:30:19 +11:00
parent 1b6883c9df
commit e8d101edb5
4 changed files with 56 additions and 46 deletions

View File

@ -6,27 +6,15 @@
import Foundation
public struct ApkIndexUpdater {
var repositories: [String]
var architectures: [String]
public var repositories: [ApkIndexRepository]
public init() {
self.repositories = [
"https://dl-cdn.alpinelinux.org/alpine/v3.20/main",
"https://dl-cdn.alpinelinux.org/alpine/v3.20/community"
]
// other archs: "armhf", "armv7", "loongarch64", "ppc64le", "riscv64", "s390x", "x86"
self.architectures = [ "aarch64" /*, "x86_64" */ ]
self.repositories = []
}
public func update() {
let repositories = self.repositories.flatMap { repo in
self.architectures.map { arch in
ApkIndexRepository(name: repo, arch: arch)
}
}
let downloader = ApkIndexDownloader()
for repo in repositories {
for repo in self.repositories {
let localIndex = URL(filePath: repo.localName)
#if false
let shouldDownload = true
@ -41,7 +29,7 @@ public struct ApkIndexUpdater {
let graph: ApkPackageGraph
do {
let tables = try repositories.map { try readIndex(URL(filePath: $0.localName)) }
let tables = try self.repositories.map { try readIndex(URL(filePath: $0.localName)) }
graph = ApkPackageGraph(index: ApkIndex.merge(tables))
graph.buildGraphNode()

View File

@ -0,0 +1,47 @@
/*
* darwin-apk © 2024 Gay Pizza Specifications
* SPDX-License-Identifier: Apache-2.0
*/
import Foundation
import ArgumentParser
import darwin_apk
struct RepositoriesConfig {
let repositories: [ApkIndexRepository]
init() async throws(ExitCode) {
let repositories: [String], architectures: [String]
do {
repositories = try await Self.read(name: "repositories")
} catch {
print("Failed to read repositories: \(error.localizedDescription)")
throw .failure
}
do {
architectures = try await Self.read(name: "arch")
} catch {
print("Failed to read arch: \(error.localizedDescription)")
throw .failure
}
self.repositories = repositories.flatMap { repo in
architectures.map { arch in
ApkIndexRepository(name: repo, arch: arch)
}
}
}
var localRepositories: [URL] {
self.repositories.map { repo in
URL(filePath: repo.localName, directoryHint: .notDirectory)
}
}
private static func read(name: String) async throws -> [String] {
try await URL(filePath: name, directoryHint: .notDirectory).lines
.map { $0.trimmingCharacters(in: .whitespaces) }
.filter { !$0.isEmpty && $0.first != "#" } // Ignore empty & commented lines
.reduce(into: [String]()) { $0.append($1) }
}
}

View File

@ -41,25 +41,7 @@ struct DpkSearchCommand: AsyncParsableCommand {
let match: any PatternMatcher
match = try matcher.init(patterns: patterns, ignoreCase: !self.caseSensitive)
let repositories: [String], architectures: [String]
do {
repositories = try await PropertyFile.read(name: "repositories")
} catch {
print("Failed to read repositories: \(error.localizedDescription)")
throw .failure
}
do {
architectures = try await PropertyFile.read(name: "arch")
} catch {
print("Failed to read arch: \(error.localizedDescription)")
throw .failure
}
let localRepositories = repositories.flatMap { repo in
architectures.map { arch in
URL(filePath: ApkIndexRepository(name: repo, arch: arch).localName, directoryHint: .notDirectory)
}
}
let localRepositories = try await RepositoriesConfig().localRepositories
let index: ApkIndex
do {
index = ApkIndex.merge(try localRepositories.map(ApkIndex.init))
@ -75,12 +57,3 @@ struct DpkSearchCommand: AsyncParsableCommand {
}
}
}
struct PropertyFile {
static func read(name: String) async throws -> [String] {
try await URL(filePath: name, directoryHint: .notDirectory).lines
.map { $0.trimmingCharacters(in: .whitespaces) }
.filter { !$0.isEmpty && $0.first != "#" } // Ignore empty & commented lines
.reduce(into: [String]()) { $0.append($1) }
}
}

View File

@ -7,15 +7,17 @@ import Foundation
import ArgumentParser
import darwin_apk
struct DpkUpdateCommand: ParsableCommand {
struct DpkUpdateCommand: AsyncParsableCommand {
static let configuration = CommandConfiguration(
commandName: "update",
abstract: "Update the system package repositories.",
aliases: [ "u" ])
func run() throws {
func run() async throws {
print("Updating package repositories")
let repositories = try await RepositoriesConfig().repositories
var updater = ApkIndexUpdater()
updater.repositories.append(contentsOf: repositories)
updater.update()
}
}