diff --git a/.github/workflows/setup.sh b/.github/workflows/setup.sh index d4627858..c15e1f13 100755 --- a/.github/workflows/setup.sh +++ b/.github/workflows/setup.sh @@ -38,13 +38,13 @@ systemd-machine-id-setup [[ -z $MINIMAL_INSTALL ]] && WEB_ARGS=("--web-port" "8080") ahriman -a x86_64 -r "github" service-setup --packager "ahriman bot " "${WEB_ARGS[@]}" # validate configuration -ahriman -a x86_64 -r "github" service-config-validate --exit-code +ahriman service-config-validate --exit-code # enable services -systemctl enable ahriman-web@x86_64 -systemctl enable ahriman@x86_64.timer +systemctl enable ahriman-web@x86_64-github +systemctl enable ahriman@x86_64-github.timer if [[ -z $MINIMAL_INSTALL ]]; then # run web service (detached) - sudo -u ahriman -- ahriman -a x86_64 web & + sudo -u ahriman -- ahriman web & WEB_PID=$! fi # add the first package diff --git a/docs/ahriman.core.log.rst b/docs/ahriman.core.log.rst index 19624dec..ca69d75b 100644 --- a/docs/ahriman.core.log.rst +++ b/docs/ahriman.core.log.rst @@ -36,10 +36,10 @@ ahriman.core.log.lazy\_logging module :no-undoc-members: :show-inheritance: -ahriman.core.log.log module ---------------------------- +ahriman.core.log.log\_loader module +----------------------------------- -.. automodule:: ahriman.core.log.log +.. automodule:: ahriman.core.log.log_loader :members: :no-undoc-members: :show-inheritance: diff --git a/src/ahriman/core/database/migrations/m011_repository_name.py b/src/ahriman/core/database/migrations/m011_repository_name.py index fdc12b7d..8089fb4f 100644 --- a/src/ahriman/core/database/migrations/m011_repository_name.py +++ b/src/ahriman/core/database/migrations/m011_repository_name.py @@ -51,9 +51,6 @@ steps = [ alter table build_queue add column repository text not null default '' """, """ - alter table build_queue add column architecture text not null default '' - """, - """ alter table build_queue rename to build_queue_ """, """ @@ -61,8 +58,7 @@ steps = [ package_base text not null, properties json not null, repository text not null, - architecture text not null, - unique (package_base, architecture, repository) + unique (package_base, repository) ) """, """ @@ -76,9 +72,6 @@ steps = [ alter table package_bases add column repository text not null default '' """, """ - alter table package_bases add column architecture text not null default '' - """, - """ alter table package_bases rename to package_bases_ """, """ @@ -92,8 +85,7 @@ steps = [ source text, packager text, repository text not null, - architecture text not null, - unique (package_base, architecture, repository) + unique (package_base, repository) ) """, """ @@ -107,9 +99,6 @@ steps = [ alter table package_statuses add column repository text not null default '' """, """ - alter table package_statuses add column architecture text not null default '' - """, - """ alter table package_statuses rename to package_statuses_ """, """ @@ -118,8 +107,7 @@ steps = [ status text not null, last_updated integer, repository text not null, - architecture text not null, - unique (package_base, architecture, repository) + unique (package_base, repository) ) """, """ @@ -168,9 +156,6 @@ steps = [ alter table logs add column repository text not null default '' """, """ - alter table logs add column architecture text not null default '' - """, - """ drop index logs_package_base_version """, """ @@ -182,16 +167,15 @@ steps = [ created real not null, record text, version text not null, - repository text not null, - architecture text not null + repository text not null ) """, """ insert into logs select * from logs_ """, """ - create index logs_package_base_version_architecture_repository - on logs (package_base, version, architecture, repository) + create index logs_package_base_version_repository + on logs (package_base, version, repository) """, """ drop table logs_ @@ -220,13 +204,8 @@ def migrate_package_repository(connection: Connection, configuration: Configurat """ _, repository_id = configuration.check_loaded() - connection.execute("""update build_queue set repository = :repository, architecture = :architecture""", - {"repository": repository_id.name, "architecture": repository_id.architecture}) - connection.execute("""update package_bases set repository = :repository, architecture = :architecture""", - {"repository": repository_id.name, "architecture": repository_id.architecture}) - connection.execute("""update package_statuses set repository = :repository, architecture = :architecture""", - {"repository": repository_id.name, "architecture": repository_id.architecture}) - connection.execute("""update packages set repository = :repository""", - {"repository": repository_id.name}) - connection.execute("""update logs set repository = :repository, architecture = :architecture""", - {"repository": repository_id.name, "architecture": repository_id.architecture}) + connection.execute("""update build_queue set repository = :repository""", {"repository": repository_id.id}) + connection.execute("""update package_bases set repository = :repository""", {"repository": repository_id.id}) + connection.execute("""update package_statuses set repository = :repository""", {"repository": repository_id.id}) + connection.execute("""update packages set repository = :repository""", {"repository": repository_id.id}) + connection.execute("""update logs set repository = :repository""", {"repository": repository_id.id}) diff --git a/src/ahriman/core/database/operations/build_operations.py b/src/ahriman/core/database/operations/build_operations.py index 0012d16d..bc0ae350 100644 --- a/src/ahriman/core/database/operations/build_operations.py +++ b/src/ahriman/core/database/operations/build_operations.py @@ -39,13 +39,11 @@ class BuildOperations(Operations): connection.execute( """ delete from build_queue - where (:package_base is null or package_base = :package_base) - and repository = :repository and architecture = :architecture + where (:package_base is null or package_base = :package_base) and repository = :repository """, { "package_base": package_base, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, }) return self.with_connection(run, commit=True) @@ -61,11 +59,8 @@ class BuildOperations(Operations): return [ Package.from_json(row["properties"]) for row in connection.execute( - """ - select properties from build_queue - where repository = :repository and architecture = :architecture - """, - {"repository": self.repository_id.name, "architecture": self.repository_id.architecture} + """select properties from build_queue where repository = :repository""", + {"repository": self.repository_id.id} ) ] @@ -82,17 +77,16 @@ class BuildOperations(Operations): connection.execute( """ insert into build_queue - (package_base, properties, repository, architecture) + (package_base, properties, repository) values - (:package_base, :properties, :repository, :architecture) - on conflict (package_base, architecture, repository) do update set + (:package_base, :properties, :repository) + on conflict (package_base, repository) do update set properties = :properties """, { "package_base": package.base, "properties": package.view(), - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, }) return self.with_connection(run, commit=True) diff --git a/src/ahriman/core/database/operations/logs_operations.py b/src/ahriman/core/database/operations/logs_operations.py index 18d8b411..f4718b69 100644 --- a/src/ahriman/core/database/operations/logs_operations.py +++ b/src/ahriman/core/database/operations/logs_operations.py @@ -46,13 +46,12 @@ class LogsOperations(Operations): for row in connection.execute( """ select created, record from logs - where package_base = :package_base and repository = :repository and architecture = :architecture + where package_base = :package_base and repository = :repository order by created limit :limit offset :offset """, { "package_base": package_base, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, "limit": limit, "offset": offset, }) @@ -73,17 +72,16 @@ class LogsOperations(Operations): connection.execute( """ insert into logs - (package_base, version, created, record, repository, architecture) + (package_base, version, created, record, repository) values - (:package_base, :version, :created, :record, :repository, :architecture) + (:package_base, :version, :created, :record, :repository) """, { "package_base": log_record_id.package_base, "version": log_record_id.version, "created": created, "record": record, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, } ) @@ -102,14 +100,14 @@ class LogsOperations(Operations): connection.execute( """ delete from logs - where package_base = :package_base and repository = :repository and architecture = :architecture + where package_base = :package_base + and repository = :repository and (:version is null or version <> :version) """, { "package_base": package_base, "version": version, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, } ) diff --git a/src/ahriman/core/database/operations/package_operations.py b/src/ahriman/core/database/operations/package_operations.py index f77e8eca..7d7795d3 100644 --- a/src/ahriman/core/database/operations/package_operations.py +++ b/src/ahriman/core/database/operations/package_operations.py @@ -41,25 +41,11 @@ class PackageOperations(Operations): package_base(str): package base name """ connection.execute( - """ - delete from package_statuses - where package_base = :package_base and repository = :repository and architecture = :architecture - """, - { - "package_base": package_base, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, - }) + """delete from package_statuses where package_base = :package_base and repository = :repository""", + {"package_base": package_base, "repository": self.repository_id.id}) connection.execute( - """ - delete from package_bases - where package_base = :package_base and repository = :repository and architecture = :architecture - """, - { - "package_base": package_base, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, - }) + """delete from package_bases where package_base = :package_base and repository = :repository""", + {"package_base": package_base, "repository": self.repository_id.id}) def _package_remove_packages(self, connection: Connection, package_base: str, current_packages: Iterable[str]) -> None: @@ -75,20 +61,13 @@ class PackageOperations(Operations): package for package in connection.execute( """ - select package, repository, architecture from packages - where package_base = :package_base and repository = :repository and architecture = :architecture""", - { - "package_base": package_base, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, - }) + select package, repository from packages + where package_base = :package_base and repository = :repository""", + {"package_base": package_base, "repository": self.repository_id.id}) if package["package"] not in current_packages ] connection.executemany( - """ - delete from packages - where package = :package and repository = :repository and architecture = :architecture - """, + """delete from packages where package = :package and repository = :repository""", packages) def _package_update_insert_base(self, connection: Connection, package: Package) -> None: @@ -102,12 +81,10 @@ class PackageOperations(Operations): connection.execute( """ insert into package_bases - (package_base, version, source, branch, git_url, path, web_url, packager, - repository, architecture) + (package_base, version, source, branch, git_url, path, web_url, packager, repository) values - (:package_base, :version, :source, :branch, :git_url, :path, :web_url, :packager, - :repository, :architecture) - on conflict (package_base, architecture, repository) do update set + (:package_base, :version, :source, :branch, :git_url, :path, :web_url, :packager, :repository) + on conflict (package_base, repository) do update set version = :version, branch = :branch, git_url = :git_url, path = :path, web_url = :web_url, source = :source, packager = :packager """, @@ -120,8 +97,7 @@ class PackageOperations(Operations): "web_url": package.remote.web_url, "source": package.remote.source.value, "packager": package.packager, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, } ) @@ -140,7 +116,7 @@ class PackageOperations(Operations): package_list.append({ "package": name, "package_base": package.base, - "repository": self.repository_id.name, + "repository": self.repository_id.id, **description.view(), }) connection.executemany( @@ -177,18 +153,17 @@ class PackageOperations(Operations): connection.execute( """ insert into package_statuses - (package_base, status, last_updated, repository, architecture) + (package_base, status, last_updated, repository) values - (:package_base, :status, :last_updated, :repository, :architecture) - on conflict (package_base, architecture, repository) do update set + (:package_base, :status, :last_updated, :repository) + on conflict (package_base, repository) do update set status = :status, last_updated = :last_updated """, { "package_base": package_base, "status": status.status.value, "last_updated": status.timestamp, - "repository": self.repository_id.name, - "architecture": self.repository_id.architecture, + "repository": self.repository_id.id, }) def _packages_get_select_package_bases(self, connection: Connection) -> dict[str, Package]: @@ -209,8 +184,8 @@ class PackageOperations(Operations): packages={}, packager=row["packager"] or None, ) for row in connection.execute( - """select * from package_bases where repository = :repository and architecture = :architecture""", - {"repository": self.repository_id.name, "architecture": self.repository_id.architecture} + """select * from package_bases where repository = :repository""", + {"repository": self.repository_id.id} ) } @@ -226,8 +201,8 @@ class PackageOperations(Operations): dict[str, Package]: map of the package base to its descriptor including individual packages """ for row in connection.execute( - """select * from packages where repository = :repository and architecture = :architecture""", - {"repository": self.repository_id.name, "architecture": self.repository_id.architecture} + """select * from packages where repository = :repository""", + {"repository": self.repository_id.id} ): if row["package_base"] not in packages: continue # normally must never happen though @@ -247,8 +222,8 @@ class PackageOperations(Operations): return { row["package_base"]: BuildStatus.from_json({"status": row["status"], "timestamp": row["last_updated"]}) for row in connection.execute( - """select * from package_statuses where repository = :repository and architecture = :architecture""", - {"repository": self.repository_id.name, "architecture": self.repository_id.architecture} + """select * from package_statuses where repository = :repository""", + {"repository": self.repository_id.id} ) } diff --git a/src/ahriman/models/repository_id.py b/src/ahriman/models/repository_id.py index 5bc2b185..58dc272b 100644 --- a/src/ahriman/models/repository_id.py +++ b/src/ahriman/models/repository_id.py @@ -44,6 +44,16 @@ class RepositoryId: """ return not self.architecture or not self.name + @property + def id(self) -> str: + """ + get repository id to be used for databases + + Returns: + str: unique id for this repository + """ + return f"{self.architecture}-{self.name}" # basically the same as used for command line + def __lt__(self, other: Any) -> bool: """ comparison operator for sorting diff --git a/tests/ahriman/core/database/migrations/test_m011_repository_name.py b/tests/ahriman/core/database/migrations/test_m011_repository_name.py index b69d30ae..319ccc51 100644 --- a/tests/ahriman/core/database/migrations/test_m011_repository_name.py +++ b/tests/ahriman/core/database/migrations/test_m011_repository_name.py @@ -31,13 +31,9 @@ def test_migrate_package_repository(connection: Connection, configuration: Confi migrate_package_repository(connection, configuration) connection.execute.assert_has_calls([ - MockCall(pytest.helpers.anyvar(str, strict=True), - {"repository": configuration.repository_name, "architecture": configuration.architecture}), - MockCall(pytest.helpers.anyvar(str, strict=True), - {"repository": configuration.repository_name, "architecture": configuration.architecture}), - MockCall(pytest.helpers.anyvar(str, strict=True), - {"repository": configuration.repository_name, "architecture": configuration.architecture}), - MockCall(pytest.helpers.anyvar(str, strict=True), {"repository": configuration.repository_name}), - MockCall(pytest.helpers.anyvar(str, strict=True), - {"repository": configuration.repository_name, "architecture": configuration.architecture}), + MockCall(pytest.helpers.anyvar(str, strict=True), {"repository": configuration.repository_id.id}), + MockCall(pytest.helpers.anyvar(str, strict=True), {"repository": configuration.repository_id.id}), + MockCall(pytest.helpers.anyvar(str, strict=True), {"repository": configuration.repository_id.id}), + MockCall(pytest.helpers.anyvar(str, strict=True), {"repository": configuration.repository_id.id}), + MockCall(pytest.helpers.anyvar(str, strict=True), {"repository": configuration.repository_id.id}), ]) diff --git a/tests/ahriman/core/database/operations/test_package_operations.py b/tests/ahriman/core/database/operations/test_package_operations.py index ae02c720..b2ac37fb 100644 --- a/tests/ahriman/core/database/operations/test_package_operations.py +++ b/tests/ahriman/core/database/operations/test_package_operations.py @@ -18,8 +18,7 @@ def test_package_remove_package_base(database: SQLite, connection: Connection) - database._package_remove_package_base(connection, "package") args = { "package_base": "package", - "repository": database.repository_id.name, - "architecture": database.repository_id.architecture, + "repository": database.repository_id.id, } connection.execute.assert_has_calls([ MockCall(pytest.helpers.anyvar(str, strict=True), args), @@ -35,8 +34,7 @@ def test_package_remove_packages(database: SQLite, connection: Connection, packa connection.execute.assert_called_once_with( pytest.helpers.anyvar(str, strict=True), { "package_base": package_ahriman.base, - "repository": database.repository_id.name, - "architecture": database.repository_id.architecture, + "repository": database.repository_id.id, }) connection.executemany.assert_called_once_with(pytest.helpers.anyvar(str, strict=True), []) diff --git a/tests/ahriman/models/test_repository_id.py b/tests/ahriman/models/test_repository_id.py index d2d3d200..ebe0c9dc 100644 --- a/tests/ahriman/models/test_repository_id.py +++ b/tests/ahriman/models/test_repository_id.py @@ -13,6 +13,14 @@ def test_is_empty() -> None: assert not RepositoryId("arch", "repo").is_empty +def test_id() -> None: + """ + must correctly generate id + """ + assert RepositoryId("", "").id == "-" + assert RepositoryId("arch", "repo").id == "arch-repo" + + def test_lt() -> None: """ must correctly compare instances