Fixed: Auto-Updater rollback logic tries to restore unchanged files.

This commit is contained in:
Taloth Saldono
2016-09-09 01:05:27 +02:00
parent 09530b238f
commit 4bf3ef45b0
10 changed files with 244 additions and 23 deletions
@@ -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)