pxar: fix relative '!' rules in .pxarexclude

and reduce indentation

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2020-10-15 12:17:55 +02:00
parent 2081327428
commit 32a4695c46
1 changed files with 46 additions and 43 deletions

View File

@ -291,58 +291,61 @@ impl<'a, 'b> Archiver<'a, 'b> {
} }
fn read_pxar_excludes(&mut self, parent: RawFd) -> Result<(), Error> { fn read_pxar_excludes(&mut self, parent: RawFd) -> Result<(), Error> {
let fd = self.open_file(parent, c_str!(".pxarexclude"), OFlag::O_RDONLY, false)?; let fd = match self.open_file(parent, c_str!(".pxarexclude"), OFlag::O_RDONLY, false)? {
Some(fd) => fd,
None => return Ok(()),
};
let old_pattern_count = self.patterns.len(); let old_pattern_count = self.patterns.len();
let path_bytes = self.path.as_os_str().as_bytes(); let path_bytes = self.path.as_os_str().as_bytes();
if let Some(fd) = fd { let file = unsafe { std::fs::File::from_raw_fd(fd.into_raw_fd()) };
let file = unsafe { std::fs::File::from_raw_fd(fd.into_raw_fd()) };
use io::BufRead; use io::BufRead;
for line in io::BufReader::new(file).split(b'\n') { for line in io::BufReader::new(file).split(b'\n') {
let line = match line { let line = match line {
Ok(line) => line, Ok(line) => line,
Err(err) => { Err(err) => {
let _ = writeln!( let _ = writeln!(
self.errors, self.errors,
"ignoring .pxarexclude after read error in {:?}: {}", "ignoring .pxarexclude after read error in {:?}: {}",
self.path, self.path,
err, err,
); );
self.patterns.truncate(old_pattern_count); self.patterns.truncate(old_pattern_count);
return Ok(()); return Ok(());
}
};
let line = crate::tools::strip_ascii_whitespace(&line);
if line.is_empty() || line[0] == b'#' {
continue;
} }
};
let mut buf; let line = crate::tools::strip_ascii_whitespace(&line);
let (line, mode) = if line[0] == b'/' {
buf = Vec::with_capacity(path_bytes.len() + 1 + line.len());
buf.extend(path_bytes);
buf.extend(line);
(&buf[..], MatchType::Exclude)
} else if line.starts_with(b"!/") {
// inverted case with absolute path
buf = Vec::with_capacity(path_bytes.len() + line.len());
buf.extend(path_bytes);
buf.extend(&line[1..]); // without the '!'
(&buf[..], MatchType::Include)
} else {
(line, MatchType::Exclude)
};
match MatchEntry::parse_pattern(line, PatternFlag::PATH_NAME, mode) { if line.is_empty() || line[0] == b'#' {
Ok(pattern) => self.patterns.push(pattern), continue;
Err(err) => { }
let _ = writeln!(self.errors, "bad pattern in {:?}: {}", self.path, err);
} let mut buf;
let (line, mode) = if line[0] == b'/' {
buf = Vec::with_capacity(path_bytes.len() + 1 + line.len());
buf.extend(path_bytes);
buf.extend(line);
(&buf[..], MatchType::Exclude)
} else if line.starts_with(b"!/") {
// inverted case with absolute path
buf = Vec::with_capacity(path_bytes.len() + line.len());
buf.extend(path_bytes);
buf.extend(&line[1..]); // without the '!'
(&buf[..], MatchType::Include)
} else if line.starts_with(b"!") {
(&line[1..], MatchType::Include)
} else {
(line, MatchType::Exclude)
};
match MatchEntry::parse_pattern(line, PatternFlag::PATH_NAME, mode) {
Ok(pattern) => self.patterns.push(pattern),
Err(err) => {
let _ = writeln!(self.errors, "bad pattern in {:?}: {}", self.path, err);
} }
} }
} }