Skip to content

Commit 46fe742

Browse files
committed
improve ArchiveEntry properties that can be unset
The attributes `atime`, `mtime`, `ctime`, `birthtime` and `size` now have the value `None` instead of `0` when they're unset.
1 parent 122e694 commit 46fe742

2 files changed

Lines changed: 33 additions & 5 deletions

File tree

libarchive/entry.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,17 @@ def isdev(self):
112112

113113
@property
114114
def atime(self):
115+
if not ffi.entry_atime_is_set(self._entry_p):
116+
return None
115117
sec_val = ffi.entry_atime(self._entry_p)
116118
nsec_val = ffi.entry_atime_nsec(self._entry_p)
117119
return format_time(sec_val, nsec_val)
118120

119121
@atime.setter
120122
def atime(self, value):
121-
if isinstance(value, int):
123+
if value is None:
124+
ffi.entry_unset_atime(self._entry_p)
125+
elif isinstance(value, int):
122126
self.set_atime(value)
123127
elif isinstance(value, tuple):
124128
self.set_atime(*value)
@@ -132,13 +136,17 @@ def set_atime(self, timestamp_sec, timestamp_nsec):
132136

133137
@property
134138
def mtime(self):
139+
if not ffi.entry_mtime_is_set(self._entry_p):
140+
return None
135141
sec_val = ffi.entry_mtime(self._entry_p)
136142
nsec_val = ffi.entry_mtime_nsec(self._entry_p)
137143
return format_time(sec_val, nsec_val)
138144

139145
@mtime.setter
140146
def mtime(self, value):
141-
if isinstance(value, int):
147+
if value is None:
148+
ffi.entry_unset_mtime(self._entry_p)
149+
elif isinstance(value, int):
142150
self.set_mtime(value)
143151
elif isinstance(value, tuple):
144152
self.set_mtime(*value)
@@ -152,13 +160,17 @@ def set_mtime(self, timestamp_sec, timestamp_nsec):
152160

153161
@property
154162
def ctime(self):
163+
if not ffi.entry_ctime_is_set(self._entry_p):
164+
return None
155165
sec_val = ffi.entry_ctime(self._entry_p)
156166
nsec_val = ffi.entry_ctime_nsec(self._entry_p)
157167
return format_time(sec_val, nsec_val)
158168

159169
@ctime.setter
160170
def ctime(self, value):
161-
if isinstance(value, int):
171+
if value is None:
172+
ffi.entry_unset_ctime(self._entry_p)
173+
elif isinstance(value, int):
162174
self.set_ctime(value)
163175
elif isinstance(value, tuple):
164176
self.set_ctime(*value)
@@ -172,13 +184,17 @@ def set_ctime(self, timestamp_sec, timestamp_nsec):
172184

173185
@property
174186
def birthtime(self):
187+
if not ffi.entry_birthtime_is_set(self._entry_p):
188+
return None
175189
sec_val = ffi.entry_birthtime(self._entry_p)
176190
nsec_val = ffi.entry_birthtime_nsec(self._entry_p)
177191
return format_time(sec_val, nsec_val)
178192

179193
@birthtime.setter
180194
def birthtime(self, value):
181-
if isinstance(value, int):
195+
if value is None:
196+
ffi.entry_unset_birthtime(self._entry_p)
197+
elif isinstance(value, int):
182198
self.set_birthtime(value)
183199
elif isinstance(value, tuple):
184200
self.set_birthtime(*value)
@@ -231,7 +247,10 @@ def size(self):
231247

232248
@size.setter
233249
def size(self, value):
234-
ffi.entry_set_size(self._entry_p, value)
250+
if value is None:
251+
ffi.entry_unset_size(self._entry_p)
252+
else:
253+
ffi.entry_set_size(self._entry_p, value)
235254

236255
@property
237256
def mode(self):

libarchive/ffi.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ def get_write_filter_function(filter_name):
177177
ffi('entry_birthtime_nsec', [c_archive_entry_p], c_long)
178178
ffi('entry_mtime_nsec', [c_archive_entry_p], c_long)
179179
ffi('entry_ctime_nsec', [c_archive_entry_p], c_long)
180+
ffi('entry_atime_is_set', [c_archive_entry_p], c_int)
181+
ffi('entry_birthtime_is_set', [c_archive_entry_p], c_int)
182+
ffi('entry_mtime_is_set', [c_archive_entry_p], c_int)
183+
ffi('entry_ctime_is_set', [c_archive_entry_p], c_int)
180184
ffi('entry_pathname', [c_archive_entry_p], c_char_p)
181185
ffi('entry_pathname_w', [c_archive_entry_p], c_wchar_p)
182186
ffi('entry_sourcepath', [c_archive_entry_p], c_char_p)
@@ -206,6 +210,11 @@ def get_write_filter_function(filter_name):
206210
ffi('entry_set_birthtime', [c_archive_entry_p, c_time_t, c_long], None)
207211
ffi('entry_set_rdevmajor', [c_archive_entry_p, c_uint], None)
208212
ffi('entry_set_rdevminor', [c_archive_entry_p, c_uint], None)
213+
ffi('entry_unset_size', [c_archive_entry_p], None)
214+
ffi('entry_unset_atime', [c_archive_entry_p], None)
215+
ffi('entry_unset_mtime', [c_archive_entry_p], None)
216+
ffi('entry_unset_ctime', [c_archive_entry_p], None)
217+
ffi('entry_unset_birthtime', [c_archive_entry_p], None)
209218

210219
ffi('entry_update_pathname_utf8', [c_archive_entry_p, c_char_p], c_int, check_int)
211220
ffi('entry_update_link_utf8', [c_archive_entry_p, c_char_p], c_int, check_int)

0 commit comments

Comments
 (0)