@@ -1177,13 +1177,12 @@ def fileify(version_pk, commit):
1177
1177
project = version .project
1178
1178
1179
1179
if not commit :
1180
- log .info (
1180
+ log .warning (
1181
1181
LOG_TEMPLATE .format (
1182
1182
project = project .slug ,
1183
1183
version = version .slug ,
1184
1184
msg = (
1185
- 'Imported File not being built because no commit '
1186
- 'information'
1185
+ 'Search index not being built because no commit information'
1187
1186
),
1188
1187
),
1189
1188
)
@@ -1198,16 +1197,15 @@ def fileify(version_pk, commit):
1198
1197
msg = 'Creating ImportedFiles' ,
1199
1198
),
1200
1199
)
1201
- _manage_imported_files (version , path , commit )
1202
- _update_intersphinx_data (version , path , commit )
1203
- else :
1204
- log .info (
1205
- LOG_TEMPLATE .format (
1206
- project = project .slug ,
1207
- version = version .slug ,
1208
- msg = 'No ImportedFile files' ,
1209
- ),
1210
- )
1200
+ try :
1201
+ _manage_imported_files (version , path , commit )
1202
+ except Exception :
1203
+ log .exception ('Failed during ImportedFile creation' )
1204
+
1205
+ try :
1206
+ _update_intersphinx_data (version , path , commit )
1207
+ except Exception :
1208
+ log .exception ('Failed during SphinxDomain creation' )
1211
1209
1212
1210
1213
1211
def _update_intersphinx_data (version , path , commit ):
@@ -1223,6 +1221,20 @@ def _update_intersphinx_data(version, path, commit):
1223
1221
log .debug ('No objects.inv, skipping intersphinx indexing.' )
1224
1222
return
1225
1223
1224
+ full_json_path = version .project .get_production_media_path (
1225
+ type_ = 'json' , version_slug = version .slug , include_file = False
1226
+ )
1227
+ type_file = os .path .join (full_json_path , 'readthedocs-sphinx-domain-names.json' )
1228
+ types = {}
1229
+ titles = {}
1230
+ if os .path .exists (type_file ):
1231
+ try :
1232
+ data = json .load (open (type_file ))
1233
+ types = data ['types' ]
1234
+ titles = data ['titles' ]
1235
+ except Exception :
1236
+ log .exception ('Exception parsing readthedocs-sphinx-domain-names.json' )
1237
+
1226
1238
# These classes are copied from Sphinx
1227
1239
# https://git.io/fhFbI
1228
1240
class MockConfig :
@@ -1236,6 +1248,8 @@ class MockApp:
1236
1248
def warn (self , msg ):
1237
1249
log .warning ('Sphinx MockApp: %s' , msg )
1238
1250
1251
+ created_sphinx_domains = []
1252
+
1239
1253
invdata = intersphinx .fetch_inventory (MockApp (), '' , object_file )
1240
1254
for key , value in sorted (invdata .items () or {}):
1241
1255
domain , _type = key .split (':' )
@@ -1252,22 +1266,41 @@ def warn(self, msg):
1252
1266
else :
1253
1267
doc_name , anchor = url , ''
1254
1268
display_name = einfo [3 ]
1255
- obj , _ = SphinxDomain .objects .get_or_create (
1269
+ obj , created = SphinxDomain .objects .get_or_create (
1256
1270
project = version .project ,
1257
1271
version = version ,
1258
1272
domain = domain ,
1259
1273
name = name ,
1260
1274
display_name = display_name ,
1261
1275
type = _type ,
1276
+ type_display = types .get (f'{ domain } :{ _type } ' , '' ),
1262
1277
doc_name = doc_name ,
1278
+ doc_display = titles .get (doc_name , '' ),
1263
1279
anchor = anchor ,
1264
1280
)
1265
1281
if obj .commit != commit :
1266
1282
obj .commit = commit
1267
1283
obj .save ()
1268
- SphinxDomain .objects .filter (project = version .project ,
1269
- version = version
1270
- ).exclude (commit = commit ).delete ()
1284
+ if created :
1285
+ created_sphinx_domains .append (obj )
1286
+
1287
+ # Send bulk_post_create signal for bulk indexing to Elasticsearch
1288
+ bulk_post_create .send (sender = SphinxDomain , instance_list = created_sphinx_domains , commit = commit )
1289
+
1290
+ # Delete the SphinxDomain first from previous commit and
1291
+ # send bulk_post_delete signal for bulk removing from Elasticsearch
1292
+ delete_queryset = (
1293
+ SphinxDomain .objects .filter (project = version .project ,
1294
+ version = version
1295
+ ).exclude (commit = commit )
1296
+ )
1297
+ # Keep the objects into memory to send it to signal
1298
+ instance_list = list (delete_queryset )
1299
+ # Always pass the list of instance, not queryset.
1300
+ bulk_post_delete .send (sender = SphinxDomain , instance_list = instance_list , commit = commit )
1301
+
1302
+ # Delete from previous versions
1303
+ delete_queryset .delete ()
1271
1304
1272
1305
1273
1306
def _manage_imported_files (version , path , commit ):
@@ -1294,7 +1327,7 @@ def _manage_imported_files(version, path, commit):
1294
1327
md5 = hashlib .md5 (open (full_path , 'rb' ).read ()).hexdigest ()
1295
1328
try :
1296
1329
# pylint: disable=unpacking-non-sequence
1297
- obj , __ = model_class .objects .get_or_create (
1330
+ obj , created = model_class .objects .get_or_create (
1298
1331
project = version .project ,
1299
1332
version = version ,
1300
1333
path = dirpath ,
@@ -1310,34 +1343,38 @@ def _manage_imported_files(version, path, commit):
1310
1343
obj .commit = commit
1311
1344
obj .save ()
1312
1345
1313
- if model_class == HTMLFile :
1346
+ if created and model_class == HTMLFile :
1314
1347
# the `obj` is HTMLFile, so add it to the list
1315
1348
created_html_files .append (obj )
1316
1349
1317
1350
# Send bulk_post_create signal for bulk indexing to Elasticsearch
1318
- bulk_post_create .send (sender = HTMLFile , instance_list = created_html_files )
1351
+ bulk_post_create .send (sender = HTMLFile , instance_list = created_html_files ,
1352
+ version = version , commit = commit )
1319
1353
1320
1354
# Delete the HTMLFile first from previous commit and
1321
1355
# send bulk_post_delete signal for bulk removing from Elasticsearch
1322
1356
delete_queryset = (
1323
1357
HTMLFile .objects .filter (project = version .project ,
1324
1358
version = version ).exclude (commit = commit )
1325
1359
)
1360
+
1326
1361
# Keep the objects into memory to send it to signal
1327
1362
instance_list = list (delete_queryset )
1363
+
1328
1364
# Always pass the list of instance, not queryset.
1329
1365
# These objects must exist though,
1330
1366
# because the task will query the DB for the objects before deleting
1331
- bulk_post_delete .send (sender = HTMLFile , instance_list = instance_list )
1332
- # Safely delete from database
1333
- delete_queryset .delete ()
1367
+ bulk_post_delete .send (sender = HTMLFile , instance_list = instance_list ,
1368
+ version = version , commit = commit )
1334
1369
1335
1370
# Delete ImportedFiles from previous versions
1336
- (
1337
- ImportedFile .objects .filter (project = version .project ,
1338
- version = version ).exclude (commit = commit
1339
- ).delete ()
1340
- )
1371
+ delete_queryset .delete ()
1372
+
1373
+ # This is required to delete ImportedFile objects that aren't HTMLFile objects,
1374
+ ImportedFile .objects .filter (
1375
+ project = version .project , version = version
1376
+ ).exclude (commit = commit ).delete ()
1377
+
1341
1378
changed_files = [
1342
1379
resolve_path (
1343
1380
version .project ,
0 commit comments