@@ -68,7 +68,7 @@ def init_and_validate(file, artifact_model, expected_digests):
6868def extract_wheel_metadata (filename ):
6969 """
7070 Extract the metadata file content from a wheel file.
71- Returns the raw metadata content as bytes or None if metadata cannot be extracted.
71+ Return the raw metadata content as bytes or None if metadata cannot be extracted.
7272 """
7373 import zipfile
7474
@@ -84,7 +84,9 @@ def extract_wheel_metadata(filename):
8484
8585def artifact_to_metadata_artifact (filename , artifact , md_digests , tmp_dir , artifact_model ):
8686 """
87- Creates artifact for metadata from the provided wheel artifact.
87+ Create artifact for metadata from the provided wheel artifact.
88+ Return (artifact, mismatched_sha256) on success, "extraction_failed" when metadata extraction
89+ fails, or None on init_and_validate failure.
8890 """
8991 import shutil
9092 import tempfile
@@ -97,7 +99,7 @@ def artifact_to_metadata_artifact(filename, artifact, md_digests, tmp_dir, artif
9799
98100 metadata_content = extract_wheel_metadata (temp_wheel_path )
99101 if not metadata_content :
100- return None
102+ return "extraction_failed"
101103
102104 with tempfile .NamedTemporaryFile (
103105 "wb" , dir = tmp_dir , suffix = ".metadata" , delete = False
@@ -130,32 +132,39 @@ def create_missing_metadata_artifacts(apps, schema_editor):
130132 contentartifact__relative_path = models .F ("filename" ),
131133 )
132134 .exclude (metadata_sha256 = "" )
133- .prefetch_related ("contentartifact_set " )
135+ .prefetch_related ("_artifacts " )
134136 .only ("filename" , "metadata_sha256" )
135137 )
136- skipped_pkgs = []
138+ skipped_pkgs = 0
137139 artifact_batch = []
138140 contentartifact_batch = []
141+ packages_batch = []
139142
140143 with tempfile .TemporaryDirectory (dir = settings .WORKING_DIRECTORY ) as temp_dir :
141144 for package in packages :
142- filename = package .filename
143-
144145 # Get the main artifact for package
145- main_artifact = package .contentartifact_set .get (). artifact
146+ main_artifact = package ._artifacts .get ()
146147
148+ filename = package .filename
147149 metadata_digests = {"sha256" : package .metadata_sha256 }
148- metadata_artifact , mismatched_sha256 = artifact_to_metadata_artifact (
150+ result = artifact_to_metadata_artifact (
149151 filename , main_artifact , metadata_digests , temp_dir , Artifact
150152 )
151- if not metadata_artifact :
152- # Failed to build metadata artifact
153- skipped_pkgs .append (package .pk )
153+ if result == "extraction_failed" :
154+ # Unset metadata_sha256 when metadata extraction fails
155+ package .metadata_sha256 = None
156+ packages_batch .append (package )
157+ skipped_pkgs += 1
154158 continue
159+ if result is None :
160+ # Failed to build metadata artifact (init_and_validate failed)
161+ skipped_pkgs += 1
162+ continue
163+ metadata_artifact , mismatched_sha256 = result
155164 if mismatched_sha256 :
156165 # Fix the package if its metadata_sha256 differs from the actual value
157166 package .metadata_sha256 = mismatched_sha256
158- package . save ( )
167+ packages_batch . append ( package )
159168
160169 contentartifact = ContentArtifact (
161170 artifact = metadata_artifact ,
@@ -170,14 +179,22 @@ def create_missing_metadata_artifacts(apps, schema_editor):
170179 ContentArtifact .objects .bulk_create (contentartifact_batch , batch_size = BATCH_SIZE )
171180 artifact_batch .clear ()
172181 contentartifact_batch .clear ()
182+ if len (packages_batch ) == BATCH_SIZE :
183+ PythonPackageContent .objects .bulk_update (
184+ packages_batch , ["metadata_sha256" ], batch_size = BATCH_SIZE
185+ )
186+ packages_batch .clear ()
173187
174188 if artifact_batch :
175189 Artifact .objects .bulk_create (artifact_batch , batch_size = BATCH_SIZE )
176190 ContentArtifact .objects .bulk_create (contentartifact_batch , batch_size = BATCH_SIZE )
191+ if packages_batch :
192+ PythonPackageContent .objects .bulk_update (
193+ packages_batch , ["metadata_sha256" ], batch_size = BATCH_SIZE
194+ )
177195
178- print (
179- f"Skipped creation of missing metadata artifacts for the following packages: { skipped_pkgs } "
180- )
196+ if skipped_pkgs > 0 :
197+ print (f"Skipped creation of missing metadata artifacts for { skipped_pkgs } packages" )
181198
182199
183200class Migration (migrations .Migration ):
0 commit comments