@@ -215,64 +215,6 @@ def _calculate_file_hash(self, file_path: Path) -> str:
215215 sha256_hash .update (chunk )
216216 return sha256_hash .hexdigest ()
217217
218- def _get_file_metadata (self , file_path : Path ) -> FileMetadata :
219- """Get complete file metadata including ownership and permissions"""
220- stat = file_path .stat ()
221- try :
222- # Try to get user/group names, fallback to IDs if not found
223- try :
224- owner = pwd .getpwuid (stat .st_uid ).pw_name
225- except KeyError :
226- owner = str (stat .st_uid )
227-
228- try :
229- group = grp .getgrgid (stat .st_gid ).gr_name
230- except KeyError :
231- group = str (stat .st_gid )
232-
233- return FileMetadata (
234- path = str (file_path ),
235- owner = owner ,
236- group = group ,
237- mode = stat .st_mode ,
238- size = stat .st_size ,
239- modified = datetime .fromtimestamp (stat .st_mtime ).isoformat (),
240- checksum = self ._calculate_file_hash (file_path )
241- )
242- except Exception as e :
243- logging .warning (f"Error getting metadata for { file_path } : { e } " )
244- # Return basic metadata if detailed lookup fails
245- return FileMetadata (
246- path = str (file_path ),
247- owner = str (stat .st_uid ),
248- group = str (stat .st_gid ),
249- mode = stat .st_mode ,
250- size = stat .st_size ,
251- modified = datetime .fromtimestamp (stat .st_mtime ).isoformat (),
252- checksum = self ._calculate_file_hash (file_path )
253- )
254-
255- def _apply_metadata (self , file_path : Path , metadata : FileMetadata ):
256- """Apply stored metadata to restored file"""
257- try :
258- os .chmod (file_path , metadata .mode )
259-
260- try :
261- uid = pwd .getpwnam (metadata .owner ).pw_uid
262- gid = grp .getgrnam (metadata .group ).gr_gid
263- except KeyError :
264- uid = int (metadata .owner ) if metadata .owner .isdigit () else - 1
265- gid = int (metadata .group ) if metadata .group .isdigit () else - 1
266-
267- if uid != - 1 and gid != - 1 :
268- try :
269- os .chown (file_path , uid , gid )
270- except PermissionError :
271- logging .warning (f"Cannot set ownership for { file_path } " )
272-
273- except Exception as e :
274- logging .error (f"Failed to apply metadata to { file_path } : { str (e )} " )
275-
276218 def backup_directory (self , source_dir : Path , backup_dir : Path ) -> bool :
277219 """Create backup of a directory with progress tracking and manifest"""
278220 timestamp = self ._get_timestamp ()
@@ -296,7 +238,7 @@ def backup_directory(self, source_dir: Path, backup_dir: Path) -> bool:
296238
297239 archive_checksums = [] # For overall manifest checksum
298240
299- # Get total size for progress tracking
241+ # Get total size for progress tracking
300242 total_size = self ._get_dir_size (source_dir )
301243 logging .info (f"Total size to backup: { humanize .naturalsize (total_size )} " )
302244
@@ -309,25 +251,15 @@ def backup_directory(self, source_dir: Path, backup_dir: Path) -> bool:
309251
310252 tracker = ProgressTracker (dir_size , "Compression" )
311253
312- # Collect file information for manifest
313- archive_files = []
314254 file_count = 0
315255
316256 with tarfile .open (archive_path , "w:gz" ) as tar :
317257 for file_path in dir_path .rglob ("*" ):
318258 if file_path .is_file ():
319- metadata = self . _get_file_metadata ( file_path )
259+ file_count += 1
320260 relative_path = str (file_path .relative_to (dir_path ))
321-
322- tar_info = tar .gettarinfo (str (file_path ), arcname = relative_path )
323- tar_info .uid = pwd .getpwnam (metadata .owner ).pw_uid if isinstance (metadata .owner , str ) else int (metadata .owner )
324- tar_info .gid = grp .getgrnam (metadata .group ).gr_gid if isinstance (metadata .group , str ) else int (metadata .group )
325- tar_info .mode = metadata .mode
326-
327- with open (file_path , "rb" ) as f :
328- tar .addfile (tar_info , f )
329-
330- tracker .update (metadata .size )
261+ tar .add (str (file_path ), arcname = relative_path )
262+ tracker .update (file_path .stat ().st_size )
331263
332264 tracker .close ()
333265
@@ -344,7 +276,6 @@ def backup_directory(self, source_dir: Path, backup_dir: Path) -> bool:
344276 'compressed_size' : compressed_size ,
345277 'compression_ratio' : ratio ,
346278 'file_count' : file_count ,
347- 'files' : archive_files ,
348279 'checksum' : archive_hash
349280 }
350281 manifest_data ['archives' ].append (archive_info )
@@ -435,19 +366,7 @@ def restore_directory(self, restore_dir: Path, output_dir: Path) -> bool:
435366 members = tar .getmembers ()
436367 for member in members :
437368 tar .extract (member , path = extract_dir )
438-
439369 if member .isfile ():
440- file_path = extract_dir / member .name
441- metadata = FileMetadata (
442- path = str (file_path ),
443- owner = str (member .uid ), # Use ID directly
444- group = str (member .gid ), # Use ID directly
445- mode = member .mode ,
446- size = member .size ,
447- modified = datetime .fromtimestamp (member .mtime ).isoformat (),
448- checksum = ""
449- )
450- self ._apply_metadata (file_path , metadata )
451370 tracker .update (member .size )
452371
453372 restored_dirs .add (extract_dir )
@@ -467,7 +386,7 @@ def restore_directory(self, restore_dir: Path, output_dir: Path) -> bool:
467386 except Exception as e :
468387 logging .error (f"Restore failed: { str (e )} " )
469388 return False
470-
389+
471390def setup_logging (log_dir : Path ) -> None :
472391 """Configure detailed logging with both file and console handlers"""
473392 log_dir .mkdir (parents = True , exist_ok = True )
0 commit comments