diff --git a/Duplicati/Library/Utility/Utility.cs b/Duplicati/Library/Utility/Utility.cs index 30dee2edf..16f8db8b9 100644 --- a/Duplicati/Library/Utility/Utility.cs +++ b/Duplicati/Library/Utility/Utility.cs @@ -906,13 +906,40 @@ namespace Duplicati.Library.Utility /// /// Expands environment variables, including the tilde character /// - /// The environment variables. + /// The expanded string. /// The string to expand. public static string ExpandEnvironmentVariables(string str) { return Environment.ExpandEnvironmentVariables(str.Replace("~", HOME_PATH)); } + /// + /// Regexp for matching environment variables on Windows (%VAR%) + /// + private static readonly Regex ENVIRONMENT_VARIABLE_MATCHER_WINDOWS = new Regex(@"\%(?\w+)\%"); + + /// + /// Regexp for matching environment variables on Linux ($VAR or ${VAR}) + /// + private static readonly Regex ENVIRONMENT_VARIABLE_MATCHER_LINUX = new Regex(@"\$(?\w+)|(\{(?[^\}]+)\})"); + + /// + /// Expands environment variables, including the tilde character, in a RegExp safe format + /// + /// The expanded string. + /// The string to expand. + public static string ExpandEnvironmentVariablesRegexp(string str) + { + return + + // TODO: Should we switch to using the native format, instead of following the Windows scheme? + //IsClientLinux ? ENVIRONMENT_VARIABLE_MATCHER_LINUX : ENVIRONMENT_VARIABLE_MATCHER_WINDOWS + + ENVIRONMENT_VARIABLE_MATCHER_WINDOWS + .Replace(str.Replace("~", Regex.Escape(HOME_PATH)), (m) => + Regex.Escape(Environment.GetEnvironmentVariable(m.Groups["name"].Value))); + } + /// /// Checks that a hostname is valid /// diff --git a/Duplicati/Server/Runner.cs b/Duplicati/Server/Runner.cs index e5633da09..281bc4610 100644 --- a/Duplicati/Server/Runner.cs +++ b/Duplicati/Server/Runner.cs @@ -654,7 +654,7 @@ namespace Duplicati.Server return options; } - + private static Duplicati.Library.Utility.IFilter ApplyFilter(Duplicati.Server.Serialization.Interface.IBackup backup, DuplicatiOperation mode, Duplicati.Library.Utility.IFilter filter) { var f2 = backup.Filters; @@ -662,7 +662,10 @@ namespace Duplicati.Server { var nf = (from n in f2 - let exp = Library.Utility.Utility.ExpandEnvironmentVariables(n.Expression) + let exp = + n.Expression.StartsWith("[") && n.Expression.EndsWith("]") + ? Library.Utility.Utility.ExpandEnvironmentVariablesRegexp(n.Expression) + : Library.Utility.Utility.ExpandEnvironmentVariables(n.Expression) orderby n.Order select (Duplicati.Library.Utility.IFilter)(new Duplicati.Library.Utility.FilterExpression(exp, n.Include))) .Aggregate((a, b) => Duplicati.Library.Utility.FilterExpression.Combine(a, b));