Skip to content

Commit e0eb047

Browse files
authored
Add back support for simplified fine-grained logging (#4557)
A recent change merged fine-grained and general logging, resulting in pretty verbose logging for fine-grained mode. This change adds back a development-time option to use less verbose logging specific to the fine-grained incremental mode.
1 parent 46ecea5 commit e0eb047

File tree

2 files changed

+39
-17
lines changed

2 files changed

+39
-17
lines changed

mypy/build.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@
5555
from mypy.server.deps import get_dependencies
5656

5757

58+
# Switch to True to produce debug output related to fine-grained incremental
59+
# mode only that is useful during development. This produces only a subset of
60+
# output compared to --verbose output. We use a global flag to enable this so
61+
# that it's easy to enable this when running tests.
62+
DEBUG_FINE_GRAINED = False
63+
64+
5865
PYTHON_EXTENSIONS = ['.pyi', '.py']
5966

6067

@@ -734,6 +741,17 @@ def log(self, *message: str) -> None:
734741
print(file=sys.stderr)
735742
sys.stderr.flush()
736743

744+
def log_fine_grained(self, *message: str) -> None:
745+
if self.options.verbosity >= 1:
746+
self.log('fine-grained:', *message)
747+
elif DEBUG_FINE_GRAINED:
748+
# Output log in a simplified format that is quick to browse.
749+
if message:
750+
print(*message, file=sys.stderr)
751+
else:
752+
print(file=sys.stderr)
753+
sys.stderr.flush()
754+
737755
def trace(self, *message: str) -> None:
738756
if self.options.verbosity >= 2:
739757
print('TRACE:', *message, file=sys.stderr)

mypy/server/update.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@
123123

124124
from mypy.build import (
125125
BuildManager, State, BuildSource, Graph, load_graph, SavedCache, CacheMeta,
126-
cache_meta_from_dict, find_module_clear_caches
126+
cache_meta_from_dict, find_module_clear_caches, DEBUG_FINE_GRAINED
127127
)
128128
from mypy.checker import DeferredNode
129129
from mypy.errors import Errors, CompileError
@@ -201,23 +201,23 @@ def update(self, changed_modules: List[Tuple[str, str]]) -> List[str]:
201201
self.triggered = []
202202
changed_modules = dedupe_modules(changed_modules + self.stale)
203203
initial_set = {id for id, _ in changed_modules}
204-
self.manager.log('fine-grained: ==== update %s ====' % ', '.join(
204+
self.manager.log_fine_grained('==== update %s ====' % ', '.join(
205205
repr(id) for id, _ in changed_modules))
206-
if self.previous_targets_with_errors and self.options.verbosity >= 1:
207-
self.manager.log('fine-grained: previous targets with errors: %s' %
206+
if self.previous_targets_with_errors and is_verbose(self.manager):
207+
self.manager.log_fine_grained('previous targets with errors: %s' %
208208
sorted(self.previous_targets_with_errors))
209209

210210
if self.blocking_error:
211211
# Handle blocking errors first. We'll exit as soon as we find a
212212
# module that still has blocking errors.
213-
self.manager.log('fine-grained: existing blocker: %s' % self.blocking_error[0])
213+
self.manager.log_fine_grained('existing blocker: %s' % self.blocking_error[0])
214214
changed_modules = dedupe_modules([self.blocking_error] + changed_modules)
215215
self.blocking_error = None
216216

217217
while changed_modules:
218218
next_id, next_path = changed_modules.pop(0)
219219
if next_id not in self.previous_modules and next_id not in initial_set:
220-
self.manager.log('fine-grained: skip %r (module not in import graph)' % next_id)
220+
self.manager.log_fine_grained('skip %r (module not in import graph)' % next_id)
221221
continue
222222
result = self.update_single(next_id, next_path)
223223
messages, remaining, (next_id, next_path), blocker = result
@@ -248,7 +248,7 @@ def update_single(self, module: str, path: str) -> Tuple[List[str],
248248
- Module which was actually processed as (id, path) tuple
249249
- Whether there was a blocking error in the module
250250
"""
251-
self.manager.log('fine-grained: --- update single %r ---' % module)
251+
self.manager.log_fine_grained('--- update single %r ---' % module)
252252

253253
# TODO: If new module brings in other modules, we parse some files multiple times.
254254
manager = self.manager
@@ -272,10 +272,10 @@ def update_single(self, module: str, path: str) -> Tuple[List[str],
272272

273273
# TODO: What to do with stale dependencies?
274274
triggered = calculate_active_triggers(manager, old_snapshots, {module: tree})
275-
if self.options.verbosity >= 1:
275+
if is_verbose(self.manager):
276276
filtered = [trigger for trigger in triggered
277277
if not trigger.endswith('__>')]
278-
self.manager.log('fine-grained: triggered: %r' % sorted(filtered))
278+
self.manager.log_fine_grained('triggered: %r' % sorted(filtered))
279279
self.triggered.extend(triggered | self.previous_targets_with_errors)
280280
collect_dependencies({module: tree}, self.deps, graph)
281281
remaining += propagate_changes_using_dependencies(
@@ -367,7 +367,7 @@ def update_single_isolated(module: str,
367367
if module in manager.modules:
368368
assert_equivalent_paths(path, manager.modules[module].path)
369369
else:
370-
manager.log('fine-grained: new module %r' % module)
370+
manager.log_fine_grained('new module %r' % module)
371371

372372
old_modules = dict(manager.modules)
373373
sources = get_sources(previous_modules, [(module, path)])
@@ -411,7 +411,7 @@ def update_single_isolated(module: str,
411411
else:
412412
del manager.modules[id]
413413
del graph[id]
414-
manager.log('fine-grained: --> %r (newly imported)' % module)
414+
manager.log_fine_grained('--> %r (newly imported)' % module)
415415
else:
416416
remaining_modules = []
417417

@@ -485,7 +485,7 @@ def assert_equivalent_paths(path1: str, path2: str) -> None:
485485
def delete_module(module_id: str,
486486
graph: Dict[str, State],
487487
manager: BuildManager) -> Dict[str, State]:
488-
manager.log('fine-grained: delete module %r' % module_id)
488+
manager.log_fine_grained('delete module %r' % module_id)
489489
# TODO: Deletion of a package
490490
# TODO: Remove deps for the module (this only affects memory use, not correctness)
491491
assert module_id not in graph
@@ -735,7 +735,7 @@ def propagate_changes_using_dependencies(
735735
if id is not None and id not in up_to_date_modules:
736736
if id not in todo:
737737
todo[id] = set()
738-
manager.log('fine-grained: process: %s' % target)
738+
manager.log_fine_grained('process: %s' % target)
739739
todo[id].update(lookup_target(manager.modules, target))
740740
triggered = set()
741741
# TODO: Preserve order (set is not optimal)
@@ -753,8 +753,8 @@ def propagate_changes_using_dependencies(
753753
# dependency loop that loops back to an originally processed module.
754754
up_to_date_modules = set()
755755
targets_with_errors = set()
756-
if manager.options.verbosity >= 1:
757-
manager.log('fine-grained: triggered: %r' % list(triggered))
756+
if is_verbose(manager):
757+
manager.log_fine_grained('triggered: %r' % list(triggered))
758758

759759
return remaining_modules
760760

@@ -793,7 +793,7 @@ def find_targets_recursive(
793793
continue
794794
if module_id not in result:
795795
result[module_id] = set()
796-
manager.log('fine-grained: process %s' % target)
796+
manager.log_fine_grained('process %s' % target)
797797
deferred = lookup_target(modules, target)
798798
result[module_id].update(deferred)
799799

@@ -810,7 +810,7 @@ def reprocess_nodes(manager: BuildManager,
810810
Return fired triggers.
811811
"""
812812
if module_id not in manager.saved_cache or module_id not in graph:
813-
manager.log('fine-grained: %s not in saved cache or graph (blocking errors or deleted?)' %
813+
manager.log_fine_grained('%s not in saved cache or graph (blocking errors or deleted?)' %
814814
module_id)
815815
return set()
816816

@@ -1008,3 +1008,7 @@ def extract_type_maps(graph: Graph) -> Dict[str, Dict[Expression, Type]]:
10081008
# This is used to export information used only by the testmerge harness.
10091009
return {id: state.type_map() for id, state in graph.items()
10101010
if state.tree}
1011+
1012+
1013+
def is_verbose(manager: BuildManager) -> bool:
1014+
return manager.options.verbosity >= 1 or DEBUG_FINE_GRAINED

0 commit comments

Comments
 (0)