@@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize};
1515use std:: collections:: { HashMap , HashSet } ;
1616use std:: fmt:: Debug ;
1717use std:: fs:: File ;
18- use std:: io:: { prelude:: * , BufReader } ;
18+ use std:: io:: { prelude:: * , BufReader , BufWriter } ;
1919use std:: marker:: PhantomData ;
2020use std:: path:: { Path , PathBuf } ;
2121use std:: str:: FromStr ;
@@ -142,7 +142,7 @@ pub struct BlobWriter<'a> {
142142 /// Compute checksum
143143 hash : Hasher ,
144144 /// Target file
145- target : Option < cap_tempfile:: TempFile < ' a > > ,
145+ target : Option < BufWriter < cap_tempfile:: TempFile < ' a > > > ,
146146 size : u64 ,
147147}
148148
@@ -673,7 +673,7 @@ impl<'a> BlobWriter<'a> {
673673 Ok ( Self {
674674 hash : Hasher :: new ( MessageDigest :: sha256 ( ) ) ?,
675675 // FIXME add ability to choose filename after completion
676- target : Some ( cap_tempfile:: TempFile :: new ( ocidir) ?) ,
676+ target : Some ( BufWriter :: new ( cap_tempfile:: TempFile :: new ( ocidir) ?) ) ,
677677 size : 0 ,
678678 } )
679679 }
@@ -702,7 +702,7 @@ impl<'a> BlobWriter<'a> {
702702 fn complete_as ( mut self , sha256_digest : & str ) -> Result < Blob > {
703703 let destname = & format ! ( "{}/{}" , BLOBDIR , sha256_digest) ;
704704 let target = self . target . take ( ) . unwrap ( ) ;
705- target. replace ( destname) ?;
705+ target. into_inner ( ) . unwrap ( ) . replace ( destname) ?;
706706 Ok ( Blob {
707707 sha256 : Sha256Digest :: from_str ( sha256_digest) . unwrap ( ) ,
708708 size : self . size ,
@@ -718,14 +718,10 @@ impl<'a> BlobWriter<'a> {
718718
719719impl std:: io:: Write for BlobWriter < ' _ > {
720720 fn write ( & mut self , srcbuf : & [ u8 ] ) -> std:: io:: Result < usize > {
721- self . hash . update ( srcbuf) ?;
722- self . target
723- . as_mut ( )
724- . unwrap ( )
725- . as_file_mut ( )
726- . write_all ( srcbuf) ?;
727- self . size += srcbuf. len ( ) as u64 ;
728- Ok ( srcbuf. len ( ) )
721+ let written = self . target . as_mut ( ) . unwrap ( ) . write ( srcbuf) ?;
722+ self . hash . update ( & srcbuf[ ..written] ) ?;
723+ self . size += written as u64 ;
724+ Ok ( written)
729725 }
730726
731727 fn flush ( & mut self ) -> std:: io:: Result < ( ) > {
@@ -757,6 +753,7 @@ where
757753 }
758754}
759755
756+ /// A writer for a layer.
760757pub struct LayerWriter < ' a , W >
761758where
762759 W : WriteComplete < BlobWriter < ' a > > ,
0 commit comments