pxar: anchor pxarexcludes starting with a slash

Given the .pxarexclude file

    foo
    /bar

The following happens:

    exclude: /foo
    exclude: /bar
    exclude: /subdir/foo
    include: /subdir/bar

since the `/bar` line is an absolute path

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2020-10-15 12:26:45 +02:00
parent d9f365d79f
commit 8d841f81ee
1 changed files with 14 additions and 8 deletions

View File

@ -12,7 +12,7 @@ use nix::errno::Errno;
use nix::fcntl::OFlag; use nix::fcntl::OFlag;
use nix::sys::stat::{FileStat, Mode}; use nix::sys::stat::{FileStat, Mode};
use pathpatterns::{MatchEntry, MatchList, MatchType, PatternFlag}; use pathpatterns::{MatchEntry, MatchFlag, MatchList, MatchType, PatternFlag};
use pxar::Metadata; use pxar::Metadata;
use pxar::encoder::LinkOffset; use pxar::encoder::LinkOffset;
@ -325,25 +325,31 @@ impl<'a, 'b> Archiver<'a, 'b> {
} }
let mut buf; let mut buf;
let (line, mode) = if line[0] == b'/' { let (line, mode, anchored) = if line[0] == b'/' {
buf = Vec::with_capacity(path_bytes.len() + 1 + line.len()); buf = Vec::with_capacity(path_bytes.len() + 1 + line.len());
buf.extend(path_bytes); buf.extend(path_bytes);
buf.extend(line); buf.extend(line);
(&buf[..], MatchType::Exclude) (&buf[..], MatchType::Exclude, true)
} else if line.starts_with(b"!/") { } else if line.starts_with(b"!/") {
// inverted case with absolute path // inverted case with absolute path
buf = Vec::with_capacity(path_bytes.len() + line.len()); buf = Vec::with_capacity(path_bytes.len() + line.len());
buf.extend(path_bytes); buf.extend(path_bytes);
buf.extend(&line[1..]); // without the '!' buf.extend(&line[1..]); // without the '!'
(&buf[..], MatchType::Include) (&buf[..], MatchType::Include, true)
} else if line.starts_with(b"!") { } else if line.starts_with(b"!") {
(&line[1..], MatchType::Include) (&line[1..], MatchType::Include, false)
} else { } else {
(line, MatchType::Exclude) (line, MatchType::Exclude, false)
}; };
match MatchEntry::parse_pattern(line, PatternFlag::PATH_NAME, mode) { match MatchEntry::parse_pattern(line, PatternFlag::PATH_NAME, mode) {
Ok(pattern) => self.patterns.push(pattern), Ok(pattern) => {
if anchored {
self.patterns.push(pattern.add_flags(MatchFlag::ANCHORED));
} else {
self.patterns.push(pattern);
}
}
Err(err) => { Err(err) => {
let _ = writeln!(self.errors, "bad pattern in {:?}: {}", self.path, err); let _ = writeln!(self.errors, "bad pattern in {:?}: {}", self.path, err);
} }
@ -1000,7 +1006,7 @@ fn process_acl(
/// Since we are generating an *exclude* list, we need to invert this, so includes get a `'!'` /// Since we are generating an *exclude* list, we need to invert this, so includes get a `'!'`
/// prefix. /// prefix.
fn generate_pxar_excludes_cli(patterns: &[MatchEntry]) -> Vec<u8> { fn generate_pxar_excludes_cli(patterns: &[MatchEntry]) -> Vec<u8> {
use pathpatterns::{MatchFlag, MatchPattern}; use pathpatterns::MatchPattern;
let mut content = Vec::new(); let mut content = Vec::new();