@@ -125,6 +125,39 @@ def run(self):
125
125
126
126
# Support for documenting audit event
127
127
128
+ def audit_events_purge (app , env , docname ):
129
+ """This is to remove from env.all_audit_events old traces of removed
130
+ documents.
131
+ """
132
+ if not hasattr (env , 'all_audit_events' ):
133
+ return
134
+ fresh_all_audit_events = {}
135
+ for name , event in env .all_audit_events .items ():
136
+ event ["source" ] = [(d , t ) for d , t in event ["source" ] if d != docname ]
137
+ if event ["source" ]:
138
+ # Only keep audit_events that have at least one source.
139
+ fresh_all_audit_events [name ] = event
140
+ env .all_audit_events = fresh_all_audit_events
141
+
142
+
143
+ def audit_events_merge (app , env , docnames , other ):
144
+ """In Sphinx parallel builds, this merges env.all_audit_events from
145
+ subprocesses.
146
+
147
+ all_audit_events is a dict of names, with values like:
148
+ {'source': [(docname, target), ...], 'args': args}
149
+ """
150
+ if not hasattr (other , 'all_audit_events' ):
151
+ return
152
+ if not hasattr (env , 'all_audit_events' ):
153
+ env .all_audit_events = {}
154
+ for name , value in other .all_audit_events .items ():
155
+ if name in env .all_audit_events :
156
+ env .all_audit_events [name ]["source" ].extend (value ["source" ])
157
+ else :
158
+ env .all_audit_events [name ] = value
159
+
160
+
128
161
class AuditEvent (Directive ):
129
162
130
163
has_content = True
@@ -589,4 +622,6 @@ def setup(app):
589
622
app .add_directive_to_domain ('py' , 'abstractmethod' , PyAbstractMethod )
590
623
app .add_directive ('miscnews' , MiscNews )
591
624
app .connect ('doctree-resolved' , process_audit_events )
625
+ app .connect ('env-merge-info' , audit_events_merge )
626
+ app .connect ('env-purge-doc' , audit_events_purge )
592
627
return {'version' : '1.0' , 'parallel_read_safe' : True }
0 commit comments