Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/duplicati/duplicati.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Skovhede <kenneth@hexad.dk>2014-12-01 01:14:29 +0300
committerKenneth Skovhede <kenneth@hexad.dk>2014-12-01 01:14:29 +0300
commit17494b7274cfa69c02684ba70e03c8dd1a2a5405 (patch)
treef0b0afa96642ca012688e16c35b22c4501f54b04
parent06e125d081bbc10b6aad5f21639c16d375fe3cc0 (diff)
Changed the auto-include rule to only scan folders and not actually include them in the output.
-rw-r--r--Duplicati/Library/Main/Operation/BackupHandler.cs35
-rw-r--r--Duplicati/Library/Main/Operation/TestFilterHandler.cs2
-rw-r--r--Duplicati/Library/Utility/FilterExpression.cs51
3 files changed, 58 insertions, 30 deletions
diff --git a/Duplicati/Library/Main/Operation/BackupHandler.cs b/Duplicati/Library/Main/Operation/BackupHandler.cs
index 8079de9e3..163972e62 100644
--- a/Duplicati/Library/Main/Operation/BackupHandler.cs
+++ b/Duplicati/Library/Main/Operation/BackupHandler.cs
@@ -83,7 +83,8 @@ namespace Duplicati.Library.Main.Operation
{
private Snapshots.ISnapshotService m_snapshot;
private FileAttributes m_attributeFilter;
- private Duplicati.Library.Utility.IFilter m_filter;
+ private Duplicati.Library.Utility.IFilter m_enumeratefilter;
+ private Duplicati.Library.Utility.IFilter m_emitfilter;
private Options.SymlinkStrategy m_symlinkPolicy;
private Options.HardlinkStrategy m_hardlinkPolicy;
private ILogWriter m_logWriter;
@@ -96,12 +97,23 @@ namespace Duplicati.Library.Main.Operation
m_snapshot = snapshot;
m_attributeFilter = attributeFilter;
m_sourcefilter = sourcefilter;
- m_filter = filter;
+ m_emitfilter = filter;
m_symlinkPolicy = symlinkPolicy;
m_hardlinkPolicy = hardlinkPolicy;
m_logWriter = logWriter;
m_hardlinkmap = new Dictionary<string, string>();
m_mixinqueue = new Queue<string>();
+
+ bool includes;
+ bool excludes;
+ Library.Utility.FilterExpression.AnalyzeFilters(filter, out includes, out excludes);
+ if (includes && !excludes)
+ {
+ m_enumeratefilter = Library.Utility.FilterExpression.Combine(filter, new Duplicati.Library.Utility.FilterExpression("*" + System.IO.Path.DirectorySeparatorChar, true));
+ }
+ else
+ m_enumeratefilter = m_emitfilter;
+
}
public bool AttributeFilter(string rootpath, string path, FileAttributes attributes)
@@ -177,7 +189,7 @@ namespace Duplicati.Library.Main.Operation
}
Library.Utility.IFilter match;
- if (!Library.Utility.FilterExpression.Matches(m_filter, path, out match))
+ if (!Library.Utility.FilterExpression.Matches(m_enumeratefilter, path, out match))
{
if (m_logWriter != null)
m_logWriter.AddVerboseMessage("Excluding path due to filter: {0} => {1}", path, match == null ? "null" : match.ToString());
@@ -209,13 +221,17 @@ namespace Duplicati.Library.Main.Operation
return true;
}
- public IEnumerable<string> EnumerateFilesAndFolders(Snapshots.ISnapshotService snapshot)
+ public IEnumerable<string> EnumerateFilesAndFolders()
{
- foreach(var s in snapshot.EnumerateFilesAndFolders(this.AttributeFilter))
+ foreach(var s in m_snapshot.EnumerateFilesAndFolders(this.AttributeFilter))
{
while (m_mixinqueue.Count > 0)
yield return m_mixinqueue.Dequeue();
+ Library.Utility.IFilter m;
+ if (m_emitfilter != m_enumeratefilter && !Library.Utility.FilterExpression.Matches(m_emitfilter, s, out m))
+ continue;
+
yield return s;
}
@@ -223,7 +239,7 @@ namespace Duplicati.Library.Main.Operation
yield return m_mixinqueue.Dequeue();
}
- public IEnumerable<string> Mixin(IEnumerable<string> list, Snapshots.ISnapshotService snapshot)
+ public IEnumerable<string> Mixin(IEnumerable<string> list)
{
foreach(var s in list.Where(x => {
var fa = FileAttributes.Normal;
@@ -242,7 +258,6 @@ namespace Duplicati.Library.Main.Operation
while (m_mixinqueue.Count > 0)
yield return m_mixinqueue.Dequeue();
}
-
}
@@ -276,7 +291,7 @@ namespace Duplicati.Library.Main.Operation
var size = 0L;
var followSymlinks = m_options.SymlinkPolicy != Duplicati.Library.Main.Options.SymlinkStrategy.Follow;
- foreach(var path in new FilterHandler(m_snapshot, m_attributeFilter, m_sourceFilter, m_filter, m_symlinkPolicy, m_options.HardlinkPolicy, null).EnumerateFilesAndFolders(m_snapshot))
+ foreach(var path in new FilterHandler(m_snapshot, m_attributeFilter, m_sourceFilter, m_filter, m_symlinkPolicy, m_options.HardlinkPolicy, null).EnumerateFilesAndFolders())
{
var fa = FileAttributes.Normal;
try { fa = m_snapshot.GetAttributes(path); }
@@ -457,7 +472,7 @@ namespace Duplicati.Library.Main.Operation
m_result.AddVerboseMessage("Processing supplied change list instead of enumerating filesystem");
m_result.OperationProgressUpdater.UpdatefileCount(m_options.ChangedFilelist.Length, 0, true);
- foreach(var p in filterhandler.Mixin(m_options.ChangedFilelist, m_snapshot))
+ foreach(var p in filterhandler.Mixin(m_options.ChangedFilelist))
{
if (m_result.TaskControlRendevouz() == TaskControlState.Stop)
{
@@ -479,7 +494,7 @@ namespace Duplicati.Library.Main.Operation
}
else
{
- foreach(var path in filterhandler.EnumerateFilesAndFolders(m_snapshot))
+ foreach(var path in filterhandler.EnumerateFilesAndFolders())
{
if (m_result.TaskControlRendevouz() == TaskControlState.Stop)
{
diff --git a/Duplicati/Library/Main/Operation/TestFilterHandler.cs b/Duplicati/Library/Main/Operation/TestFilterHandler.cs
index 46ba3a6ca..74e3d5a68 100644
--- a/Duplicati/Library/Main/Operation/TestFilterHandler.cs
+++ b/Duplicati/Library/Main/Operation/TestFilterHandler.cs
@@ -38,7 +38,7 @@ namespace Duplicati.Library.Main.Operation
using(var snapshot = BackupHandler.GetSnapshot(sources, m_options, m_result))
{
- foreach(var path in new BackupHandler.FilterHandler(snapshot, m_options.FileAttributeFilter, sourcefilter, filter, m_options.SymlinkPolicy, m_options.HardlinkPolicy, m_result).EnumerateFilesAndFolders(snapshot))
+ foreach(var path in new BackupHandler.FilterHandler(snapshot, m_options.FileAttributeFilter, sourcefilter, filter, m_options.SymlinkPolicy, m_options.HardlinkPolicy, m_result).EnumerateFilesAndFolders())
{
var fa = FileAttributes.Normal;
try { fa = snapshot.GetAttributes(path); }
diff --git a/Duplicati/Library/Utility/FilterExpression.cs b/Duplicati/Library/Utility/FilterExpression.cs
index 836c0a683..66e8995f1 100644
--- a/Duplicati/Library/Utility/FilterExpression.cs
+++ b/Duplicati/Library/Utility/FilterExpression.cs
@@ -367,27 +367,17 @@ namespace Duplicati.Library.Utility
IFilter match;
return Matches(filter, path, out match);
}
-
+
/// <summary>
- /// Utility function to match a filter with a default fall-through value
+ /// Examines a list of filters and returns flags indicating if the list contains excludes and includes
/// </summary>
- /// <param name="filter">The filter to evaluate</param>
- /// <param name="path">The path to evaluate</param>
- /// <param name="match">The filter that matched</param>
- public static bool Matches(IFilter filter, string path, out IFilter match)
+ /// <param name="filter">The filter to examine</param>
+ /// <param name="includes">True if the filter contains includes, false otherwise.</param>
+ /// <param name="excludes">True if the filter contains excludes, false otherwise.</param>
+ public static void AnalyzeFilters(IFilter filter, out bool includes, out bool excludes)
{
- if (filter == null || filter.Empty)
- {
- match = null;
- return true;
- }
-
- bool result;
- if (filter.Matches(path, out result, out match))
- return result;
-
- var includes = false;
- var excludes = false;
+ includes = false;
+ excludes = false;
Tuple<bool, bool> cacheLookup;
@@ -432,13 +422,36 @@ namespace Duplicati.Library.Utility
_matchFallbackLookup[filter] = new Tuple<bool, bool>(includes, excludes);
}
}
+ }
+
+ /// <summary>
+ /// Utility function to match a filter with a default fall-through value
+ /// </summary>
+ /// <param name="filter">The filter to evaluate</param>
+ /// <param name="path">The path to evaluate</param>
+ /// <param name="match">The filter that matched</param>
+ public static bool Matches(IFilter filter, string path, out IFilter match)
+ {
+ if (filter == null || filter.Empty)
+ {
+ match = null;
+ return true;
+ }
+
+ bool result;
+ if (filter.Matches(path, out result, out match))
+ return result;
+ bool includes;
+ bool excludes;
+
+ AnalyzeFilters(filter, out includes, out excludes);
match = null;
// We have only include filters, we exclude files by default
if (includes && !excludes)
{
- return path.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString());
+ return false;
}
// Otherwise we include by default
else