From e5e00fd346f3ad5c23fa980a246711830b84ff64 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Thu, 31 Jul 2014 00:00:55 +0200 Subject: [PATCH] Fixed: Renaming Episodes will never overwrite existing files. --- .../DiskProviderFixtureBase.cs | 6 +++--- src/NzbDrone.Common/Disk/DiskProviderBase.cs | 6 +++--- src/NzbDrone.Common/Disk/IDiskProvider.cs | 2 +- .../DeleteFileFixture.cs | 18 +++++++++++++++++- .../MediaFiles/RecycleBinProvider.cs | 19 +++++++++++++++++-- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/NzbDrone.Common.Test/DiskProviderTests/DiskProviderFixtureBase.cs b/src/NzbDrone.Common.Test/DiskProviderTests/DiskProviderFixtureBase.cs index 493914c12..a35f3e068 100644 --- a/src/NzbDrone.Common.Test/DiskProviderTests/DiskProviderFixtureBase.cs +++ b/src/NzbDrone.Common.Test/DiskProviderTests/DiskProviderFixtureBase.cs @@ -63,7 +63,7 @@ namespace NzbDrone.Common.Test.DiskProviderTests File.WriteAllText(source2, "SourceFile2"); Subject.MoveFile(source1, destination); - Subject.MoveFile(source2, destination); + Subject.MoveFile(source2, destination, true); File.Exists(destination).Should().BeTrue(); } @@ -75,7 +75,7 @@ namespace NzbDrone.Common.Test.DiskProviderTests File.WriteAllText(source, "SourceFile1"); - Subject.MoveFile(source, source); + Subject.MoveFile(source, source, true); File.Exists(source).Should().BeTrue(); ExceptionVerification.ExpectedWarns(1); @@ -148,7 +148,7 @@ namespace NzbDrone.Common.Test.DiskProviderTests File.SetAttributes(source, FileAttributes.ReadOnly); File.SetAttributes(destination, FileAttributes.ReadOnly); - Subject.MoveFile(source, destination); + Subject.MoveFile(source, destination, true); } [Test] diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index 540c694cd..1a07168e2 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -220,7 +220,7 @@ namespace NzbDrone.Common.Disk } case TransferAction.Move: { - MoveFile(sourceFile.FullName, destFile); + MoveFile(sourceFile.FullName, destFile, true); break; } } @@ -251,7 +251,7 @@ namespace NzbDrone.Common.Disk File.Copy(source, destination, overwrite); } - public void MoveFile(string source, string destination) + public void MoveFile(string source, string destination, bool overwrite = false) { Ensure.That(source, () => source).IsValidPath(); Ensure.That(destination, () => destination).IsValidPath(); @@ -262,7 +262,7 @@ namespace NzbDrone.Common.Disk return; } - if (FileExists(destination)) + if (FileExists(destination) && overwrite) { DeleteFile(destination); } diff --git a/src/NzbDrone.Common/Disk/IDiskProvider.cs b/src/NzbDrone.Common/Disk/IDiskProvider.cs index 473a0211d..e325484f6 100644 --- a/src/NzbDrone.Common/Disk/IDiskProvider.cs +++ b/src/NzbDrone.Common/Disk/IDiskProvider.cs @@ -29,7 +29,7 @@ namespace NzbDrone.Common.Disk void MoveFolder(string source, string destination); void DeleteFile(string path); void CopyFile(string source, string destination, bool overwrite = false); - void MoveFile(string source, string destination); + void MoveFile(string source, string destination, bool overwrite = false); void DeleteFolder(string path, bool recursive); string ReadAllText(string filePath); void WriteAllText(string filename, string contents); diff --git a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteFileFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteFileFixture.cs index f9f6c44d5..d0f206718 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteFileFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteFileFixture.cs @@ -47,7 +47,23 @@ namespace NzbDrone.Core.Test.ProviderTests.RecycleBinProviderTests Mocker.Resolve().DeleteFile(path); - Mocker.GetMock().Verify(v => v.MoveFile(path, @"C:\Test\Recycle Bin\S01E01.avi".AsOsAgnostic()), Times.Once()); + Mocker.GetMock().Verify(v => v.MoveFile(path, @"C:\Test\Recycle Bin\S01E01.avi".AsOsAgnostic(), true), Times.Once()); + } + + [Test] + public void should_use_alternative_name_if_already_exists() + { + WithRecycleBin(); + + var path = @"C:\Test\TV\30 Rock\S01E01.avi".AsOsAgnostic(); + + Mocker.GetMock() + .Setup(v => v.FileExists(@"C:\Test\Recycle Bin\S01E01.avi".AsOsAgnostic())) + .Returns(true); + + Mocker.Resolve().DeleteFile(path); + + Mocker.GetMock().Verify(v => v.MoveFile(path, @"C:\Test\Recycle Bin\S01E01_2.avi".AsOsAgnostic(), true), Times.Once()); } [Test] diff --git a/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs b/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs index b8fad1a47..b3dd60cce 100644 --- a/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs +++ b/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs @@ -84,10 +84,25 @@ namespace NzbDrone.Core.MediaFiles else { - var destination = Path.Combine(recyclingBin, new FileInfo(path).Name); + var fileInfo = new FileInfo(path); + var destination = Path.Combine(recyclingBin, fileInfo.Name); + + var index = 1; + while (_diskProvider.FileExists(destination)) + { + index++; + if (fileInfo.Extension.IsNullOrWhiteSpace()) + { + destination = Path.Combine(recyclingBin, fileInfo.Name + "_" + index); + } + else + { + destination = Path.Combine(recyclingBin, Path.GetFileNameWithoutExtension(fileInfo.Name) + "_" + index + fileInfo.Extension); + } + } logger.Debug("Moving '{0}' to '{1}'", path, destination); - _diskProvider.MoveFile(path, destination); + _diskProvider.MoveFile(path, destination, true); _diskProvider.FileSetLastWriteTimeUtc(destination, DateTime.UtcNow); logger.Debug("File has been moved to the recycling bin: {0}", destination); }