1010 DEFAULT_UNIX_PERMISSION , ARCHIVE_EOF ,
1111 page_size , entry_sourcepath , entry_clear , read_disk_new , read_disk_open_w ,
1212 read_next_header2 , read_disk_descend , read_free , write_header , write_data ,
13- write_finish_entry , entry_set_size , entry_set_filetype , entry_set_perm
13+ write_finish_entry , entry_set_size , entry_set_filetype , entry_set_perm ,
14+ read_disk_set_behavior
1415)
1516
1617
1718@contextmanager
18- def new_archive_read_disk (path ):
19+ def new_archive_read_disk (path , flags = 0 , lookup = False ):
1920 archive_p = read_disk_new ()
21+ read_disk_set_behavior (archive_p , flags )
22+ if lookup :
23+ ffi .read_disk_set_standard_lookup (archive_p )
2024 read_disk_open_w (archive_p , path )
2125 try :
2226 yield archive_p
@@ -39,8 +43,10 @@ def add_entries(self, entries):
3943 write_data (write_p , block , len (block ))
4044 write_finish_entry (write_p )
4145
42- def add_files (self , * paths ):
46+ def add_files (self , * paths , ** kw ):
4347 """Read the given paths from disk and add them to the archive.
48+
49+ The keyword arguments (`**kw`) are passed to `new_archive_read_disk`.
4450 """
4551 write_p = self ._pointer
4652
@@ -51,7 +57,7 @@ def add_files(self, *paths):
5157 with new_archive_entry () as entry_p :
5258 entry = ArchiveEntry (None , entry_p )
5359 for path in paths :
54- with new_archive_read_disk (path ) as read_p :
60+ with new_archive_read_disk (path , ** kw ) as read_p :
5561 while 1 :
5662 r = read_next_header2 (read_p , entry_p )
5763 if r == ARCHIVE_EOF :
@@ -109,11 +115,15 @@ def add_file_from_memory(
109115
110116
111117@contextmanager
112- def new_archive_write (format_name , filter_name = None ):
118+ def new_archive_write (format_name , filter_name = None , options = '' ):
113119 archive_p = ffi .write_new ()
114120 getattr (ffi , 'write_set_format_' + format_name )(archive_p )
115121 if filter_name :
116122 getattr (ffi , 'write_add_filter_' + filter_name )(archive_p )
123+ if options :
124+ if not isinstance (options , bytes ):
125+ options = options .encode ('utf-8' )
126+ ffi .write_set_options (archive_p , options )
117127 try :
118128 yield archive_p
119129 ffi .write_close (archive_p )
@@ -128,7 +138,7 @@ def new_archive_write(format_name, filter_name=None):
128138def custom_writer (
129139 write_func , format_name , filter_name = None ,
130140 open_func = VOID_CB , close_func = VOID_CB , block_size = page_size ,
131- archive_write_class = ArchiveWrite
141+ archive_write_class = ArchiveWrite , options = ''
132142):
133143
134144 def write_cb_internal (archive_p , context , buffer_ , length ):
@@ -139,7 +149,7 @@ def write_cb_internal(archive_p, context, buffer_, length):
139149 write_cb = WRITE_CALLBACK (write_cb_internal )
140150 close_cb = CLOSE_CALLBACK (close_func )
141151
142- with new_archive_write (format_name , filter_name ) as archive_p :
152+ with new_archive_write (format_name , filter_name , options ) as archive_p :
143153 ffi .write_set_bytes_in_last_block (archive_p , 1 )
144154 ffi .write_set_bytes_per_block (archive_p , block_size )
145155 ffi .write_open (archive_p , None , open_cb , write_cb , close_cb )
@@ -148,28 +158,30 @@ def write_cb_internal(archive_p, context, buffer_, length):
148158
149159@contextmanager
150160def fd_writer (
151- fd , format_name , filter_name = None , archive_write_class = ArchiveWrite
161+ fd , format_name , filter_name = None ,
162+ archive_write_class = ArchiveWrite , options = ''
152163):
153- with new_archive_write (format_name , filter_name ) as archive_p :
164+ with new_archive_write (format_name , filter_name , options ) as archive_p :
154165 ffi .write_open_fd (archive_p , fd )
155166 yield archive_write_class (archive_p )
156167
157168
158169@contextmanager
159170def file_writer (
160171 filepath , format_name , filter_name = None ,
161- archive_write_class = ArchiveWrite
172+ archive_write_class = ArchiveWrite , options = ''
162173):
163- with new_archive_write (format_name , filter_name ) as archive_p :
174+ with new_archive_write (format_name , filter_name , options ) as archive_p :
164175 ffi .write_open_filename_w (archive_p , filepath )
165176 yield archive_write_class (archive_p )
166177
167178
168179@contextmanager
169180def memory_writer (
170- buf , format_name , filter_name = None , archive_write_class = ArchiveWrite
181+ buf , format_name , filter_name = None ,
182+ archive_write_class = ArchiveWrite , options = ''
171183):
172- with new_archive_write (format_name , filter_name ) as archive_p :
184+ with new_archive_write (format_name , filter_name , options ) as archive_p :
173185 used = byref (c_size_t ())
174186 buf_p = cast (buf , c_void_p )
175187 ffi .write_open_memory (archive_p , buf_p , len (buf ), used )
0 commit comments