diff --git a/src/Recyclarr.Tests/Command/Initialization/Init/InitializeAppDataPathTest.cs b/src/Recyclarr.Tests/Command/Initialization/Init/InitializeAppDataPathTest.cs new file mode 100644 index 00000000..f1e6ed07 --- /dev/null +++ b/src/Recyclarr.Tests/Command/Initialization/Init/InitializeAppDataPathTest.cs @@ -0,0 +1,37 @@ +using AutoFixture.NUnit3; +using NSubstitute; +using NUnit.Framework; +using Recyclarr.Command; +using Recyclarr.Command.Initialization.Init; +using TestLibrary.AutoFixture; +using TrashLib; + +namespace Recyclarr.Tests.Command.Initialization.Init; + +[TestFixture] +[Parallelizable(ParallelScope.All)] +public class InitializeAppDataPathTest +{ + [Test, AutoMockData] + public void Do_not_override_path_if_null( + [Frozen] IAppPaths paths, + SonarrCommand cmd, + InitializeAppDataPath sut) + { + sut.Initialize(cmd); + + paths.DidNotReceiveWithAnyArgs().SetAppDataPath(default!); + } + + [Test, AutoMockData] + public void Override_path_if_not_null( + [Frozen] IAppPaths paths, + SonarrCommand cmd, + InitializeAppDataPath sut) + { + cmd.AppDataDirectory = "path"; + sut.Initialize(cmd); + + paths.Received().SetAppDataPath("path"); + } +} diff --git a/src/Recyclarr/Command/Initialization/Init/InitializeAppDataPath.cs b/src/Recyclarr/Command/Initialization/Init/InitializeAppDataPath.cs new file mode 100644 index 00000000..a858a5e8 --- /dev/null +++ b/src/Recyclarr/Command/Initialization/Init/InitializeAppDataPath.cs @@ -0,0 +1,27 @@ +using System.IO.Abstractions; +using TrashLib; + +namespace Recyclarr.Command.Initialization.Init; + +public class InitializeAppDataPath : IServiceInitializer +{ + private readonly IFileSystem _fs; + private readonly IAppPaths _paths; + + public InitializeAppDataPath(IFileSystem fs, IAppPaths paths) + { + _fs = fs; + _paths = paths; + } + + public void Initialize(ServiceCommand cmd) + { + if (string.IsNullOrEmpty(cmd.AppDataDirectory)) + { + return; + } + + _fs.Directory.CreateDirectory(cmd.AppDataDirectory); + _paths.SetAppDataPath(cmd.AppDataDirectory); + } +} diff --git a/src/Recyclarr/Command/Initialization/InitializationAutofacModule.cs b/src/Recyclarr/Command/Initialization/InitializationAutofacModule.cs index 0823c673..d9dc2e09 100644 --- a/src/Recyclarr/Command/Initialization/InitializationAutofacModule.cs +++ b/src/Recyclarr/Command/Initialization/InitializationAutofacModule.cs @@ -14,6 +14,7 @@ public class InitializationAutofacModule : Module // Initialization Services builder.RegisterTypes( + typeof(InitializeAppDataPath), typeof(ServiceInitializer), typeof(ServicePreInitializer)) .As() diff --git a/src/Recyclarr/Command/ServiceCommand.cs b/src/Recyclarr/Command/ServiceCommand.cs index 108d4fac..a321ded0 100644 --- a/src/Recyclarr/Command/ServiceCommand.cs +++ b/src/Recyclarr/Command/ServiceCommand.cs @@ -23,7 +23,12 @@ public abstract class ServiceCommand : ICommand, IServiceCommand "If not specified, the script will look for `recyclarr.yml` in the same directory as the executable.")] public ICollection Config { get; [UsedImplicitly] set; } = new List(); - public abstract string CacheStoragePath { get; protected init; } + [CommandOption("app-data", Description = + "Explicitly specify the location of the recyclarr application data directory. " + + "Mainly for usage in Docker; not recommended for normal use.")] + public string? AppDataDirectory { get; [UsedImplicitly] set; } + + public abstract string CacheStoragePath { get; [UsedImplicitly] protected init; } public abstract string Name { get; } protected ServiceCommand(IServiceInitializationAndCleanup init) diff --git a/src/TrashLib/Repo/RepoUpdater.cs b/src/TrashLib/Repo/RepoUpdater.cs index 55a96f67..ef56ce6b 100644 --- a/src/TrashLib/Repo/RepoUpdater.cs +++ b/src/TrashLib/Repo/RepoUpdater.cs @@ -9,6 +9,7 @@ namespace TrashLib.Repo; public class RepoUpdater : IRepoUpdater { private readonly ILogger _log; + private readonly IAppPaths _paths; private readonly IGitRepositoryFactory _repositoryFactory; private readonly IFileUtilities _fileUtils; private readonly ISettingsProvider _settingsProvider; @@ -21,13 +22,13 @@ public class RepoUpdater : IRepoUpdater ISettingsProvider settingsProvider) { _log = log; + _paths = paths; _repositoryFactory = repositoryFactory; _fileUtils = fileUtils; _settingsProvider = settingsProvider; - RepoPath = paths.RepoDirectory; } - public string RepoPath { get; } + public string RepoPath => _paths.RepoDirectory; public void UpdateRepo() {