From 9e04134e3ce22ca28dea075327e19339312477c6 Mon Sep 17 00:00:00 2001 From: Samuel Olwe Date: Tue, 24 Jun 2025 12:53:35 +0300 Subject: [PATCH 1/4] feat: moved migrate.py to root level --- migrate.py | 15 +++++++++++++++ rockcraft.yaml | 1 + 2 files changed, 16 insertions(+) create mode 100644 migrate.py diff --git a/migrate.py b/migrate.py new file mode 100644 index 00000000..7e46bb76 --- /dev/null +++ b/migrate.py @@ -0,0 +1,15 @@ +from flask_migrate import upgrade + +from webapp.app import app +from webapp.context import database_lock + + +def migrate() -> None: + # Use lock to prevent multiple concurrent migrations on startup + # Automatically upgrade to head revision + with app.app_context(), database_lock(): + upgrade() + + +if __name__ == "__main__": + migrate() \ No newline at end of file diff --git a/rockcraft.yaml b/rockcraft.yaml index cc011bd1..cc4dfc99 100644 --- a/rockcraft.yaml +++ b/rockcraft.yaml @@ -20,6 +20,7 @@ parts: - flask/app/.env - flask/app/app.py - flask/app/data + - flask/app/migrate.py - flask/app/migrations - flask/app/webapp - flask/app/templates From b80badc3527741f7f9af2e3298cb17dd104802d9 Mon Sep 17 00:00:00 2001 From: Samuel Olwe Date: Tue, 24 Jun 2025 13:54:25 +0300 Subject: [PATCH 2/4] feat: don't crash if caching fails --- webapp/site_repository.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/webapp/site_repository.py b/webapp/site_repository.py index 7b9ff60a..2e6f7291 100644 --- a/webapp/site_repository.py +++ b/webapp/site_repository.py @@ -276,8 +276,7 @@ def get_tree_from_db(self): ) tree = self.get_new_tree() return tree - # Raise an error if the project does not exist. - raise SiteRepositoryError("Invalid project_id. Unable to load tree.") + return None def get_tree(self, no_cache: bool = False): """Get the tree from the cache or load a new tree to cache and db.""" @@ -403,14 +402,14 @@ def get_tree_sync(self, no_cache: bool = False): self.invalidate_cache() # Load the tree from database - try: - tree = self.get_tree_from_db() + if tree := self.get_tree_from_db(): self.logger.info(f"Tree refreshed for {self.repository_uri}") - # Update the cache - self.set_tree_in_cache(tree) + try: + # Update the cache + self.set_tree_in_cache(tree) + except Exception as e: + self.logger.error(f"Unable to save tree to cache: {e}") return tree - except Exception as e: - self.logger.error(f"Error loading tree: {e}") # Or just return an empty tree return { From f291d59c3f7250882f736cb287765a78dc5d600e Mon Sep 17 00:00:00 2001 From: Samuel Olwe Date: Tue, 24 Jun 2025 14:06:03 +0300 Subject: [PATCH 3/4] fix: get new tree if there are no children and no parent --- webapp/site_repository.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/site_repository.py b/webapp/site_repository.py index 2e6f7291..c7564b65 100644 --- a/webapp/site_repository.py +++ b/webapp/site_repository.py @@ -265,7 +265,7 @@ def get_tree_from_db(self): tree = get_tree_struct(db.session, webpages) # If the tree is empty, load from the repository if not tree or ( - tree.get("children") and not tree.get("parent_id") + not tree.get("children") and not tree.get("parent_id") ): msg = ( "Reloading incomplete tree root " From 3bd4be8ffeeb3b12886849cb17b0c70ef5a323c0 Mon Sep 17 00:00:00 2001 From: Samuel Olwe Date: Tue, 24 Jun 2025 14:15:20 +0300 Subject: [PATCH 4/4] feat: print traceback on cache errors --- webapp/site_repository.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webapp/site_repository.py b/webapp/site_repository.py index c7564b65..2d0bf09a 100644 --- a/webapp/site_repository.py +++ b/webapp/site_repository.py @@ -2,6 +2,7 @@ import re import subprocess import time +import traceback from collections.abc import Callable from pathlib import Path from typing import TypedDict @@ -269,7 +270,7 @@ def get_tree_from_db(self): ): msg = ( "Reloading incomplete tree root " - f"{self.repository_uri}." + f"{self.repository_uri}. {tree}" ) self.logger.info( msg, @@ -408,6 +409,7 @@ def get_tree_sync(self, no_cache: bool = False): # Update the cache self.set_tree_in_cache(tree) except Exception as e: + self.logger.exception(traceback.format_exc()) self.logger.error(f"Unable to save tree to cache: {e}") return tree