mirror of
https://github.com/jkl1337/duplicacy.git
synced 2026-01-06 13:44:40 -06:00
add regex matching to include/exclude filters
This commit is contained in:
@@ -761,6 +761,7 @@ func (manager *BackupManager) Restore(top string, revision int, inPlace bool, qu
|
||||
for _, file := range remoteSnapshot.Files {
|
||||
|
||||
if MatchPath(file.Path, patterns) {
|
||||
LOG_TRACE("RESTORE_INCLUDE", "Include %s", file.Path)
|
||||
includedFiles = append(includedFiles, file)
|
||||
} else {
|
||||
LOG_TRACE("RESTORE_EXCLUDE", "Exclude %s", file.Path)
|
||||
|
||||
@@ -67,7 +67,7 @@ func CreateSnapshotFromDirectory(id string, top string) (snapshot *Snapshot, ski
|
||||
}
|
||||
|
||||
var patterns []string
|
||||
|
||||
|
||||
patternFile, err := ioutil.ReadFile(path.Join(GetDuplicacyPreferencePath(), "filters"))
|
||||
if err == nil {
|
||||
for _, pattern := range strings.Split(string(patternFile), "\n") {
|
||||
@@ -76,14 +76,25 @@ func CreateSnapshotFromDirectory(id string, top string) (snapshot *Snapshot, ski
|
||||
continue
|
||||
}
|
||||
|
||||
if pattern[0] != '+' && pattern[0] != '-' {
|
||||
if pattern[0] == '#' {
|
||||
continue
|
||||
}
|
||||
|
||||
if IsUnspecifiedFilter(pattern) {
|
||||
pattern = "+" + pattern
|
||||
}
|
||||
|
||||
if pattern == "+" || pattern == "-" {
|
||||
if IsEmptyFilter(pattern) {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.HasPrefix(pattern, "i:") || strings.HasPrefix(pattern, "e:") {
|
||||
valid, err := IsValidRegex(pattern[2:])
|
||||
if !valid || err != nil {
|
||||
LOG_ERROR("SNAPSHOT_FILTER", "Invalid regular expression encountered for filter: \"%s\", error: %v", pattern, err)
|
||||
}
|
||||
}
|
||||
|
||||
patterns = append(patterns, pattern)
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,31 @@ func CreateRateLimitedReader(content []byte, rate int) (*RateLimitedReader) {
|
||||
}
|
||||
}
|
||||
|
||||
func IsEmptyFilter(pattern string) bool {
|
||||
if pattern == "+" || pattern == "-" || pattern == "i:" || pattern == "e:" {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func IsUnspecifiedFilter(pattern string) bool {
|
||||
if pattern[0] != '+' && pattern[0] != '-' && pattern[0] != 'i' && pattern[0] != 'e' {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func IsValidRegex(pattern string) (valid bool, err error) {
|
||||
_, err = regexp.Compile(pattern)
|
||||
if err != nil {
|
||||
return false, err
|
||||
} else {
|
||||
return true, err
|
||||
}
|
||||
}
|
||||
|
||||
func (reader *RateLimitedReader) Length() (int64) {
|
||||
return int64(len(reader.Content))
|
||||
}
|
||||
@@ -300,6 +325,25 @@ func MatchPath(filePath string, patterns [] string) (included bool) {
|
||||
if matchPattern(filePath, pattern[1:]) {
|
||||
return false
|
||||
}
|
||||
} else if strings.HasPrefix(pattern, "i:") {
|
||||
matched, err := regexp.MatchString(pattern[2:], filePath)
|
||||
if err != nil {
|
||||
LOG_ERROR("SNAPSHOT_MATCH", "Error during regexp match: %s - %v", pattern, err)
|
||||
}
|
||||
if matched {
|
||||
LOG_TRACE("SNAPSHOT_MATCH", "Regex include comparison for filePath=\"%s\", pattern=\"%s\", matched=%t", filePath, pattern[2:], matched)
|
||||
return true
|
||||
}
|
||||
} else if strings.HasPrefix(pattern, "e:") {
|
||||
allIncludes = false
|
||||
matched, err := regexp.MatchString(pattern[2:], filePath)
|
||||
if err != nil {
|
||||
LOG_ERROR("SNAPSHOT_MATCH", "Error during regexp match: %s - %v", pattern, err)
|
||||
}
|
||||
if matched {
|
||||
LOG_TRACE("SNAPSHOT_MATCH", "Regex exclude comparison for filePath=\"%s\", pattern=\"%s\", matched=%t", filePath, pattern[2:], matched)
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user