fix(core): preserve an existing database default when repairing a missing config default

Follow-up to #985 (the #974 fix by @rudi193-cmd), addressing the codex P2
raised on #987: when config's default_project has no database row but the
database still holds a valid default of its own, promoting the just-added
project would silently steal that default. The repair now repoints config
at a surviving database default — matching synchronize_projects, which
treats the database default as authoritative — and promotes the added
project only when no usable database default exists (no default at all,
or one unknown to config, which set_default_project rejects and
reconciliation deletes).

Also removes an unused ProjectConfig import from the #985 regression test
(strict ruff failure; CI's --fix lint masked it).

Refs #974

Signed-off-by: phernandez <paul@basicmachines.co>
This commit is contained in:
phernandez
2026-06-12 09:07:14 -05:00
committed by Paul Hernandez
parent 25732b2fe2
commit 32a1c208b3
2 changed files with 77 additions and 9 deletions
+30 -8
View File
@@ -261,14 +261,36 @@ class ProjectService:
if config_default is not None:
db_default_project = await self.repository.get_by_name(config_default)
if db_default_project is None:
await self.repository.set_as_default(created_project.id)
self.config_manager.set_default_project(name)
logger.info(
"Promoted project '%s' to default because configured default '%s' "
"is missing from database",
name,
config_default,
)
# Trigger: config names a default project that has no database row
# (the fresh-config wedge from issue #974).
# Why: synchronize_projects treats an existing database default as
# authoritative, so a surviving default must win over promoting
# the just-added project. set_default_project raises for names
# absent from config — and reconciliation deletes such rows —
# so a database default unknown to config cannot be repointed to.
# Outcome: config is repointed at a usable database default when one
# exists; otherwise the added project becomes the default.
db_default = await self.repository.get_default_project()
if (
db_default is not None
and self.config_manager.get_project(db_default.name)[0] is not None
):
self.config_manager.set_default_project(db_default.name)
logger.info(
"Repointed config default from missing '%s' at existing "
"database default '%s'",
config_default,
db_default.name,
)
else:
await self.repository.set_as_default(created_project.id)
self.config_manager.set_default_project(name)
logger.info(
"Promoted project '%s' to default because configured default '%s' "
"is missing from database",
name,
config_default,
)
logger.info(f"Project '{name}' added at {resolved_path}")