Exporting user/group names in tar files (re #2)

pull/10/head
Dennis Schwerdel 2017-04-12 15:01:54 +02:00
parent efbd374678
commit 6444ed7076
3 changed files with 12 additions and 5 deletions

View File

@ -8,6 +8,7 @@ This project follows [semantic versioning](http://semver.org).
- [added] Locking local repository to avoid index corruption - [added] Locking local repository to avoid index corruption
- [added] Storing user/group names in backup - [added] Storing user/group names in backup
- [modified] No longer trying to upload by rename - [modified] No longer trying to upload by rename
- [modified] No longer failing restore if setting file attributes fails
- [fixed] Creating empty bundle cache on init to avoid warnings - [fixed] Creating empty bundle cache on init to avoid warnings
- [fixed] Calling sodiumoxide::init for faster algorithms and thread safety (not needed) - [fixed] Calling sodiumoxide::init for faster algorithms and thread safety (not needed)
- [fixed] Fixed a deadlock in the bundle upload code - [fixed] Fixed a deadlock in the bundle upload code

View File

@ -380,7 +380,7 @@ pub fn run() -> Result<(), ErrorCode> {
checked!(repo.get_inode(&backup.root), "load root inode", ErrorCode::LoadInode) checked!(repo.get_inode(&backup.root), "load root inode", ErrorCode::LoadInode)
}; };
if tar { if tar {
checked!(repo.export_tarfile(inode, &dst_path), "restore backup", ErrorCode::RestoreRun); checked!(repo.export_tarfile(&backup, inode, &dst_path), "restore backup", ErrorCode::RestoreRun);
} else { } else {
checked!(repo.restore_inode_tree(&backup, inode, &dst_path), "restore backup", ErrorCode::RestoreRun); checked!(repo.restore_inode_tree(&backup, inode, &dst_path), "restore backup", ErrorCode::RestoreRun);
} }

View File

@ -190,7 +190,7 @@ impl Repository {
} }
} }
fn export_tarfile_recurse(&mut self, path: &Path, inode: Inode, tarfile: &mut tar::Builder<File>) -> Result<(), RepositoryError> { fn export_tarfile_recurse(&mut self, backup: &Backup, path: &Path, inode: Inode, tarfile: &mut tar::Builder<File>) -> Result<(), RepositoryError> {
let mut header = tar::Header::new_gnu(); let mut header = tar::Header::new_gnu();
header.set_size(inode.size); header.set_size(inode.size);
let path = path.join(inode.name); let path = path.join(inode.name);
@ -200,7 +200,13 @@ impl Repository {
} }
header.set_mode(inode.mode); header.set_mode(inode.mode);
header.set_uid(inode.user); header.set_uid(inode.user);
if let Some(name) = backup.user_names.get(&inode.user) {
header.set_username(name).ok();
}
header.set_gid(inode.group); header.set_gid(inode.group);
if let Some(name) = backup.group_names.get(&inode.group) {
header.set_groupname(name).ok();
}
header.set_mtime(inode.timestamp as u64); header.set_mtime(inode.timestamp as u64);
header.set_entry_type(match inode.file_type { header.set_entry_type(match inode.file_type {
FileType::File => tar::EntryType::Regular, FileType::File => tar::EntryType::Regular,
@ -220,15 +226,15 @@ impl Repository {
if let Some(children) = inode.children { if let Some(children) = inode.children {
for chunks in children.values() { for chunks in children.values() {
let inode = try!(self.get_inode(chunks)); let inode = try!(self.get_inode(chunks));
try!(self.export_tarfile_recurse(&path, inode, tarfile)); try!(self.export_tarfile_recurse(backup, &path, inode, tarfile));
} }
} }
Ok(()) Ok(())
} }
pub fn export_tarfile<P: AsRef<Path>>(&mut self, inode: Inode, tarfile: P) -> Result<(), RepositoryError> { pub fn export_tarfile<P: AsRef<Path>>(&mut self, backup: &Backup, inode: Inode, tarfile: P) -> Result<(), RepositoryError> {
let mut tarfile = tar::Builder::new(try!(File::create(tarfile))); let mut tarfile = tar::Builder::new(try!(File::create(tarfile)));
try!(self.export_tarfile_recurse(Path::new(""), inode, &mut tarfile)); try!(self.export_tarfile_recurse(backup, Path::new(""), inode, &mut tarfile));
try!(tarfile.finish()); try!(tarfile.finish());
Ok(()) Ok(())
} }