mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-22 22:14:44 -04:00
Fixed: Auto-Updater rollback logic tries to restore unchanged files.
This commit is contained in:
@@ -15,6 +15,7 @@ namespace NzbDrone.Common.Disk
|
||||
{
|
||||
TransferMode TransferFolder(string sourcePath, string targetPath, TransferMode mode, bool verified = true);
|
||||
TransferMode TransferFile(string sourcePath, string targetPath, TransferMode mode, bool overwrite = false, bool verified = true);
|
||||
int MirrorFolder(string sourcePath, string targetPath);
|
||||
}
|
||||
|
||||
public enum DiskTransferVerificationMode
|
||||
@@ -83,6 +84,100 @@ namespace NzbDrone.Common.Disk
|
||||
return result;
|
||||
}
|
||||
|
||||
public int MirrorFolder(string sourcePath, string targetPath)
|
||||
{
|
||||
var filesCopied = 0;
|
||||
|
||||
Ensure.That(sourcePath, () => sourcePath).IsValidPath();
|
||||
Ensure.That(targetPath, () => targetPath).IsValidPath();
|
||||
|
||||
_logger.Debug("Mirror [{0}] > [{1}]", sourcePath, targetPath);
|
||||
|
||||
if (!_diskProvider.FolderExists(targetPath))
|
||||
{
|
||||
_diskProvider.CreateFolder(targetPath);
|
||||
}
|
||||
|
||||
var sourceFolders = _diskProvider.GetDirectoryInfos(sourcePath);
|
||||
var targetFolders = _diskProvider.GetDirectoryInfos(targetPath);
|
||||
|
||||
foreach (var subDir in targetFolders.Where(v => !sourceFolders.Any(d => d.Name == v.Name)))
|
||||
{
|
||||
_diskProvider.DeleteFolder(subDir.FullName, true);
|
||||
}
|
||||
|
||||
foreach (var subDir in sourceFolders)
|
||||
{
|
||||
filesCopied += MirrorFolder(subDir.FullName, Path.Combine(targetPath, subDir.Name));
|
||||
}
|
||||
|
||||
var sourceFiles = _diskProvider.GetFileInfos(sourcePath);
|
||||
var targetFiles = _diskProvider.GetFileInfos(targetPath);
|
||||
|
||||
foreach (var targetFile in targetFiles.Where(v => !sourceFiles.Any(d => d.Name == v.Name)))
|
||||
{
|
||||
_diskProvider.DeleteFile(targetFile.FullName);
|
||||
}
|
||||
|
||||
foreach (var sourceFile in sourceFiles)
|
||||
{
|
||||
var targetFile = Path.Combine(targetPath, sourceFile.Name);
|
||||
|
||||
if (CompareFiles(sourceFile.FullName, targetFile))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
TransferFile(sourceFile.FullName, targetFile, TransferMode.Copy, true, true);
|
||||
filesCopied++;
|
||||
}
|
||||
|
||||
return filesCopied;
|
||||
}
|
||||
|
||||
private bool CompareFiles(string sourceFile, string targetFile)
|
||||
{
|
||||
if (!_diskProvider.FileExists(sourceFile) || !_diskProvider.FileExists(targetFile))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_diskProvider.GetFileSize(sourceFile) != _diskProvider.GetFileSize(targetFile))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var sourceBuffer = new byte[64 * 1024];
|
||||
var targetBuffer = new byte[64 * 1024];
|
||||
using (var sourceStream = _diskProvider.OpenReadStream(sourceFile))
|
||||
using (var targetStream = _diskProvider.OpenReadStream(targetFile))
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
var sourceLength = sourceStream.Read(sourceBuffer, 0, sourceBuffer.Length);
|
||||
var targetLength = targetStream.Read(targetBuffer, 0, targetBuffer.Length);
|
||||
|
||||
if (sourceLength != targetLength)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sourceLength == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (var i = 0; i < sourceLength; i++)
|
||||
{
|
||||
if (sourceBuffer[i] != targetBuffer[i])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public TransferMode TransferFile(string sourcePath, string targetPath, TransferMode mode, bool overwrite = false, bool verified = true)
|
||||
{
|
||||
var verificationMode = verified ? VerificationMode : DiskTransferVerificationMode.None;
|
||||
@@ -96,7 +191,7 @@ namespace NzbDrone.Common.Disk
|
||||
Ensure.That(targetPath, () => targetPath).IsValidPath();
|
||||
|
||||
_logger.Debug("{0} [{1}] > [{2}]", mode, sourcePath, targetPath);
|
||||
|
||||
|
||||
var originalSize = _diskProvider.GetFileSize(sourcePath);
|
||||
|
||||
if (sourcePath == targetPath)
|
||||
|
||||
Reference in New Issue
Block a user