@@ -20,10 +20,11 @@ use std::sync::Mutex;
2020
2121use base64:: Engine ;
2222
23- use super :: core:: { BucketOperation , CommitFile , HfCore , LfsFile , map_xet_error } ;
23+ use super :: core:: { BucketOperation , CommitFile , HfCore , LfsFile } ;
2424use super :: uri:: RepoType ;
2525use opendal_core:: raw:: * ;
2626use opendal_core:: * ;
27+ use subxet:: data:: errors:: DataProcessingError ;
2728use subxet:: data:: streaming:: XetWriter ;
2829
2930/// Writer that handles both regular (small) and XET (large) file uploads.
@@ -45,34 +46,33 @@ pub enum HfWriter {
4546impl HfWriter {
4647 /// Create a new writer by determining the upload mode from the API.
4748 pub async fn try_new ( core : Arc < HfCore > , path : String ) -> Result < Self > {
48- // Buckets always use XET and don't have a preupload endpoint
49- if core. repo . repo_type == RepoType :: Bucket {
49+ // Buckets always use XET and don't have a preupload endpoint;
50+ // other repo types check the preupload API.
51+ let use_xet = core. repo . repo_type == RepoType :: Bucket
52+ || core. determine_upload_mode ( & path) . await ? == "lfs" ;
53+
54+ let writer = if use_xet {
5055 let client = core. xet_client ( "write" ) . await ?;
51- let writer = client. write ( None ) . await . map_err ( map_xet_error) ?;
52- return Ok ( HfWriter :: Xet {
56+ let writer = client. write ( None ) . await . map_err ( |err| {
57+ let kind = match & err {
58+ DataProcessingError :: AuthError ( _) => ErrorKind :: PermissionDenied ,
59+ _ => ErrorKind :: Unexpected ,
60+ } ;
61+ Error :: new ( kind, "failed to create xet writer" ) . set_source ( err)
62+ } ) ?;
63+ HfWriter :: Xet {
5364 core,
5465 path,
5566 writer : Mutex :: new ( writer) ,
56- } ) ;
57- }
58-
59- let mode_str = core. determine_upload_mode ( & path) . await ?;
60-
61- if mode_str == "lfs" {
62- let client = core. xet_client ( "write" ) . await ?;
63- let writer = client. write ( None ) . await . map_err ( map_xet_error) ?;
64- return Ok ( HfWriter :: Xet {
67+ }
68+ } else {
69+ HfWriter :: Regular {
6570 core,
6671 path,
67- writer : Mutex :: new ( writer) ,
68- } ) ;
69- }
70-
71- Ok ( HfWriter :: Regular {
72- core,
73- path,
74- buf : Vec :: new ( ) ,
75- } )
72+ buf : Vec :: new ( ) ,
73+ }
74+ } ;
75+ Ok ( writer)
7676 }
7777
7878 fn prepare_commit_file ( path : & str , body : & [ u8 ] ) -> CommitFile {
@@ -97,7 +97,10 @@ impl oio::Write for HfWriter {
9797 . unwrap ( )
9898 . write ( bs. to_bytes ( ) )
9999 . await
100- . map_err ( map_xet_error) ,
100+ . map_err ( |err| {
101+ Error :: new ( ErrorKind :: Unexpected , "failed to write chunk to xet stream" )
102+ . set_source ( err)
103+ } ) ,
101104 }
102105 }
103106
@@ -122,12 +125,9 @@ impl oio::Write for HfWriter {
122125 Ok ( meta)
123126 }
124127 HfWriter :: Xet { core, path, writer } => {
125- let file_info = writer
126- . get_mut ( )
127- . unwrap ( )
128- . close ( )
129- . await
130- . map_err ( map_xet_error) ?;
128+ let file_info = writer. get_mut ( ) . unwrap ( ) . close ( ) . await . map_err ( |err| {
129+ Error :: new ( ErrorKind :: Unexpected , "failed to close xet writer" ) . set_source ( err)
130+ } ) ?;
131131
132132 let meta = Metadata :: default ( ) . with_content_length ( file_info. file_size ( ) ) ;
133133
0 commit comments