Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Add lifecycle hooks to file targets#6215

Open
Dave-Senn wants to merge 28 commits into
NLog:devNLog/NLog:devfrom
Dave-Senn:hooksDave-Senn/NLog:hooksCopy head branch name to clipboard
Open

Add lifecycle hooks to file targets#6215
Dave-Senn wants to merge 28 commits into
NLog:devNLog/NLog:devfrom
Dave-Senn:hooksDave-Senn/NLog:hooksCopy head branch name to clipboard

Conversation

@Dave-Senn

Copy link
Copy Markdown

PR for #6213

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: bc296fb8-7ca8-4d01-b0e1-4192da09422c

📥 Commits

Reviewing files that changed from the base of the PR and between 5d832f3 and 858df30.

📒 Files selected for processing (1)
  • tests/NLog.UnitTests/Targets/FileTargetTests.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/NLog.UnitTests/Targets/FileTargetTests.cs

Walkthrough

Adds FileLifecycleHooks and wires optional lifecycle callbacks into FileTarget and archive deletion. A new test double verifies callback order and error handling. A separate test update expands the accepted process-name variants.

Changes

File lifecycle hooks feature

Layer / File(s) Summary
FileLifecycleHooks contract
src/NLog/Targets/FileLifecycleHooks.cs
Adds the new FileLifecycleHooks public abstract class with five overridable callbacks; OnFileOpened returns the provided stream by default.
FileTarget hook wiring
src/NLog/Targets/FileTarget.cs, src/NLog/Targets/FileArchiveHandlers/BaseFileArchiveHandler.cs
Adds the optional hook field and constructor, invokes the lifecycle callbacks at initialize/close/open/delete points with guarded logging, renames the internal archive-delete helper, and updates the archive handler callsite.
FileTarget lifecycle tests
tests/NLog.UnitTests/Targets/FileTargetTests.cs
Adds tests for callback ordering and exception handling, plus MockFileLifecycleHooks; also includes the small test-file cleanup and AutoFlushTest condition adjustment.

Process name renderer test update

Layer / File(s) Summary
Allowed process names
tests/NLog.UnitTests/LayoutRenderers/ProcessNameLayoutRendererTests.cs
Expands the allowed process-name variants and updates the assertion message to use the lowercased rendered value.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped through hooks from dawn to dusk,
A stream could switch, a file could husk.
Close, delete, and open sang in tune,
Then process names got one more rune.
Tiny paws approve this tidy trail,
With callback bells that do not fail.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.59% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding lifecycle hooks to file targets.
Description check ✅ Passed The description is related to the changeset by referencing the issue this PR implements.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Dave-Senn
Dave-Senn marked this pull request as ready for review June 11, 2026 09:42

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (3)
src/NLog/Targets/FileLifecycleHooks.cs (1)

87-93: ⚡ Quick win

Add XML documentation for the return value.

The <returns> XML documentation tag is missing for the CreateLinkedHooks method.

📝 Suggested documentation addition
 /// Creates a linked hook combining the current and given <see cref="FileLifecycleHooks"/>.
 /// </summary>
 /// <param name="hooks">Hooks to link with current <see cref="FileLifecycleHooks"/>. Methods on <paramref name="hooks"/> will be invoked after the current <see cref="FileLifecycleHooks"/> methods.</param>
-/// <returns></returns>
+/// <returns>A new <see cref="LinkedFileLifecycleHooks"/> that invokes both hook instances in sequence.</returns>
 public FileLifecycleHooks CreateLinkedHooks(FileLifecycleHooks hooks) =>
     new LinkedFileLifecycleHooks(this, hooks);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/NLog/Targets/FileLifecycleHooks.cs` around lines 87 - 93, The
CreateLinkedHooks method lacks a <returns> XML doc; update the XML documentation
for the CreateLinkedHooks(FileLifecycleHooks hooks) method to include a
<returns> tag that clearly states it returns a new LinkedFileLifecycleHooks
instance that links the current FileLifecycleHooks with the provided hooks
(methods on the provided hooks will be invoked after the current ones),
referencing LinkedFileLifecycleHooks and FileLifecycleHooks in the description.
tests/NLog.UnitTests/Targets/FileTargetTests.cs (1)

150-184: ⚡ Quick win

Strengthen error-path verification by asserting log output was still written.

Hooks_ErrorHandlingTest validates callback recording, but it should also assert that writing still succeeded when hooks throw.

Suggested test addition
 LogManager.Configuration = null;    // Flush

+Assert.True(new FileInfo(logFile).Length > 0);
+
 var expected = new List<string>
 {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/NLog.UnitTests/Targets/FileTargetTests.cs` around lines 150 - 184, The
test Hooks_ErrorHandlingTest currently only asserts the hook callback sequence;
enhance it to also verify that the log entry was actually written despite hooks
throwing by reading the temporary logFile (after the existing flush:
LogManager.Configuration = null) and asserting the file contains the expected
logged text (e.g., "ccc" or the formatted log line); update the method to use
the existing logFile and callRecording variables and add a final assertion like
Assert.Contains("ccc", File.ReadAllText(logFile)) before cleanup.
tests/NLog.UnitTests/Targets/LinkedFileLifecycleHooksTests.cs (1)

98-139: ⚡ Quick win

Extract shared test logic to eliminate duplication.

CreateLinkedHooks and VerifyChainedCalls share nearly identical test logic (lines 107-138 duplicate lines 64-95). The only difference is how the target hook chain is constructed (line 105 vs line 62).

Consider extracting the shared assertion logic into a helper method:

private void VerifyHookChaining(FileLifecycleHooks target, List<string> callRecording)
{
    target.OnFileDeleting("del.log");
    target.OnFileClosed("close.log");
    using (var stream = new MemoryStream())
    {
        var actualStream = target.OnFileOpened("open.log", stream);
        Assert.IsType<MockStream>(actualStream);
        Assert.Equal("hook_2", ((MockStream)actualStream).Name);
    }

    var expectedTarget = new FileTarget("my-file_1");
    target.OnTargetInitialize(expectedTarget);

    expectedTarget = new FileTarget("my-file_2");
    expectedTarget.Dispose();
    target.OnTargetClose(expectedTarget);

    var expected = new List<string>
    {
        "hook_1_OnFileDeleting_del.log",
        "hook_2_OnFileDeleting_del.log",
        "hook_1_OnFileClosed_close.log",
        "hook_2_OnFileClosed_close.log",
        "hook_1_OnFileOpened_open.log_stream",
        "hook_2_OnFileOpened_open.log_hook_1",
        "hook_1_OnTargetInitialize_my-file_1",
        "hook_2_OnTargetInitialize_my-file_1",
        "hook_1_OnTargetClose_my-file_2",
        "hook_2_OnTargetClose_my-file_2"
    };

    Assert.Equal(expected, callRecording);
}

Then both tests become:

[Fact]
public void VerifyChainedCalls()
{
    var callRecording = new List<string>();
    var first = new MockFileLifecycleHooks("hook_1", callRecording);
    var second = new MockFileLifecycleHooks("hook_2", callRecording);
    var target = new LinkedFileLifecycleHooks(first, second);
    
    VerifyHookChaining(target, callRecording);
}

[Fact]
public void CreateLinkedHooks()
{
    var callRecording = new List<string>();
    var first = new MockFileLifecycleHooks("hook_1", callRecording);
    var second = new MockFileLifecycleHooks("hook_2", callRecording);
    var target = first.CreateLinkedHooks(second);
    
    VerifyHookChaining(target, callRecording);
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/NLog.UnitTests/Targets/LinkedFileLifecycleHooksTests.cs` around lines
98 - 139, Tests CreateLinkedHooks and VerifyChainedCalls duplicate the same
sequence of actions and assertions; extract that shared logic into a private
helper (e.g., VerifyHookChaining(FileLifecycleHooks target, List<string>
callRecording)) that performs the
OnFileDeleting/OnFileClosed/OnFileOpened/OnTargetInitialize/OnTargetClose calls
and asserts the expected callRecording; then simplify both tests to construct
MockFileLifecycleHooks("hook_1", callRecording) and
MockFileLifecycleHooks("hook_2", callRecording) and call VerifyHookChaining with
either new LinkedFileLifecycleHooks(first, second) or
first.CreateLinkedHooks(second).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/NLog.sln.DotSettings`:
- Around line 2-3: The PR includes two ReSharper inspection settings (keys
BuiltInTypeReferenceStyle and BuiltInTypeReferenceStyleForMemberAccess) set to
DO_NOT_SHOW in src/NLog.sln.DotSettings that look accidental; either remove
those two <s:String> entries from the commit if they were pulled from your local
IDE, or replace them with a short commit message and PR description confirming
this is an intentional team-wide style change (and keep the entries). Locate the
entries by their keys
("/Default/CodeInspection/Highlighting/InspectionSeverities/=BuiltInTypeReferenceStyle/@EntryIndexedValue"
and
"/Default/CodeInspection/Highlighting/InspectionSeverities/=BuiltInTypeReferenceStyleForMemberAccess/@EntryIndexedValue")
and act accordingly.

In `@src/NLog.Targets.GZipFile/GZipFileTarget.cs`:
- Around line 65-71: The new GZipFileTarget(FileLifecycleHooks hooks)
constructor doesn't set ArchiveOldFileOnStartup to true, causing
InitializeTarget to throw NLogConfigurationException; update the constructor
(GZipFileTarget(FileLifecycleHooks hooks)) to initialize ArchiveOldFileOnStartup
= true (matching the parameterless GZipFileTarget()) so instances created via
this overload behave the same and won't fail during InitializeTarget.

In `@src/NLog/Targets/FileTarget.cs`:
- Around line 584-592: The hook catch blocks (e.g., the one around
Hooks.OnTargetInitialize and the similar blocks for OnTargetClose, OnFileClosed,
and OnFileOpened) currently swallow all Exception instances; update each catch
to preserve NLog’s fatal-exception behavior by invoking the same guard used
elsewhere (call ExceptionHelpers.MustBeRethrown(ex) or equivalent) and rethrow
when it returns true, otherwise log via InternalLogger.Error as today—apply this
pattern to the catch blocks for OnTargetInitialize, OnTargetClose, OnFileClosed
and OnFileOpened so fatal exceptions are not swallowed.
- Around line 1407-1418: The call to Hooks.OnFileOpened can return null and
currently overwrites the original FileStream, risking lost references and leaks;
modify the FileTarget logic to keep a reference to the original FileStream
(stream/originalStream), call var replacement = Hooks.OnFileOpened(filePath,
originalStream), then: if replacement is null, log a warning (use
InternalLogger.Warn/Error) and continue using originalStream; if replacement is
non-null and not the same instance, dispose/close the originalStream to avoid a
leak and use replacement; if replacement equals originalStream, just use it.
Also preserve the existing exception catch for hook throws
(FileLifecycleHooks.OnFileOpened, stream variable, Hooks).

---

Nitpick comments:
In `@src/NLog/Targets/FileLifecycleHooks.cs`:
- Around line 87-93: The CreateLinkedHooks method lacks a <returns> XML doc;
update the XML documentation for the CreateLinkedHooks(FileLifecycleHooks hooks)
method to include a <returns> tag that clearly states it returns a new
LinkedFileLifecycleHooks instance that links the current FileLifecycleHooks with
the provided hooks (methods on the provided hooks will be invoked after the
current ones), referencing LinkedFileLifecycleHooks and FileLifecycleHooks in
the description.

In `@tests/NLog.UnitTests/Targets/FileTargetTests.cs`:
- Around line 150-184: The test Hooks_ErrorHandlingTest currently only asserts
the hook callback sequence; enhance it to also verify that the log entry was
actually written despite hooks throwing by reading the temporary logFile (after
the existing flush: LogManager.Configuration = null) and asserting the file
contains the expected logged text (e.g., "ccc" or the formatted log line);
update the method to use the existing logFile and callRecording variables and
add a final assertion like Assert.Contains("ccc", File.ReadAllText(logFile))
before cleanup.

In `@tests/NLog.UnitTests/Targets/LinkedFileLifecycleHooksTests.cs`:
- Around line 98-139: Tests CreateLinkedHooks and VerifyChainedCalls duplicate
the same sequence of actions and assertions; extract that shared logic into a
private helper (e.g., VerifyHookChaining(FileLifecycleHooks target, List<string>
callRecording)) that performs the
OnFileDeleting/OnFileClosed/OnFileOpened/OnTargetInitialize/OnTargetClose calls
and asserts the expected callRecording; then simplify both tests to construct
MockFileLifecycleHooks("hook_1", callRecording) and
MockFileLifecycleHooks("hook_2", callRecording) and call VerifyHookChaining with
either new LinkedFileLifecycleHooks(first, second) or
first.CreateLinkedHooks(second).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5e4fa9f5-77d0-4bb7-928a-92fdcbc88e2c

📥 Commits

Reviewing files that changed from the base of the PR and between 819e835 and b65b115.

📒 Files selected for processing (11)
  • src/NLog.Targets.AtomicFile/AtomicFileTarget.cs
  • src/NLog.Targets.GZipFile/GZipFileTarget.cs
  • src/NLog.sln
  • src/NLog.sln.DotSettings
  • src/NLog/Targets/FileArchiveHandlers/BaseFileArchiveHandler.cs
  • src/NLog/Targets/FileLifecycleHooks.cs
  • src/NLog/Targets/FileTarget.cs
  • src/NLog/Targets/LinkedFileLifecycleHooks.cs
  • tests/NLog.Targets.AtomicFile.Tests/AtomicFileTests.cs
  • tests/NLog.UnitTests/Targets/FileTargetTests.cs
  • tests/NLog.UnitTests/Targets/LinkedFileLifecycleHooksTests.cs

Comment thread src/NLog.sln.DotSettings Outdated
Comment thread src/NLog.Targets.GZipFile/GZipFileTarget.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread src/NLog.Targets.AtomicFile/AtomicFileTarget.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread src/NLog/Targets/FileLifecycleHooks.cs Outdated
Comment thread src/NLog.Targets.AtomicFile/AtomicFileTarget.cs Outdated
Comment thread src/NLog.Targets.GZipFile/GZipFileTarget.cs Outdated
Comment thread src/NLog/Targets/FileLifecycleHooks.cs Outdated
Comment thread src/NLog/Targets/FileArchiveHandlers/BaseFileArchiveHandler.cs Outdated
Comment thread src/NLog/Targets/FileTarget.cs Outdated
Comment thread tests/NLog.UnitTests/Targets/FileTargetTests.cs Outdated
Comment thread tests/NLog.UnitTests/Targets/FileTargetTests.cs Outdated
Comment thread src/NLog/Targets/FileLifecycleHooks.cs Outdated
@snakefoot

snakefoot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

I guess those 2 additional comments suddenly exploded into a lot more. But thank you for your quick resolve. I'm happy about the result, and the Sonar-Report also looks good.

Do you have anything else that you want to add? And have you verified that the new FileTarget API provides what you need?

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/NLog/Targets/FileTarget.cs (1)

607-610: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve fatal-exception behavior in lifecycle hook catch blocks.

Line 607, Line 1015, Line 1039, and Line 1346 catch Exception and always continue. Add ExceptionMustBeRethrown(ex) guards before logging so fatal exceptions are not swallowed.

🛠️ Proposed fix pattern (apply to all four hook catch blocks)
 catch (Exception ex)
 {
+    if (ExceptionMustBeRethrown(ex))
+        throw;
     InternalLogger.Error(ex, "{0}: {1} hook threw an unexpected error", this, nameof(FileLifecycleHooks.OnTargetClose));
 }
 catch (Exception ex)
 {
+    if (ExceptionMustBeRethrown(ex))
+        throw;
     InternalLogger.Error(ex, "{0}: {1} hook threw an unexpected error for file '{2}'", this, nameof(FileLifecycleHooks.OnFileDeleting), filepath);
 }
 catch (Exception ex)
 {
+    if (ExceptionMustBeRethrown(ex))
+        throw;
     InternalLogger.Error(ex, "{0}: {1} hook threw an unexpected error for file '{2}'", this, nameof(FileLifecycleHooks.OnFileClosed), openFile.FileAppender.FilePath);
 }
 catch (Exception ex)
 {
+    if (ExceptionMustBeRethrown(ex))
+        throw;
     InternalLogger.Error(ex, "{0}: {1} hook threw an unexpected error for file '{2}'", this, nameof(FileLifecycleHooks.OnFileOpened), filePath);
 }

Also applies to: 1015-1018, 1039-1042, 1346-1349

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/NLog/Targets/FileTarget.cs` around lines 607 - 610, In the FileTarget.cs
file, add `ExceptionMustBeRethrown(ex)` guard checks before logging in all four
lifecycle hook catch blocks (the OnTargetClose hook catch block at line 607, and
the other three hook catch blocks at lines 1015, 1039, and 1346). Each catch
block should check if the exception is fatal using `ExceptionMustBeRethrown(ex)`
before calling InternalLogger.Error, and rethrow the exception if it is fatal,
ensuring fatal exceptions are not swallowed by these catch blocks.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/NLog/Targets/FileLifecycleHooks.cs`:
- Around line 48-49: The XML documentation comments in the FileLifecycleHooks
class contain two typos that affect generated API docs. On line 48 in the
OnFileClosed documentation, add a missing space between the word "that" and the
opening tag "<see" (currently reads "that<see" instead of "that <see").
Additionally, on line 102, correct the spelling error by changing "beeing" to
"being" in the corresponding documentation comment. These are simple text
corrections within the XML doc comment blocks.

---

Duplicate comments:
In `@src/NLog/Targets/FileTarget.cs`:
- Around line 607-610: In the FileTarget.cs file, add
`ExceptionMustBeRethrown(ex)` guard checks before logging in all four lifecycle
hook catch blocks (the OnTargetClose hook catch block at line 607, and the other
three hook catch blocks at lines 1015, 1039, and 1346). Each catch block should
check if the exception is fatal using `ExceptionMustBeRethrown(ex)` before
calling InternalLogger.Error, and rethrow the exception if it is fatal, ensuring
fatal exceptions are not swallowed by these catch blocks.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: bef176a2-c03a-4077-b7c0-da9762151f7a

📥 Commits

Reviewing files that changed from the base of the PR and between 0bce5d6 and fe0684c.

📒 Files selected for processing (5)
  • src/NLog/Targets/FileArchiveHandlers/BaseFileArchiveHandler.cs
  • src/NLog/Targets/FileLifecycleHooks.cs
  • src/NLog/Targets/FileTarget.cs
  • tests/NLog.UnitTests/LayoutRenderers/ProcessNameLayoutRendererTests.cs
  • tests/NLog.UnitTests/Targets/FileTargetTests.cs

Comment thread src/NLog/Targets/FileLifecycleHooks.cs Outdated
Comment thread tests/NLog.UnitTests/Targets/FileTargetTests.cs Outdated
Comment thread tests/NLog.UnitTests/Targets/FileTargetTests.cs
@Dave-Senn

Copy link
Copy Markdown
Author

I guess those 2 additional comments suddenly exploded into a lot more. But thank you for your quick resolve. I'm happy about the result, and the Sonar-Report also looks good.

Do you have anything else that you want to add? And have you verified that the new FileTarget API provides what you need?

* Nuget-Package PreRelease: https://ci.appveyor.com/project/nlog/nlog/builds/54244123/job/nc1ankfowj447nls/artifacts

Thank you very much for your time and frequent reviews. I've tested the new behavior with the package from the build and it works for my use case. I don't have anything I would like to add to this PR.

@snakefoot

Copy link
Copy Markdown
Contributor

I usually make a NLog patch-releases once a month (like now), and postpone bigger features for the minor-releases once a year (like 5-7 month from now)

How urgent is this feature for you?

Comment thread tests/NLog.UnitTests/Targets/FileTargetTests.cs
@Dave-Senn

Copy link
Copy Markdown
Author

I usually make a NLog patch-releases once a month (like now), and postpone bigger features for the minor-releases once a year (like 5-7 month from now)

How urgent is this feature for you?

Of course, I would like to have access to this feature as fast as possible, but it’s not that urgent. 5-7 Months work for me 😊

@sonarqubecloud

Copy link
Copy Markdown

@snakefoot

Copy link
Copy Markdown
Contributor

@Dave-Senn Of course, I would like to have access to this feature as fast as possible, but it’s not that urgent. 5-7 Months work for me 😊

Then I will release NLog v6.2 after my summer holiday around 1st August.

@snakefoot snakefoot added this to the 6.2 milestone Jun 25, 2026
@snakefoot snakefoot added feature file-target file-archiving Issues with archiving with the file target labels Jul 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature file-archiving Issues with archiving with the file target file-target size/L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Morty Proxy This is a proxified and sanitized view of the page, visit original site.