diff --git a/Duplicati/Library/Utility/FilterExpression.cs b/Duplicati/Library/Utility/FilterExpression.cs index f1e5fe32c..b10734596 100644 --- a/Duplicati/Library/Utility/FilterExpression.cs +++ b/Duplicati/Library/Utility/FilterExpression.cs @@ -133,52 +133,45 @@ namespace Duplicati.Library.Utility /// Group regex private static Regex GetFilterGroupRegex(string filterGroupName) { - FilterGroup filterGroup; - if (Enum.TryParse(filterGroupName, true /* ignoreCase */, out filterGroup)) + FilterGroup filterGroup = FilterGroups.ParseFilterList(filterGroupName, FilterGroup.None); + Regex result; + if (FilterEntry.filterGroupRegexCache.TryGetValue(filterGroup, out result)) { - Regex result; - if (FilterEntry.filterGroupRegexCache.TryGetValue(filterGroup, out result)) - { - return result; - } - else - { - // Get the filter strings for this filter group, and convert them to their regex forms - List regexStrings = FilterGroups.GetFilterStrings(filterGroup) - .Select(filterString => - { - if (filterString.StartsWith("[", StringComparison.Ordinal) && filterString.EndsWith("]", StringComparison.Ordinal)) - { - return filterString.Substring(1, filterString.Length - 2); - } - else - { - return Utility.ConvertGlobbingToRegExp(filterString); - } - }) - .ToList(); - - string regexString; - if (regexStrings.Count == 1) - { - regexString = regexStrings.Single(); - } - else - { - // If there are multiple regex strings, then they need to be merged by wrapping each in parenthesis and ORing them together - regexString = "(" + string.Join(")|(", regexStrings) + ")"; - } - - result = new Regex(regexString, REGEXP_OPTIONS); - - FilterEntry.filterGroupRegexCache[filterGroup] = result; - - return result; - } + return result; } else { - throw new ArgumentException(string.Format("Unknown filter group {0}", filterGroupName)); + // Get the filter strings for this filter group, and convert them to their regex forms + List regexStrings = FilterGroups.GetFilterStrings(filterGroup) + .Select(filterString => + { + if (filterString.StartsWith("[", StringComparison.Ordinal) && filterString.EndsWith("]", StringComparison.Ordinal)) + { + return filterString.Substring(1, filterString.Length - 2); + } + else + { + return Utility.ConvertGlobbingToRegExp(filterString); + } + }) + .ToList(); + + string regexString; + if (regexStrings.Count == 1) + { + regexString = regexStrings.Single(); + } + else + { + // If there are multiple regex strings, then they need to be merged by wrapping each in parenthesis and ORing them together + regexString = "(" + string.Join(")|(", regexStrings) + ")"; + } + + result = new Regex(regexString, REGEXP_OPTIONS); + + FilterEntry.filterGroupRegexCache[filterGroup] = result; + + return result; } } diff --git a/Duplicati/Library/Utility/FilterGroups.cs b/Duplicati/Library/Utility/FilterGroups.cs index 1df23018f..874dfc0a7 100644 --- a/Duplicati/Library/Utility/FilterGroups.cs +++ b/Duplicati/Library/Utility/FilterGroups.cs @@ -72,6 +72,37 @@ namespace Duplicati.Library.Utility /// public static class FilterGroups { + /// + /// In addition to the default names from the enums, these alternate / shorter names are also available. + /// + private static Dictionary filterGroupAliases = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "System", FilterGroup.SystemFiles }, + + { "OS", FilterGroup.OperatingSystem }, + + { "CacheFolders", FilterGroup.CacheFiles }, + { "Caches", FilterGroup.CacheFiles }, + { "Cache", FilterGroup.CacheFiles }, + + { "TemporaryFiles", FilterGroup.TemporaryFolders }, + { "TempFolders", FilterGroup.TemporaryFolders }, + { "TempFiles", FilterGroup.TemporaryFolders }, + { "Temp", FilterGroup.TemporaryFolders }, + + { "Apps", FilterGroup.Applications }, + }; + + /// + /// Gets the list of alternate aliases which can refer to this group. + /// + /// Filter group + /// Group aliases + public static IEnumerable GetAliases(FilterGroup group) + { + return FilterGroups.filterGroupAliases.Where(pair => pair.Value == group).Select(pair => pair.Key); + } + /// /// Helper method that parses a string with a number of options and returns the group that it represents /// @@ -85,8 +116,11 @@ namespace Duplicati.Library.Utility foreach (var f in (filters ?? string.Empty).Split(new char[] { ':', ',', ';', '|' }, StringSplitOptions.RemoveEmptyEntries)) { any = true; - if (!Enum.TryParse(f, true, out var fg)) + if (!Enum.TryParse(f, true, out var fg) && + !FilterGroups.filterGroupAliases.TryGetValue(f, out fg)) + { throw new ArgumentException(Strings.Filters.UnknownFilterGroup(f)); + } res |= fg; }