profile
viewpoint

lifengl/project-system 0

The C#, F# and Visual Basic project system for Visual Studio

lifengl/roslyn 0

The .NET Compiler Platform ("Roslyn") provides open-source C# and Visual Basic compilers with rich code analysis APIs.

fork AArnott/sdk-api

Public contributions for win32 API documentation

fork in 2 days

push eventmicrosoft/vs-threading

dependabot[bot]

commit sha abd4e96649f3bb6112ea7e17504d0efdd09fa2b6

Bump Microsoft.Diagnostics.Runtime from 2.0.151903 to 2.0.156101 (#721) Bumps [Microsoft.Diagnostics.Runtime](https://github.com/Microsoft/clrmd) from 2.0.151903 to 2.0.156101. - [Release notes](https://github.com/Microsoft/clrmd/releases) - [Changelog](https://github.com/microsoft/clrmd/blob/master/doc/ReleaseNotes2.0.md) - [Commits](https://github.com/Microsoft/clrmd/commits) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

view details

push time in 5 days

delete branch microsoft/vs-threading

delete branch : dependabot/nuget/Microsoft.Diagnostics.Runtime-2.0.156101

delete time in 5 days

PR merged microsoft/vs-threading

Bump Microsoft.Diagnostics.Runtime from 2.0.151903 to 2.0.156101 dependencies

Bumps Microsoft.Diagnostics.Runtime from 2.0.151903 to 2.0.156101. <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/Microsoft/clrmd/commits">compare view</a></li> </ul> </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually

</details>

+1 -1

0 comment

1 changed file

dependabot[bot]

pr closed time in 5 days

startedrhysd/github-action-benchmark

started time in 5 days

PR opened microsoft/vs-threading

Bump Microsoft.Diagnostics.Runtime from 2.0.151903 to 2.0.156101

Bumps Microsoft.Diagnostics.Runtime from 2.0.151903 to 2.0.156101. <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/Microsoft/clrmd/commits">compare view</a></li> </ul> </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually

</details>

+1 -1

0 comment

1 changed file

pr created time in 6 days

Pull request review commentmicrosoft/vs-threading

Mitigate deadlock between AsyncReaderWriterLock and main thread

 protected bool CaptureDiagnostics             set { this.captureDiagnostics = value; }         } +        /// <summary>+        /// Gets a time delay to check whether pending writer lock and reader locks forms a deadlock.+        /// </summary>+        protected virtual TimeSpan DeadlockCheckTimeOut => DefaultDeadlockCheckTimeOut;

Timeout is also a discrete term. It's conventional to not capitalize the O.

lifengl

comment created time in 8 days

pull request commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

@lifengl I see this PR is not a 'draft' any more but your PR description still describes it as a draft. Are you looking for a review from me at this point, or are you still developing this?

lifengl

comment created time in 9 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 namespace Microsoft.VisualStudio.Threading     public partial class AsyncReaderWriterLock : IDisposable     {         /// <summary>-        /// A time delay to check whether pending writer lock and reader locks forms a dead lock.+        /// A time delay to check whether pending writer lock and reader locks forms a deadlock.         /// </summary>-        private const int DefaultDeadLockCheckTimeOutInMilliseconds = 3 * 1000;+        private static readonly TimeSpan DefaultDeadlockCheckTimeOut = new TimeSpan(hours: 0, minutes: 0, seconds: 3);

tip: I find TimeSpan.FromSeconds(3) to be a succinct way of expressing this.

lifengl

comment created time in 9 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 public ReaderWriterLockWithFastDeadLockCheck(JoinableTaskContext joinableTaskCon         {         } -        protected override int DeadLockCheckTimeOutInMilliseconds => 50;+        protected override TimeSpan DeadlockCheckTimeOut { get; } = new TimeSpan(days: 0, hours: 0, minutes: 0, seconds: 0, milliseconds: 50);

tip: TimeSpan.FromMilliseconds(50) seems like a good fit here.

lifengl

comment created time in 9 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 private void PendAwaiter(Awaiter awaiter)                 {                     Queue<Awaiter>? queue = this.GetLockQueue(awaiter.Kind);                     queue.Enqueue(awaiter);++                    if (awaiter.Kind == LockKind.Write)+                    {+                        this.EnablePendingWriterLockDeadLockWatching();+                    }                 }             }         } +        private void EnablePendingWriterLockDeadLockWatching()+        {+            if (this.joinableTaskContext != null &&+                this.pendingWriterLockDeadLockCheckTimer == null &&+                this.waitingWriters.Count > 0 &&+                (this.issuedReadLocks.Count > 0 || this.issuedUpgradeableReadLocks.Count > 0))+            {+                this.pendingWriterLockDeadLockCheckTimer = new Timer(PendingWriterLockDeadLockWatchingCallback, this, this.DeadLockCheckTimeOutInMilliseconds, -1);+            }+        }++        private void StopPendingWriterLockDeadLockWatching()+        {+            if (this.pendingWriterLockDeadLockCheckTimer != null && this.waitingWriters.Count == 0)

Why do we check this.waitingWriters.Count == 0 and only do what the method name claims it will do if that condition is true? Shouldn't we always Stop if the method is called to stop it? Should the caller check this condition before calling this method? Should we rename this method to "Stop...If..."?

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 private void PendAwaiter(Awaiter awaiter)                 {                     Queue<Awaiter>? queue = this.GetLockQueue(awaiter.Kind);                     queue.Enqueue(awaiter);++                    if (awaiter.Kind == LockKind.Write)+                    {+                        this.EnablePendingWriterLockDeadLockWatching();+                    }                 }             }         } +        private void EnablePendingWriterLockDeadLockWatching()

Maybe call this StartPendingWriterDeadlockTimerIfNecessary() to reflect that conditions are applied before it decides to actually start the timer.

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 namespace Microsoft.VisualStudio.Threading     /// </devnotes>     public partial class AsyncReaderWriterLock : IDisposable     {+        /// <summary>+        /// A time delay to check whether pending writer lock and reader locks forms a dead lock.

nit: deadlock exists as a discrete (and socially acceptable) term. Adding a space (or capitalizing the L as you do in the member name) may trigger policheck for using the term 'dead'. I suggest you spell it as deadlock or Deadlock. Here and in other places you add it.

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 private bool TryInvokeAllReadersIfAppropriate(bool searchAllWaiters)             return invoked;         } +        private void TryInvokeAllDependentReadersIfAppropriate()+        {+            lock (this.syncObject)+            {+                if (this.issuedWriteLocks.Count == 0 && this.waitingWriters.Count > 0 && this.waitingReaders.Count > 0 && (this.issuedReadLocks.Count > 0 || this.issuedUpgradeableReadLocks.Count > 0))+                {+                    HashSet<JoinableTask>? dependentTasks = JoinableTaskDependencyGraph.GetDependentTasksFromCandidates(+                        this.issuedReadLocks.Concat(this.issuedUpgradeableReadLocks).Where(w => w.AmbientJoinableTask != null).Select(w => w.AmbientJoinableTask!),+                        this.waitingReaders.Where(w => w.AmbientJoinableTask != null).Select(w => w.AmbientJoinableTask!));++                    if (dependentTasks.Count > 0)+                    {+                        int pendingCount = this.waitingReaders.Count;+                        while (pendingCount-- != 0)+                        {+                            Awaiter? pendingReader = this.waitingReaders.Dequeue();+                            JoinableTask? readerContext = pendingReader?.AmbientJoinableTask;+                            if (readerContext != null && dependentTasks.Contains(readerContext))+                            {+                                this.IssueAndExecute(pendingReader!);+                            }+                            else+                            {+                                this.waitingReaders.Enqueue(pendingReader!);

It seems odd that you're evidently prepared for pendingReader is null yet you shove it (back) into a collection that is evidently typed to guarantee there are no null elements. I feel like this code both doesn't trust the null ref annotations and doesn't mind violating them either. Can this be changed to depend on them more? Except when checking inputs at public entrypoints, we should be able to trust and honor them.

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 private static bool HasAnyNestedLocks(Awaiter lck, HashSet<Awaiter> lockCollecti             return false;         } +        private static void PendingWriterLockDeadLockWatchingCallback(object? state)+        {+            var readerWriterLock = state as AsyncReaderWriterLock;+            if (readerWriterLock != null)

tip: rewrite the first two lines as just one:

if (state is AsyncReaderWriterLock readerWriterLock)

Or even better, don't no-op when the cast fails. We don't expect the cast to ever fail, right? So let's use this to call more attention to our expectations, particularly when they fail:

var readerWriterLock = (AsyncReaderWriterLock)state;
Assumes.NotNull(readerWriterLock);
lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 protected bool CaptureDiagnostics             set { this.captureDiagnostics = value; }         } +        /// <summary>+        /// Gets a time delay to check whether pending writer lock and reader locks forms a dead lock.+        /// </summary>+        protected virtual int DeadLockCheckTimeOutInMilliseconds => DefaultDeadLockCheckTimeOutInMilliseconds;

Use Deadlock instead of DeadLock Instead of InMilliseconds how about we drop that suffix and type this as TimeSpan so the implementer can express it in whatever is the most natural way?

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 public void Dispose()         /// <param name="disposing"><c>true</c> if <see cref="Dispose()"/> was called; <c>false</c> if the object is being finalized.</param>         protected virtual void Dispose(bool disposing)         {+            if (disposing)+            {+                lock (this.syncObject)+                {+                    this.pendingWriterLockDeadLockCheckTimer?.Dispose();

Instead of calling Dispose() within a lock, can we merely snap the value of the field into a local variable and clear the field, then call Dispose outside the lock on the local variable?

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 internal static void OnTaskCompleted(IJoinableTaskDependent taskItem)             taskItem.GetJoinableTaskDependentData().OnTaskCompleted();         } +        /// <summary>+        /// Get all tasks inside the cadidate sets tasks, which are depended by one or more task in the source tasks list.

typo: cadidate -> candidate Same typo appears elsewhere, so try find & replace

lifengl

comment created time in 11 days

Pull request review commentmicrosoft/vs-threading

Dev/lifengl/write lock request hang

 internal static void OnTaskCompleted(IJoinableTaskDependent taskItem)             taskItem.GetJoinableTaskDependentData().OnTaskCompleted();         } +        /// <summary>+        /// Get all tasks inside the cadidate sets tasks, which are depended by one or more task in the source tasks list.+        /// </summary>+        /// <param name="sourceTasks">A collection of JoinableTasks represents source tasks.</param>+        /// <param name="candidateTasks">A collection of JoinableTasks which represents cadidates.</param>+        /// <returns>A set of tasks matching the condition.</returns>+        internal static HashSet<JoinableTask> GetDependentTasksFromCandidates(IEnumerable<JoinableTask> sourceTasks, IEnumerable<JoinableTask> candidateTasks)+        {+            Requires.NotNull(sourceTasks, nameof(sourceTasks));+            Requires.NotNull(candidateTasks, nameof(candidateTasks));++            var candidates = new HashSet<JoinableTask>(candidateTasks);+            if (candidates.Count == 0)+            {+                return candidates;+            }++            var results = new HashSet<JoinableTask>();+            var visited = new HashSet<IJoinableTaskDependent>();++            var queue = new Queue<IJoinableTaskDependent>();+            foreach (JoinableTask? task in sourceTasks)+            {+                if (task != null && visited.Add(task))

Is task is null really a possibility? If so, shouldn't we type the parameter as IEnumerable<JoinableTask?>?

lifengl

comment created time in 11 days

fork AArnott/docs

The open-source repo for docs.github.com

https://docs.github.com

fork in 11 days

push eventmicrosoft/vs-threading

dependabot[bot]

commit sha 5810823fb821954cdb31e1e29db1aca0227f751d

Bump Microsoft.Net.Compilers.Toolset from 3.7.0 to 3.8.0 (#718) Bumps [Microsoft.Net.Compilers.Toolset](https://github.com/dotnet/roslyn) from 3.7.0 to 3.8.0. - [Release notes](https://github.com/dotnet/roslyn/releases) - [Changelog](https://github.com/dotnet/roslyn/blob/master/docs/Breaking%20API%20Changes.md) - [Commits](https://github.com/dotnet/roslyn/commits) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

view details

push time in 12 days

delete branch microsoft/vs-threading

delete branch : dependabot/nuget/Microsoft.Net.Compilers.Toolset-3.8.0

delete time in 12 days

PR merged microsoft/vs-threading

Bump Microsoft.Net.Compilers.Toolset from 3.7.0 to 3.8.0 dependencies

Bumps Microsoft.Net.Compilers.Toolset from 3.7.0 to 3.8.0. <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/dotnet/roslyn/commits">compare view</a></li> </ul> </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually

</details>

+1 -1

0 comment

1 changed file

dependabot[bot]

pr closed time in 12 days

issue closedmicrosoft/vs-threading

Add Exception to VSTHRD100 when method in context is an event handler

Background

I have async callback, which I want to pass into System.Threading.Timer constructor. As of now, I have decided to use private async void HandleTimerCallback(object state) as the signature of the said callback function.

Problem

However, this implementation is greeted with a VSTHRD100 warning, which as you can see, would be impossible implement as TimerCallback will not accept it. I have to currently specifically ignore this single warning case by adding a suppression in the source code itself, but it seems a generic and practical problem that is worth solving for good.

Proposed Solution

Stephen Cleary also clarified this in a StackOverflow comment. So I thought this is worth adding as an exception while assessing the rules.

closed time in 12 days

sakshamsaxena

issue openedmicrosoft/vs-threading

Add Exception to VSTHRD100 when method in context is an event handler

Background

I have async callback, which I want to pass into System.Threading.Timer constructor. As of now, I have decided to use private async void HandleTimerCallback(object state) as the signature of the said callback function.

Problem

However, this implementation is greeted with a VSTHRD100 warning, which as you can see, would be impossible implement as TimerCallback will not accept it. I have to currently specifically ignore this single warning case by adding a suppression in the source code itself, but it seems a generic and practical problem that is worth solving for good.

Proposed Solution

Stephen Cleary also clarified this in a StackOverflow comment. So I thought this is worth adding as an exception while assessing the rules.

created time in 12 days

PR opened microsoft/vs-threading

Bump System.Runtime.CompilerServices.Unsafe from 4.7.1 to 5.0.0

Bumps System.Runtime.CompilerServices.Unsafe from 4.7.1 to 5.0.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/dotnet/runtime/releases">System.Runtime.CompilerServices.Unsafe's releases</a>.</em></p> <blockquote> <h2>.NET 5</h2> <p><a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/5.0.0/5.0.0.md">Release Notes</a> <a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/5.0.0/5.0.0-install-instructions.md">Install Instructions</a></p> <h1>Repo</h1> <ul> <li><a href="https://github.com/dotnet/core/releases/tag/v5.0.0">Core</a></li> </ul> <h2>.NET 5 RC 2</h2> <p><a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-rc.2.md">Release Notes</a> <a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-rc.2-install-instructions.md">Install Instructions</a></p> <h1>Repos</h1> <ul> <li><a href="https://github.com/dotnet/core/releases/tag/v5.0.0-rc.2">Core</a></li> <li><a href="https://github.com/dotnet/installer/releases/tag/v5.0.100-rc.2.20479.15">Installer</a></li> <li><a href="https://github.com/dotnet/windowsdesktop/releases/tag/v5.0.0-rc.2.20475.6">Windowsdesktop</a></li> <li><a href="https://github.com/dotnet/runtime/releases/tag/v5.0.0-rc.2.20475.5">Runtime</a></li> <li><a href="https://github.com/dotnet/aspnetcore/releases/tag/v5.0.0-rc.2.20475.17">Aspnetcore</a></li> <li><a href="https://github.com/dotnet/templating/releases/tag/v5.0.0-rc.2.20474.2">templating</a></li> <li><a href="https://github.com/dotnet/sdk/releases/tag/v5.0.100-rc.2.20477.7">SDK</a></li> <li><a href="https://github.com/dotnet/winforms/releases/tag/v5.0.0-rc.2.20475.11">winforms</a></li> <li><a href="https://github.com/dotnet/wpf/releases/tag/v5.0.0-rc.2.20475.5">WPF</a></li> <li><a href="https://github.com/dotnet/wcf/releases/tag/v1.2.0-preview1.20474.1">WCF</a></li> <li><a href="https://github.com/dotnet/efcore/releases/tag/v5.0.0-rc.2.20475.6">EF Core</a></li> <li><a href="https://github.com/dotnet/fsharp/releases/tag/v11.0.0-beta.20471.5">Fsharp</a></li> <li><a href="https://github.com/dotnet/msbuild/releases/tag/v16.8.0-preview-20475-05">MSBuild</a></li> </ul> <h2>.NET 5.0 RC 1</h2> <p><a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-rc.1.md">Release Notes</a> <a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-rc.1-install-instructions.md">Install Instructions</a></p> <h1>Repos</h1> <ul> <li><a href="https://github.com/dotnet/core/releases/tag/v5.0.0-rc.1">Core</a></li> <li><a href="https://github.com/dotnet/installer/releases/tag/v5.0.100-rc.1.20452.10">Installer</a></li> <li><a href="https://github.com/dotnet/windowsdesktop/releases/tag/v5.0.0-rc.1.20452.2">Windowsdesktop</a></li> <li><a href="https://github.com/dotnet/runtime/releases/tag/v5.0.0-rc.1.20451.14">Runtime</a></li> <li><a href="https://github.com/dotnet/aspnetcore/releases/tag/v5.0.0-rc.1.20451.17">Aspnetcore</a></li> <li><a href="https://github.com/dotnet/templating/releases/tag/v5.0.0-rc.1.20431.3">templating</a></li> <li><a href="https://github.com/dotnet/sdk/releases/tag/v5.0.100-rc.1.20452.20">SDK</a></li> <li><a href="https://github.com/dotnet/winforms/releases/tag/v5.0.0-rc.1.20451.14">winforms</a></li> <li><a href="https://github.com/dotnet/wpf/releases/tag/v5.0.0-rc.1.20451.6">WPF</a></li> <li><a href="https://github.com/dotnet/efcore/releases/tag/v5.0.0-rc.1.20451.13">EF Core</a></li> <li><a href="https://github.com/dotnet/fsharp/releases/tag/v11.0.0-beta.20428.2">Fsharp</a></li> <li><a href="https://github.com/dotnet/msbuild/releases/tag/v16.8.0-preview-20451-02">MSBuild</a></li> </ul> <h2>.NET 5.0 Preview 8</h2> <p><a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-preview.8.md">Release Notes</a> <a href="https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-preview.8-install-instructions.md">Install Instructions</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/dotnet/runtime/commits">compare view</a></li> </ul> </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually

</details>

+1 -1

0 comment

1 changed file

pr created time in 13 days

PR opened microsoft/vs-threading

Bump Microsoft.Net.Compilers.Toolset from 3.7.0 to 3.8.0

Bumps Microsoft.Net.Compilers.Toolset from 3.7.0 to 3.8.0. <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/dotnet/roslyn/commits">compare view</a></li> </ul> </details> <br />

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


<details> <summary>Dependabot commands and options</summary> <br />

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually

</details>

+1 -1

0 comment

1 changed file

pr created time in 13 days

more