@@ -46,7 +46,7 @@ def add_entries(self, entries):
4646
4747 def add_files (
4848 self , * paths , flags = 0 , lookup = False , pathname = None , recursive = True ,
49- symlink_mode = ffi . ARCHIVE_SYMLINK_MODE_PHYSICAL , ** attributes
49+ symlink_mode = None , ** attributes
5050 ):
5151 """Read files through the OS and add them to the archive.
5252
@@ -63,11 +63,9 @@ def add_files(
6363 recursive (bool):
6464 when False, if a path in `paths` is a directory,
6565 only the directory itself is added.
66- symlink_mode (enum):
67- Determines how symlinks are traversed. Valid options are
68- ARCHIVE_SYMLINK_MODE_HYBRID, ARCHIVE_SYMLINK_MODE_LOGICAL, and
69- ARCHIVE_SYMLINK_MODE_PHYSICAL as defined in the ffi module.
70- Default value matches default from libarchive.
66+ symlink_mode (Literal['hybrid', 'logical', 'physical'] | None):
67+ how symbolic links should be handled; see `man archive_read_disk`
68+ for meanings
7169 attributes (dict): passed to `ArchiveEntry.modify()`
7270
7371 Raises:
@@ -80,18 +78,23 @@ def add_files(
8078 if block_size <= 0 :
8179 block_size = 10240 # pragma: no cover
8280
81+ set_symlink_mode = None
82+ if symlink_mode :
83+ try :
84+ set_symlink_mode = getattr (
85+ ffi , f'read_disk_set_symlink_{ symlink_mode } '
86+ )
87+ except AttributeError :
88+ raise ValueError (
89+ f"symlink_mode value { symlink_mode !r} is invalid"
90+ ) from None
91+
8392 entry = ArchiveEntry (header_codec = self .header_codec )
8493 entry_p = entry ._entry_p
8594 for path in paths :
8695 with new_archive_read_disk (path , flags , lookup ) as read_p :
87- if (symlink_mode == ffi .ARCHIVE_SYMLINK_MODE_PHYSICAL ):
88- ffi .read_disk_set_symlink_physical (read_p )
89- elif (symlink_mode == ffi .ARCHIVE_SYMLINK_MODE_LOGICAL ):
90- ffi .read_disk_set_symlink_logical (read_p )
91- elif (symlink_mode == ffi .ARCHIVE_SYMLINK_MODE_HYBRID ):
92- ffi .read_disk_set_symlink_hybrid (read_p )
93- else :
94- raise ValueError (f"Bad symlink mode value { symlink_mode } " )
96+ if set_symlink_mode :
97+ set_symlink_mode (read_p )
9598 while 1 :
9699 r = read_next_header2 (read_p , entry_p )
97100 if r == ARCHIVE_EOF :
0 commit comments