@@ -860,8 +860,7 @@ def write_cache(id: str, path: str, tree: MypyFile,
860
860
861
861
# Make sure directory for cache files exists
862
862
parent = os .path .dirname (data_json )
863
- if not os .path .isdir (parent ):
864
- os .makedirs (parent )
863
+ os .makedirs (parent , exist_ok = True )
865
864
assert os .path .dirname (meta_json ) == parent
866
865
867
866
# Construct temp file names
@@ -877,6 +876,20 @@ def write_cache(id: str, path: str, tree: MypyFile,
877
876
data_str = json .dumps (data , sort_keys = True )
878
877
interface_hash = compute_hash (data_str )
879
878
879
+ # Obtain and set up metadata
880
+ try :
881
+ st = manager .get_stat (path )
882
+ except OSError as err :
883
+ manager .log ("Cannot get stat for {}: {}" .format (path , err ))
884
+ # Remove apparently-invalid cache files.
885
+ for filename in [data_json , meta_json ]:
886
+ try :
887
+ os .remove (filename )
888
+ except OSError :
889
+ pass
890
+ # Still return the interface hash we computed.
891
+ return interface_hash
892
+
880
893
# Write data cache file, if applicable
881
894
if old_interface_hash == interface_hash :
882
895
# If the interface is unchanged, the cached data is guaranteed
@@ -891,8 +904,6 @@ def write_cache(id: str, path: str, tree: MypyFile,
891
904
os .replace (data_json_tmp , data_json )
892
905
manager .trace ("Interface for {} has changed" .format (id ))
893
906
894
- # Obtain and set up metadata
895
- st = manager .get_stat (path ) # TODO: Handle errors
896
907
mtime = st .st_mtime
897
908
size = st .st_size
898
909
options = manager .options .clone_for_module (id )
@@ -1524,26 +1535,26 @@ def valid_references(self) -> Set[str]:
1524
1535
return valid_refs
1525
1536
1526
1537
def write_cache (self ) -> None :
1527
- ok = self .path and self .options .incremental
1528
- if ok :
1529
- if self .manager .options .quick_and_dirty :
1530
- is_errors = self .manager .errors .is_errors_for_file (self .path )
1531
- else :
1532
- is_errors = self .manager .errors .is_errors ()
1533
- ok = not is_errors
1534
- if ok :
1535
- dep_prios = [self .priorities .get (dep , PRI_HIGH ) for dep in self .dependencies ]
1536
- new_interface_hash = write_cache (
1537
- self .id , self .path , self .tree ,
1538
- list (self .dependencies ), list (self .suppressed ), list (self .child_modules ),
1539
- dep_prios , self .interface_hash ,
1540
- self .manager )
1541
- if new_interface_hash == self .interface_hash :
1542
- self .manager .log ("Cached module {} has same interface" .format (self .id ))
1543
- else :
1544
- self .manager .log ("Cached module {} has changed interface" .format (self .id ))
1545
- self .mark_interface_stale ()
1546
- self .interface_hash = new_interface_hash
1538
+ if not self .path or self .options .cache_dir == os . devnull :
1539
+ return
1540
+ if self .manager .options .quick_and_dirty :
1541
+ is_errors = self .manager .errors .is_errors_for_file (self .path )
1542
+ else :
1543
+ is_errors = self .manager .errors .is_errors ()
1544
+ if is_errors :
1545
+ return
1546
+ dep_prios = [self .priorities .get (dep , PRI_HIGH ) for dep in self .dependencies ]
1547
+ new_interface_hash = write_cache (
1548
+ self .id , self .path , self .tree ,
1549
+ list (self .dependencies ), list (self .suppressed ), list (self .child_modules ),
1550
+ dep_prios , self .interface_hash ,
1551
+ self .manager )
1552
+ if new_interface_hash == self .interface_hash :
1553
+ self .manager .log ("Cached module {} has same interface" .format (self .id ))
1554
+ else :
1555
+ self .manager .log ("Cached module {} has changed interface" .format (self .id ))
1556
+ self .mark_interface_stale ()
1557
+ self .interface_hash = new_interface_hash
1547
1558
1548
1559
1549
1560
def dispatch (sources : List [BuildSource ], manager : BuildManager ) -> Graph :
0 commit comments