Fixed usage of filelist filter

This commit is contained in:
Kenneth Skovhede
2026-03-19 12:25:33 +01:00
committed by Carl Johnsen
parent 2b83cd0d54
commit 25d35f68b4
4 changed files with 33 additions and 34 deletions
+1 -1
View File
@@ -369,7 +369,7 @@ namespace Duplicati.Library.Main
public IRecreateDatabaseResults UpdateDatabaseWithVersions(IFilter filter = null)
{
var filelistfilter = Operation.RestoreHandler.FilterNumberedFilelist(m_options.Time, m_options.Version, singleTimeMatch: true);
var filelistfilter = Operation.RestoreHandler.GetNumberedFilelistFilterDelegate(m_options.Time, m_options.Version, singleTimeMatch: true);
return RunAction(new RecreateDatabaseResults(), ref filter, async (result, backendManager) =>
{
@@ -238,8 +238,7 @@ namespace Duplicati.Library.Main.Operation
where p != null && p.FileType == RemoteVolumeType.Files
orderby p.Time descending
select p).ToArray();
var filelistFilter = RestoreHandler.FilterNumberedFilelist(options.Time, options.Version);
return filelistFilter(parsedlist).ToList();
return RestoreHandler.FilterNumberedFilelist(parsedlist, options.Time, options.Version).ToList();
}
private class RemoteVolumeMapper(IParsedVolume Volume) : IRemoteVolume
@@ -127,7 +127,7 @@ namespace Duplicati.Library.Main.Operation
if (f != null && File.Exists(f))
File.Delete(f);
var filelistfilter = RestoreHandler.FilterNumberedFilelist(m_options.Time, m_options.Version);
var filelistfilter = RestoreHandler.GetNumberedFilelistFilterDelegate(m_options.Time, m_options.Version);
await new RecreateDatabaseHandler(m_options, (RecreateDatabaseResults)m_result.RecreateDatabaseResults)
.RunAsync(m_options.Dryrun ? (string)f : m_options.Dbpath, backendManager, filter, filelistfilter, null)
@@ -101,7 +101,15 @@ namespace Duplicati.Library.Main.Operation
return tmp.CompressionModule;
}
public static RecreateDatabaseHandler.NumberedFilterFilelistDelegate FilterNumberedFilelist(DateTime time, long[] versions, bool singleTimeMatch = false)
public static RecreateDatabaseHandler.NumberedFilterFilelistDelegate GetNumberedFilelistFilterDelegate(DateTime time, long[] versions, bool singleTimeMatch = false)
{
if (versions.Length == 0 && time.Ticks == 0)
return null;
return (filelist) => FilterNumberedFilelist(filelist, time, versions, singleTimeMatch);
}
public static IEnumerable<KeyValuePair<long, IParsedVolume>> FilterNumberedFilelist(IEnumerable<IParsedVolume> filelist, DateTime time, long[] versions, bool singleTimeMatch = false)
{
if (time.Kind == DateTimeKind.Unspecified)
throw new Exception("Unspecified datetime instance, must be either local or UTC");
@@ -111,36 +119,28 @@ namespace Duplicati.Library.Main.Operation
time = Library.Utility.Utility.DeserializeDateTime(Library.Utility.Utility.SerializeDateTime(time)).ToUniversalTime();
versions ??= [];
// Unwrap, so we do not query the remote storage twice
var lst = (from n in filelist
where n.FileType == RemoteVolumeType.Files
orderby n.Time descending
select n).ToArray();
if (versions.Length == 0 && time.Ticks == 0)
return null;
var numbers = lst.Zip(Enumerable.Range(0, lst.Length), (a, b) => new KeyValuePair<long, IParsedVolume>(b, a)).ToList();
return
_lst =>
{
// Unwrap, so we do not query the remote storage twice
var lst = (from n in _lst
where n.FileType == RemoteVolumeType.Files
orderby n.Time descending
select n).ToArray();
var numbers = lst.Zip(Enumerable.Range(0, lst.Length), (a, b) => new KeyValuePair<long, IParsedVolume>(b, a)).ToList();
if (time.Ticks > 0 && versions.Length > 0)
return from n in numbers
where (singleTimeMatch ? n.Value.Time == time : n.Value.Time <= time) && versions.Contains(n.Key)
select n;
else if (time.Ticks > 0)
return from n in numbers
where (singleTimeMatch ? n.Value.Time == time : n.Value.Time <= time)
select n;
else if (versions.Length > 0)
return from n in numbers
where versions.Contains(n.Key)
select n;
else
return numbers;
};
if (time.Ticks > 0 && versions.Length > 0)
return from n in numbers
where (singleTimeMatch ? n.Value.Time == time : n.Value.Time <= time) && versions.Contains(n.Key)
select n;
else if (time.Ticks > 0)
return from n in numbers
where (singleTimeMatch ? n.Value.Time == time : n.Value.Time <= time)
select n;
else if (versions.Length > 0)
return from n in numbers
where versions.Contains(n.Key)
select n;
else
return numbers;
}
public async Task RunAsync(string[] paths, IBackendManager backendManager, Library.Utility.IFilter filter, IRestoreDestinationProvider restoreDestination)
@@ -172,7 +172,7 @@ namespace Duplicati.Library.Main.Operation
{
Logging.Log.WriteInformationMessage(LOGTAG, "NoLocalDatabase", "No local database, building a temporary database");
tmpdb = new TempFile();
RecreateDatabaseHandler.NumberedFilterFilelistDelegate filelistfilter = FilterNumberedFilelist(m_options.Time, m_options.Version);
RecreateDatabaseHandler.NumberedFilterFilelistDelegate filelistfilter = GetNumberedFilelistFilterDelegate(m_options.Time, m_options.Version);
db = await LocalRestoreDatabase.CreateAsync(tmpdb, null, m_result.TaskControl.ProgressToken)
.ConfigureAwait(false);
m_result.RecreateDatabaseResults = new RecreateDatabaseResults(m_result);