diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 916bac55f..e6dd860a0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,12 +15,12 @@ variables: buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' sentryOrg: 'servarr' sentryUrl: 'https://sentry.servarr.com' - dotnetVersion: '6.0.421' + dotnetVersion: '8.0.204' nodeVersion: '20.X' innoVersion: '6.2.2' windowsImage: 'windows-2022' linuxImage: 'ubuntu-20.04' - macImage: 'macOS-11' + macImage: 'macOS-12' trigger: branches: @@ -122,27 +122,27 @@ stages: artifact: '$(osName)Backend' displayName: Publish Backend condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net6.0/win-x64/publish' + - publish: '$(testsFolder)/net8.0/win-x64/publish' artifact: win-x64-tests displayName: Publish win-x64 Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net6.0/linux-x64/publish' + - publish: '$(testsFolder)/net8.0/linux-x64/publish' artifact: linux-x64-tests displayName: Publish linux-x64 Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net6.0/linux-x86/publish' + - publish: '$(testsFolder)/net8.0/linux-x86/publish' artifact: linux-x86-tests displayName: Publish linux-x86 Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net6.0/linux-musl-x64/publish' + - publish: '$(testsFolder)/net8.0/linux-musl-x64/publish' artifact: linux-musl-x64-tests displayName: Publish linux-musl-x64 Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net6.0/freebsd-x64/publish' + - publish: '$(testsFolder)/net8.0/freebsd-x64/publish' artifact: freebsd-x64-tests displayName: Publish freebsd-x64 Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) - - publish: '$(testsFolder)/net6.0/osx-x64/publish' + - publish: '$(testsFolder)/net8.0/osx-x64/publish' artifact: osx-x64-tests displayName: Publish osx-x64 Test Package condition: and(succeeded(), eq(variables['osName'], 'Windows')) @@ -189,7 +189,7 @@ stages: artifact: '$(osName)Frontend' displayName: Publish Frontend condition: and(succeeded(), eq(variables['osName'], 'Windows')) - + - stage: Installer dependsOn: - Build_Backend @@ -259,21 +259,21 @@ stages: archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip' archiveType: 'zip' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0 + rootFolderOrFile: $(artifactsFolder)/win-x64/net8.0 - task: ArchiveFiles@2 displayName: Create win-x86 zip inputs: archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip' archiveType: 'zip' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0 + rootFolderOrFile: $(artifactsFolder)/win-x86/net8.0 - task: ArchiveFiles@2 displayName: Create osx-x64 app inputs: archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip' archiveType: 'zip' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0 + rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net8.0 - task: ArchiveFiles@2 displayName: Create osx-x64 tar inputs: @@ -281,14 +281,14 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0 + rootFolderOrFile: $(artifactsFolder)/osx-x64/net8.0 - task: ArchiveFiles@2 displayName: Create osx-arm64 app inputs: archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip' archiveType: 'zip' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0 + rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net8.0 - task: ArchiveFiles@2 displayName: Create osx-arm64 tar inputs: @@ -296,7 +296,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0 + rootFolderOrFile: $(artifactsFolder)/osx-arm64/net8.0 - task: ArchiveFiles@2 displayName: Create linux-x64 tar inputs: @@ -304,7 +304,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-x64/net8.0 - task: ArchiveFiles@2 displayName: Create linux-musl-x64 tar inputs: @@ -312,7 +312,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net8.0 - task: ArchiveFiles@2 displayName: Create linux-x86 tar inputs: @@ -320,7 +320,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-x86/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-x86/net8.0 - task: ArchiveFiles@2 displayName: Create linux-arm tar inputs: @@ -328,7 +328,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-arm/net8.0 - task: ArchiveFiles@2 displayName: Create linux-musl-arm tar inputs: @@ -336,7 +336,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net8.0 - task: ArchiveFiles@2 displayName: Create linux-arm64 tar inputs: @@ -344,7 +344,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-arm64/net8.0 - task: ArchiveFiles@2 displayName: Create linux-musl-arm64 tar inputs: @@ -352,7 +352,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0 + rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net8.0 - task: ArchiveFiles@2 displayName: Create freebsd-x64 tar inputs: @@ -360,7 +360,7 @@ stages: archiveType: 'tar' tarCompression: 'gz' includeRootFolder: false - rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0 + rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net8.0 - publish: $(Build.ArtifactStagingDirectory) artifact: 'Packages' displayName: Publish Packages @@ -391,7 +391,7 @@ stages: SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr) SENTRY_ORG: $(sentryOrg) SENTRY_URL: $(sentryUrl) - + - stage: Unit_Test displayName: Unit Tests dependsOn: Build_Backend @@ -476,6 +476,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: '$(testName) Unit Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true - job: Unit_Docker displayName: Unit Docker @@ -494,11 +495,11 @@ stages: pool: vmImage: ${{ variables.linuxImage }} - + container: $[ variables['containerImage'] ] timeoutInMinutes: 10 - + steps: - task: UseDotNet@2 displayName: 'Install .NET' @@ -525,6 +526,9 @@ stages: ls -lR ${TESTSFOLDER} ${TESTSFOLDER}/test.sh Linux Unit Test displayName: Run Tests + env: + COMPlus_EnableDiagnostics: 0 + DOTNET_GCHeapHardLimit: 100000000 - task: PublishTestResults@2 displayName: Publish Test Results inputs: @@ -532,7 +536,8 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: '$(testName) Unit Tests' failTaskOnFailedTests: true - + failTaskOnMissingResultsFile: true + - job: Unit_LinuxCore_Postgres14 displayName: Unit Native LinuxCore with Postgres14 Database dependsOn: Prepare @@ -549,7 +554,7 @@ stages: vmImage: ${{ variables.linuxImage }} timeoutInMinutes: 10 - + steps: - task: UseDotNet@2 displayName: 'Install .net core' @@ -585,6 +590,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: 'LinuxCore Postgres14 Unit Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true - job: Unit_LinuxCore_Postgres15 displayName: Unit Native LinuxCore with Postgres15 Database @@ -597,12 +603,12 @@ stages: Prowlarr__Postgres__Port: '5432' Prowlarr__Postgres__User: 'prowlarr' Prowlarr__Postgres__Password: 'prowlarr' - + pool: vmImage: ${{ variables.linuxImage }} timeoutInMinutes: 10 - + steps: - task: UseDotNet@2 displayName: 'Install .net core' @@ -638,6 +644,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: 'LinuxCore Postgres15 Unit Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true - stage: Integration displayName: Integration @@ -681,7 +688,7 @@ stages: pool: vmImage: $(imageName) - + steps: - task: UseDotNet@2 displayName: 'Install .net core' @@ -703,7 +710,7 @@ stages: targetPath: $(Build.ArtifactStagingDirectory) - task: ExtractFiles@1 inputs: - archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' displayName: Extract Package - bash: | @@ -720,6 +727,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: '$(testName) Integration Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true displayName: Publish Test Results - job: Integration_LinuxCore_Postgres14 @@ -757,7 +765,7 @@ stages: targetPath: $(Build.ArtifactStagingDirectory) - task: ExtractFiles@1 inputs: - archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' displayName: Extract Package - bash: | @@ -782,6 +790,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: 'Integration LinuxCore Postgres14 Database Integration Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true displayName: Publish Test Results @@ -820,7 +829,7 @@ stages: targetPath: $(Build.ArtifactStagingDirectory) - task: ExtractFiles@1 inputs: - archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' displayName: Extract Package - bash: | @@ -845,6 +854,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: 'Integration LinuxCore Postgres15 Database Integration Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true displayName: Publish Test Results - job: Integration_FreeBSD @@ -891,6 +901,7 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: 'FreeBSD Integration Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true displayName: Publish Test Results - job: Integration_Docker @@ -915,7 +926,7 @@ stages: container: $[ variables['containerImage'] ] timeoutInMinutes: 15 - + steps: - task: UseDotNet@2 displayName: 'Install .NET' @@ -943,7 +954,7 @@ stages: targetPath: $(Build.ArtifactStagingDirectory) - task: ExtractFiles@1 inputs: - archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' displayName: Extract Package - bash: | @@ -960,12 +971,13 @@ stages: testResultsFiles: '**/TestResult.xml' testRunTitle: '$(testName) Integration Tests' failTaskOnFailedTests: true + failTaskOnMissingResultsFile: true displayName: Publish Test Results - stage: Automation displayName: Automation dependsOn: Packages - + jobs: - job: Automation strategy: @@ -991,7 +1003,7 @@ stages: pool: vmImage: $(imageName) - + steps: - task: UseDotNet@2 displayName: 'Install .net core' @@ -1013,7 +1025,7 @@ stages: targetPath: $(Build.ArtifactStagingDirectory) - task: ExtractFiles@1 inputs: - archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' displayName: Extract Package - bash: | @@ -1116,7 +1128,7 @@ stages: - checkout: self submodules: true persistCredentials: true - fetchDepth: 1 + fetchDepth: 1 - bash: ./docs.sh Windows displayName: Create openapi.json - bash: | @@ -1184,8 +1196,8 @@ stages: sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml - bash: | - ./build.sh --backend -f net6.0 -r win-x64 - TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage + ./build.sh --backend -f net8.0 -r win-x64 + TEST_DIR=_tests/net8.0/win-x64/publish/ ./test.sh Windows Unit Coverage displayName: Coverage Unit Tests - task: SonarCloudAnalyze@1 condition: eq(variables['System.PullRequest.IsFork'], 'False') @@ -1233,4 +1245,3 @@ stages: DISCORDCHANNELID: $(discordChannelId) DISCORDWEBHOOKKEY: $(discordWebhookKey) DISCORDTHREADID: $(discordThreadId) - diff --git a/build.sh b/build.sh index 5139dba52..b8f13c518 100755 --- a/build.sh +++ b/build.sh @@ -79,9 +79,9 @@ Build() if [[ -z "$RID" || -z "$FRAMEWORK" ]]; then - dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids + dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids else - dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids + dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids fi ProgressEnd 'Build' @@ -137,7 +137,7 @@ PackageLinux() echo "Adding Prowlarr.Mono to UpdatePackage" cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update - if [ "$framework" = "net6.0" ]; then + if [ "$framework" = "net8.0" ]; then cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update fi @@ -165,7 +165,7 @@ PackageMacOS() echo "Adding Prowlarr.Mono to UpdatePackage" cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update - if [ "$framework" = "net6.0" ]; then + if [ "$framework" = "net8.0" ]; then cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update fi @@ -377,15 +377,15 @@ then Build if [[ -z "$RID" || -z "$FRAMEWORK" ]]; then - PackageTests "net6.0" "win-x64" - PackageTests "net6.0" "win-x86" - PackageTests "net6.0" "linux-x64" - PackageTests "net6.0" "linux-musl-x64" - PackageTests "net6.0" "osx-x64" + PackageTests "net8.0" "win-x64" + PackageTests "net8.0" "win-x86" + PackageTests "net8.0" "linux-x64" + PackageTests "net8.0" "linux-musl-x64" + PackageTests "net8.0" "osx-x64" if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ]; then - PackageTests "net6.0" "freebsd-x64" - PackageTests "net6.0" "linux-x86" + PackageTests "net8.0" "freebsd-x64" + PackageTests "net8.0" "linux-x86" fi else PackageTests "$FRAMEWORK" "$RID" @@ -413,20 +413,20 @@ then if [[ -z "$RID" || -z "$FRAMEWORK" ]]; then - Package "net6.0" "win-x64" - Package "net6.0" "win-x86" - Package "net6.0" "linux-x64" - Package "net6.0" "linux-musl-x64" - Package "net6.0" "linux-arm64" - Package "net6.0" "linux-musl-arm64" - Package "net6.0" "linux-arm" - Package "net6.0" "linux-musl-arm" - Package "net6.0" "osx-x64" - Package "net6.0" "osx-arm64" + Package "net8.0" "win-x64" + Package "net8.0" "win-x86" + Package "net8.0" "linux-x64" + Package "net8.0" "linux-musl-x64" + Package "net8.0" "linux-arm64" + Package "net8.0" "linux-musl-arm64" + Package "net8.0" "linux-arm" + Package "net8.0" "linux-musl-arm" + Package "net8.0" "osx-x64" + Package "net8.0" "osx-arm64" if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ]; then - Package "net6.0" "freebsd-x64" - Package "net6.0" "linux-x86" + Package "net8.0" "freebsd-x64" + Package "net8.0" "linux-x86" fi else Package "$FRAMEWORK" "$RID" @@ -436,7 +436,7 @@ fi if [ "$INSTALLER" = "YES" ]; then InstallInno - BuildInstaller "net6.0" "win-x64" - BuildInstaller "net6.0" "win-x86" + BuildInstaller "net8.0" "win-x64" + BuildInstaller "net8.0" "win-x86" RemoveInno fi diff --git a/docs.sh b/docs.sh index ae11bc83f..6135f0ab6 100644 --- a/docs.sh +++ b/docs.sh @@ -29,7 +29,7 @@ dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p dotnet new tool-manifest dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli -dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/prowlarr.console.dll" v1 & +dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/net8.0/$RUNTIME/prowlarr.console.dll" v1 & sleep 30 diff --git a/package.json b/package.json index bb99c1d7f..7ed5acf49 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@fortawesome/free-solid-svg-icons": "6.4.0", "@fortawesome/react-fontawesome": "0.2.0", "@juggle/resize-observer": "3.4.0", - "@microsoft/signalr": "6.0.25", + "@microsoft/signalr": "8.0.0", "@sentry/browser": "7.100.0", "@sentry/integrations": "7.100.0", "@types/node": "18.19.31", diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 3608b0efa..a0b0e40bf 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -99,13 +99,6 @@ $(MSBuildProjectName.Replace('Prowlarr','NzbDrone')) - - - - - - - @@ -136,7 +129,7 @@ - + diff --git a/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj b/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj index bb0b5fcc4..39a837e31 100644 --- a/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj +++ b/src/NzbDrone.Automation.Test/Prowlarr.Automation.Test.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 diff --git a/src/NzbDrone.Common.Test/Prowlarr.Common.Test.csproj b/src/NzbDrone.Common.Test/Prowlarr.Common.Test.csproj index 0bf15596a..5cd51e814 100644 --- a/src/NzbDrone.Common.Test/Prowlarr.Common.Test.csproj +++ b/src/NzbDrone.Common.Test/Prowlarr.Common.Test.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 diff --git a/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs b/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs index ffdc36e0e..d96bb22e9 100644 --- a/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs +++ b/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Runtime.Serialization; namespace NzbDrone.Common.Disk { @@ -24,10 +23,5 @@ namespace NzbDrone.Common.Disk : base(message, innerException) { } - - protected DestinationAlreadyExistsException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } } } diff --git a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs index 178ce7a0f..07c878c04 100644 --- a/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs +++ b/src/NzbDrone.Common/EnvironmentInfo/AppFolderFactory.cs @@ -75,6 +75,17 @@ namespace NzbDrone.Common.EnvironmentInfo { try { + if (OsInfo.IsOsx) + { + var userAppDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.DoNotVerify), ".config", "Prowlarr"); + + if (_diskProvider.FolderExists(userAppDataFolder) && !_diskProvider.FileExists(_appFolderInfo.GetConfigPath())) + { + _diskTransferService.MirrorFolder(userAppDataFolder, _appFolderInfo.AppDataFolder); + _diskProvider.DeleteFolder(userAppDataFolder, true); + } + } + var oldDbFile = Path.Combine(_appFolderInfo.AppDataFolder, "nzbdrone.db"); if (_startupContext.Args.ContainsKey(StartupContext.APPDATA)) @@ -115,7 +126,7 @@ namespace NzbDrone.Common.EnvironmentInfo catch (Exception ex) { _logger.Debug(ex, ex.Message); - throw new ProwlarrStartupException("Unable to migrate DB from nzbdrone.db to {0}. Migrate manually", _appFolderInfo.GetDatabase()); + throw new ProwlarrStartupException(ex, "Unable to migrate DB from nzbdrone.db to {0}. Migrate manually", _appFolderInfo.GetDatabase()); } } diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index d90f7738e..322f746c0 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -1,25 +1,25 @@  - net6.0 + net8.0 ISMUSL - - + + - - - + + + - + - + diff --git a/src/NzbDrone.Console/Prowlarr.Console.csproj b/src/NzbDrone.Console/Prowlarr.Console.csproj index a1e85f4d6..e53204bc6 100644 --- a/src/NzbDrone.Console/Prowlarr.Console.csproj +++ b/src/NzbDrone.Console/Prowlarr.Console.csproj @@ -1,7 +1,7 @@ Exe - net6.0 + net8.0 ..\NzbDrone.Host\Prowlarr.ico diff --git a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj index 13bc15cbc..ce5633e63 100644 --- a/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/Prowlarr.Core.Test.csproj @@ -1,9 +1,9 @@  - net6.0 + net8.0 - + diff --git a/src/NzbDrone.Core/Prowlarr.Core.csproj b/src/NzbDrone.Core/Prowlarr.Core.csproj index 50fdb89e8..5e062947c 100644 --- a/src/NzbDrone.Core/Prowlarr.Core.csproj +++ b/src/NzbDrone.Core/Prowlarr.Core.csproj @@ -1,26 +1,26 @@  - net6.0 + net8.0 - - - - + + + + - + - + - + - + diff --git a/src/NzbDrone.Host.Test/Prowlarr.Host.Test.csproj b/src/NzbDrone.Host.Test/Prowlarr.Host.Test.csproj index 6e9231a1a..8d7fa3773 100644 --- a/src/NzbDrone.Host.Test/Prowlarr.Host.Test.csproj +++ b/src/NzbDrone.Host.Test/Prowlarr.Host.Test.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 diff --git a/src/NzbDrone.Host/Prowlarr.Host.csproj b/src/NzbDrone.Host/Prowlarr.Host.csproj index 4eb549ced..0ccd00256 100644 --- a/src/NzbDrone.Host/Prowlarr.Host.csproj +++ b/src/NzbDrone.Host/Prowlarr.Host.csproj @@ -1,12 +1,12 @@  - net6.0 + net8.0 Library - - - + + + diff --git a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj index a6f817f63..c83f6de4f 100644 --- a/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj +++ b/src/NzbDrone.Integration.Test/Prowlarr.Integration.Test.csproj @@ -1,10 +1,10 @@  - net6.0 + net8.0 Library - + diff --git a/src/NzbDrone.Libraries.Test/Prowlarr.Libraries.Test.csproj b/src/NzbDrone.Libraries.Test/Prowlarr.Libraries.Test.csproj index e905dd74d..2ba38c9f2 100644 --- a/src/NzbDrone.Libraries.Test/Prowlarr.Libraries.Test.csproj +++ b/src/NzbDrone.Libraries.Test/Prowlarr.Libraries.Test.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 diff --git a/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj b/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj index 6d2d1a18d..554e12664 100644 --- a/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj +++ b/src/NzbDrone.Mono.Test/Prowlarr.Mono.Test.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 diff --git a/src/NzbDrone.Mono/Prowlarr.Mono.csproj b/src/NzbDrone.Mono/Prowlarr.Mono.csproj index 46d7dabc8..877810c31 100644 --- a/src/NzbDrone.Mono/Prowlarr.Mono.csproj +++ b/src/NzbDrone.Mono/Prowlarr.Mono.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 true diff --git a/src/NzbDrone.SignalR/Prowlarr.SignalR.csproj b/src/NzbDrone.SignalR/Prowlarr.SignalR.csproj index b33b66994..6c6a22776 100644 --- a/src/NzbDrone.SignalR/Prowlarr.SignalR.csproj +++ b/src/NzbDrone.SignalR/Prowlarr.SignalR.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 Library diff --git a/src/NzbDrone.Test.Common/NzbDroneRunner.cs b/src/NzbDrone.Test.Common/NzbDroneRunner.cs index 5339fe13f..2b2196482 100644 --- a/src/NzbDrone.Test.Common/NzbDroneRunner.cs +++ b/src/NzbDrone.Test.Common/NzbDroneRunner.cs @@ -55,7 +55,7 @@ namespace NzbDrone.Test.Common if (BuildInfo.IsDebug) { - var frameworkFolder = "net6.0"; + var frameworkFolder = "net8.0"; Start(Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "_output", frameworkFolder, consoleExe)); } else diff --git a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj index 59dcf031a..477c0e101 100644 --- a/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj +++ b/src/NzbDrone.Test.Common/Prowlarr.Test.Common.csproj @@ -1,12 +1,12 @@  - net6.0 + net8.0 - + diff --git a/src/NzbDrone.Test.Dummy/Prowlarr.Test.Dummy.csproj b/src/NzbDrone.Test.Dummy/Prowlarr.Test.Dummy.csproj index 1ead72088..cd894cc15 100644 --- a/src/NzbDrone.Test.Dummy/Prowlarr.Test.Dummy.csproj +++ b/src/NzbDrone.Test.Dummy/Prowlarr.Test.Dummy.csproj @@ -1,6 +1,6 @@ Exe - net6.0 + net8.0 \ No newline at end of file diff --git a/src/NzbDrone.Update.Test/Prowlarr.Update.Test.csproj b/src/NzbDrone.Update.Test/Prowlarr.Update.Test.csproj index 448d0869e..359c5e98e 100644 --- a/src/NzbDrone.Update.Test/Prowlarr.Update.Test.csproj +++ b/src/NzbDrone.Update.Test/Prowlarr.Update.Test.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 diff --git a/src/NzbDrone.Update/Prowlarr.Update.csproj b/src/NzbDrone.Update/Prowlarr.Update.csproj index 2d2812f00..8a8af494e 100644 --- a/src/NzbDrone.Update/Prowlarr.Update.csproj +++ b/src/NzbDrone.Update/Prowlarr.Update.csproj @@ -1,12 +1,12 @@  WinExe - net6.0 + net8.0 - + diff --git a/src/NzbDrone.Windows.Test/Prowlarr.Windows.Test.csproj b/src/NzbDrone.Windows.Test/Prowlarr.Windows.Test.csproj index 632293b92..36d9e2855 100644 --- a/src/NzbDrone.Windows.Test/Prowlarr.Windows.Test.csproj +++ b/src/NzbDrone.Windows.Test/Prowlarr.Windows.Test.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 diff --git a/src/NzbDrone.Windows/Prowlarr.Windows.csproj b/src/NzbDrone.Windows/Prowlarr.Windows.csproj index e4407e1cd..4f1f1834c 100644 --- a/src/NzbDrone.Windows/Prowlarr.Windows.csproj +++ b/src/NzbDrone.Windows/Prowlarr.Windows.csproj @@ -1,10 +1,10 @@  - net6.0 + net8.0 true - + diff --git a/src/NzbDrone/Prowlarr.csproj b/src/NzbDrone/Prowlarr.csproj index ca6227e15..767207008 100644 --- a/src/NzbDrone/Prowlarr.csproj +++ b/src/NzbDrone/Prowlarr.csproj @@ -1,14 +1,14 @@  WinExe - net6.0-windows + net8.0-windows win-x64;win-x86 true ..\NzbDrone.Host\Prowlarr.ico true - + diff --git a/src/Prowlarr.Api.V1.Test/Prowlarr.Api.V1.Test.csproj b/src/Prowlarr.Api.V1.Test/Prowlarr.Api.V1.Test.csproj index 0c72fa8ca..eec930286 100644 --- a/src/Prowlarr.Api.V1.Test/Prowlarr.Api.V1.Test.csproj +++ b/src/Prowlarr.Api.V1.Test/Prowlarr.Api.V1.Test.csproj @@ -1,6 +1,6 @@  - net6.0 + net8.0 diff --git a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs index 4ee129caf..656037ca5 100644 --- a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs +++ b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs @@ -341,7 +341,7 @@ namespace NzbDrone.Api.V1.Indexers { if (!HttpContext.Response.Headers.ContainsKey("Retry-After") && retryAfterSeconds > 0) { - HttpContext.Response.Headers.Add("Retry-After", $"{retryAfterSeconds}"); + HttpContext.Response.Headers.Append("Retry-After", $"{retryAfterSeconds}"); } } diff --git a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj index 49878d538..2cd6c5172 100644 --- a/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj +++ b/src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj @@ -1,10 +1,10 @@  - net6.0 + net8.0 - + diff --git a/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj b/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj index 1559caafc..260fdafec 100644 --- a/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj +++ b/src/Prowlarr.Benchmark.Test/Prowlarr.Benchmark.Test.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 false diff --git a/src/Prowlarr.Http/Authentication/ApiKeyAuthenticationHandler.cs b/src/Prowlarr.Http/Authentication/ApiKeyAuthenticationHandler.cs index eda470c4c..d39a57c7d 100644 --- a/src/Prowlarr.Http/Authentication/ApiKeyAuthenticationHandler.cs +++ b/src/Prowlarr.Http/Authentication/ApiKeyAuthenticationHandler.cs @@ -28,9 +28,8 @@ namespace Prowlarr.Http.Authentication public ApiKeyAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, - ISystemClock clock, IConfigFileProvider config) - : base(options, logger, encoder, clock) + : base(options, logger, encoder) { _apiKey = config.ApiKey; } diff --git a/src/Prowlarr.Http/Authentication/BasicAuthenticationHandler.cs b/src/Prowlarr.Http/Authentication/BasicAuthenticationHandler.cs index 0ff574654..765551e5c 100644 --- a/src/Prowlarr.Http/Authentication/BasicAuthenticationHandler.cs +++ b/src/Prowlarr.Http/Authentication/BasicAuthenticationHandler.cs @@ -6,6 +6,7 @@ using System.Text.Encodings.Web; using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NzbDrone.Common.EnvironmentInfo; @@ -20,9 +21,8 @@ namespace Prowlarr.Http.Authentication public BasicAuthenticationHandler(IAuthenticationService authService, IOptionsMonitor options, ILoggerFactory logger, - UrlEncoder encoder, - ISystemClock clock) - : base(options, logger, encoder, clock) + UrlEncoder encoder) + : base(options, logger, encoder) { _authService = authService; } @@ -71,7 +71,7 @@ namespace Prowlarr.Http.Authentication protected override Task HandleChallengeAsync(AuthenticationProperties properties) { - Response.Headers.Add("WWW-Authenticate", $"Basic realm=\"{BuildInfo.AppName}\""); + Response.Headers.Append("WWW-Authenticate", $"Basic realm=\"{BuildInfo.AppName}\""); Response.StatusCode = 401; return Task.CompletedTask; } diff --git a/src/Prowlarr.Http/Authentication/NoAuthenticationHandler.cs b/src/Prowlarr.Http/Authentication/NoAuthenticationHandler.cs index 9b5cae860..4c023b67e 100644 --- a/src/Prowlarr.Http/Authentication/NoAuthenticationHandler.cs +++ b/src/Prowlarr.Http/Authentication/NoAuthenticationHandler.cs @@ -13,9 +13,8 @@ namespace Prowlarr.Http.Authentication { public NoAuthenticationHandler(IOptionsMonitor options, ILoggerFactory logger, - UrlEncoder encoder, - ISystemClock clock) - : base(options, logger, encoder, clock) + UrlEncoder encoder) + : base(options, logger, encoder) { } diff --git a/src/Prowlarr.Http/Middleware/VersionMiddleware.cs b/src/Prowlarr.Http/Middleware/VersionMiddleware.cs index 61c990f59..140d085fb 100644 --- a/src/Prowlarr.Http/Middleware/VersionMiddleware.cs +++ b/src/Prowlarr.Http/Middleware/VersionMiddleware.cs @@ -22,7 +22,7 @@ namespace Prowlarr.Http.Middleware { if (context.Request.IsApiRequest() && !context.Response.Headers.ContainsKey(VERSIONHEADER)) { - context.Response.Headers.Add(VERSIONHEADER, _version); + context.Response.Headers.Append(VERSIONHEADER, _version); } await _next(context); diff --git a/src/Prowlarr.Http/Prowlarr.Http.csproj b/src/Prowlarr.Http/Prowlarr.Http.csproj index 39bf131f8..fe5862887 100644 --- a/src/Prowlarr.Http/Prowlarr.Http.csproj +++ b/src/Prowlarr.Http/Prowlarr.Http.csproj @@ -1,11 +1,11 @@  - net6.0 + net8.0 - - + + diff --git a/src/Prowlarr.Http/REST/RestController.cs b/src/Prowlarr.Http/REST/RestController.cs index 3ec48b75f..3d5348ed8 100644 --- a/src/Prowlarr.Http/REST/RestController.cs +++ b/src/Prowlarr.Http/REST/RestController.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Reflection; using FluentValidation; using FluentValidation.Results; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; @@ -89,7 +90,7 @@ namespace Prowlarr.Http.REST if (controllerAttributes.Any(x => x.AttributeType == DEPRECATED_ATTRIBUTE) || attributes.Any(x => x.AttributeType == DEPRECATED_ATTRIBUTE)) { _logger.Warn("API call made to deprecated endpoint from {0}", Request.Headers.UserAgent.ToString()); - Response.Headers.Add("Deprecation", "true"); + Response.Headers.Append("Deprecation", "true"); } base.OnActionExecuting(context); diff --git a/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj b/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj index 21e3125e0..79a732c2f 100644 --- a/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj +++ b/src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj @@ -1,7 +1,7 @@  WinExe - net6.0 + net8.0 diff --git a/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj b/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj index 21e3125e0..79a732c2f 100644 --- a/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj +++ b/src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj @@ -1,7 +1,7 @@  WinExe - net6.0 + net8.0 diff --git a/test.sh b/test.sh index a917ecbdf..202942e32 100755 --- a/test.sh +++ b/test.sh @@ -37,11 +37,14 @@ fi if [ "$PLATFORM" = "Windows" ]; then mkdir -p "$ProgramData/Prowlarr" WHERE="$WHERE&Category!=LINUX" -elif [ "$PLATFORM" = "Linux" ] || [ "$PLATFORM" = "Mac" ] ; then +elif [ "$PLATFORM" = "Linux" ]; then mkdir -p ~/.config/Prowlarr WHERE="$WHERE&Category!=WINDOWS" +elif [ "$PLATFORM" = "Mac" ]; then + mkdir -p ~/Library/Application\ Support/Prowlarr + WHERE="$WHERE&Category!=WINDOWS" else - echo "Platform must be provided as first arguement: Windows, Linux or Mac" + echo "Platform must be provided as first argument: Windows, Linux or Mac" exit 1 fi diff --git a/yarn.lock b/yarn.lock index cec16a2db..a77960944 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1229,14 +1229,14 @@ resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== -"@microsoft/signalr@6.0.25": - version "6.0.25" - resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-6.0.25.tgz#009f043066d383e2de41a483bd7e02bfd74d3cf8" - integrity sha512-8AzrpxS+E0yn1tXSlv7+UlURLmSxTQDgbvOT0pGKXjZT7MkhnDP+/GLuk7veRtUjczou/x32d9PHhYlr2NBy6Q== +"@microsoft/signalr@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@microsoft/signalr/-/signalr-8.0.0.tgz#cb1412e88e0527f40da9178fefc27a65c3ddeab0" + integrity sha512-K/wS/VmzRWePCGqGh8MU8OWbS1Zvu7DG7LSJS62fBB8rJUXwwj4axQtqrAAwKGUZHQF6CuteuQR9xMsVpM2JNA== dependencies: abort-controller "^3.0.0" - eventsource "^1.0.7" - fetch-cookie "^0.11.0" + eventsource "^2.0.2" + fetch-cookie "^2.0.3" node-fetch "^2.6.7" ws "^7.4.5" @@ -3423,10 +3423,10 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@^1.0.7: - version "1.1.2" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.2.tgz#bc75ae1c60209e7cb1541231980460343eaea7c2" - integrity sha512-xAH3zWhgO2/3KIniEKYPr8plNSzlGINOUqYj0m0u7AB81iRw8b/3E73W6AuU+6klLbaSFmZnaETQ2lXPfAydrA== +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== extend-shallow@^1.1.2: version "1.1.4" @@ -3495,12 +3495,13 @@ faye-websocket@~0.10.0: dependencies: websocket-driver ">=0.5.1" -fetch-cookie@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407" - integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA== +fetch-cookie@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.2.0.tgz#01086b6b5b1c3e08f15ffd8647b02ca100377365" + integrity sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ== dependencies: - tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0" + set-cookie-parser "^2.4.8" + tough-cookie "^4.0.0" file-entry-cache@^6.0.1: version "6.0.1" @@ -6278,6 +6279,11 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" +set-cookie-parser@^2.4.8: + version "2.6.0" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" + integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -6812,7 +6818,7 @@ to-space-case@^1.0.0: dependencies: to-no-case "^1.0.0" -"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0": +tough-cookie@^4.0.0: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==