def create_graph(module_list, force=None):
graph = Graph()
- return upgrade_graph(graph, module_list, force)
+ upgrade_graph(graph, module_list, force)
+ return graph
def upgrade_graph(graph, module_list, force=None):
if force is None:
force = []
packages = []
+ len_graph = len(graph)
for module in module_list:
try:
mod_path = get_module_path(module)
for package in later:
unmet_deps = filter(lambda p: p not in graph, dependencies[package])
logger.notifyChannel('init', netsvc.LOG_ERROR, 'module %s: Unmet dependencies: %s' % (package, ', '.join(unmet_deps)))
-
- return graph
+
+ result = len(graph) - len_graph
+ if result != len(module_list):
+ logger.notifyChannel('init', netsvc.LOG_WARNING, 'Not all modules have loaded.')
+ return result
def init_module_objects(cr, module_name, obj_list):
STATES_TO_LOAD += ['to install']
+ loop_guardrail = 0
while True:
+ loop_guardrail += 1
+ if loop_guardrail > 100:
+ raise ProgrammingError()
cr.execute("SELECT name from ir_module_module WHERE state in (%s)" % ','.join(['%s']*len(STATES_TO_LOAD)), STATES_TO_LOAD)
module_list = [name for (name,) in cr.fetchall() if name not in graph]
if not module_list:
break
-
- upgrade_graph(graph, module_list, force)
+
+ new_modules_in_graph = upgrade_graph(graph, module_list, force)
+ if new_modules_in_graph == 0:
+ # nothing to load
+ break
+
+ logger.notifyChannel('init', netsvc.LOG_DEBUG, 'Updating graph with %d more modules' % (len(module_list)))
r = load_module_graph(cr, graph, status, report=report)
has_updates = has_updates or r
obj = pool.get(model)
if obj:
obj._check_removed_columns(cr, log=True)
-
+
if report.get_report():
logger.notifyChannel('init', netsvc.LOG_INFO, report)