diff --git a/Duplicati/GUI/Duplicati.csproj b/Duplicati/GUI/Duplicati.csproj
index 42b0c308f..b355f0379 100644
--- a/Duplicati/GUI/Duplicati.csproj
+++ b/Duplicati/GUI/Duplicati.csproj
@@ -94,6 +94,11 @@
True
FilterDialog.resx
+
+ True
+ True
+ FilterEditor.resx
+
True
True
@@ -1017,6 +1022,10 @@
+
+ ResXFileCodeGenerator
+ FilterEditor.Designer.cs
+
ResXFileCodeGenerator
WaitForOperation.Designer.cs
diff --git a/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs b/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs
index 6ef1eb69e..e83b9d6e4 100644
--- a/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs
+++ b/Duplicati/GUI/HelperControls/FilterEditor.Designer.cs
@@ -47,6 +47,7 @@ namespace Duplicati.GUI.HelperControls
this.label1 = new System.Windows.Forms.Label();
this.FilenameTester = new System.Windows.Forms.TextBox();
this.TestResults = new System.Windows.Forms.PictureBox();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.groupBox1.SuspendLayout();
this.toolStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.TestResults)).BeginInit();
@@ -217,5 +218,6 @@ namespace Duplicati.GUI.HelperControls
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox FilenameTester;
private System.Windows.Forms.PictureBox TestResults;
+ private System.Windows.Forms.ToolTip toolTip1;
}
}
diff --git a/Duplicati/GUI/HelperControls/FilterEditor.cs b/Duplicati/GUI/HelperControls/FilterEditor.cs
index 64e442023..7ea7b2b09 100644
--- a/Duplicati/GUI/HelperControls/FilterEditor.cs
+++ b/Duplicati/GUI/HelperControls/FilterEditor.cs
@@ -72,15 +72,16 @@ namespace Duplicati.GUI.HelperControls
{
if (FilenameTester.Text.Trim().Length == 0 || string.IsNullOrEmpty(m_basepath))
{
+ SetTooltipMessage("");
TestResults.Visible = false;
return;
}
-
string filename = FilenameTester.Text;
if (filename.IndexOfAny(System.IO.Path.GetInvalidPathChars()) >= 0)
{
+ SetTooltipMessage(string.Format(Strings.FilterEditor.InvalidCharsInFilenameError, filename));
TestResults.Visible = false;
return;
}
@@ -90,15 +91,52 @@ namespace Duplicati.GUI.HelperControls
if (!filename.StartsWith(m_basepath))
{
+ SetTooltipMessage(string.Format(Strings.FilterEditor.FilenameIsNotInRootFolder, filename, m_basepath));
TestResults.Visible = false;
return;
}
+ List parentFolders = new List();
+ string folder = filename;
+ while (folder.Length > m_basepath.Length)
+ {
+ folder = System.IO.Path.GetDirectoryName(folder);
+ parentFolders.Add(Duplicati.Library.Core.Utility.AppendDirSeperator(folder));
+ }
+
+ parentFolders.Reverse();
+
Library.Core.FilenameFilter fn = new Duplicati.Library.Core.FilenameFilter(GetFilterList());
- TestResults.Image = imageList1.Images[fn.ShouldInclude(m_basepath, filename) ? 0 : 1];
+ Library.Core.IFilenameFilter match;
+ foreach(string s in parentFolders)
+ if (!fn.ShouldInclude(m_basepath, s, out match))
+ {
+ SetTooltipMessage(string.Format(Strings.FilterEditor.FolderIsExcluded, s, ((Library.Core.RegularExpressionFilter)match).Expression.ToString()));
+ TestResults.Image = imageList1.Images[1];
+ TestResults.Visible = true;
+ return;
+ }
+
+ TestResults.Image = imageList1.Images[fn.ShouldInclude(m_basepath, filename, out match) ? 0 : 1];
+
+ if (match == null)
+ SetTooltipMessage(string.Format(Strings.FilterEditor.FileIsIncludedDefault, filename));
+ else if (match.Include)
+ SetTooltipMessage(string.Format(Strings.FilterEditor.FileIsIncluded, filename, ((Library.Core.RegularExpressionFilter)match).Expression.ToString()));
+ else
+ SetTooltipMessage(string.Format(Strings.FilterEditor.FileIsExcluded, filename, ((Library.Core.RegularExpressionFilter)match).Expression.ToString()));
+
TestResults.Visible = true;
}
+ private void SetTooltipMessage(string message)
+ {
+ toolTip1.SetToolTip(FilenameTester, message);
+ toolTip1.SetToolTip(label1, message);
+ toolTip1.SetToolTip(TestResults, message);
+ toolTip1.Show(message, TestResults, 5000);
+ }
+
private void listView_SelectedIndexChanged(object sender, EventArgs e)
{
RemoveFilterButton.Enabled =
@@ -115,6 +153,7 @@ namespace Duplicati.GUI.HelperControls
{
while (listView.SelectedItems.Count > 0)
listView.Items.Remove(listView.SelectedItems[0]);
+ FilenameTester_TextChanged(sender, e);
}
private void EditFilterButton_Click(object sender, EventArgs e)
@@ -126,6 +165,7 @@ namespace Duplicati.GUI.HelperControls
{
listView.SelectedItems[0].Text = dlg.Filter.Value;
listView.SelectedItems[0].ImageIndex = dlg.Filter.Key ? 0 : 1;
+ FilenameTester_TextChanged(sender, e);
}
}
}
@@ -139,6 +179,7 @@ namespace Duplicati.GUI.HelperControls
listView.Items.RemoveAt(index);
listView.Items.Insert(index - 1, lvi);
lvi.Selected = true;
+ FilenameTester_TextChanged(sender, e);
}
}
@@ -151,6 +192,7 @@ namespace Duplicati.GUI.HelperControls
listView.Items.RemoveAt(index);
listView.Items.Insert(index + 1, lvi);
lvi.Selected = true;
+ FilenameTester_TextChanged(sender, e);
}
}
@@ -163,6 +205,7 @@ namespace Duplicati.GUI.HelperControls
listView.Items.RemoveAt(index);
listView.Items.Insert(0, lvi);
lvi.Selected = true;
+ FilenameTester_TextChanged(sender, e);
}
}
@@ -175,6 +218,7 @@ namespace Duplicati.GUI.HelperControls
listView.Items.RemoveAt(index);
listView.Items.Insert(listView.Items.Count, lvi);
lvi.Selected = true;
+ FilenameTester_TextChanged(sender, e);
}
}
@@ -182,7 +226,10 @@ namespace Duplicati.GUI.HelperControls
{
FilterDialog dlg = new FilterDialog(new KeyValuePair(true, ""));
if (dlg.ShowDialog(this) == DialogResult.OK)
+ {
listView.Items.Add(dlg.Filter.Value, dlg.Filter.Key ? 0 : 1);
+ FilenameTester_TextChanged(sender, e);
+ }
}
private void FilterEditor_Load(object sender, EventArgs e)
diff --git a/Duplicati/GUI/HelperControls/FilterEditor.resx b/Duplicati/GUI/HelperControls/FilterEditor.resx
index 202588d1b..60a69712d 100644
--- a/Duplicati/GUI/HelperControls/FilterEditor.resx
+++ b/Duplicati/GUI/HelperControls/FilterEditor.resx
@@ -142,29 +142,28 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD6
- BAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
- AwABEAMAAQEBAAEgBgABEP8AKwABFAIBARoBLQIBAUMBLQIBAUMBLQIBAUPwAAFYAQMBAgGyAVkB4gGM
- Af8BWAHhAYkB/wFKAcgBcgH/8AABWAEDAQIBsgFNAdQBbQH/AUQBywFUAf8BSgHJAXIB//AAAVgBAwEC
- AbIBVQHaAXcB/wFFAcwBVgH/AUoBygFyAf/wAAFYAQMBAgGyAWEB4wGBAf8BUQHUAWMB/wFLAcsBcwH/
- 4AABPgGoATwB/gFUAdMBeQH/AVQB1AF7Af8BVQHUAXsB/wFUAdMBegH/AW0B6gGEAf8BYAHfAXMB/wFe
- AeMBkAH/AUsBygFxAf8BSQHIAXAB/wFIAcYBbgH/AUgBxQFuAf8BMQIBAUwMAAFJAgIBhAJQAdMB/wJS
- AdQB/wJUAdQB/wJVAdMB/wJUAdAB/wJRAcwB/wJNAccB/wJJAcMB/wJHAcIB/wJHAcIB/wI2AagB/5AA
- AUEBrQFBAf4BaQHaAXwB/wFyAeQBgQH/AXgB7AGGAf8BewHwAYoB/wF4Ae8BhwH/AW8B6gGBAf8BYgHh
- AXYB/wFVAdcBZwH/AUkBzgFaAf8BRAHLAVQB/wFXAeABhwH/ATECAQFMDAABSQICAYQCYgHXAf8CaQHW
- Af8CdQHkAf8CfQHuAf8CfQHwAf8CcQHpAf8CXgHcAf8CTgHQAf8CSQHMAf8CSQHMAf8CQAG3Af+QAAFB
- Aa4BQQH+AWIB1gGBAf8BagHfAYUB/wFxAecBjQH/AXYB7gGTAf8BewHvAYoB/wF5AfABiAH/AXEB7AGG
- Af8BZgHnAYIB/wFbAd4BfQH/AVEB1wFyAf8BWAHhAYoB/wExAgEBTAwAAUkCAgGEAmMB2gH/AmoB3QH/
- AnQB6AH/AnoB8AH/AnoB8gH/AnEB7AH/AmIB4gH/AlQB2AH/Ak8B1AH/Ak8B1AH/AkABtwH/kAABVwED
- AQIBsQFYAQQBAgG1AVgBBAECAbUBWAEEAQIBtQFXATIBDgHoAXYB7QGTAf8BewHvAYkB/wFXAdYBgQH/
- AVgBBAECAbUBWAEEAQIBtQFYAQQBAgG1AVgBBAECAbUBGQIBASEMAAEuAgEBRgFYAQIBBAG1AVgBAgEE
- AbUBWAECAQQBtQFYAQIBBAG1AVgBAgEEAbUBWAECAQQBtQFYAQIBBAG1AVgBAgEEAbUBWAECAQQBtQFY
- AQIBBAG1AVcBAgEEAbSgAAFYAQMBAgGyAW8B5QGLAf8BdgHoAYMB/wFXAdYBgQH/8AABWAEDAQIBsgFm
- AdsBgQH/AW0B3gGAAf8BVgHVAX8B//AAAVgBAwECAbIBXQHSAX4B/wFiAdMBdQH/AVUB1AF9Af/wAAFV
- AgIBqwE4AbkBPQH/ATgBuAE9Af8BNgG1ATkB//8A/wDaAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEB
- AQABAQUAAYAXAAP/AQAE/wQAAfwBPwL/BAAB/AE/Av8EAAH8AT8C/wQAAfwBPwL/BAAB/AE/Av8EAAHA
- AQEBwAEDBAABwAEBAcABAwQAAcABAQHAAQMEAAHAAQEBwAEDBAAB/AE/Av8EAAH8AT8C/wQAAfwBPwL/
- BAAB/AE/Av8EAAT/BAAE/wQACw==
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC8
+ BAAAAk1TRnQBSQFMAgEBAgEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABEAMAAQEBAAEgBgABEP8AKwADEwEaASwCKwFDASwCKwFDASwCKwFD8AABVQJCAbIBVwHiAYwB/wFW
+ AeEBiQH/AUgByAFwAf/wAAFVAkIBsgFLAdQBawH/AUIBywFSAf8BSAHJAXAB//AAAVUCQgGyAVMB2gF1
+ Af8BQwHMAVQB/wFIAcoBcAH/8AABVQJCAbIBXwHjAYEB/wFPAdQBYQH/AUkBywFxAf/gAAE+AaQBPAH+
+ AVIB0wF3Af8BUgHUAXkB/wFTAdQBeQH/AVIB0wF4Af8BawHqAYQB/wFeAd8BcQH/AVwB4wGQAf8BSQHK
+ AW8B/wFHAcgBbgH/AUYBxgFsAf8BRgHFAWwB/wMwAUwMAAFIAkMBhAJOAdMB/wJQAdQB/wJSAdQB/wJT
+ AdMB/wJSAdAB/wJPAcwB/wJLAccB/wJHAcMB/wJFAcIB/wJFAcIB/wI0AagB/5AAAUEBqQFBAf4BZwHa
+ AXoB/wFwAeQBgQH/AXYB7AGGAf8BeQHwAYoB/wF2Ae8BhwH/AW0B6gGBAf8BYAHhAXQB/wFTAdcBZQH/
+ AUcBzgFYAf8BQgHLAVIB/wFVAeABhwH/AzABTAwAAUgCQwGEAmAB1wH/AmcB1gH/AnMB5AH/AnsB7gH/
+ AnsB8AH/Am8B6QH/AlwB3AH/AkwB0AH/AkcBzAH/AkcBzAH/Aj4BtwH/kAABQQGqAUEB/gFgAdYBgQH/
+ AWgB3wGFAf8BbwHnAY0B/wF0Ae4BkwH/AXkB7wGKAf8BdwHwAYgB/wFvAewBhgH/AWQB5wGCAf8BWQHe
+ AXsB/wFPAdcBcAH/AVYB4QGKAf8DMAFMDAABSAJDAYQCYQHaAf8CaAHdAf8CcgHoAf8CeAHwAf8CeAHy
+ Af8CbwHsAf8CYAHiAf8CUgHYAf8CTQHUAf8CTQHUAf8CPgG3Af+QAAFWAkIBsQFVAkEBtQFVAkEBtQFV
+ AkEBtQFXAUEBJwHoAXQB7QGTAf8BeQHvAYkB/wFVAdYBgQH/AVUCQQG1AVUCQQG1AVUCQQG1AVUCQQG1
+ AxgBIQwAAy0BRgFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFVAkEBtQFV
+ AkEBtQFVAkEBtQFWAUABQgG0oAABVQJCAbIBbQHlAYsB/wF0AegBgwH/AVUB1gGBAf/wAAFVAkIBsgFk
+ AdsBgQH/AWsB3gGAAf8BVAHVAX0B//AAAVUCQgGyAVsB0gF8Af8BYAHTAXMB/wFTAdQBewH/8AABVAJE
+ AasBNgG5ATsB/wE2AbgBOwH/ATQBtQE3Af//AP8A2gABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEA
+ AQEFAAGAFwAD/wEABP8EAAH8AT8C/wQAAfwBPwL/BAAB/AE/Av8EAAH8AT8C/wQAAfwBPwL/BAABwAEB
+ AcABAwQAAcABAQHAAQMEAAHAAQEBwAEDBAABwAEBAcABAwQAAfwBPwL/BAAB/AE/Av8EAAH8AT8C/wQA
+ AfwBPwL/BAAE/wQABP8EAAs=
@@ -183,22 +182,21 @@
0
- 121, 19
+ 3, 16
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAiNJREFUOE+Fk29L
- U3EUx+cr6AVES+e8btVEcwUlKWZI0IOQLIaNYrJqgc7sUrlCbG0oxmrhkpRkVGQM+ocPKpoRxHJXcW61
- SX8IZBA9CXrQK/jW98BuXebqwIHfPfd8P/ec8zu3ylTB3DEXvv38Km83bthkut+fqKqUa4hvDdRi/+12
- qMl+jKaD4jzvm96DLRetqAhR753BtjErBpI+RHNXMbkaxdTHCdzKTSC2eg2R7Ch8zz2Sw9wyUH3IDM+z
- HowsD2GscBnj2RAWi2lxQsL5YVxZ9qNn7hCUsNkIYNm77zahL3UCQ9lBjOQDCGqXULJ4fhrD789DXenD
- 6de92Bl3gBq9CnukBh2PdsG74IY/c1IggZSqA6ZyMYnxnSflQsuTJlAjAE67YaYOrU+dOD7fjYE3PlxY
- +O0vB3XATe2GxPl15hBADbWm9nCLPDgf23EnP6OLKh04k+aHNtFQqwMY5LD+Z1rxrRFQaoGA7vlOBNI+
- hDJ+jGtnddZsYVJugK2xhVIF0gKNA9mRULD3lQ1dSw4cyzXCqzl1QPRTL46uNOKg5kBb0o7mB8qfIRLA
- K9ket6IzWQdXTsGpzzb43zkMAO8HGw5n6tHxQpH+DddICBepLWGBe8kC/5oF6lo1ij8K4te/dEnsiFYr
- Ocwt20Sup+0vyLniZgS/m8UJI7h1tkZy1l3lEpGlNUTMknxgrlqcZ8bKyv7X78kJ857p+rTXEfwChEDw
- QjpqrrIAAAAASUVORK5CYII=
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIMSURBVDhPjZPvS1NhFMf9S5bOeb0rJ5orKElRQ4JehGQx
+ bBSTWQvsml4ql4itDcVYLVySkowKDKEyfFHRjCCWu4lztzbpB4HsdeDf8K3vgd0aa9UDB84995zPc349
+ VVUVjjfuQUekVYR6Jb8y+55gLY7c64CevIDJdEiE+uH5Q9h91VEZpD+8iIYpB4aSAcTMG5jdimHu8wzu
+ mjOIb91ENDuJwAuf+NC37Ob6sA2+532Y2BjFVP4aprNhvC+kRQiJ5MZxfUND38pxKBFbKYBpH3zQjMHU
+ AEazw5jIBREyxlA8idw8xj9ehr45iPNv+rE/4QJjrCyc0Rp0PTkA/5oXWuasQIIp3QLMmXGx8Z8v5UHr
+ cjMYIwB2uHGhDm3P3Diz2ouhtwFcWfspr4YtwB3jtth5O30IYIxMh2Pih/upE/dzC1ZQJYU9aXmsSgxj
+ LQCNbNa/jlF4VwoolkBA72o3gukAwhkN08aIxVrMz8oEWBpLKGZgLRgbsm9JQedrFT3rLpw2m+A33BYg
+ 9qUfpzabcMxwoT3pRMsj5VcT2UiOZG/Cge5kHTymgnNfVWgfXCUA/ycVJzL16HqpSP0lYySEi9S+ZId3
+ 3Q5t2w59uxqFnbzIrW89Yjtp1IoPfcs2keup/ga5VNiF0HebCGEEty3WiM8fV7lIZGqNUZs4H12pFqFO
+ W1naf3ui//ucfwCJ3vHLSjlN7AAAAABJRU5ErkJggg==
@@ -219,16 +217,15 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAe9JREFUOE+FU99L
- U3EU3976G6SnoIcpk5rU7AebFjFBaRkRCCJEOmbqMmoOUxwLVhuBbhLLBhUVCD7aS5BPPokPQRDU7CGN
- 2noI79xcbNa8n+7nyBa3280vfOB7P+dzPpxz7vlaLSZn0deHSu6rRA80HLR408+tZlodP9/ajJXLXdgI
- j+FbIi5Yn7wp3AunHaYmryeCWDplE/HWo1n8eDqH8rO0oPQ4BSU1jY3gEF6dsINag9HL4zZ8uT6A7ft3
- gNkYdtNJHX4m76EYm8LnwT5Qayh7rdOFwsQoqtHbUGeidRPMzcidnBoJYis0jIznpL6dZa2s3CUPdm75
- RYR4uG5SSxZOi5UCV5DtPgvmSBWc9ju3A5sayaCiVaHcnTQiEoIyHsD3G/2iZQ5zLQtdZ+Sj4nVi88lD
- 7HeUN6tQPK3ItDvAXDH41HFESE56v2MwYBnvNTcaFK5eRD42jnxiag8P9GBrbIHaegucAweSPXcMOxec
- UHtPAz43MOL6g2va3dcmMbZKbX2INOD2sY28twXV3qNQfQ5gqEUHcoxRQ61hK7kcDBR77KgO2PArcAjq
- 6GEB7+QYo8awSKyC68nAx/ONUHqaUPbvJRK8k/vQYRfNP1e5tposjW/iradJzAjeyf33Mf39OPh3+IsJ
- WRiT8xtNQweCAHQ6FwAAAABJRU5ErkJggg==
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHfSURBVDhPjVPfS1NhGPZvCbpYY1ITm5rMHxETlFYiwkCE
+ SIc1XYtaY00cBssNwekIm4MKCYIu8yaoq67EC0EQbHVRi5hehGebLfzROk/neccmx+PUDx54z/M+33Pe
+ 9/ver66uxnrnHsTbnk4B41o6A/+mqR7L/T3IhB9hazYm+D7+QLjXNkttow8hPz5eMYk4v5DAn1dJ7C6m
+ BMUX81DmZ5Dxe/C+2QJqDX9eumzCz3vD+D39BEhE8S81p8PB3BR2ohP4cWcQ1OoMWPaXbjsKIR9KkcdQ
+ 45GqCZJxicmpk37kA6NIO1r07XzSytrsc2D/4YiIEAtXTSqbhdNyRe8tZG9eBfdIFTzh9TYrtjWSSUWr
+ Qnk6bsRkAErQi1/3h0TLPXI7vCZ+7Dlt2H75HKctZXUFiqMJ6Q6rXLEYfOu6KCRP+rRlMGAZG5obDQq3
+ e5GLBpGbnSjjmR5sjS1QW22B58ADyV5rxP4NG9SBVsDdBozZD3FXi93tkmOr1FYPkQa8RraRczagNHAJ
+ qtsKeBp0IMccNdQappLDwcSOy4LSsAl/veeg+s4LGJNjjhrDILEKjicTX69fgOIyY3ekvJFgTO5zl0U0
+ x45yZTRZGt/EmsMsZgRjcic+pqOP46zP+T9spgnV3QfwFQAAAABJRU5ErkJggg==
@@ -249,15 +246,15 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAcZJREFUOE+VU0sv
- Q0EYvR4bP8HCxg+w6Fq6FhIhIiFWFpZlK7FkxaKJV6RCsChtpBpBKPqMtqlalDaVEpS6RVUrDW2jevQb
- pqq9bWKSk7kz957znfPN3CrhZ7jdPmSzSaGmtlb4zGSE6uo6gdZ8iKIodHS0V+U3ih9S6Q+8JtJlYTI7
- YDRaUFEgGk+BQEKR2PfM9+x2B0J3ofIi5ICTC2cu4DkLQLexDe2sCoae3lInPAJV5iQ+P0XfQLi8EmFr
- bUOgpQVmufyvCHcgPsTZh+eB2zz42uc9g3VOBb1MBt3AQKkAZQ7ev+QFODHgNuDaMgjqg1a7Ds2EUjoC
- WS52EPRa8WqSIayvh1/dx5ooeRo8AndA1alydL+JkR9VDYhou5lDclJynFwgHHlnEQorE/l2uQ102S6D
- z5UF7sNxULNiO7+VH1a7YHd4sHd4DJvTC71+U9oBHSFZ9J9qEDnpwstKI3xTzVCr1zA5swTl1CI0G0bW
- yJIIydQHmP2cRdeBAj5zPzTjnRhUDGF4ZJQJEPnYcyPdxLxALv+0cgyzcwuYX1zF1u4RI3kvnuG/iuM6
- lJDugcvlRiGcTheKQd0nUKSyP9V/X3wBzfZGZumMH9MAAAAASUVORK5CYII=
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAG1SURBVDhPlVPBSgJRFPU3WrTpA1q4jtZSq4igaNXCpbYN
+ WtaqFkJWhJFUC22GqCEqysrMSMU0MhXDpNJMrdFUpFJcnLyvnpWOQQOHO2/m3XPPue8+lerr8fnC8Hp9
+ 8F9cssjX9E6QpC3wvYqxXKmiWKq0xLHDDbv9pDUJEeQKZQYikvOfkX9zudxIPiRbk3ACnvQzmUgCwSg2
+ NncgzptgGxxqVsItUGVelcfn3CsIsdsUTnt6EdVo4Oju/k3CFaQyBbbxOpqog6/DoSCcCyZIajU2tNpm
+ ApIdf3ypE/DEqM+GuxM9qA+iuA5h2qBsgSQ3KoiHnCgeq5GW2hCxDLMmKp4Gt8AVUHWqnDvoZMlPpnbI
+ 4gBTSEqaZoETpOU3ZuFnZUpOrPSy4YrFs38TPKYLoGbld78rZ6z9cLkD2D86x6knpDyVpICOkCRGrgTI
+ /n68rHYgbOyCxbKGmbllGIxmCJt21sgmC+/lKpj8mkTvoQ5hxwiEqT7odaMYG59gBJR8HrhXbmKdoOZ/
+ 1jCJ+YUlLJqt2N47Y0mhmywitwXcJUvKPeC3jkePx4tGUPcJZOnPm/mfnx/Qo1STSDASFQAAAABJRU5E
+ rkJggg==
@@ -281,13 +278,13 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAVlJREFUOE9jYCAA
- pt6c+p+QGpzySWdc/2ec8/jfd7WPdENAmjseJINx3kWf/10Xu4g3BKa5+kH6/4anOf+nvMv/n3PN/X/X
- aSIMQdfcAtTc+b7k/8zPhRCX4DMEprn2YQbYZpjmjg9FYHbfu8z/IDVYDUHXDLIVhGGaa15l/C9/lvy/
- 7lHE/5QTTqiGOO41+19zPfB/zf3g/233o8B+BmkE4aa3uf9BmkEaQfIFFzz/F553/++4wQi7S7z3uID9
- C9Nc9SLtf96DKLAB7ltsCcdE2IEAsAEgmyuep4A1J98M+F92J+C/7xYn4gyY9iEL7N+c+5H/E2/4/w+7
- 4Po//4YXcQYE7/T93/c6+X/WvfD/Cdf9wJp9T9uC0wFRLgAZ0PI0+n/cNR+4ZpINAIV2yHlnsM0wDHKB
- z0ZHwmEAdsGDQLCTkXHtXV/iDEjemwT2KzoG2R6+KQzDBQBtp08dH0E7jQAAAABJRU5ErkJggg==
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFZSURBVDhPY2AgAKbenPqfkBqc8klnXP9nnPP433e1j3RD
+ QJo7HiSDcd5Fn/9dF7uINwSmufpB+v+Gpzn/p7zL/59zzf1/12kiDEHX3ALU3Pm+5P/Mz4UQl+AzBKa5
+ 9mEG2GaY5o4PRWB237vM/yA1WA1B1wyyFYRhmmteZfwvf5b8v+5RxP+UE06ohjjuNftfcz3wf8394P9t
+ 96PAfgZpBOGmt7n/QZpBGkHyBRc8/xeed//vuMEIu0u897iA/QvTXPUi7X/egyiwAe5bbAnHRNiBALAB
+ IJsrnqeANSffDPhfdifgv+8WJ+IMmPYhC+zfnPuR/xNv+P8Pu+D6P/+GF3EGBO/0/d/3Ovl/1r3w/wnX
+ /cCafU/bgtMBUS4AGdDyNPp/3DUfuGaSDQCFdsh5Z7DNMAxygc9GR8JhAHbBg0Cwk5Fx7V1f4gxI3psE
+ 9is6BtkevikMwwUAbadPHR9BO40AAAAASUVORK5CYII=
@@ -308,14 +305,14 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAY9JREFUOE+Vk8tL
- AlEUxsdaBf01bdr0zhAjTAQVe5FNGJNWGvmojRFlVqBTUFCL+hPatQhcFPSiJLNEhVKJHhIi5r6+OBNj
- ZpnTwF3cmfl933fOuVfGlDz2kB0P+VTh7TvzxlQx1cK+pqqW2W7YkZUy3/aGIy1WYjq4omrMx/uwnDSC
- fzRhKzsGdUCOP2H6aDjUYu5Oj5GgDtbIAKYTJrgfzFhPc9IFvLf9BXjhxQpam6826QK+e1ZwJnA2Y4Yn
- Y/ufAMUlmMCl3JSwNvITUO23SesBNYxgUWAxNwl/lpMmoAp0CnFFZyphJm2CJ22Ecq/xZ4LV2BraAvXC
- 2JxRjTABiksCIjye6oEjoYHjuhPsqRzcWTtaduvgPnZ/CvoiPliuun44u56HQTAbV8MQVkB90YyhsBym
- k9YvWDwY/hteECF3cnY+sbAkDTDGuqELdUB13lQeFkX4MA8uqIT3hcVoQo/BqEo6XCxCdVLNkp1Lzzcl
- 6T1oBBdRVI5d7nLwl6uCyK8Nq3ijin4ojKoM9AHxq1tZT9V7JgAAAABJRU5ErkJggg==
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF9SURBVDhPlZPbSgJhFIV7pm66soMZosQ0CCp2onHCmLTS
+ yEPdGFFmBToGBfUS3XUReJF0pCSzRIXSiA4iItYLrNoTM4kmTgMbZuBf31p77/k7Ohoeb8oLW8KslDVh
+ Ut7tJxwazzd9207N2MpZEMiyWM2PYrPIQXx1YL86AzauUwH4dl95tGIqaYE7M47FggPBFyd2SoJ6QPhh
+ TBGvld2g2vvwqAdEnnnJmYTLFSdCFc//ABSXxCTcqC1Itfs5B+ZIq24GNDASy4D12jyiVUEdgIkbpbiy
+ M7WwVHIgVOJgONQ0J4jltqGNd0lr82dN0gYoLgFk8ezTMHwFE3x3RvAXOgiX/eg96ETwLPgDjGQicN0O
+ NjkH3idBYj7PwpbWg73ugT2tg+O871cs/0nRe1GCkDs5+994uIo2cLkhWFIDYK66W4tliJgWISQNCJd5
+ TBesmMgy6sX1EOqTelbt3HghKMnIsQZCRt8+dqvbJd7EJMifA2t7JesOKKtqIfoCZo5mLImpLeYAAAAA
+ SUVORK5CYII=
@@ -339,14 +336,14 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAZJJREFUOE+Vk81L
- AmEQxv2vvETWQepiHyBEGZqRkliblUmYGEQHs8yPQAMpLPSQdIq6RElBnjTJyENGdKgWywSrP2ByZnl1
- pV22FoY97Pv8nmfmnVWpFJ5o8h6Uzsh+73XnQLdShOBO6f8QFE/uVYCL1Qiyvn37dwgTzwXewLFVA2fq
- S4BEb5QhPZ4COaPY5HkAs/cRXNE6zB4KEH/4Wh6CzlzkA7i1FzAtlaHTloUue5ZAmGQm+Ql4RhLCnB1+
- XhBPXIBtvwZTySpBDO4ywS277wQJBHOtJGpjBvSRMtWgrwTdlkyzDWxlPv1NEN1yEfr9d1TqgaN2CN6l
- y5cHjfkMxg54wCQoxv7ZDBA8vXApPwN0sceFAWI5Q9UmACFcuk7pJBcHxVLOLAEOkWaQqlLKNggODMXW
- BE+Dw8NMiG8SNxYKxcbEK1WH/rgFcW8UgJVm9JTuXOyMAASjaNF71axQOP+7nT7reRsAY9s2K3R92uET
- 5U0UA8i5IR7HxYrzoB0SxZb7BRlALDasPsFI7FkS8AOfmJ+7r3cchAAAAABJRU5ErkJggg==
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGSSURBVDhPlZPNSwJhEMb9r7xE1kHqYh8gRBmakZJYm5VJ
+ mBhEB7PMj0ADKSz0kHSKukRJQZ40ychDRnSoFssEqz9gcmZ5daVdthaGPez7/J5n5p1VqRSeaPIelM7I
+ fu9150C3UoTgTun/EBRP7lWAi9UIsr59+3cIE88F3sCxVQNn6kuARG+UIT2eAjmj2OR5ALP3EVzROswe
+ ChB/+Foegs5c5AO4tRcwLZWh05aFLnuWQJhkJvkJeEYSwpwdfl4QT1yAbb8GU8kqQQzuMsEtu+8ECQRz
+ rSRqYwb0kTLVoK8E3ZZMsw1sZT79TRDdchH6/XdU6oGjdgjepcuXB435DMYOeMAkKMb+2QwQPL1wKT8D
+ dLHHhQFiOUPVJgAhXLpO6SQXB8VSziwBDpFmkKpSyjYIDgzF1gRPg8PDTIhvEjcWCsXGxCtVh/64BXFv
+ FICVZvSU7lzsjAAEo2jRe9WsUDj/u50+63kbAGPbNit0fdrhE+VNFAPIuSEex8WK86AdEsWW+wUZQCw2
+ rD7BSOxZEvADn5ifu693HIQAAAAASUVORK5CYII=
@@ -367,15 +364,14 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAbBJREFUOE9jZEAD
- oYVH/osaajKwv/zFwMzCwsDEwszAwMzE8EuMieHKlpMMexa4MqLrQeGH5B36n7/s3f+S/tf/C6e8+182
- 7QMYly77/N8lYfd/vJpBkiADCtZ8+l82GaEZZABIzCl2F3YD2qdd+g/DIEVgA6A2g2iQS7IWvf1vHb79
- f1vXSTBuaj6GMMw2ftf/+GVP/6ctewPGZXM/wg3Im/TmPwinTnz+P37ms/+hU+/+D517D2wYinecM4F+
- X/kexWaQ7SDNyZ1P/se1Pvwf1nD7f/j0B/9BFmINC5AhyM6HaU5of0RYM8jE2u6zYNNBhoA0p/U8+4+s
- 2S5h1//84n2otk9aeOO/eeze/2F99/4HdV//79N44T9IISgsIvsf/I9svAv2O8hg14Kj/70azoKxmd8G
- RED2z70K1giKa5C/E6tvgQ0BaYRp9k45ATYMZJFHzen/tXWH0Vwy6xKKIfGVN8EhDTKIoGZYiE4CGgIy
- HeQSUBhElFz575dxGr/N6NEBMwSUcEDRB3I2KCywOhtXugYZ4l5yAux/kjXDvTP9PDjUSbIZm4tQ0jwW
- BQBGf59N9yfyuQAAAABJRU5ErkJggg==
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGUSURBVDhPlZPLSwJhFMX7q2oRtehBUeEiUnNhY1RSLXyQ
+ CVGGFiVlJFkpBS5qMRC0aBcYteiFIVJI0QvFonSR2esPOHm/+tSZpsyByzDDPb9z7v1mKipkl9p6iMH1
+ Z1g9adi8T7AvZmH3v8Ky+Y4Gww7k/T+eO0z7MItZJrYufYmphsWP/wPIjTtzAL2r04eUE7j9MfCiJgb4
+ dqY7JaGxqrXbmJ49YTUxeVyA1QghCOIjjGKGlT34lgeYfBlQ9S2kIaykoF6OQx1MMJhk/vqB3OwbLxJn
+ cidxz8wDuqbuoHHeQhtIggwVl0mQ4vhcbHDflxYT0eGJMjpBSGycS6FYXGsIwTy0J3X3rV2hSr8LzXwC
+ 7Z5LtLnOQI20C503CZ0rzmYncKPlCC3OKKtK1VZhkd7gBRPSWdPc3aM3DEJCLm7tDTMYGTWPReAYP5Al
+ WY1JIMLINds0gUqK+UZ9OQjRKQntoNN2DlV/5G9n+XFwCH04dHwUm3ahGPu3H4MgTbYwm79scX6cwCnb
+ elnOSokk37xCwycvE6v477beNgAAAABJRU5ErkJggg==
@@ -516,6 +512,9 @@
0
+
+ 130, 17
+
True
@@ -591,6 +590,12 @@
System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ toolTip1
+
+
+ System.Windows.Forms.ToolTip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
FilterEditor
diff --git a/Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs b/Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs
new file mode 100644
index 000000000..49942478d
--- /dev/null
+++ b/Duplicati/GUI/HelperControls/Strings/FilterEditor.Designer.cs
@@ -0,0 +1,117 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4927
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Duplicati.GUI.HelperControls.Strings {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class FilterEditor {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal FilterEditor() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Duplicati.GUI.HelperControls.Strings.FilterEditor", typeof(FilterEditor).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The file {0} is excluded due to rule {1}.
+ ///
+ internal static string FileIsExcluded {
+ get {
+ return ResourceManager.GetString("FileIsExcluded", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The file {0} is included due to rule {1}.
+ ///
+ internal static string FileIsIncluded {
+ get {
+ return ResourceManager.GetString("FileIsIncluded", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The file {0} is included because no rule matched.
+ ///
+ internal static string FileIsIncludedDefault {
+ get {
+ return ResourceManager.GetString("FileIsIncludedDefault", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The filename {0} is not located in the folder {1}.
+ ///
+ internal static string FilenameIsNotInRootFolder {
+ get {
+ return ResourceManager.GetString("FilenameIsNotInRootFolder", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The folder {0} is excluded due to rule {1}.
+ ///
+ internal static string FolderIsExcluded {
+ get {
+ return ResourceManager.GetString("FolderIsExcluded", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The filename {0} has invalid characters.
+ ///
+ internal static string InvalidCharsInFilenameError {
+ get {
+ return ResourceManager.GetString("InvalidCharsInFilenameError", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/Duplicati/GUI/HelperControls/Strings/FilterEditor.resx b/Duplicati/GUI/HelperControls/Strings/FilterEditor.resx
new file mode 100644
index 000000000..fd93a8b4d
--- /dev/null
+++ b/Duplicati/GUI/HelperControls/Strings/FilterEditor.resx
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ The file {0} is excluded due to rule {1}
+
+
+ The file {0} is included due to rule {1}
+
+
+ The file {0} is included because no rule matched
+
+
+ The filename {0} is not located in the folder {1}
+
+
+ The folder {0} is excluded due to rule {1}
+
+
+ The filename {0} has invalid characters
+
+
\ No newline at end of file
diff --git a/Duplicati/Library/Core/FilenameFilter.cs b/Duplicati/Library/Core/FilenameFilter.cs
index 84c87f76b..95030f103 100644
--- a/Duplicati/Library/Core/FilenameFilter.cs
+++ b/Duplicati/Library/Core/FilenameFilter.cs
@@ -227,9 +227,15 @@ namespace Duplicati.Library.Core
return res;
}
-
public bool ShouldInclude(string basepath, string filename)
{
+ IFilenameFilter dummy;
+ return ShouldInclude(basepath, filename, out dummy);
+ }
+
+ public bool ShouldInclude(string basepath, string filename, out IFilenameFilter match)
+ {
+ match = null;
basepath = Core.Utility.AppendDirSeperator(basepath);
if (!filename.StartsWith(basepath))
return false;
@@ -242,7 +248,10 @@ namespace Duplicati.Library.Core
//Run through each filter
foreach (IFilenameFilter filter in m_filters)
if (filter.Match(relpath))
+ {
+ match = filter;
return filter.Include;
+ }
return true;
}
diff --git a/Duplicati/Library/Core/RegularExpressionFilter.cs b/Duplicati/Library/Core/RegularExpressionFilter.cs
index cf9156921..5c40a7cec 100644
--- a/Duplicati/Library/Core/RegularExpressionFilter.cs
+++ b/Duplicati/Library/Core/RegularExpressionFilter.cs
@@ -48,6 +48,8 @@ namespace Duplicati.Library.Core
m_include = include;
}
+ public Regex Expression { get { return m_expression; } }
+
#region IFilenameFilter Members
public bool Include
diff --git a/Duplicati/Library/Core/Utility.cs b/Duplicati/Library/Core/Utility.cs
index 8289712cb..ff0684c70 100644
--- a/Duplicati/Library/Core/Utility.cs
+++ b/Duplicati/Library/Core/Utility.cs
@@ -106,14 +106,11 @@ namespace Duplicati.Library.Core
string f = AppendDirSeperator(lst.Dequeue());
try
{
- //TODO: We cannot guess if the folder has files that should be included,
- //so we have to enumerate all the files
foreach (string s in System.IO.Directory.GetDirectories(f))
- lst.Enqueue(s);
+ if (filter == null || filter.ShouldInclude(rootpath, f))
+ lst.Enqueue(s);
- //TODO: If anything is included from subpaths, we should report the folder itself
- if (filter == null || filter.ShouldInclude(rootpath, f))
- callback(rootpath, f, EnumeratedFileStatus.Folder);
+ callback(rootpath, f, EnumeratedFileStatus.Folder);
}
catch (System.Threading.ThreadAbortException)
{