@@ -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,40 @@ 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 )
136138 skipped_pkgs = []
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 :
142145 filename = package .filename
143146
144147 # Get the main artifact for package
145- main_artifact = package .contentartifact_set .get (). artifact
148+ main_artifact = package ._artifacts .get ()
146149
147150 metadata_digests = {"sha256" : package .metadata_sha256 }
148- metadata_artifact , mismatched_sha256 = artifact_to_metadata_artifact (
151+ result = artifact_to_metadata_artifact (
149152 filename , main_artifact , metadata_digests , temp_dir , Artifact
150153 )
151- if not metadata_artifact :
152- # Failed to build metadata artifact
154+ if result == "extraction_failed" :
155+ # Unset metadata_sha256 when metadata extraction fails
156+ package .metadata_sha256 = None
157+ packages_batch .append (package )
158+ skipped_pkgs .append (package .pk )
159+ continue
160+ if result is None :
161+ # Failed to build metadata artifact (init_and_validate failed)
153162 skipped_pkgs .append (package .pk )
154163 continue
164+ metadata_artifact , mismatched_sha256 = result
155165 if mismatched_sha256 :
156166 # Fix the package if its metadata_sha256 differs from the actual value
157167 package .metadata_sha256 = mismatched_sha256
158- package . save ( )
168+ packages_batch . append ( package )
159169
160170 contentartifact = ContentArtifact (
161171 artifact = metadata_artifact ,
@@ -170,14 +180,24 @@ def create_missing_metadata_artifacts(apps, schema_editor):
170180 ContentArtifact .objects .bulk_create (contentartifact_batch , batch_size = BATCH_SIZE )
171181 artifact_batch .clear ()
172182 contentartifact_batch .clear ()
183+ if len (packages_batch ) == BATCH_SIZE :
184+ PythonPackageContent .objects .bulk_update (
185+ packages_batch , ["metadata_sha256" ], batch_size = BATCH_SIZE
186+ )
187+ packages_batch .clear ()
173188
174189 if artifact_batch :
175190 Artifact .objects .bulk_create (artifact_batch , batch_size = BATCH_SIZE )
176191 ContentArtifact .objects .bulk_create (contentartifact_batch , batch_size = BATCH_SIZE )
192+ if packages_batch :
193+ PythonPackageContent .objects .bulk_update (
194+ packages_batch , ["metadata_sha256" ], batch_size = BATCH_SIZE
195+ )
177196
178- print (
179- f"Skipped creation of missing metadata artifacts for the following packages: { skipped_pkgs } "
180- )
197+ if skipped_pkgs :
198+ print (
199+ f"Skipped creation of missing metadata artifacts for the following packages: { skipped_pkgs } "
200+ )
181201
182202
183203class Migration (migrations .Migration ):
0 commit comments