@@ -540,7 +540,13 @@ def download_blob(
540540 if digest == oras .defaults .blank_hash :
541541 return os .devnull
542542 raise e
543- self ._validate_blob (outfile , oras .oci .Digest (digest ), size )
543+
544+ try :
545+ self ._validate_blob (outfile , oras .oci .Digest (digest ), size )
546+ except Exception :
547+ os .remove (outfile )
548+ raise
549+
544550 return outfile
545551
546552 def put_upload (
@@ -916,7 +922,6 @@ def pull(
916922 :type outdir: str
917923 :param target: target location to pull from
918924 :type target: str
919- :raises ValueError: if a layer descriptor or downloaded layer is invalid
920925 """
921926 container = self .get_container (target )
922927 self .auth .load_configs (
@@ -944,28 +949,17 @@ def pull(
944949 )
945950 continue
946951
947- digest = layer [ "digest" ]
948- size = layer ["size" ]
949- if not isinstance ( size , int ) or isinstance ( size , bool ) or size < 0 :
950- raise ValueError ( f"Invalid OCI descriptor size for { digest } : { size !r } ." )
952+ # A directory will need to be uncompressed and moved
953+ if layer ["mediaType" ] == oras . defaults . default_blob_dir_media_type :
954+ targz = oras . utils . get_tmpfile ( suffix = ".tar.gz" )
955+ self . download_blob ( container , layer [ "digest" ], targz , layer [ " size" ] )
951956
952- outfile_dir = os .path .dirname (outfile )
953- if outfile_dir and not os .path .exists (outfile_dir ):
954- oras .utils .mkdir_p (outfile_dir )
957+ # The artifact will be extracted to the correct name
958+ oras .utils .extract_targz (targz , os .path .dirname (outfile ))
955959
956- # Keep downloaded content private until its descriptor is verified.
957- with TemporaryDirectory (prefix = ".oras-" , dir = outfile_dir ) as tmpdir :
958- is_directory = (
959- layer ["mediaType" ] == oras .defaults .default_blob_dir_media_type
960- )
961- staged = os .path .join (tmpdir , "blob.tar.gz" if is_directory else "blob" )
962- self .download_blob (container , digest , staged , size )
963-
964- # A verified directory archive can now be safely consumed.
965- if is_directory :
966- oras .utils .extract_targz (staged , outfile_dir )
967- else :
968- os .replace (staged , outfile )
960+ # Anything else just extracted directly
961+ else :
962+ self .download_blob (container , layer ["digest" ], outfile , layer ["size" ])
969963
970964 logger .info (f"Successfully pulled { outfile } ." )
971965 files .append (outfile )
0 commit comments