From cc572729ff0ce6585f6737c5e4dbd692c2b18fa6 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 26 Jun 2021 23:19:41 -0400 Subject: [PATCH] New: Drop Mono Support Co-Authored-By: ta264 --- azure-pipelines.yml | 55 ----- build.sh | 8 - src/Directory.Build.props | 9 - src/Directory.Build.targets | 7 - .../Mono/System.Diagnostics.Tracing.dll | Bin 5120 -> 0 bytes .../Mono/System.Globalization.Extensions.dll | Bin 6144 -> 0 bytes .../Mono/System.Numerics.Vectors.dll | Bin 163464 -> 0 bytes ...ime.InteropServices.RuntimeInformation.dll | Bin 7168 -> 0 bytes .../Mono/System.Text.Encoding.CodePages.dll | Bin 5120 -> 0 bytes .../Mono/System.Threading.Overlapped.dll | Bin 4608 -> 0 bytes src/Libraries/Mono/readme.txt | 3 - src/NzbDrone.Api.Test/Radarr.Api.Test.csproj | 2 +- .../Radarr.Automation.Test.csproj | 2 +- .../Radarr.Common.Test.csproj | 5 +- .../Composition/ContainerBuilderBase.cs | 18 +- .../EnvironmentInfo/PlatformInfo.cs | 13 -- .../EnvironmentInfo/RuntimeInfo.cs | 7 - .../Expansive/CircularReferenceException.cs | 12 - src/NzbDrone.Common/Expansive/Expansive.cs | 213 ------------------ src/NzbDrone.Common/Expansive/PatternStyle.cs | 12 - src/NzbDrone.Common/Expansive/Tree.cs | 11 - src/NzbDrone.Common/Expansive/TreeNode.cs | 90 -------- src/NzbDrone.Common/Expansive/TreeNodeList.cs | 31 --- src/NzbDrone.Common/Expansive/license.txt | 2 - .../Extensions/DictionaryExtensions.cs | 8 - .../Http/Dispatchers/ManagedHttpDispatcher.cs | 64 +----- src/NzbDrone.Common/Http/HttpAccept.cs | 4 - src/NzbDrone.Common/Http/NzbDroneWebClient.cs | 20 -- .../Processes/ProcessProvider.cs | 4 - src/NzbDrone.Common/Radarr.Common.csproj | 7 +- src/NzbDrone.Console/Radarr.Console.csproj | 2 +- .../HealthCheck/Checks/MonoDebugFixture.cs | 63 ------ .../Checks/MonoNotNetCoreCheckFixture.cs | 68 ------ .../Checks/MonoVersionCheckFixture.cs | 82 ------- .../Radarr.Core.Test.csproj | 2 +- .../HealthCheck/Checks/MonoDebugCheck.cs | 49 ---- .../HealthCheck/Checks/MonoNotNetCoreCheck.cs | 49 ---- .../HealthCheck/Checks/MonoTlsCheck.cs | 46 ---- .../HealthCheck/Checks/MonoVersionCheck.cs | 66 ------ src/NzbDrone.Core/Radarr.Core.csproj | 6 +- .../Radarr.Host.Test.csproj | 5 +- src/NzbDrone.Host/Bootstrap.cs | 4 - src/NzbDrone.Host/Radarr.Host.csproj | 15 +- .../WebHost/Middleware/SignalRMiddleware.cs | 7 - .../WebHost/WebHostController.cs | 10 - .../Radarr.Integration.Test.csproj | 7 +- .../Radarr.Libraries.Test.csproj | 2 +- .../Radarr.Mono.Test.csproj | 7 +- src/NzbDrone.Mono/Radarr.Mono.csproj | 7 +- src/NzbDrone.SignalR/Radarr.SignalR.csproj | 6 +- src/NzbDrone.SignalR/SignalRMessage.cs | 4 - src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs | 2 - src/NzbDrone.Test.Common/NzbDroneRunner.cs | 3 +- .../Radarr.Test.Common.csproj | 2 +- .../Radarr.Test.Dummy.csproj | 2 +- .../Radarr.Update.Test.csproj | 2 +- src/NzbDrone.Update/Radarr.Update.csproj | 2 +- .../Radarr.Windows.Test.csproj | 2 +- src/NzbDrone.Windows/Radarr.Windows.csproj | 2 +- src/NzbDrone/Radarr.csproj | 5 +- src/Radarr.Api.V3/Radarr.Api.V3.csproj | 2 +- src/Radarr.Http/Mapping/MappingValidation.cs | 54 ----- .../Mapping/ResourceMappingException.cs | 14 -- src/Radarr.Http/Radarr.Http.csproj | 2 +- .../ServiceInstall/ServiceInstall.csproj | 4 +- .../ServiceUninstall/ServiceUninstall.csproj | 4 +- src/Targets/FixBindingRedirects.targets | 17 -- src/Targets/MonoFacades.targets | 52 ----- src/Targets/PublishAllRids.targets | 2 - 69 files changed, 39 insertions(+), 1248 deletions(-) delete mode 100644 src/Libraries/Mono/System.Diagnostics.Tracing.dll delete mode 100644 src/Libraries/Mono/System.Globalization.Extensions.dll delete mode 100755 src/Libraries/Mono/System.Numerics.Vectors.dll delete mode 100644 src/Libraries/Mono/System.Runtime.InteropServices.RuntimeInformation.dll delete mode 100644 src/Libraries/Mono/System.Text.Encoding.CodePages.dll delete mode 100644 src/Libraries/Mono/System.Threading.Overlapped.dll delete mode 100644 src/Libraries/Mono/readme.txt delete mode 100644 src/NzbDrone.Common/Expansive/CircularReferenceException.cs delete mode 100644 src/NzbDrone.Common/Expansive/Expansive.cs delete mode 100644 src/NzbDrone.Common/Expansive/PatternStyle.cs delete mode 100644 src/NzbDrone.Common/Expansive/Tree.cs delete mode 100644 src/NzbDrone.Common/Expansive/TreeNode.cs delete mode 100644 src/NzbDrone.Common/Expansive/TreeNodeList.cs delete mode 100644 src/NzbDrone.Common/Expansive/license.txt delete mode 100644 src/NzbDrone.Common/Http/NzbDroneWebClient.cs delete mode 100644 src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs delete mode 100644 src/NzbDrone.Core.Test/HealthCheck/Checks/MonoNotNetCoreCheckFixture.cs delete mode 100644 src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs delete mode 100644 src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs delete mode 100644 src/NzbDrone.Core/HealthCheck/Checks/MonoNotNetCoreCheck.cs delete mode 100644 src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs delete mode 100644 src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs delete mode 100644 src/Radarr.Http/Mapping/MappingValidation.cs delete mode 100644 src/Radarr.Http/Mapping/ResourceMappingException.cs delete mode 100644 src/Targets/FixBindingRedirects.targets delete mode 100644 src/Targets/MonoFacades.targets diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 8ba52fb5c..fda05e6c0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -115,10 +115,6 @@ stages: artifact: WindowsCoreTests displayName: Publish Windows Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net472/linux-x64/publish' - artifact: LinuxTests - displayName: Publish Linux Mono Test Package - condition: and(succeeded(), eq(variables['osName'], 'Windows')) - publish: '$(testsFolder)/net5.0/linux-x64/publish' artifact: LinuxCoreTests displayName: Publish Linux Test Package @@ -277,14 +273,6 @@ stages: tarCompression: 'gz' includeRootFolder: false rootFolderOrFile: $(artifactsFolder)/macos/net5.0 - - task: ArchiveFiles@2 - displayName: Create Linux Mono tar - inputs: - archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).linux.tar.gz' - archiveType: 'tar' - tarCompression: 'gz' - includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-x64/net472 - task: ArchiveFiles@2 displayName: Create Linux Core tar inputs: @@ -439,14 +427,6 @@ stages: - powershell: Set-Service SCardSvr -StartupType Manual displayName: Enable Windows Test Service condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - bash: | - SYMLINK=6_6_0 - MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK - echo "##vso[task.setvariable variable=MONOPREFIX;]$MONOPREFIX" - echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH" - echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH" - displayName: Set Mono Version - condition: and(succeeded(), eq(variables['osName'], 'Mac')) - bash: find ${TESTSFOLDER} -name "Radarr.Test.Dummy" -exec chmod a+x {} \; displayName: Make Test Dummy Executable condition: and(succeeded(), ne(variables['osName'], 'Windows')) @@ -470,18 +450,6 @@ stages: condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) strategy: matrix: - mono520: - testName: 'Mono 5.20' - artifactName: LinuxTests - containerImage: ghcr.io/servarr/testimages:mono-5.20 - mono610: - testName: 'Mono 6.10' - artifactName: LinuxTests - containerImage: ghcr.io/servarr/testimages:mono-6.10 - mono612: - testName: 'Mono 6.12' - artifactName: LinuxTests - containerImage: ghcr.io/servarr/testimages:mono-6.12 alpine: testName: 'Musl Net Core' artifactName: LinuxMuslCoreTests @@ -566,14 +534,6 @@ stages: vmImage: $(imageName) steps: - - bash: | - SYMLINK=6_6_0 - MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK - echo "##vso[task.setvariable variable=MONOPREFIX;]$MONOPREFIX" - echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH" - echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH" - displayName: Set Mono Version - condition: and(succeeded(), eq(variables['osName'], 'Mac')) - task: UseDotNet@2 displayName: 'Install .net core' inputs: @@ -665,21 +625,6 @@ stages: condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0')) strategy: matrix: - mono520: - testName: 'Mono 5.20' - artifactName: LinuxTests - containerImage: ghcr.io/servarr/testimages:mono-5.20 - pattern: 'Radarr.*.linux.tar.gz' - mono610: - testName: 'Mono 6.10' - artifactName: LinuxTests - containerImage: ghcr.io/servarr/testimages:mono-6.10 - pattern: 'Radarr.*.linux.tar.gz' - mono612: - testName: 'Mono 6.12' - artifactName: LinuxTests - containerImage: ghcr.io/servarr/testimages:mono-6.12 - pattern: 'Radarr.*.linux.tar.gz' alpine: testName: 'Musl Net Core' artifactName: LinuxMuslCoreTests diff --git a/build.sh b/build.sh index e2b7adf33..baa6873c9 100755 --- a/build.sh +++ b/build.sh @@ -33,7 +33,6 @@ EnableBsdSupport() if grep -qv freebsd-x64 src/Directory.Build.props; then sed -i'' -e "s^\(.*\)^\1;freebsd-x64^g" src/Directory.Build.props - sed -i'' -e "s^\(.*\)^\1;freebsd-x64:net472^g" src/Directory.Build.props fi } @@ -148,11 +147,6 @@ PackageMacOS() PackageFiles "$folder" "$framework" "osx-x64" - if [ "$framework" = "net472" ]; then - echo "Adding Startup script" - cp macOS/Radarr $folder - fi - echo "Removing Service helpers" rm -f $folder/ServiceUninstall.* rm -f $folder/ServiceInstall.* @@ -337,7 +331,6 @@ then PackageTests "net5.0" "linux-x64" PackageTests "net5.0" "linux-musl-x64" PackageTests "net5.0" "osx-x64" - PackageTests "net472" "linux-x64" if [ "$ENABLE_BSD" = "YES" ]; then PackageTests "net5.0" "freebsd-x64" @@ -377,7 +370,6 @@ then Package "net5.0" "linux-musl-arm64" Package "net5.0" "linux-arm" Package "net5.0" "osx-x64" - Package "net472" "linux-x64" if [ "$ENABLE_BSD" = "YES" ]; then Package "net5.0" "freebsd-x64" diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 518e7dcac..fd31745cd 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -6,7 +6,6 @@ AnyCPU true win-x64;win-x86;osx-x64;linux-x64;linux-musl-x64;linux-arm;linux-arm64;linux-musl-arm64 - win-x64:net472;win-x86:net472;osx-x64:net472;linux-arm:net472;linux-arm64:net472;linux-musl-x64:net472;linux-musl-arm64:net472 $(MSBuildThisFileDirectory)..\ @@ -100,14 +99,6 @@ - - - - all - runtime; build; native; contentfiles; analyzers - - - false diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index c5681e6b2..4cf15bc72 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,11 +1,4 @@ - - - full - - - - diff --git a/src/Libraries/Mono/System.Diagnostics.Tracing.dll b/src/Libraries/Mono/System.Diagnostics.Tracing.dll deleted file mode 100644 index 3c7819569f8352e5aaebb61ddb7db97d362743a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 zcmeHL3v3)m8UEL=*m*c{A5rQy&IX6dF5z@(Ocbk0>&L~88#^{W$0?1Qdhc$0-ehn0 z*xmD^g5Zi)RR~h7I8;pv6{13FiyBB(N}+0TM1-hBkWy%cX)A&tU}&XcK~YHCgzul- zd#s%xRFF`m&Sn1nU-Qp5|NJ{UPS@R&R7^xA=$9`OJ&z~1CQ1K2nSi-+&5tVS*@`o3 zpI181tnC}t9W`xRNn1;)am_R>SB(kP&X}rhs*&!fnz9liv~1bpb$;lcZA6_)F&*tK zJ(Qj89DPDvqJ)VSLsRZ)hwAZE(VNhTR!F|c!_5lDFWUqt^xTT6=|OhofBB~`vI^}w z#O-FLiRi9e5LWnYkZ38`3w1;{Wp)3_Q_Vq_-sOZ6Dpk;Ie=whk|T|pZpZIrZG(hf;KE9vJX)g%o8_cVp*T6!7uMw$h!r8&?~ zNxD(e+o(zjQ7f$n-9fuRqvU|@0WF!}JQhh*jI4%c@F*j`O-O_g+K@r+Um&XcB; zLg`XKT8&tF&x=Kc(!PMy67bv=km7;)&IHCi8StD8*p>vOfq>K)h`A{cj&7L?19g}~mYvdE7&YUnUJ>EMZ9UCi3qwT2kd`sr zW<%GUycL;A>xK;6D-3N+as~G6N_uRhIPT^LW(}=Ydfe8N!v&_DmMK?yCFfLHGsp9W z-i+z$DZwZ(b4)jMx4;@5cU+MQMRW~0b6h>{g!*hPj&sf1u|Cb&?{Tfe_%I5?6FS8R z*sBi?C5)W8R}2{<&KdK@db_)AEG}dk{eU`fn8NnwvH%)FDDGPJ6{hjLc8Kv&%T731 z2Y;m@FX6(D3VTG43x~Y=!J1IS5M}0M-SufWzNMJwJa|#zy7F+BR=>C<-)v{c?6!3m zpyz45@!fK5e()~M)Q5!Q29(W6$q4o$pp>ZEWF5*E{=yS~d-GSubKO6_|GA$WI(F_+ zDp3`syjUfr6iihWi@EMC_}Z6F|88`};h!!V?XI7_werYcO5gs&?AqyXzcV|R80cI&b?Q6E>h6iHe@d)h zeet!e?mgD0&(9s$``zWIAKrTNO<%dDRjg7|(^CyycfT@KuJ|{j8b;Gsv~sttrMZ~1 z)zCL=TceHwKlyc{H40TV6iz4A6kNZ+&jc)_^5k0#9t*yt$ zq8BPcbwBUmPJP^+g~4a9^U(OUCo{yYfe?Z_wFy9gXgVj{l$nCo__k}FC0F#Cv)=2 z@Z7KG&cF86$F@%H-+Xdkc;(4oe81vS+wZ5oG4c?0G}q+yFeedh@$W>e>StbMZeh#b zojl9Et(F}zj4n+#y%Svs`SP;$@+T2v{xk~%{@*o<1i1>=tRNKcMu%-%pl3h6JKohq z^gix#+4g>M1K57tNbUvQM!n!VaMRuixdXJ#yLHoxCGTAF?oN2IWb>YP6i8kH`wBcF z=nA50WFwA_JEcHOlZMEWPV3}7rw>*QS_gKGT=-d#y!O440bo^t$%U5=eew#CHcOu{ zWq%D615ZGIBgVEOUJ5^f(Jp2oL>tG`g(iiYS_E-5#5Li^TAku}hRDMe_h)51ow&4S z?pZh^&`HG8S=SpzzV~;&Un_qpLd7zV&ka+eSUQx21f{aF!1Bnj~ljv3<_kLBlE7L zu@AiBBn@L$oL|U5J+kLj3}ejzvs#c>4H_5TmRt?T9g?`a{Wx4996g&?mb~5hZ}AV~ z!=g|R=CQD<43N47*(u!nY`yUgs#r1Cb`m4F#soCp8^ATs)n@y#GT^w18sxqO=b68I z^Y?DE9Mg<=4q~KG{RT42c?|A4kGmCpgWPw{-pB1DlL6KHKZ9ZU_xVQ#^~XT}M;Z7R DtO-f; diff --git a/src/Libraries/Mono/System.Globalization.Extensions.dll b/src/Libraries/Mono/System.Globalization.Extensions.dll deleted file mode 100644 index 8c0861579e934bf6c285d54aea26f14559e2545e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 E0%~bA2LJ#7 diff --git a/src/Libraries/Mono/System.Numerics.Vectors.dll b/src/Libraries/Mono/System.Numerics.Vectors.dll deleted file mode 100755 index 10205772c39d70f6c83a120b012e25c7a206da7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163464 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

RF{eI=gCp`63&yO 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 aok~A<-HE?W^)_`9L%-_>s-#m5X#WSf38Nzb diff --git a/src/Libraries/Mono/System.Runtime.InteropServices.RuntimeInformation.dll b/src/Libraries/Mono/System.Runtime.InteropServices.RuntimeInformation.dll deleted file mode 100644 index e55b5eb23a927d37141e2fdb219f16ddcc51d72a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7168 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 Z{vR&5(D*y?!v&e@e|R_lSN#+%@Nc{TN0k5o diff --git a/src/Libraries/Mono/System.Text.Encoding.CodePages.dll b/src/Libraries/Mono/System.Text.Encoding.CodePages.dll deleted file mode 100644 index 414770bc096f591deb3b2473b719e19d3c9d6cbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 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 diff --git a/src/Libraries/Mono/readme.txt b/src/Libraries/Mono/readme.txt deleted file mode 100644 index f1251a98f..000000000 --- a/src/Libraries/Mono/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -Copied from mono/4.5/Facades of the mono 5.4 release. -These are the mono version of the dotnet Core TypeForwardedTo assemblies. -Using these assemblies is no longer necessary once we reach mono 5.18 as minimum version \ No newline at end of file diff --git a/src/NzbDrone.Api.Test/Radarr.Api.Test.csproj b/src/NzbDrone.Api.Test/Radarr.Api.Test.csproj index 757942be2..54e9639b1 100644 --- a/src/NzbDrone.Api.Test/Radarr.Api.Test.csproj +++ b/src/NzbDrone.Api.Test/Radarr.Api.Test.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Automation.Test/Radarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Radarr.Automation.Test.csproj index c5b2ef926..13b6acb22 100644 --- a/src/NzbDrone.Automation.Test/Radarr.Automation.Test.csproj +++ b/src/NzbDrone.Automation.Test/Radarr.Automation.Test.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Common.Test/Radarr.Common.Test.csproj b/src/NzbDrone.Common.Test/Radarr.Common.Test.csproj index 7b7306832..c2495d284 100644 --- a/src/NzbDrone.Common.Test/Radarr.Common.Test.csproj +++ b/src/NzbDrone.Common.Test/Radarr.Common.Test.csproj @@ -1,13 +1,10 @@ - net5.0;net472 + net5.0 - - - diff --git a/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs b/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs index 03a2b58a2..4439b3bde 100644 --- a/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs +++ b/src/NzbDrone.Common/Composition/ContainerBuilderBase.cs @@ -1,17 +1,14 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Loader; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.Messaging; using TinyIoC; -#if NETCOREAPP -using System.IO; -using System.Runtime.InteropServices; -using System.Runtime.Loader; -#endif - namespace NzbDrone.Common.Composition { public abstract class ContainerBuilderBase @@ -27,12 +24,6 @@ namespace NzbDrone.Common.Composition assemblies.Add(OsInfo.IsWindows ? "Radarr.Windows" : "Radarr.Mono"); assemblies.Add("Radarr.Common"); -#if !NETCOREAPP - foreach (var assembly in assemblies) - { - _loadedTypes.AddRange(Assembly.Load(assembly).GetExportedTypes()); - } -#else var startupPath = AppDomain.CurrentDomain.BaseDirectory; foreach (var assemblyName in assemblies) @@ -44,14 +35,12 @@ namespace NzbDrone.Common.Composition toRegisterResolver.AddRange(assemblies.Intersect(new[] { "Radarr.Core" })); RegisterNativeResolver(toRegisterResolver); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ContainerResolveEventHandler); -#endif Container = new Container(new TinyIoCContainer(), _loadedTypes); AutoRegisterInterfaces(); Container.Register(args); } -#if NETCOREAPP private static Assembly ContainerResolveEventHandler(object sender, ResolveEventArgs args) { var resolver = new AssemblyDependencyResolver(args.RequestingAssembly.Location); @@ -103,7 +92,6 @@ namespace NzbDrone.Common.Composition return NativeLibrary.Load(mappedName, assembly, dllImportSearchPath); } -#endif private void AutoRegisterInterfaces() { diff --git a/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs index 0a0ac17c9..5c28231fe 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/PlatformInfo.cs @@ -26,21 +26,8 @@ namespace NzbDrone.Common.EnvironmentInfo static PlatformInfo() { -#if NETCOREAPP _platform = PlatformType.NetCore; _version = Environment.Version; -#else - if (Type.GetType("Mono.Runtime") != null) - { - _platform = PlatformType.Mono; - _version = GetMonoVersion(); - } - else - { - _platform = PlatformType.DotNet; - _version = GetDotNetVersion(); - } -#endif } public static PlatformType Platform => _platform; diff --git a/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs b/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs index 5be00f9f3..a75c3c676 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/RuntimeInfo.cs @@ -23,7 +23,6 @@ namespace NzbDrone.Common.EnvironmentInfo serviceProvider.ServiceExist(ServiceProvider.SERVICE_NAME) && serviceProvider.GetStatus(ServiceProvider.SERVICE_NAME) == ServiceControllerStatus.StartPending; -#if NETCOREAPP // net5.0 will return Radarr.dll for entry assembly, we need the actual // executable name (Radarr on linux). On mono this will return the location of // the mono executable itself, which is not what we want. @@ -34,12 +33,6 @@ namespace NzbDrone.Common.EnvironmentInfo ExecutingApplication = entry.FileName; IsWindowsTray = OsInfo.IsWindows && entry.ModuleName == $"{ProcessProvider.RADARR_PROCESS_NAME}.exe"; } -#else - // On mono we need to get the location of the Radarr assembly, not Mono. - // Can't be running tray app in mono. - ExecutingApplication = Assembly.GetEntryAssembly()?.Location; -#endif - } static RuntimeInfo() diff --git a/src/NzbDrone.Common/Expansive/CircularReferenceException.cs b/src/NzbDrone.Common/Expansive/CircularReferenceException.cs deleted file mode 100644 index 737663c54..000000000 --- a/src/NzbDrone.Common/Expansive/CircularReferenceException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace NzbDrone.Common.Expansive -{ - public class CircularReferenceException : Exception - { - public CircularReferenceException(string message) - : base(message) - { - } - } -} diff --git a/src/NzbDrone.Common/Expansive/Expansive.cs b/src/NzbDrone.Common/Expansive/Expansive.cs deleted file mode 100644 index f6a2ff3c5..000000000 --- a/src/NzbDrone.Common/Expansive/Expansive.cs +++ /dev/null @@ -1,213 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Dynamic; -using System.Linq; -using System.Text.RegularExpressions; - -namespace NzbDrone.Common.Expansive -{ - public static class Expansive - { - private static PatternStyle _patternStyle; - - public static bool RequireAllExpansions { get; set; } - - public static Func DefaultExpansionFactory { get; set; } - - static Expansive() - { - Initialize(); - } - - public static string Expand(this string source) - { - return source.Expand(DefaultExpansionFactory); - } - - public static string Expand(this string source, params string[] args) - { - var output = source; - var tokens = new List(); - var pattern = new Regex(_patternStyle.TokenMatchPattern, RegexOptions.IgnoreCase); - var calls = new Stack(); - string callingToken = null; - - while (pattern.IsMatch(output)) - { - foreach (Match match in pattern.Matches(output)) - { - var token = _patternStyle.TokenReplaceFilter(match.Value); - var tokenIndex = 0; - if (!tokens.Contains(token)) - { - tokens.Add(token); - tokenIndex = tokens.Count - 1; - } - else - { - tokenIndex = tokens.IndexOf(token); - } - - output = Regex.Replace(output, _patternStyle.OutputFilter(match.Value), "{" + tokenIndex + "}"); - } - } - - var newArgs = new List(); - foreach (var arg in args) - { - var newArg = arg; - var tokenPattern = new Regex(_patternStyle.TokenFilter(string.Join("|", tokens))); - while (tokenPattern.IsMatch(newArg)) - { - foreach (Match match in tokenPattern.Matches(newArg)) - { - var token = _patternStyle.TokenReplaceFilter(match.Value); - if (calls.Contains(string.Format("{0}:{1}", callingToken, token))) - { - throw new CircularReferenceException(string.Format("Circular Reference Detected for token '{0}'.", callingToken)); - } - - calls.Push(string.Format("{0}:{1}", callingToken, token)); - callingToken = token; - newArg = Regex.Replace(newArg, _patternStyle.OutputFilter(match.Value), args[tokens.IndexOf(token)]); - } - } - - newArgs.Add(newArg); - } - - return string.Format(output, newArgs.ToArray()); - } - - public static string Expand(this string source, Func expansionFactory) - { - return source.ExpandInternal(expansionFactory); - } - - public static string Expand(this string source, object model) - { - return source.ExpandInternal( - name => - { - IDictionary modelDict = model.ToDictionary(); - if (RequireAllExpansions && !modelDict.ContainsKey(name)) - { - return ""; - } - - if (modelDict[name] == null) - { - return ""; - } - - return modelDict[name].ToString(); - }); - } - - private static void Initialize() - { - _patternStyle = new PatternStyle - { - TokenMatchPattern = @"\{[a-zA-Z]\w*\}", - TokenReplaceFilter = token => token.Replace("{", "").Replace("}", ""), - OutputFilter = output => (output.StartsWith("{") && output.EndsWith("}") ? output : @"\{" + output + @"\}"), - TokenFilter = tokens => "{(" + tokens + ")}" - }; - } - - private static string ExpandInternal(this string source, Func expansionFactory) - { - if (expansionFactory == null) - { - throw new ApplicationException("ExpansionFactory not defined.\nDefine a DefaultExpansionFactory or call Expand(source, Func expansionFactory))"); - } - - var pattern = new Regex(_patternStyle.TokenMatchPattern, RegexOptions.IgnoreCase); - - var callTreeParent = new Tree("root").Root; - - return source.Explode(pattern, _patternStyle, expansionFactory, callTreeParent); - } - - private static string Explode(this string source, Regex pattern, PatternStyle patternStyle, Func expansionFactory, TreeNode parent) - { - var output = source; - while (output.HasChildren(pattern)) - { - foreach (Match match in pattern.Matches(source)) - { - var child = match.Value; - var token = patternStyle.TokenReplaceFilter(match.Value); - - var thisNode = parent.Children.Add(token); - - // if we have already encountered this token in this call tree, we have a circular reference - if (thisNode.CallTree.Contains(token)) - { - throw new CircularReferenceException(string.Format("Circular Reference Detected for token '{0}'. Call Tree: {1}->{2}", - token, - string.Join("->", thisNode.CallTree.ToArray().Reverse()), - token)); - } - - // expand this match - var expandedValue = expansionFactory(token); - - // Replace the match with the expanded value - child = Regex.Replace(child, patternStyle.OutputFilter(match.Value), expandedValue); - - // Recursively expand the child until we no longer encounter nested tokens (or hit a circular reference) - child = child.Explode(pattern, patternStyle, expansionFactory, thisNode); - - // finally, replace the match in the output with the fully-expanded value - output = Regex.Replace(output, patternStyle.OutputFilter(match.Value), child); - } - } - - return output; - } - - private static bool HasChildren(this string token, Regex pattern) - { - return pattern.IsMatch(token); - } - - ///

- /// Turns the object into an ExpandoObject - /// - private static dynamic ToExpando(this object o) - { - var result = new ExpandoObject(); - var d = result as IDictionary; //work with the Expando as a Dictionary - if (o is ExpandoObject) - { - return o; //shouldn't have to... but just in case - } - - if (o is NameValueCollection || o.GetType().IsSubclassOf(typeof(NameValueCollection))) - { - var nv = (NameValueCollection)o; - nv.Cast().Select(key => new KeyValuePair(key, nv[key])).ToList().ForEach(i => d.Add(i)); - } - else - { - var props = o.GetType().GetProperties(); - foreach (var item in props) - { - d.Add(item.Name, item.GetValue(o, null)); - } - } - - return result; - } - - /// - /// Turns the object into a Dictionary - /// - private static IDictionary ToDictionary(this object thingy) - { - return (IDictionary)thingy.ToExpando(); - } - } -} diff --git a/src/NzbDrone.Common/Expansive/PatternStyle.cs b/src/NzbDrone.Common/Expansive/PatternStyle.cs deleted file mode 100644 index 011e77315..000000000 --- a/src/NzbDrone.Common/Expansive/PatternStyle.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace NzbDrone.Common.Expansive -{ - internal class PatternStyle - { - public string TokenMatchPattern { get; set; } - public Func TokenFilter { get; set; } - public Func TokenReplaceFilter { get; set; } - public Func OutputFilter { get; set; } - } -} diff --git a/src/NzbDrone.Common/Expansive/Tree.cs b/src/NzbDrone.Common/Expansive/Tree.cs deleted file mode 100644 index 744c0714e..000000000 --- a/src/NzbDrone.Common/Expansive/Tree.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NzbDrone.Common.Expansive -{ - internal class Tree : TreeNode - { - public Tree(T rootValue) - : base(rootValue) - { - Value = rootValue; - } - } -} diff --git a/src/NzbDrone.Common/Expansive/TreeNode.cs b/src/NzbDrone.Common/Expansive/TreeNode.cs deleted file mode 100644 index 4a61fa08e..000000000 --- a/src/NzbDrone.Common/Expansive/TreeNode.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; - -namespace NzbDrone.Common.Expansive -{ - internal class TreeNode - { - private List _CallTree; - private TreeNode _Parent; - - public TreeNode(T value) - { - Value = value; - Parent = null; - Children = new TreeNodeList(this); - _CallTree = new List(); - } - - public TreeNode(T value, TreeNode parent) - { - Value = value; - Parent = parent; - Children = new TreeNodeList(this); - _CallTree = new List(); - } - - public TreeNode Parent - { - get - { - return _Parent; - } - - set - { - if (value == _Parent) - { - return; - } - - if (_Parent != null) - { - _Parent.Children.Remove(this); - } - - if (value != null && !value.Children.Contains(this)) - { - value.Children.Add(this); - } - - _Parent = value; - } - } - - public TreeNode Root - { - get - { - //return (Parent == null) ? this : Parent.Root; - TreeNode node = this; - while (node.Parent != null) - { - node = node.Parent; - } - - return node; - } - } - - public TreeNodeList Children { get; private set; } - - public List CallTree - { - get - { - _CallTree = new List(); - TreeNode node = this; - while (node.Parent != null) - { - node = node.Parent; - _CallTree.Add(node.Value); - } - - return _CallTree; - } - private set => _CallTree = value; - } - - public T Value { get; set; } - } -} diff --git a/src/NzbDrone.Common/Expansive/TreeNodeList.cs b/src/NzbDrone.Common/Expansive/TreeNodeList.cs deleted file mode 100644 index a239a3b15..000000000 --- a/src/NzbDrone.Common/Expansive/TreeNodeList.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; - -namespace NzbDrone.Common.Expansive -{ - internal class TreeNodeList : List> - { - public TreeNode Parent; - - public TreeNodeList(TreeNode parent) - { - Parent = parent; - } - - public new TreeNode Add(TreeNode node) - { - base.Add(node); - node.Parent = Parent; - return node; - } - - public TreeNode Add(T value) - { - return Add(new TreeNode(value)); - } - - public override string ToString() - { - return "Count=" + Count.ToString(); - } - } -} diff --git a/src/NzbDrone.Common/Expansive/license.txt b/src/NzbDrone.Common/Expansive/license.txt deleted file mode 100644 index b48f7ea2f..000000000 --- a/src/NzbDrone.Common/Expansive/license.txt +++ /dev/null @@ -1,2 +0,0 @@ -Source: https://github.com/anderly/Expansive -Microsoft Public License (MS-PL): http://opensource.org/licenses/MS-PL \ No newline at end of file diff --git a/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs b/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs index aa29245e3..7f0fe06ce 100644 --- a/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs +++ b/src/NzbDrone.Common/Extensions/DictionaryExtensions.cs @@ -6,14 +6,6 @@ namespace NzbDrone.Common.Extensions { public static class DictionaryExtensions { -#if !NETCOREAPP - public static TValue GetValueOrDefault(this IReadOnlyDictionary dictionary, TKey key, TValue defaultValue = default(TValue)) - { - TValue value; - return dictionary.TryGetValue(key, out value) ? value : defaultValue; - } -#endif - public static Dictionary Merge(this Dictionary first, Dictionary second) { if (first == null) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index 356d684b9..61d024e93 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -33,19 +33,10 @@ namespace NzbDrone.Common.Http.Dispatchers { var webRequest = (HttpWebRequest)WebRequest.Create((Uri)request.Url); - if (PlatformInfo.IsMono) - { - // On Mono GZipStream/DeflateStream leaks memory if an exception is thrown, use an intermediate buffer in that case. - webRequest.AutomaticDecompression = DecompressionMethods.None; - webRequest.Headers.Add("Accept-Encoding", "gzip"); - } - else - { - // Deflate is not a standard and could break depending on implementation. - // we should just stick with the more compatible Gzip - //http://stackoverflow.com/questions/8490718/how-to-decompress-stream-deflated-with-java-util-zip-deflater-in-net - webRequest.AutomaticDecompression = DecompressionMethods.GZip; - } + // Deflate is not a standard and could break depending on implementation. + // we should just stick with the more compatible Gzip + //http://stackoverflow.com/questions/8490718/how-to-decompress-stream-deflated-with-java-util-zip-deflater-in-net + webRequest.AutomaticDecompression = DecompressionMethods.GZip; webRequest.Method = request.Method.ToString(); webRequest.UserAgent = _userAgentBuilder.GetUserAgent(request.UseSimplifiedUserAgent); @@ -86,9 +77,6 @@ namespace NzbDrone.Common.Http.Dispatchers if (httpWebResponse == null) { - // Workaround for mono not closing connections properly in certain situations. - AbortWebRequest(webRequest); - // The default messages for WebException on mono are pretty horrible. if (e.Status == WebExceptionStatus.NameResolutionFailure) { @@ -122,19 +110,6 @@ namespace NzbDrone.Common.Http.Dispatchers try { data = responseStream.ToBytes(); - - if (PlatformInfo.IsMono && httpWebResponse.ContentEncoding == "gzip") - { - using (var compressedStream = new MemoryStream(data)) - using (var gzip = new GZipStream(compressedStream, CompressionMode.Decompress)) - using (var decompressedStream = new MemoryStream()) - { - gzip.CopyTo(decompressedStream); - data = decompressedStream.ToArray(); - } - - httpWebResponse.Headers.Remove("Content-Encoding"); - } } catch (Exception ex) { @@ -244,36 +219,5 @@ namespace NzbDrone.Common.Http.Dispatchers } } } - - // Workaround for mono not closing connections properly on timeouts - private void AbortWebRequest(HttpWebRequest webRequest) - { - // First affected version was mono 5.16 - if (OsInfo.IsNotWindows && _platformInfo.Version >= new Version(5, 16)) - { - try - { - var currentOperationInfo = webRequest.GetType().GetField("currentOperation", BindingFlags.NonPublic | BindingFlags.Instance); - var currentOperation = currentOperationInfo.GetValue(webRequest); - - if (currentOperation != null) - { - var responseStreamInfo = currentOperation.GetType().GetField("responseStream", BindingFlags.NonPublic | BindingFlags.Instance); - var responseStream = responseStreamInfo.GetValue(currentOperation) as Stream; - - // Note that responseStream will likely be null once mono fixes it. - responseStream?.Dispose(); - } - } - catch (Exception ex) - { - // This can fail randomly on future mono versions that have been changed/fixed. Log to sentry and ignore. - _logger.Trace() - .Exception(ex) - .Message("Unable to dispose responseStream on mono {0}", _platformInfo.Version) - .Write(); - } - } - } } } diff --git a/src/NzbDrone.Common/Http/HttpAccept.cs b/src/NzbDrone.Common/Http/HttpAccept.cs index fc0eab894..21367b3a6 100644 --- a/src/NzbDrone.Common/Http/HttpAccept.cs +++ b/src/NzbDrone.Common/Http/HttpAccept.cs @@ -4,11 +4,7 @@ { public static readonly HttpAccept Rss = new HttpAccept("application/rss+xml, text/rss+xml, application/xml, text/xml"); public static readonly HttpAccept Json = new HttpAccept("application/json"); -#if NETCOREAPP public static readonly HttpAccept JsonCharset = new HttpAccept("application/json; charset=utf-8"); -#else - public static readonly HttpAccept JsonCharset = new HttpAccept("application/json;charset=utf-8"); -#endif public static readonly HttpAccept Html = new HttpAccept("text/html"); public string Value { get; private set; } diff --git a/src/NzbDrone.Common/Http/NzbDroneWebClient.cs b/src/NzbDrone.Common/Http/NzbDroneWebClient.cs deleted file mode 100644 index ccd369bb7..000000000 --- a/src/NzbDrone.Common/Http/NzbDroneWebClient.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Net; - -namespace NzbDrone.Common.Http -{ - public class NzbDroneWebClient : WebClient - { - protected override WebRequest GetWebRequest(Uri address) - { - var request = base.GetWebRequest(address); - if (request is HttpWebRequest) - { - ((HttpWebRequest)request).KeepAlive = false; - ((HttpWebRequest)request).ServicePoint.Expect100Continue = false; - } - - return request; - } - } -} diff --git a/src/NzbDrone.Common/Processes/ProcessProvider.cs b/src/NzbDrone.Common/Processes/ProcessProvider.cs index 368d01662..f2318e4e8 100644 --- a/src/NzbDrone.Common/Processes/ProcessProvider.cs +++ b/src/NzbDrone.Common/Processes/ProcessProvider.cs @@ -44,11 +44,7 @@ namespace NzbDrone.Common.Processes public static int GetCurrentProcessId() { -#if NETCOREAPP return Environment.ProcessId; -#else - return Process.GetCurrentProcess().Id; -#endif } public ProcessInfo GetCurrentProcess() diff --git a/src/NzbDrone.Common/Radarr.Common.csproj b/src/NzbDrone.Common/Radarr.Common.csproj index f44233c6c..9c07a241b 100644 --- a/src/NzbDrone.Common/Radarr.Common.csproj +++ b/src/NzbDrone.Common/Radarr.Common.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 ISMUSL @@ -12,17 +12,12 @@ - - - - - True diff --git a/src/NzbDrone.Console/Radarr.Console.csproj b/src/NzbDrone.Console/Radarr.Console.csproj index bc5851b45..bac151faa 100644 --- a/src/NzbDrone.Console/Radarr.Console.csproj +++ b/src/NzbDrone.Console/Radarr.Console.csproj @@ -1,7 +1,7 @@ Exe - net5.0;net472 + net5.0 ..\NzbDrone.Host\Radarr.ico app.manifest diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs deleted file mode 100644 index 765dc95b8..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoDebugFixture.cs +++ /dev/null @@ -1,63 +0,0 @@ -using NUnit.Framework; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Test.Framework; -using NzbDrone.Test.Common; -using static NzbDrone.Core.HealthCheck.Checks.MonoDebugCheck; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class MonoDebugFixture : CoreTest - { - private void GivenHasStackFrame(bool hasStackFrame) - { - Mocker.GetMock() - .Setup(f => f.HasStackFrameInfo()) - .Returns(hasStackFrame); - } - - [Test] - public void should_return_ok_if_not_mono() - { - if (PlatformInfo.IsMono) - { - throw new IgnoreException("non mono specific test"); - } - - Subject.Check().ShouldBeOk(); - } - - [Test] - public void should_return_ok_if_not_debug() - { - MonoOnly(); - - GivenHasStackFrame(false); - - Subject.Check().ShouldBeOk(); - } - - [Test] - public void should_log_warning_if_not_debug() - { - MonoOnly(); - - GivenHasStackFrame(false); - - Subject.Check(); - - ExceptionVerification.ExpectedWarns(1); - } - - [Test] - public void should_return_ok_if_debug() - { - MonoOnly(); - - GivenHasStackFrame(true); - - Subject.Check().ShouldBeOk(); - } - } -} diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoNotNetCoreCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoNotNetCoreCheckFixture.cs deleted file mode 100644 index ee2b47ad6..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoNotNetCoreCheckFixture.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Collections.Generic; -using Moq; -using NUnit.Framework; -using NzbDrone.Common.Processes; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Localization; -using NzbDrone.Core.Test.Framework; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class MonoNotNetCoreCheckFixture : CoreTest - { - [SetUp] - public void setup() - { - Mocker.GetMock() - .Setup(s => s.GetLocalizedString(It.IsAny())) - .Returns("Some Warning Message"); - } - - [Test] - [Platform(Exclude = "Mono")] - public void should_return_ok_if_net_core() - { - Subject.Check().ShouldBeOk(); - } - - [Test] - [Platform("Mono")] - public void should_log_error_if_mono() - { - Subject.Check().ShouldBeError(); - } - - [Test] - [Platform("Mono")] - public void should_return_error_if_otherbsd() - { - Mocker.GetMock() - .Setup(x => x.StartAndCapture("uname", null, null)) - .Returns(new ProcessOutput - { - Lines = new List - { - new ProcessOutputLine(ProcessOutputLevel.Standard, "OpenBSD") - } - }); - Subject.Check().ShouldBeError(); - } - - [Test] - [Platform("Mono")] - public void should_log_error_if_freebsd() - { - Mocker.GetMock() - .Setup(x => x.StartAndCapture("uname", null, null)) - .Returns(new ProcessOutput - { - Lines = new List - { - new ProcessOutputLine(ProcessOutputLevel.Standard, "FreeBSD") - } - }); - Subject.Check().ShouldBeError(); - } - } -} diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs deleted file mode 100644 index 4be2bdeb0..000000000 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/MonoVersionCheckFixture.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using Moq; -using NUnit.Framework; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Core.HealthCheck.Checks; -using NzbDrone.Core.Localization; -using NzbDrone.Core.Test.Framework; - -namespace NzbDrone.Core.Test.HealthCheck.Checks -{ - [TestFixture] - public class MonoVersionCheckFixture : CoreTest - { - [SetUp] - public void Setup() - { - Mocker.GetMock() - .Setup(s => s.GetLocalizedString(It.IsAny())) - .Returns("Some Warning Message"); - } - - private void GivenOutput(string version) - { - MonoOnly(); - - Mocker.GetMock() - .SetupGet(s => s.Version) - .Returns(new Version(version)); - } - - [TestCase("5.20")] - [TestCase("6.4")] - [TestCase("6.12")] - public void should_return_ok(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeOk(); - } - - public void should_return_notice(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeNotice(); - } - - public void should_return_warning(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeWarning(); - } - - [TestCase("2.10.2")] - [TestCase("2.10.8.1")] - [TestCase("3.0.0.1")] - [TestCase("3.2.0.1")] - [TestCase("3.2.1")] - [TestCase("3.2.7")] - [TestCase("3.6.1")] - [TestCase("3.8")] - [TestCase("3.10")] - [TestCase("4.0.0.0")] - [TestCase("4.2")] - [TestCase("4.4.0")] - [TestCase("4.4.1")] - [TestCase("5.4")] - [TestCase("5.8")] - [TestCase("5.10")] - [TestCase("5.12")] - [TestCase("5.14")] - [TestCase("5.16")] - [TestCase("5.18")] - public void should_return_error(string version) - { - GivenOutput(version); - - Subject.Check().ShouldBeError(); - } - } -} diff --git a/src/NzbDrone.Core.Test/Radarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Radarr.Core.Test.csproj index 099b952fc..3c48b9f50 100644 --- a/src/NzbDrone.Core.Test/Radarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Radarr.Core.Test.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs deleted file mode 100644 index bb0a96c70..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoDebugCheck.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Diagnostics; -using NLog; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Extensions; -using NzbDrone.Core.Localization; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoDebugCheck : HealthCheckBase - { - private readonly Logger _logger; - private readonly StackFrameHelper _stackFrameHelper; - - public override bool CheckOnSchedule => false; - - public MonoDebugCheck(Logger logger, StackFrameHelper stackFrameHelper, ILocalizationService localizationService) - : base(localizationService) - { - _logger = logger; - _stackFrameHelper = stackFrameHelper; - } - - public class StackFrameHelper - { - public virtual bool HasStackFrameInfo() - { - var stackTrace = new StackTrace(true); - - return stackTrace.FrameCount > 0 && stackTrace.GetFrame(0).GetFileName().IsNotNullOrWhiteSpace(); - } - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - if (!_stackFrameHelper.HasStackFrameInfo()) - { - _logger.Warn("Mono is not running with --debug switch"); - return new HealthCheck(GetType()); - } - - return new HealthCheck(GetType()); - } - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoNotNetCoreCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoNotNetCoreCheck.cs deleted file mode 100644 index 8e828550b..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoNotNetCoreCheck.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Linq; -using System.Runtime.InteropServices; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Processes; -using NzbDrone.Core.Localization; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoNotNetCoreCheck : HealthCheckBase - { - private static string[] MonoUnames = new string[] { "OpenBSD", "MidnightBSD", "NetBSD" }; - private readonly IProcessProvider _processProvider; - - public MonoNotNetCoreCheck(IProcessProvider processProvider, - ILocalizationService localizationService) - : base(localizationService) - { - _processProvider = processProvider; - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - // Don't warn on linux x86 - we don't build x86 net core - if (OsInfo.IsLinux && RuntimeInformation.ProcessArchitecture == Architecture.X86) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("Monox86SupportCheckMessage"), "#mono-support-end-of-life"); - } - - // Check for BSD - var output = _processProvider.StartAndCapture("uname"); - if (output?.ExitCode == 0 && MonoUnames.Contains(output?.Lines.First().Content)) - { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("MonoBSDSupportCheckMessage"), OsInfo.Os), "#mono-support-end-of-life"); - } - - return new HealthCheck(GetType(), - HealthCheckResult.Error, - _localizationService.GetLocalizedString("MonoNotNetCoreCheckMessage"), - "#update-to-net-core-version"); - } - - public override bool CheckOnSchedule => false; - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs deleted file mode 100644 index c434500be..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoTlsCheck.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using NLog; -using NLog.Fluent; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Common.Instrumentation.Extensions; -using NzbDrone.Core.Localization; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoTlsCheck : HealthCheckBase - { - private readonly IPlatformInfo _platformInfo; - private readonly Logger _logger; - - public MonoTlsCheck(IPlatformInfo platformInfo, ILocalizationService localizationService, Logger logger) - : base(localizationService) - { - _platformInfo = platformInfo; - _logger = logger; - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - var monoVersion = _platformInfo.Version; - - if (monoVersion >= new Version("5.8.0") && Environment.GetEnvironmentVariable("MONO_TLS_PROVIDER") == "legacy") - { - _logger.Debug() - .Message("Mono version {0} and legacy TLS provider is selected, recommending user to switch to btls.", monoVersion) - .WriteSentryDebug("LegacyTlsProvider", monoVersion.ToString()) - .Write(); - - return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("MonoTlsCheckMessage"), "#mono-tls-legacy"); - } - - return new HealthCheck(GetType()); - } - - public override bool CheckOnSchedule => false; - } -} diff --git a/src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs deleted file mode 100644 index ed5a48735..000000000 --- a/src/NzbDrone.Core/HealthCheck/Checks/MonoVersionCheck.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using NLog; -using NzbDrone.Common.EnvironmentInfo; -using NzbDrone.Core.Localization; - -namespace NzbDrone.Core.HealthCheck.Checks -{ - public class MonoVersionCheck : HealthCheckBase - { - private readonly IPlatformInfo _platformInfo; - private readonly Logger _logger; - - public MonoVersionCheck(IPlatformInfo platformInfo, ILocalizationService localizationService, Logger logger) - : base(localizationService) - { - _platformInfo = platformInfo; - _logger = logger; - } - - public override HealthCheck Check() - { - if (!PlatformInfo.IsMono) - { - return new HealthCheck(GetType()); - } - - var monoVersion = _platformInfo.Version; - - // Currently best stable Mono version (5.18 gets us .net 4.7.2 support) - var bestVersion = new Version("5.20"); - var targetVersion = new Version("5.20"); - if (monoVersion >= targetVersion) - { - _logger.Debug("Mono version is {0} or better: {1}", targetVersion, monoVersion); - return new HealthCheck(GetType()); - } - - // Stable Mono versions - var stableVersion = new Version("5.20"); - if (monoVersion >= stableVersion) - { - _logger.Debug("Mono version is {0} or better: {1}", stableVersion, monoVersion); - return new HealthCheck(GetType(), - HealthCheckResult.Notice, - string.Format(_localizationService.GetLocalizedString("MonoVersionCheckUpgradeRecommendedMessage"), monoVersion, bestVersion), - "#currently-installed-mono-version-is-supported-but-upgrading-is-recommended"); - } - - var oldVersion = new Version("5.20"); - if (monoVersion >= oldVersion) - { - return new HealthCheck(GetType(), - HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("MonoVersionCheckUpgradeRecommendedMessage"), monoVersion, bestVersion), - "#currently-installed-mono-version-is-old-and-unsupported"); - } - - return new HealthCheck(GetType(), - HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("MonoVersionCheckUpgradeRecommendedMessage"), monoVersion, bestVersion), - "#currently-installed-mono-version-is-old-and-unsupported"); - } - - public override bool CheckOnSchedule => false; - } -} diff --git a/src/NzbDrone.Core/Radarr.Core.csproj b/src/NzbDrone.Core/Radarr.Core.csproj index ef57d407c..b473e876d 100644 --- a/src/NzbDrone.Core/Radarr.Core.csproj +++ b/src/NzbDrone.Core/Radarr.Core.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 @@ -22,10 +22,6 @@ - - - - Resources\Logo\64.png diff --git a/src/NzbDrone.Host.Test/Radarr.Host.Test.csproj b/src/NzbDrone.Host.Test/Radarr.Host.Test.csproj index 1fd96fbea..1268019ce 100644 --- a/src/NzbDrone.Host.Test/Radarr.Host.Test.csproj +++ b/src/NzbDrone.Host.Test/Radarr.Host.Test.csproj @@ -1,12 +1,9 @@ - net5.0;net472 + net5.0 - - - diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index 15819568c..68b11c351 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -24,11 +24,7 @@ namespace Radarr.Host try { Logger.Info("Starting Radarr - {0} - Version {1}", -#if NETCOREAPP Process.GetCurrentProcess().MainModule.FileName, -#else - Assembly.GetCallingAssembly().Location, -#endif Assembly.GetExecutingAssembly().GetName().Version); if (!PlatformValidation.IsValidate(userAlert)) diff --git a/src/NzbDrone.Host/Radarr.Host.csproj b/src/NzbDrone.Host/Radarr.Host.csproj index df72a9e5c..d23c5e66f 100644 --- a/src/NzbDrone.Host/Radarr.Host.csproj +++ b/src/NzbDrone.Host/Radarr.Host.csproj @@ -1,18 +1,10 @@  - net5.0;net472 + net5.0 Library - - - - - - - - - + @@ -29,7 +21,4 @@ True - - - diff --git a/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs b/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs index 01de0cb6d..f30acb125 100644 --- a/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs +++ b/src/NzbDrone.Host/WebHost/Middleware/SignalRMiddleware.cs @@ -57,17 +57,10 @@ namespace Radarr.Host.Middleware } }); -#if NETCOREAPP appBuilder.UseEndpoints(x => { x.MapHub(URL_BASE + "/signalr/messages"); }); -#else - appBuilder.UseSignalR(x => - { - x.MapHub("/signalr/messages"); - }); -#endif // This is a side effect of haing multiple IoC containers, TinyIoC and whatever // Kestrel/SignalR is using. Ideally we'd have one IoC container, but that's non-trivial with TinyIoC diff --git a/src/NzbDrone.Host/WebHost/WebHostController.cs b/src/NzbDrone.Host/WebHost/WebHostController.cs index 440f938cb..1cc790ef2 100644 --- a/src/NzbDrone.Host/WebHost/WebHostController.cs +++ b/src/NzbDrone.Host/WebHost/WebHostController.cs @@ -108,24 +108,14 @@ namespace Radarr.Host { services .AddSignalR() -#if !NETCOREAPP - .AddJsonProtocol(options => - { - options.PayloadSerializerSettings = Json.GetSerializerSettings(); - }); -#else .AddJsonProtocol(options => { options.PayloadSerializerOptions = STJson.GetSerializerSettings(); }); -#endif - }) .Configure(app => { -#if NETCOREAPP app.UseRouting(); -#endif app.Properties["host.AppName"] = BuildInfo.AppName; app.UsePathBase(_configFileProvider.UrlBase); diff --git a/src/NzbDrone.Integration.Test/Radarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Radarr.Integration.Test.csproj index d1f8a10db..3a50f7ee1 100644 --- a/src/NzbDrone.Integration.Test/Radarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Radarr.Integration.Test.csproj @@ -1,12 +1,9 @@  - net5.0;net472 + net5.0 Library - - - - + diff --git a/src/NzbDrone.Libraries.Test/Radarr.Libraries.Test.csproj b/src/NzbDrone.Libraries.Test/Radarr.Libraries.Test.csproj index 3a19e7f7a..d9c4c6ebd 100644 --- a/src/NzbDrone.Libraries.Test/Radarr.Libraries.Test.csproj +++ b/src/NzbDrone.Libraries.Test/Radarr.Libraries.Test.csproj @@ -1,6 +1,6 @@ - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj b/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj index f8d111e77..e7ce864c4 100644 --- a/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj +++ b/src/NzbDrone.Mono.Test/Radarr.Mono.Test.csproj @@ -1,15 +1,12 @@ - net5.0;net472 + net5.0 - - - - + diff --git a/src/NzbDrone.Mono/Radarr.Mono.csproj b/src/NzbDrone.Mono/Radarr.Mono.csproj index b111ef023..6ad39c7fa 100644 --- a/src/NzbDrone.Mono/Radarr.Mono.csproj +++ b/src/NzbDrone.Mono/Radarr.Mono.csproj @@ -1,15 +1,12 @@  - net5.0;net472 + net5.0 - - - - + diff --git a/src/NzbDrone.SignalR/Radarr.SignalR.csproj b/src/NzbDrone.SignalR/Radarr.SignalR.csproj index 34b8f5cbd..25ae75c8c 100644 --- a/src/NzbDrone.SignalR/Radarr.SignalR.csproj +++ b/src/NzbDrone.SignalR/Radarr.SignalR.csproj @@ -1,12 +1,8 @@  - net5.0;net472 + net5.0 Library - - - - diff --git a/src/NzbDrone.SignalR/SignalRMessage.cs b/src/NzbDrone.SignalR/SignalRMessage.cs index 81a0a2b2c..4b468477c 100644 --- a/src/NzbDrone.SignalR/SignalRMessage.cs +++ b/src/NzbDrone.SignalR/SignalRMessage.cs @@ -7,11 +7,7 @@ namespace NzbDrone.SignalR public object Body { get; set; } public string Name { get; set; } -#if !NETCOREAPP - [Newtonsoft.Json.JsonIgnore] -#else [System.Text.Json.Serialization.JsonIgnore] -#endif public ModelAction Action { get; set; } } } diff --git a/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs b/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs index 04abf96e9..ecd01a814 100644 --- a/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs +++ b/src/NzbDrone.Test.Common/AutoMoq/AutoMoqer.cs @@ -152,9 +152,7 @@ namespace NzbDrone.Test.Common.AutoMoq _registeredMocks = new Dictionary(); AddTheAutoMockingContainerExtensionToTheContainer(container); -#if NETCOREAPP ContainerBuilderBase.RegisterNativeResolver(new[] { "System.Data.SQLite", "Radarr.Core" }); -#endif } private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container) diff --git a/src/NzbDrone.Test.Common/NzbDroneRunner.cs b/src/NzbDrone.Test.Common/NzbDroneRunner.cs index 5ad478f40..bf819bee5 100644 --- a/src/NzbDrone.Test.Common/NzbDroneRunner.cs +++ b/src/NzbDrone.Test.Common/NzbDroneRunner.cs @@ -55,8 +55,7 @@ namespace NzbDrone.Test.Common if (BuildInfo.IsDebug) { - var frameworkFolder = PlatformInfo.IsNetCore ? "net5.0" : "net472"; - Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", frameworkFolder, consoleExe)); + Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", "net5.0", consoleExe)); } else { diff --git a/src/NzbDrone.Test.Common/Radarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Radarr.Test.Common.csproj index 97886ca09..ca78ac8b9 100644 --- a/src/NzbDrone.Test.Common/Radarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Radarr.Test.Common.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Test.Dummy/Radarr.Test.Dummy.csproj b/src/NzbDrone.Test.Dummy/Radarr.Test.Dummy.csproj index 0340998df..244fa2aeb 100644 --- a/src/NzbDrone.Test.Dummy/Radarr.Test.Dummy.csproj +++ b/src/NzbDrone.Test.Dummy/Radarr.Test.Dummy.csproj @@ -1,6 +1,6 @@ Exe - net5.0;net472 + net5.0 \ No newline at end of file diff --git a/src/NzbDrone.Update.Test/Radarr.Update.Test.csproj b/src/NzbDrone.Update.Test/Radarr.Update.Test.csproj index 99f1a29d3..69454879d 100644 --- a/src/NzbDrone.Update.Test/Radarr.Update.Test.csproj +++ b/src/NzbDrone.Update.Test/Radarr.Update.Test.csproj @@ -1,6 +1,6 @@ - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Update/Radarr.Update.csproj b/src/NzbDrone.Update/Radarr.Update.csproj index 3b817ef5e..0cf9cb995 100644 --- a/src/NzbDrone.Update/Radarr.Update.csproj +++ b/src/NzbDrone.Update/Radarr.Update.csproj @@ -1,7 +1,7 @@  WinExe - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Windows.Test/Radarr.Windows.Test.csproj b/src/NzbDrone.Windows.Test/Radarr.Windows.Test.csproj index 533eaae66..a0df33019 100644 --- a/src/NzbDrone.Windows.Test/Radarr.Windows.Test.csproj +++ b/src/NzbDrone.Windows.Test/Radarr.Windows.Test.csproj @@ -1,6 +1,6 @@ - net5.0;net472 + net5.0 diff --git a/src/NzbDrone.Windows/Radarr.Windows.csproj b/src/NzbDrone.Windows/Radarr.Windows.csproj index d5a90c741..d73de3665 100644 --- a/src/NzbDrone.Windows/Radarr.Windows.csproj +++ b/src/NzbDrone.Windows/Radarr.Windows.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/NzbDrone/Radarr.csproj b/src/NzbDrone/Radarr.csproj index c0e805297..f9c70c64d 100644 --- a/src/NzbDrone/Radarr.csproj +++ b/src/NzbDrone/Radarr.csproj @@ -1,7 +1,7 @@  WinExe - net5.0-windows;net472 + net5.0-windows win-x64;win-x86 true ..\NzbDrone.Host\Radarr.ico @@ -14,9 +14,6 @@ - - - True diff --git a/src/Radarr.Api.V3/Radarr.Api.V3.csproj b/src/Radarr.Api.V3/Radarr.Api.V3.csproj index f711b51f7..e3ac7c1d2 100644 --- a/src/Radarr.Api.V3/Radarr.Api.V3.csproj +++ b/src/Radarr.Api.V3/Radarr.Api.V3.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/Radarr.Http/Mapping/MappingValidation.cs b/src/Radarr.Http/Mapping/MappingValidation.cs deleted file mode 100644 index 059866919..000000000 --- a/src/Radarr.Http/Mapping/MappingValidation.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using NzbDrone.Common.Reflection; -using Radarr.Http.REST; - -namespace Radarr.Http.Mapping -{ - public static class MappingValidation - { - public static void ValidateMapping(Type modelType, Type resourceType) - { - var errors = modelType.GetSimpleProperties().Where(c => !c.GetGetMethod().IsStatic).Select(p => GetError(resourceType, p)).Where(c => c != null).ToList(); - - if (errors.Any()) - { - throw new ResourceMappingException(errors); - } - - PrintExtraProperties(modelType, resourceType); - } - - private static void PrintExtraProperties(Type modelType, Type resourceType) - { - var resourceBaseProperties = typeof(RestResource).GetProperties().Select(c => c.Name); - var resourceProperties = resourceType.GetProperties().Select(c => c.Name).Except(resourceBaseProperties); - var modelProperties = modelType.GetProperties().Select(c => c.Name); - - var extra = resourceProperties.Except(modelProperties); - - foreach (var extraProp in extra) - { - Console.WriteLine("Extra: [{0}]", extraProp); - } - } - - private static string GetError(Type resourceType, PropertyInfo modelProperty) - { - var resourceProperty = resourceType.GetProperties().FirstOrDefault(c => c.Name == modelProperty.Name); - - if (resourceProperty == null) - { - return string.Format("public {0} {1} {{ get; set; }}", modelProperty.PropertyType.Name, modelProperty.Name); - } - - if (resourceProperty.PropertyType != modelProperty.PropertyType && !typeof(RestResource).IsAssignableFrom(resourceProperty.PropertyType)) - { - return string.Format("Expected {0}.{1} to have type of {2} but found {3}", resourceType.Name, resourceProperty.Name, modelProperty.PropertyType, resourceProperty.PropertyType); - } - - return null; - } - } -} diff --git a/src/Radarr.Http/Mapping/ResourceMappingException.cs b/src/Radarr.Http/Mapping/ResourceMappingException.cs deleted file mode 100644 index e200ae678..000000000 --- a/src/Radarr.Http/Mapping/ResourceMappingException.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Radarr.Http.Mapping -{ - public class ResourceMappingException : ApplicationException - { - public ResourceMappingException(IEnumerable error) - : base(Environment.NewLine + string.Join(Environment.NewLine, error.OrderBy(c => c))) - { - } - } -} diff --git a/src/Radarr.Http/Radarr.Http.csproj b/src/Radarr.Http/Radarr.Http.csproj index e235827b6..b7645dcef 100644 --- a/src/Radarr.Http/Radarr.Http.csproj +++ b/src/Radarr.Http/Radarr.Http.csproj @@ -1,6 +1,6 @@  - net5.0;net472 + net5.0 diff --git a/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj b/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj index 7aafe20c1..cfe8281cc 100644 --- a/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj +++ b/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj @@ -1,9 +1,9 @@  WinExe - net5.0;net472 + net5.0 - + diff --git a/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj b/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj index 7aafe20c1..cfe8281cc 100644 --- a/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj +++ b/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj @@ -1,9 +1,9 @@  WinExe - net5.0;net472 + net5.0 - + diff --git a/src/Targets/FixBindingRedirects.targets b/src/Targets/FixBindingRedirects.targets deleted file mode 100644 index 8b34cfb68..000000000 --- a/src/Targets/FixBindingRedirects.targets +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/Targets/MonoFacades.targets b/src/Targets/MonoFacades.targets deleted file mode 100644 index 7e358209c..000000000 --- a/src/Targets/MonoFacades.targets +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - $(MSBuildThisFileDirectory)..\Libraries\Mono\ - - $(ResolveReferencesDependsOn); - SubstituteMonoFacadesBuild - - - - - - - - - - - - - - - - - - %(ReferenceCopyLocalPaths.Identity) - $(MonoFacadesPath)%(Filename)%(Extension) - - - - - - - - - - - - diff --git a/src/Targets/PublishAllRids.targets b/src/Targets/PublishAllRids.targets index e43dd7bfe..98f1b2de9 100644 --- a/src/Targets/PublishAllRids.targets +++ b/src/Targets/PublishAllRids.targets @@ -21,8 +21,6 @@ %(Framework) - - RuntimeIdentifier=%(Renamed.Runtime);TargetFramework=%(Renamed.Framework)