diff --git a/codewiki/src/be/dependency_analyzer/analysis/call_graph_analyzer.py b/codewiki/src/be/dependency_analyzer/analysis/call_graph_analyzer.py index db524edf..b6d720e3 100644 --- a/codewiki/src/be/dependency_analyzer/analysis/call_graph_analyzer.py +++ b/codewiki/src/be/dependency_analyzer/analysis/call_graph_analyzer.py @@ -356,16 +356,11 @@ def _resolve_call_relationships(self): relationship.is_resolved = True resolved_count += 1 elif "." in callee_name: - if callee_name in func_lookup: - relationship.callee = func_lookup[callee_name] + method_name = callee_name.split(".")[-1] + if method_name in func_lookup: + relationship.callee = func_lookup[method_name] relationship.is_resolved = True resolved_count += 1 - else: - method_name = callee_name.split(".")[-1] - if method_name in func_lookup: - relationship.callee = func_lookup[method_name] - relationship.is_resolved = True - resolved_count += 1 def _deduplicate_relationships(self): """ @@ -539,3 +534,4 @@ def _select_most_connected_nodes(self, target_count: int): if rel.caller in selected_func_ids and rel.callee in selected_func_ids ] + diff --git a/codewiki/src/be/documentation_generator.py b/codewiki/src/be/documentation_generator.py index ae3c7634..f0ca485a 100644 --- a/codewiki/src/be/documentation_generator.py +++ b/codewiki/src/be/documentation_generator.py @@ -201,6 +201,7 @@ async def generate_module_documentation(self, components: Dict[str, Any], leaf_n # Process modules in dependency order final_module_tree = module_tree processed_modules = set() + failed_modules = [] if len(module_tree) > 0: logger.info(f"├─ Processing {len(processing_order)} modules...") @@ -284,9 +285,20 @@ async def generate_module_documentation(self, components: Dict[str, Any], leaf_n logger.error(f"│ ├─ [{idx}/{len(processing_order)}] ❌ Failed: {module_key}") logger.error(f"│ │ └─ Error: {str(e)}") logger.error(f"│ │ └─ Traceback:\n{traceback.format_exc()}") - # Continue processing other modules (graceful degradation) + # Record the failure so the overall run can be reported/failed + # instead of silently degrading to a stale/incomplete tree. + failed_modules.append((module_key, str(e))) continue + if failed_modules: + failure_summary = "; ".join(f"{key}: {err}" for key, err in failed_modules) + logger.error( + f"├─ ❌ {len(failed_modules)}/{len(processing_order)} module(s) failed to generate: {failure_summary}" + ) + raise RuntimeError( + f"Module documentation generation failed for {len(failed_modules)} module(s): {failure_summary}" + ) + # Generate repo overview logger.info(f"├─ 📚 Generating repository overview...") import time @@ -492,4 +504,4 @@ async def run(self) -> None: except Exception as e: logger.error(f"Documentation generation failed: {str(e)}") logger.error(f"Traceback: {traceback.format_exc()}") - raise \ No newline at end of file + raise diff --git a/codewiki/src/fe/config.py b/codewiki/src/fe/config.py index cb041f29..8637aac9 100644 --- a/codewiki/src/fe/config.py +++ b/codewiki/src/fe/config.py @@ -22,7 +22,7 @@ class WebAppConfig: CACHE_EXPIRY_DAYS = 365 # Job cleanup settings - JOB_CLEANUP_HOURS = 24000 + JOB_CLEANUP_HOURS = 24 RETRY_COOLDOWN_MINUTES = 3 # Server settings diff --git a/codewiki/src/fe/github_processor.py b/codewiki/src/fe/github_processor.py index a31ce6b8..53fb33e6 100644 --- a/codewiki/src/fe/github_processor.py +++ b/codewiki/src/fe/github_processor.py @@ -71,6 +71,8 @@ def clone_repository(clone_url: str, target_dir: str, commit_id: str = None) -> if result.returncode != 0: logger.error(f"Error cloning repository: {result.stderr}") + if os.path.isdir(target_dir): + shutil.rmtree(target_dir, ignore_errors=True) return False # Checkout specific commit @@ -91,6 +93,8 @@ def clone_repository(clone_url: str, target_dir: str, commit_id: str = None) -> if result.returncode != 0: logger.error(f"Error cloning repository: {result.stderr}") + if os.path.isdir(target_dir): + shutil.rmtree(target_dir, ignore_errors=True) return False return True @@ -99,3 +103,4 @@ def clone_repository(clone_url: str, target_dir: str, commit_id: str = None) -> if os.path.isdir(target_dir): shutil.rmtree(target_dir, ignore_errors=True) return False +