Cleanup dual target and mono code

Fixes #1893
Fixes #1808
pull/1909/head
Qstick 2 years ago
parent 3481168df5
commit bcc8370d05

@ -20,7 +20,6 @@ class About extends Component {
packageVersion, packageVersion,
packageAuthor, packageAuthor,
isNetCore, isNetCore,
isMono,
isDocker, isDocker,
runtimeVersion, runtimeVersion,
migrationVersion, migrationVersion,
@ -50,14 +49,6 @@ class About extends Component {
/> />
} }
{
isMono &&
<DescriptionListItem
title={translate('MonoVersion')}
data={runtimeVersion}
/>
}
{ {
isNetCore && isNetCore &&
<DescriptionListItem <DescriptionListItem
@ -121,7 +112,6 @@ About.propTypes = {
packageVersion: PropTypes.string, packageVersion: PropTypes.string,
packageAuthor: PropTypes.string, packageAuthor: PropTypes.string,
isNetCore: PropTypes.bool.isRequired, isNetCore: PropTypes.bool.isRequired,
isMono: PropTypes.bool.isRequired,
runtimeVersion: PropTypes.string.isRequired, runtimeVersion: PropTypes.string.isRequired,
isDocker: PropTypes.bool.isRequired, isDocker: PropTypes.bool.isRequired,
migrationVersion: PropTypes.number.isRequired, migrationVersion: PropTypes.number.isRequired,

@ -437,24 +437,6 @@ namespace NzbDrone.Common.Test.DiskTests
Assert.Throws<IOException>(() => Subject.TransferFolder(source.FullName, destination.FullName, TransferMode.Copy)); Assert.Throws<IOException>(() => Subject.TransferFolder(source.FullName, destination.FullName, TransferMode.Copy));
} }
[Test]
public void CopyFolder_should_not_copy_casesensitive_folder()
{
MonoOnly();
WithRealDiskProvider();
var original = GetFilledTempFolder();
var root = new DirectoryInfo(GetTempFilePath());
var source = new DirectoryInfo(root.FullName + "A/series");
var destination = new DirectoryInfo(root.FullName + "A/Series");
Subject.TransferFolder(original.FullName, source.FullName, TransferMode.Copy);
// Note: Although technically possible top copy to different case, we're not allowing it
Assert.Throws<IOException>(() => Subject.TransferFolder(source.FullName, destination.FullName, TransferMode.Copy));
}
[Test] [Test]
public void CopyFolder_should_ignore_nfs_temp_file() public void CopyFolder_should_ignore_nfs_temp_file()
{ {
@ -540,26 +522,6 @@ namespace NzbDrone.Common.Test.DiskTests
source.FullName.GetActualCasing().Should().Be(destination.FullName); source.FullName.GetActualCasing().Should().Be(destination.FullName);
} }
[Test]
public void MoveFolder_should_rename_casesensitive_folder()
{
MonoOnly();
WithRealDiskProvider();
var original = GetFilledTempFolder();
var root = new DirectoryInfo(GetTempFilePath());
var source = new DirectoryInfo(root.FullName + "A/series");
var destination = new DirectoryInfo(root.FullName + "A/Series");
Subject.TransferFolder(original.FullName, source.FullName, TransferMode.Copy);
Subject.TransferFolder(source.FullName, destination.FullName, TransferMode.Move);
Directory.Exists(source.FullName).Should().Be(false);
Directory.Exists(destination.FullName).Should().Be(true);
}
[Test] [Test]
public void should_throw_if_destination_is_readonly() public void should_throw_if_destination_is_readonly()
{ {

@ -307,11 +307,6 @@ namespace NzbDrone.Common.Test.Http
[Test] [Test]
public void should_follow_redirects_to_https() public void should_follow_redirects_to_https()
{ {
if (typeof(TDispatcher) == typeof(ManagedHttpDispatcher) && PlatformInfo.IsMono)
{
Assert.Ignore("Will fail on tls1.2 via managed dispatcher, ignore.");
}
var request = new HttpRequestBuilder($"https://{_httpBinHost}/redirect-to") var request = new HttpRequestBuilder($"https://{_httpBinHost}/redirect-to")
.AddQueryParam("url", $"https://readarr.com/") .AddQueryParam("url", $"https://readarr.com/")
.Build(); .Build();

@ -279,7 +279,7 @@ namespace NzbDrone.Common.Test
[Test] [Test]
public void GetUpdateClientExePath() public void GetUpdateClientExePath()
{ {
GetIAppDirectoryInfo().GetUpdateClientExePath(PlatformType.DotNet).Should().BeEquivalentTo(@"C:\Temp\readarr_update\Readarr.Update.exe".AsOsAgnostic()); GetIAppDirectoryInfo().GetUpdateClientExePath().Should().BeEquivalentTo(@"C:\Temp\readarr_update\Readarr.Update".AsOsAgnostic().ProcessNameToExe());
} }
[Test] [Test]

@ -1,4 +1,4 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -171,7 +171,7 @@ namespace NzbDrone.Common.Test
var processStarted = new ManualResetEventSlim(); var processStarted = new ManualResetEventSlim();
string suffix; string suffix;
if (OsInfo.IsWindows || PlatformInfo.IsMono) if (OsInfo.IsWindows)
{ {
suffix = ".exe"; suffix = ".exe";
} }

@ -1,17 +1,7 @@
using System; using System;
using System.Reflection;
using System.Text.RegularExpressions;
using Microsoft.Win32;
namespace NzbDrone.Common.EnvironmentInfo namespace NzbDrone.Common.EnvironmentInfo
{ {
public enum PlatformType
{
DotNet = 0,
Mono = 1,
NetCore = 2
}
public interface IPlatformInfo public interface IPlatformInfo
{ {
Version Version { get; } Version Version { get; }
@ -19,38 +9,18 @@ namespace NzbDrone.Common.EnvironmentInfo
public class PlatformInfo : IPlatformInfo public class PlatformInfo : IPlatformInfo
{ {
private static readonly Regex MonoVersionRegex = new Regex(@"(?<=\W|^)(?<version>\d+\.\d+(\.\d+)?(\.\d+)?)(?=\W)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static PlatformType _platform;
private static Version _version; private static Version _version;
static PlatformInfo() static PlatformInfo()
{ {
_platform = PlatformType.NetCore;
_version = Environment.Version; _version = Environment.Version;
} }
public static PlatformType Platform => _platform;
public static bool IsMono => Platform == PlatformType.Mono;
public static bool IsDotNet => Platform == PlatformType.DotNet;
public static bool IsNetCore => Platform == PlatformType.NetCore;
public static string PlatformName public static string PlatformName
{ {
get get
{ {
if (IsDotNet) return ".NET";
{
return ".NET";
}
else if (IsMono)
{
return "Mono";
}
else
{
return ".NET Core";
}
} }
} }
@ -60,107 +30,5 @@ namespace NzbDrone.Common.EnvironmentInfo
{ {
return _version; return _version;
} }
private static Version GetMonoVersion()
{
try
{
var type = Type.GetType("Mono.Runtime");
if (type != null)
{
var displayNameMethod = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
if (displayNameMethod != null)
{
var displayName = displayNameMethod.Invoke(null, null).ToString();
var versionMatch = MonoVersionRegex.Match(displayName);
if (versionMatch.Success)
{
return new Version(versionMatch.Groups["version"].Value);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Couldnt get Mono version: " + ex.ToString());
}
return new Version();
}
private static Version GetDotNetVersion()
{
try
{
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
{
if (ndpKey == null)
{
return new Version(4, 0);
}
var releaseKey = (int)ndpKey.GetValue("Release");
if (releaseKey >= 528040)
{
return new Version(4, 8, 0);
}
if (releaseKey >= 461808)
{
return new Version(4, 7, 2);
}
if (releaseKey >= 461308)
{
return new Version(4, 7, 1);
}
if (releaseKey >= 460798)
{
return new Version(4, 7);
}
if (releaseKey >= 394802)
{
return new Version(4, 6, 2);
}
if (releaseKey >= 394254)
{
return new Version(4, 6, 1);
}
if (releaseKey >= 393295)
{
return new Version(4, 6);
}
if (releaseKey >= 379893)
{
return new Version(4, 5, 2);
}
if (releaseKey >= 378675)
{
return new Version(4, 5, 1);
}
if (releaseKey >= 378389)
{
return new Version(4, 5);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Couldnt get .NET framework version: " + ex.ToString());
}
return new Version(4, 0);
}
} }
} }

@ -240,9 +240,9 @@ namespace NzbDrone.Common.Extensions
return null; return null;
} }
public static string ProcessNameToExe(this string processName, PlatformType runtime) public static string ProcessNameToExe(this string processName)
{ {
if (OsInfo.IsWindows || runtime != PlatformType.NetCore) if (OsInfo.IsWindows)
{ {
processName += ".exe"; processName += ".exe";
} }
@ -250,11 +250,6 @@ namespace NzbDrone.Common.Extensions
return processName; return processName;
} }
public static string ProcessNameToExe(this string processName)
{
return processName.ProcessNameToExe(PlatformInfo.Platform);
}
public static string GetLongestCommonPath(this List<string> paths) public static string GetLongestCommonPath(this List<string> paths)
{ {
var firstPath = paths.First(); var firstPath = paths.First();
@ -347,9 +342,9 @@ namespace NzbDrone.Common.Extensions
return Path.Combine(GetUpdatePackageFolder(appFolderInfo), UPDATE_CLIENT_FOLDER_NAME); return Path.Combine(GetUpdatePackageFolder(appFolderInfo), UPDATE_CLIENT_FOLDER_NAME);
} }
public static string GetUpdateClientExePath(this IAppFolderInfo appFolderInfo, PlatformType runtime) public static string GetUpdateClientExePath(this IAppFolderInfo appFolderInfo)
{ {
return Path.Combine(GetUpdateSandboxFolder(appFolderInfo), UPDATE_CLIENT_EXE_NAME).ProcessNameToExe(runtime); return Path.Combine(GetUpdateSandboxFolder(appFolderInfo), UPDATE_CLIENT_EXE_NAME).ProcessNameToExe();
} }
public static string GetDatabase(this IAppFolderInfo appFolderInfo) public static string GetDatabase(this IAppFolderInfo appFolderInfo)

@ -38,16 +38,6 @@ namespace NzbDrone.Common.Instrumentation
return; return;
} }
if (PlatformInfo.IsMono)
{
if ((exception is TypeInitializationException && exception.InnerException is DllNotFoundException) ||
exception is DllNotFoundException)
{
Logger.Debug(exception, "Minor Fail: " + exception.Message);
return;
}
}
Console.WriteLine("EPIC FAIL: {0}", exception); Console.WriteLine("EPIC FAIL: {0}", exception);
Logger.Fatal(exception, "EPIC FAIL."); Logger.Fatal(exception, "EPIC FAIL.");
} }

@ -109,13 +109,6 @@ namespace NzbDrone.Common.Instrumentation.Sentry
o.Debug = false; o.Debug = false;
o.DiagnosticLevel = SentryLevel.Debug; o.DiagnosticLevel = SentryLevel.Debug;
o.Release = BuildInfo.Release; o.Release = BuildInfo.Release;
if (PlatformInfo.IsMono)
{
// Mono 6.0 broke GzipStream.WriteAsync
// TODO: Check specific version
o.RequestBodyCompressionLevel = System.IO.Compression.CompressionLevel.NoCompression;
}
o.BeforeSend = x => SentryCleanser.CleanseEvent(x); o.BeforeSend = x => SentryCleanser.CleanseEvent(x);
o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x); o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x);
o.Environment = BuildInfo.Branch; o.Environment = BuildInfo.Branch;
@ -158,14 +151,6 @@ namespace NzbDrone.Common.Instrumentation.Sentry
SentrySdk.ConfigureScope(scope => SentrySdk.ConfigureScope(scope =>
{ {
scope.SetTag("is_docker", $"{osInfo.IsDocker}"); scope.SetTag("is_docker", $"{osInfo.IsDocker}");
if (osInfo.Name != null && PlatformInfo.IsMono)
{
// Sentry auto-detection of non-Windows platforms isn't that accurate on certain devices.
scope.Contexts.OperatingSystem.Name = osInfo.Name.FirstCharToUpper();
scope.Contexts.OperatingSystem.RawDescription = osInfo.FullName;
scope.Contexts.OperatingSystem.Version = osInfo.Version.ToString();
}
}); });
} }

@ -377,11 +377,6 @@ namespace NzbDrone.Common.Processes
private (string Path, string Args) GetPathAndArgs(string path, string args) private (string Path, string Args) GetPathAndArgs(string path, string args)
{ {
if (PlatformInfo.IsMono && path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))
{
return ("mono", $"--debug {path} {args}");
}
if (OsInfo.IsWindows && path.EndsWith(".bat", StringComparison.InvariantCultureIgnoreCase)) if (OsInfo.IsWindows && path.EndsWith(".bat", StringComparison.InvariantCultureIgnoreCase))
{ {
return ("cmd.exe", $"/c {path} {args}"); return ("cmd.exe", $"/c {path} {args}");

@ -16,11 +16,6 @@ namespace NzbDrone.Core.Test.MediaCoverTests
[SetUp] [SetUp]
public void SetUp() public void SetUp()
{ {
if (PlatformInfo.IsMono && PlatformInfo.GetVersion() < new Version(5, 8))
{
Assert.Inconclusive("Not supported on Mono < 5.8");
}
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(v => v.FileExists(It.IsAny<string>())) .Setup(v => v.FileExists(It.IsAny<string>()))
.Returns<string>(s => File.Exists(s)); .Returns<string>(s => File.Exists(s));

@ -69,7 +69,7 @@ namespace NzbDrone.Core.Test.UpdateTests
.Returns(true); .Returns(true);
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(v => v.FileExists(It.Is<string>(s => s.EndsWith("Readarr.Update.exe")))) .Setup(v => v.FileExists(It.Is<string>(s => s.EndsWith("Readarr.Update".ProcessNameToExe()))))
.Returns(true); .Returns(true);
_sandboxFolder = Mocker.GetMock<IAppFolderInfo>().Object.GetUpdateSandboxFolder(); _sandboxFolder = Mocker.GetMock<IAppFolderInfo>().Object.GetUpdateSandboxFolder();
@ -165,7 +165,7 @@ namespace NzbDrone.Core.Test.UpdateTests
public void should_return_with_warning_if_updater_doesnt_exists() public void should_return_with_warning_if_updater_doesnt_exists()
{ {
Mocker.GetMock<IDiskProvider>() Mocker.GetMock<IDiskProvider>()
.Setup(v => v.FileExists(It.Is<string>(s => s.EndsWith("Readarr.Update.exe")))) .Setup(v => v.FileExists(It.Is<string>(s => s.EndsWith("Readarr.Update".ProcessNameToExe()))))
.Returns(false); .Returns(false);
Subject.Execute(new ApplicationUpdateCommand()); Subject.Execute(new ApplicationUpdateCommand());

@ -52,7 +52,7 @@ namespace NzbDrone.Core.HealthCheck
.AddQueryParam("version", BuildInfo.Version) .AddQueryParam("version", BuildInfo.Version)
.AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant()) .AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant())
.AddQueryParam("arch", RuntimeInformation.OSArchitecture) .AddQueryParam("arch", RuntimeInformation.OSArchitecture)
.AddQueryParam("runtime", PlatformInfo.Platform.ToString().ToLowerInvariant()) .AddQueryParam("runtime", "netcore")
.AddQueryParam("branch", _configFileProvider.Branch) .AddQueryParam("branch", _configFileProvider.Branch)
.Build(); .Build();
try try

@ -1,4 +1,4 @@
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using SixLabors.ImageSharp; using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Formats.Jpeg;
@ -21,12 +21,6 @@ namespace NzbDrone.Core.MediaCover
{ {
_diskProvider = diskProvider; _diskProvider = diskProvider;
// Random segfaults on mono 5.0 and 5.4
if (PlatformInfo.IsMono && platformInfo.Version < new System.Version(5, 8))
{
return;
}
_enabled = true; _enabled = true;
// More conservative memory allocation // More conservative memory allocation

@ -146,7 +146,7 @@ namespace NzbDrone.Core.Update
_logger.Info("Preparing client"); _logger.Info("Preparing client");
_diskTransferService.TransferFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder, TransferMode.Move); _diskTransferService.TransferFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder, TransferMode.Move);
var updateClientExePath = _appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime); var updateClientExePath = _appFolderInfo.GetUpdateClientExePath();
if (!_diskProvider.FileExists(updateClientExePath)) if (!_diskProvider.FileExists(updateClientExePath))
{ {
@ -155,7 +155,7 @@ namespace NzbDrone.Core.Update
} }
// Set executable flag on update app // Set executable flag on update app
if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore)) if (OsInfo.IsOsx || OsInfo.IsLinux)
{ {
_diskProvider.SetFilePermissions(updateClientExePath, "755", null); _diskProvider.SetFilePermissions(updateClientExePath, "755", null);
} }

@ -1,4 +1,4 @@
using System; using System;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Core.Update namespace NzbDrone.Core.Update
@ -12,6 +12,5 @@ namespace NzbDrone.Core.Update
public UpdateChanges Changes { get; set; } public UpdateChanges Changes { get; set; }
public string Hash { get; set; } public string Hash { get; set; }
public string Branch { get; set; } public string Branch { get; set; }
public PlatformType Runtime { get; set; }
} }
} }

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using FluentValidation.Validators;
using NzbDrone.Common.Cloud; using NzbDrone.Common.Cloud;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
@ -39,7 +40,7 @@ namespace NzbDrone.Core.Update
.AddQueryParam("version", currentVersion) .AddQueryParam("version", currentVersion)
.AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant()) .AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant())
.AddQueryParam("arch", RuntimeInformation.OSArchitecture) .AddQueryParam("arch", RuntimeInformation.OSArchitecture)
.AddQueryParam("runtime", PlatformInfo.Platform.ToString().ToLowerInvariant()) .AddQueryParam("runtime", "netcore")
.AddQueryParam("runtimeVer", _platformInfo.Version) .AddQueryParam("runtimeVer", _platformInfo.Version)
.AddQueryParam("dbType", _mainDatabase.DatabaseType) .AddQueryParam("dbType", _mainDatabase.DatabaseType)
.SetSegment("branch", branch); .SetSegment("branch", branch);
@ -67,7 +68,7 @@ namespace NzbDrone.Core.Update
.AddQueryParam("version", currentVersion) .AddQueryParam("version", currentVersion)
.AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant()) .AddQueryParam("os", OsInfo.Os.ToString().ToLowerInvariant())
.AddQueryParam("arch", RuntimeInformation.OSArchitecture) .AddQueryParam("arch", RuntimeInformation.OSArchitecture)
.AddQueryParam("runtime", PlatformInfo.Platform.ToString().ToLowerInvariant()) .AddQueryParam("runtime", "netcore")
.AddQueryParam("runtimeVer", _platformInfo.Version) .AddQueryParam("runtimeVer", _platformInfo.Version)
.SetSegment("branch", branch); .SetSegment("branch", branch);

@ -10,11 +10,6 @@ namespace NzbDrone.Mono.Test.DiskProviderTests
[Platform(Exclude = "Win")] [Platform(Exclude = "Win")]
public class FreeSpaceFixture : FreeSpaceFixtureBase<DiskProvider> public class FreeSpaceFixture : FreeSpaceFixtureBase<DiskProvider>
{ {
public FreeSpaceFixture()
{
MonoOnly();
}
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
@ -24,6 +19,7 @@ namespace NzbDrone.Mono.Test.DiskProviderTests
.Returns<string>(s => s); .Returns<string>(s => s);
} }
[Ignore("Docker")]
[Test] [Test]
public void should_be_able_to_check_space_on_ramdrive() public void should_be_able_to_check_space_on_ramdrive()
{ {

@ -8,14 +8,9 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Mono.Test.DiskProviderTests namespace NzbDrone.Mono.Test.DiskProviderTests
{ {
[TestFixture] [TestFixture]
[Platform("Mono")] [Platform(Exclude = "Win")]
public class SymbolicLinkResolverFixture : TestBase<SymbolicLinkResolver> public class SymbolicLinkResolverFixture : TestBase<SymbolicLinkResolver>
{ {
public SymbolicLinkResolverFixture()
{
MonoOnly();
}
[Test] [Test]
public void should_follow_nested_symlinks() public void should_follow_nested_symlinks()
{ {

@ -309,7 +309,7 @@ namespace NzbDrone.Mono.Disk
} }
else else
{ {
base.MoveFileInternal(source, destination); TransferFilePatched(source, destination, false, true);
} }
} }
@ -321,9 +321,7 @@ namespace NzbDrone.Mono.Disk
// Catch the exception and attempt to handle these edgecases // Catch the exception and attempt to handle these edgecases
// Mono 6.x till 6.10 doesn't properly try use rename first. // Mono 6.x till 6.10 doesn't properly try use rename first.
if (move && if (move)
((PlatformInfo.Platform == PlatformType.Mono && PlatformInfo.GetVersion() < new Version(6, 10)) ||
(PlatformInfo.Platform == PlatformType.NetCore)))
{ {
if (Syscall.lstat(source, out var sourcestat) == 0 && if (Syscall.lstat(source, out var sourcestat) == 0 &&
Syscall.lstat(destination, out var deststat) != 0 && Syscall.lstat(destination, out var deststat) != 0 &&
@ -351,32 +349,7 @@ namespace NzbDrone.Mono.Disk
var dstInfo = new FileInfo(destination); var dstInfo = new FileInfo(destination);
var exists = dstInfo.Exists && srcInfo.Exists; var exists = dstInfo.Exists && srcInfo.Exists;
if (PlatformInfo.Platform == PlatformType.Mono && PlatformInfo.GetVersion() >= new Version(6, 6) && if (exists && dstInfo.Length == srcInfo.Length)
exists && dstInfo.Length == 0 && srcInfo.Length != 0)
{
// mono >=6.6 bug: zero length file since chmod happens at the start
_logger.Debug("{3} failed to {2} file likely due to known {3} bug, attempting to {2} directly. '{0}' -> '{1}'", source, destination, move ? "move" : "copy", PlatformInfo.PlatformName);
try
{
_logger.Trace("Copying content from {0} to {1} ({2} bytes)", source, destination, srcInfo.Length);
using (var srcStream = new FileStream(source, FileMode.Open, FileAccess.Read))
using (var dstStream = new FileStream(destination, FileMode.Create, FileAccess.Write))
{
srcStream.CopyTo(dstStream);
}
}
catch
{
// If it fails again then bail
throw;
}
}
else if (((PlatformInfo.Platform == PlatformType.Mono &&
PlatformInfo.GetVersion() >= new Version(6, 0) &&
PlatformInfo.GetVersion() < new Version(6, 6)) ||
PlatformInfo.Platform == PlatformType.NetCore) &&
exists && dstInfo.Length == srcInfo.Length)
{ {
// mono 6.0, mono 6.4 and netcore 3.1 bug: full length file since utime and chmod happens at the end // mono 6.0, mono 6.4 and netcore 3.1 bug: full length file since utime and chmod happens at the end
_logger.Debug("{3} failed to {2} file likely due to known {3} bug, attempting to {2} directly. '{0}' -> '{1}'", source, destination, move ? "move" : "copy", PlatformInfo.PlatformName); _logger.Debug("{3} failed to {2} file likely due to known {3} bug, attempting to {2} directly. '{0}' -> '{1}'", source, destination, move ? "move" : "copy", PlatformInfo.PlatformName);

@ -50,10 +50,6 @@ namespace NzbDrone.Test.Common
{ {
readarrConsoleExe = "Readarr.Console.exe"; readarrConsoleExe = "Readarr.Console.exe";
} }
else if (PlatformInfo.IsMono)
{
readarrConsoleExe = "Readarr.exe";
}
else else
{ {
readarrConsoleExe = "Readarr"; readarrConsoleExe = "Readarr";

@ -1,4 +1,4 @@
using System; using System;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using FluentAssertions; using FluentAssertions;
@ -166,14 +166,6 @@ namespace NzbDrone.Test.Common
} }
} }
protected void MonoOnly()
{
if (!PlatformInfo.IsMono)
{
throw new IgnoreException("mono specific test");
}
}
protected void NotBsd() protected void NotBsd()
{ {
if (OsInfo.Os == Os.Bsd) if (OsInfo.Os == Os.Bsd)

@ -125,8 +125,8 @@ namespace NzbDrone.Update.UpdateEngine
_logger.Info("Copying new files to target folder"); _logger.Info("Copying new files to target folder");
_diskTransferService.MirrorFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder); _diskTransferService.MirrorFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder);
// Set executable flag on Readarr app // Set executable flag on app
if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore)) if (OsInfo.IsOsx || OsInfo.IsLinux)
{ {
_diskProvider.SetFilePermissions(Path.Combine(installationFolder, "Readarr"), "755", null); _diskProvider.SetFilePermissions(Path.Combine(installationFolder, "Readarr"), "755", null);
} }

@ -70,8 +70,7 @@ namespace Readarr.Api.V1.System
AppData = _appFolderInfo.GetAppDataPath(), AppData = _appFolderInfo.GetAppDataPath(),
OsName = _osInfo.Name, OsName = _osInfo.Name,
OsVersion = _osInfo.Version, OsVersion = _osInfo.Version,
IsNetCore = PlatformInfo.IsNetCore, IsNetCore = true,
IsMono = PlatformInfo.IsMono,
IsLinux = OsInfo.IsLinux, IsLinux = OsInfo.IsLinux,
IsOsx = OsInfo.IsOsx, IsOsx = OsInfo.IsOsx,
IsWindows = OsInfo.IsWindows, IsWindows = OsInfo.IsWindows,
@ -84,7 +83,7 @@ namespace Readarr.Api.V1.System
MigrationVersion = _database.Migration, MigrationVersion = _database.Migration,
UrlBase = _configFileProvider.UrlBase, UrlBase = _configFileProvider.UrlBase,
RuntimeVersion = _platformInfo.Version, RuntimeVersion = _platformInfo.Version,
RuntimeName = PlatformInfo.Platform, RuntimeName = "netcore",
StartTime = _runtimeInfo.StartTime, StartTime = _runtimeInfo.StartTime,
PackageVersion = _deploymentInfoProvider.PackageVersion, PackageVersion = _deploymentInfoProvider.PackageVersion,
PackageAuthor = _deploymentInfoProvider.PackageAuthor, PackageAuthor = _deploymentInfoProvider.PackageAuthor,

Loading…
Cancel
Save