diff --git a/.github/workflows/backendtests.yml b/.github/workflows/backendtests.yml index 7591a0a8f..52ae0ec5a 100644 --- a/.github/workflows/backendtests.yml +++ b/.github/workflows/backendtests.yml @@ -269,11 +269,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -309,11 +309,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -347,11 +347,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -386,11 +386,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -424,11 +424,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -463,11 +463,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -500,11 +500,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -540,11 +540,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -579,11 +579,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -613,11 +613,11 @@ jobs: - ubuntu-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -646,11 +646,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -684,11 +684,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -720,11 +720,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -758,11 +758,11 @@ jobs: # - macos-latest # steps: # - name: Set up .NET - # uses: actions/setup-dotnet@v4 + # uses: actions/setup-dotnet@v5 # with: # dotnet-version: 10.x # - name: Checkout source - # uses: actions/checkout@v4 + # uses: actions/checkout@v7 # - name: Restore NuGet dependencies # run: >- # dotnet restore @@ -794,11 +794,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -831,11 +831,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -869,11 +869,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -910,11 +910,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore diff --git a/.github/workflows/build-packages.yml b/.github/workflows/build-packages.yml index cd31002db..294c876d3 100644 --- a/.github/workflows/build-packages.yml +++ b/.github/workflows/build-packages.yml @@ -19,12 +19,12 @@ jobs: steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Create dummy changelog file working-directory: ./ReleaseBuilder @@ -41,6 +41,6 @@ jobs: # selenium: # runs-on: ubuntu-latest # steps: - # - uses: actions/checkout@v4 + # - uses: actions/checkout@v7 # - name: Selenium # run: pipeline/selenium/test.sh diff --git a/.github/workflows/secretprovidertests.yml b/.github/workflows/secretprovidertests.yml index a0cdcf7b2..119358752 100644 --- a/.github/workflows/secretprovidertests.yml +++ b/.github/workflows/secretprovidertests.yml @@ -89,11 +89,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -122,11 +122,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -157,11 +157,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -192,11 +192,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -227,11 +227,11 @@ jobs: - macos-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore @@ -252,11 +252,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: >- dotnet restore diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 0ec48e7d0..567da4972 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: issues: write actions: write steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: days-before-issue-stale: 15 days-before-issue-close: 15 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 19edc83c2..1daecfc32 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,12 +19,12 @@ jobs: steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: dotnet restore Duplicati.slnx @@ -49,12 +49,12 @@ jobs: steps: - name: Set up .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - name: Checkout source - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Restore NuGet dependencies run: dotnet restore Duplicati.slnx @@ -71,13 +71,13 @@ jobs: name: Playwright UI tests runs-on: ubuntu-latest steps: - - uses: actions/setup-dotnet@v4 + - uses: actions/setup-dotnet@v5 with: dotnet-version: 10.x - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 20 - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - name: Install NPM dependencies run: npm ci - name: Install Playwright browsers @@ -112,7 +112,7 @@ jobs: - name: Upload Playwright test results on failure if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: playwright-test-results path: | @@ -123,7 +123,7 @@ jobs: - name: Upload Playwright HTML report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: playwright-html-report path: playwright-report/ diff --git a/Duplicati/CommandLine/CLI/Commands.cs b/Duplicati/CommandLine/CLI/Commands.cs index b2376a3ec..f8e4f4892 100644 --- a/Duplicati/CommandLine/CLI/Commands.cs +++ b/Duplicati/CommandLine/CLI/Commands.cs @@ -498,6 +498,17 @@ namespace Duplicati.CommandLine return 0; } + public static int Find(TextWriter outwriter, Action setup, List args, Dictionary options, Library.Utility.IFilter filter) + { + // Unlike "list" (which shows only the newest version by default), "find" searches every + // backup version, so a file is located regardless of which version it appears in. + // Respect an explicit --all-versions / --version / --time supplied by the user. + if (!options.ContainsKey("all-versions") && !options.ContainsKey("version") && !options.ContainsKey("time")) + options["all-versions"] = "true"; + + return List(outwriter, setup, args, options, filter); + } + public static int List(TextWriter outwriter, Action setup, List args, Dictionary options, Library.Utility.IFilter filter) { filter = filter ?? new Duplicati.Library.Utility.FilterExpression(); diff --git a/Duplicati/CommandLine/CLI/Program.cs b/Duplicati/CommandLine/CLI/Program.cs index 4886e856f..59b36a95d 100644 --- a/Duplicati/CommandLine/CLI/Program.cs +++ b/Duplicati/CommandLine/CLI/Program.cs @@ -76,7 +76,7 @@ namespace Duplicati.CommandLine ["help"] = Commands.Help, ["example"] = Commands.Examples, ["examples"] = Commands.Examples, - ["find"] = Commands.List, + ["find"] = Commands.Find, ["list"] = Commands.List, ["list-filesets"] = Commands.ListFilesets, ["list-folder-content"] = Commands.ListFolderContent, @@ -107,7 +107,7 @@ namespace Duplicati.CommandLine ["readlockinfo"] = Commands.ReadLockInfo, ["system-info"] = Commands.SystemInfo, ["systeminfo"] = Commands.SystemInfo, - ["send-mail"] = Commands.SendMail, + ["send-mail"] = Commands.SendMail, ["sync"] = Commands.Sync }; @@ -393,15 +393,25 @@ namespace Duplicati.CommandLine foreach (KeyValuePair keyvalue in opt) options[keyvalue.Key] = keyvalue.Value; + var command = cargs.Count >= 1 ? cargs[0] : string.Empty; + var isBackup = command.Equals("backup", StringComparison.OrdinalIgnoreCase); + var isTestFilters = command.Equals("test-filters", StringComparison.OrdinalIgnoreCase) + || command.Equals("test-filter", StringComparison.OrdinalIgnoreCase); + if (!string.IsNullOrEmpty(newtarget)) { - if (cargs.Count <= 1) + // test-filters takes source paths as positional arguments and has no target, so a + // --target from the parameters file must not become a bogus positional source (#4812). + if (isTestFilters) + Library.Logging.Log.WriteVerboseMessage(LOGTAG, "NotUsingTarget", Strings.Program.SkippingTargetArgumentOnTestFilters); + else if (cargs.Count <= 1) cargs.Add(newtarget); else cargs[1] = newtarget; } - if (cargs.Count >= 1 && cargs[0].Equals("backup", StringComparison.OrdinalIgnoreCase)) + // backup and test-filters take source paths as positional arguments. + if (isBackup || isTestFilters) cargs.AddRange(newsource); else if (newsource.Count > 0) Library.Logging.Log.WriteVerboseMessage(LOGTAG, "NotUsingBackupSources", Strings.Program.SkippingSourceArgumentsOnNonBackupOperation); diff --git a/Duplicati/CommandLine/CLI/Strings.cs b/Duplicati/CommandLine/CLI/Strings.cs index b8cab8695..2b0befbe9 100644 --- a/Duplicati/CommandLine/CLI/Strings.cs +++ b/Duplicati/CommandLine/CLI/Strings.cs @@ -54,6 +54,7 @@ namespace Duplicati.CommandLine.Strings public static string QuietConsoleOptionLong { get { return LC.L(@"If this option is set, progress reports and other messages that would normally go to the console will be redirected to the log."); } } public static string QuietConsoleOptionShort { get { return LC.L(@"Disable console output"); } } public static string SkippingSourceArgumentsOnNonBackupOperation { get { return @"The --source argument was specified in the parameter file, but the current operation is not a backup operation, so the argument is ignored."; } } + public static string SkippingTargetArgumentOnTestFilters { get { return @"The --target argument was specified in the parameter file, but the test-filters operation has no target, so the argument is ignored."; } } public static string AutoUpdateOptionShort { get { return LC.L(@"Toggle automatic updates"); } } public static string AutoUpdateOptionLong { get { return LC.L(@"Set this option if you prefer to have the commandline version automatically update"); } } public static string PortableModeOptionShort { get { return LC.L(@"Use portable mode"); } } diff --git a/Duplicati/CommandLine/CLI/help.txt b/Duplicati/CommandLine/CLI/help.txt index 815996de9..5956711ce 100644 --- a/Duplicati/CommandLine/CLI/help.txt +++ b/Duplicati/CommandLine/CLI/help.txt @@ -103,7 +103,7 @@ Usage: %CLI_EXE% backup "" [] Usage: %CLI_EXE% find [""] [] - Finds specific files in specific backups. If is specified, all occurrences of in the backup are listed. can contain * and ? as wildcards. File names in [brackets] are interpreted as regular expression. Latest backup is searched by default. If entire path is specified, all available versions of the file are listed. If no is specified, a list of all available backups is shown. + Finds specific files in specific backups. If is specified, all occurrences of in the backup are listed. can contain * and ? as wildcards. File names in [brackets] are interpreted as regular expression. The "find" command searches all backup versions by default, while "list" shows only the latest version by default (use --all-versions with "list" to search every version). If no is specified, a list of all available backups is shown. --time=