Skip to content

Commit 34037a9

Browse files
committed
- Improved handling of long paths
- Added option to override default case sensitivity (default is "on" for Linux and "off" for Windows and Mac). Some network drives are case sensitive even under Windows for example. - Consider updated file size while checking free space
1 parent 680549c commit 34037a9

9 files changed

+323
-171
lines changed

App.config

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<startup>
4-
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
4+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
55
</startup>
66
<runtime>
77
<!-- https://docs.microsoft.com/en-us/archive/blogs/jeremykuhne/net-4-6-2-and-long-paths-on-windows-10 -->
8-
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false"/>
8+
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
9+
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
10+
<dependentAssembly>
11+
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
12+
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
13+
</dependentAssembly>
14+
</assemblyBinding>
915
</runtime>
1016
</configuration>

AsyncToSyncCodeRoundtripSynchroniserMonitorNet.csproj

+25-18
Original file line numberDiff line numberDiff line change
@@ -46,40 +46,40 @@
4646
</PropertyGroup>
4747
<ItemGroup>
4848
<Reference Include="Microsoft.Extensions.Configuration, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
49-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.Configuration.1.1.2\lib\netstandard1.1\Microsoft.Extensions.Configuration.dll</HintPath>
49+
<HintPath>packages\Microsoft.Extensions.Configuration.1.1.2\lib\netstandard1.1\Microsoft.Extensions.Configuration.dll</HintPath>
5050
</Reference>
5151
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
52-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.Configuration.Abstractions.1.1.2\lib\netstandard1.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
52+
<HintPath>packages\Microsoft.Extensions.Configuration.Abstractions.1.1.2\lib\netstandard1.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
5353
</Reference>
5454
<Reference Include="Microsoft.Extensions.Configuration.FileExtensions, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
55-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.Configuration.FileExtensions.1.1.2\lib\net451\Microsoft.Extensions.Configuration.FileExtensions.dll</HintPath>
55+
<HintPath>packages\Microsoft.Extensions.Configuration.FileExtensions.1.1.2\lib\net451\Microsoft.Extensions.Configuration.FileExtensions.dll</HintPath>
5656
</Reference>
5757
<Reference Include="Microsoft.Extensions.Configuration.Json, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
58-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.Configuration.Json.1.1.2\lib\net451\Microsoft.Extensions.Configuration.Json.dll</HintPath>
58+
<HintPath>packages\Microsoft.Extensions.Configuration.Json.1.1.2\lib\net451\Microsoft.Extensions.Configuration.Json.dll</HintPath>
5959
</Reference>
6060
<Reference Include="Microsoft.Extensions.FileProviders.Abstractions, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
61-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.FileProviders.Abstractions.1.1.1\lib\netstandard1.0\Microsoft.Extensions.FileProviders.Abstractions.dll</HintPath>
61+
<HintPath>packages\Microsoft.Extensions.FileProviders.Abstractions.1.1.1\lib\netstandard1.0\Microsoft.Extensions.FileProviders.Abstractions.dll</HintPath>
6262
</Reference>
6363
<Reference Include="Microsoft.Extensions.FileProviders.Physical, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
64-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.FileProviders.Physical.1.1.1\lib\net451\Microsoft.Extensions.FileProviders.Physical.dll</HintPath>
64+
<HintPath>packages\Microsoft.Extensions.FileProviders.Physical.1.1.1\lib\net451\Microsoft.Extensions.FileProviders.Physical.dll</HintPath>
6565
</Reference>
6666
<Reference Include="Microsoft.Extensions.FileSystemGlobbing, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
67-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.FileSystemGlobbing.1.1.1\lib\net45\Microsoft.Extensions.FileSystemGlobbing.dll</HintPath>
67+
<HintPath>packages\Microsoft.Extensions.FileSystemGlobbing.1.1.1\lib\net45\Microsoft.Extensions.FileSystemGlobbing.dll</HintPath>
6868
</Reference>
6969
<Reference Include="Microsoft.Extensions.Primitives, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
70-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Microsoft.Extensions.Primitives.1.1.1\lib\netstandard1.0\Microsoft.Extensions.Primitives.dll</HintPath>
70+
<HintPath>packages\Microsoft.Extensions.Primitives.1.1.1\lib\netstandard1.0\Microsoft.Extensions.Primitives.dll</HintPath>
7171
</Reference>
7272
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
7373
<HintPath>packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
7474
</Reference>
7575
<Reference Include="MyOddWeb.DirectoryWatcher, Version=0.1.8.0, Culture=neutral, PublicKeyToken=b044eb2621106c1f, processorArchitecture=MSIL">
76-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\MyOddWeb.DirectoryWatcher.0.1.8\lib\net452\MyOddWeb.DirectoryWatcher.dll</HintPath>
76+
<HintPath>packages\MyOddWeb.DirectoryWatcher.0.1.8\lib\net452\MyOddWeb.DirectoryWatcher.dll</HintPath>
7777
</Reference>
7878
<Reference Include="MyOddWeb.DirectoryWatcher.Interfaces, Version=0.1.8.0, Culture=neutral, PublicKeyToken=b044eb2621106c1f, processorArchitecture=MSIL">
79-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\MyOddWeb.DirectoryWatcher.0.1.8\lib\net452\MyOddWeb.DirectoryWatcher.Interfaces.dll</HintPath>
79+
<HintPath>packages\MyOddWeb.DirectoryWatcher.0.1.8\lib\net452\MyOddWeb.DirectoryWatcher.Interfaces.dll</HintPath>
8080
</Reference>
8181
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
82-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
82+
<HintPath>packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
8383
</Reference>
8484
<Reference Include="Nito.AsyncEx.Coordination, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL">
8585
<HintPath>packages\Nito.AsyncEx.Coordination.5.0.0\lib\netstandard1.3\Nito.AsyncEx.Coordination.dll</HintPath>
@@ -112,9 +112,9 @@
112112
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
113113
<HintPath>packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
114114
</Reference>
115-
<Reference Include="System.Windows.Forms" />
116-
<Reference Include="System.IO.Compression" />
117-
<Reference Include="System.IO.Compression.FileSystem" />
115+
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
116+
<HintPath>packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
117+
</Reference>
118118
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
119119
<HintPath>packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
120120
</Reference>
@@ -124,15 +124,17 @@
124124
<Reference Include="System.IO.FileSystem.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
125125
<HintPath>packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
126126
</Reference>
127+
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
128+
<HintPath>packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
129+
</Reference>
127130
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
128131
<HintPath>packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
129132
</Reference>
130-
<Reference Include="System.Numerics" />
131133
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
132-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\System.Runtime.CompilerServices.Unsafe.4.3.0\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
134+
<HintPath>packages\System.Runtime.CompilerServices.Unsafe.4.3.0\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
133135
</Reference>
134136
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
135-
<HintPath>..\AsyncToSyncCodeRoundtripSynchroniserMonitor\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
137+
<HintPath>packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
136138
</Reference>
137139
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
138140
<HintPath>packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net46\System.Security.Cryptography.Algorithms.dll</HintPath>
@@ -146,12 +148,17 @@
146148
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
147149
<HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net46\System.Security.Cryptography.X509Certificates.dll</HintPath>
148150
</Reference>
151+
<Reference Include="System.Windows.Forms" />
152+
<Reference Include="System.IO.Compression.FileSystem" />
153+
<Reference Include="System.Numerics" />
149154
<Reference Include="System.Xml.Linq" />
150155
<Reference Include="System.Data.DataSetExtensions" />
151156
<Reference Include="Microsoft.CSharp" />
152157
<Reference Include="System.Data" />
153-
<Reference Include="System.Net.Http" />
154158
<Reference Include="System.Xml" />
159+
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
160+
<HintPath>packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
161+
</Reference>
155162
</ItemGroup>
156163
<ItemGroup>
157164
<Compile Include="AsyncToSyncConverter.cs" />

AsyncToSyncConverter.cs

+75-23
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace AsyncToSyncCodeRoundtripSynchroniserMonitor
1919
static class AsyncToSyncConverter
2020
{
2121
//TODO config file
22-
public static readonly List<KVP> Replacements = new List<KVP>()
22+
public static readonly List<KVP> CS_Replacements = new List<KVP>()
2323
{
2424
//NB! VS may put the /*--await--*/ on a separate line therefore need handling for various space types after /*--await--*/
2525
//TODO!: ensure that await starts at word boundary
@@ -41,15 +41,18 @@ static class AsyncToSyncConverter
4141
new KVP("(async\r", "(/*--async--*/\r"),
4242
new KVP("(async\n", "(/*--async--*/\n"),
4343

44+
new KVP(@", Task ", @", /*--Task--*/Action "), //method argument type
45+
new KVP(@"(Task ", @"(/*--Task--*/Action "), //method argument type
46+
new KVP(@", Task<T> ", @", /*--Task<T>--*/Func<T> "), //method argument type
47+
new KVP(@"(Task<T> ", @"(/*--Task<T>--*/Func<T> "), //method argument type
4448
new KVP(@" Task ", @" /*--Task--*/void "), //method return type
45-
new KVP(@"Task ", @"/*--Task--*/Action "), //method argument type
46-
new KVP(@"Task<T> ", @"/*--Task<T>--*/Func<T> "), //method argument type
4749

4850
new KVP(@").Wait();", @")/*--.Wait()--*/;"),
4951
//new KVP("Task.Delay", "/*--Task.Delay--*/System.Threading.Thread.Sleep"), //this needs special regex in sync to async direction
5052
new KVP(@"Task.FromResult", @"/*--Task.FromResult--*/"),
5153
new KVP(@"Task.WhenAll", @"/*--Task.WhenAll--*/"),
52-
new KVP(@" AsyncLock", @" /*--AsyncLock--*/object"),
54+
new KVP(@" AsyncLock ", @" /*--AsyncLock--*/object "), //TODO!!! add handling for \t \r \n
55+
new KVP(@" AsyncLock(", @" /*--AsyncLock--*/object("),
5356

5457
new KVP(@"#define ASYNC", @"#define NOASYNC"),
5558
};
@@ -59,47 +62,96 @@ static class AsyncToSyncConverter
5962
//private static readonly string AsyncLockReplaceRegexReplacement = @"$1/*--AsyncLock--*/object";
6063

6164

62-
private static readonly Regex TaskDelayReplaceRegex = new Regex(@"Task[.]Delay", RegexOptions.Singleline | RegexOptions.Compiled);
63-
private const string TaskDelayReplaceRegexReplacement = @"/*--Task.Delay--*/System.Threading.Thread.Sleep";
65+
private static readonly Regex CS_TaskDelayReplaceRegex = new Regex(@"Task[.]Delay", RegexOptions.Singleline | RegexOptions.Compiled);
66+
private const string CS_TaskDelayReplaceRegexReplacement = @"/*--Task.Delay--*/System.Threading.Thread.Sleep";
6467

6568

66-
private static readonly Regex TaskReplaceRegex = new Regex(@"(\s+)(async\s+)?Task<([^(]+)>(\s+)", RegexOptions.Singleline | RegexOptions.Compiled);
67-
private const string TaskReplaceRegexReplacement = @"$1/*--$2Task<--*/$3/*-->--*/$4";
69+
private static readonly Regex CS_TaskReplaceRegex = new Regex(@"(\s+)(async\s+)?Task<([^(]+)>(\s+)", RegexOptions.Singleline | RegexOptions.Compiled);
70+
private const string CS_TaskReplaceRegexReplacement = @"$1/*--$2Task<--*/$3/*-->--*/$4";
6871

6972

70-
private static readonly Regex AsyncLockReplaceRegex = new Regex(@"using([^(]*)[(]await(\s+[^(]+)[.]LockAsync[(][)][)]", RegexOptions.Singleline | RegexOptions.Compiled);
71-
private const string AsyncLockReplaceRegexReplacement = @"/*--using--*/lock$1(/*--await--*/ $2/*--.Lock A s y n c()--*/)";
73+
private static readonly Regex CS_AsyncLockReplaceRegex = new Regex(@"using([^(]*)[(]await(\s+[^(]+)[.]LockAsync[(][)][)]", RegexOptions.Singleline | RegexOptions.Compiled);
74+
private const string CS_AsyncLockReplaceRegexReplacement = @"/*--using--*/lock$1(/*--await--*/ $2/*--.Lock A s y n c()--*/)";
75+
76+
77+
private static readonly Regex CS_FuncTaskReplaceRegex = new Regex(@"([\s,(]+)Func<Task<([^=)]+)>>", RegexOptions.Singleline | RegexOptions.Compiled);
78+
private const string CS_FuncTaskReplaceRegexReplacement = @"$1Func</*--Task<--*/$2/*-->--*/>";
79+
80+
81+
82+
83+
public static readonly List<KVP> PY_Replacements = new List<KVP>()
84+
{
85+
//TODO!: ensure that matches start at word boundary
86+
87+
new KVP(@"ASYNC = True", @"ASYNC = False"),
88+
new KVP(@"NOASYNC = False", @"NOASYNC = True"),
89+
90+
new KVP(" aiofiles.open", " open"),
91+
new KVP("\taiofiles.open", "\topen"),
92+
new KVP("\raiofiles.open", "\ropen"),
93+
new KVP("\naiofiles.open", "\nopen"),
94+
95+
new KVP(" open", " io.open"),
96+
new KVP("\topen", "\tio.open"),
97+
new KVP("\ropen", "\rio.open"),
98+
new KVP("\nopen", "\nio.open"),
99+
};
100+
101+
102+
private static readonly Regex PY_AwaitReplaceRegex = new Regex(@"(\n\r|\r\n|\n)(\s*)await(\s+)", RegexOptions.Singleline | RegexOptions.Compiled);
103+
private const string PY_AwaitReplaceRegexReplacement = @"$1#--$2await$3--$1";
104+
105+
106+
private static readonly Regex PY_Await2ReplaceRegex = new Regex(@"=(\s*)await(\s+)", RegexOptions.Singleline | RegexOptions.Compiled);
107+
private const string PY_Await2ReplaceRegexReplacement = @"=#--$1await$2--$1";
108+
109+
110+
private static readonly Regex PY_AsyncReplaceRegex = new Regex(@"(\n\r|\r\n|\n)(\s*)async(\s+)", RegexOptions.Singleline | RegexOptions.Compiled);
111+
private const string PY_AsyncRegexReplacement = @"$1#--$2async$3--$2";
72112

73113

74-
private static readonly Regex FuncTaskReplaceRegex = new Regex(@"([\s,(]+)Func<Task<([^=)]+)>>", RegexOptions.Singleline | RegexOptions.Compiled);
75-
private const string FuncTaskReplaceRegexReplacement = @"$1Func</*--Task<--*/$2/*-->--*/>";
76114

77115

78116
public static async Task AsyncFileUpdated(string fullName, Context context)
79117
{
80118
//using (await Global.FileOperationAsyncLock.LockAsync())
81119
{
82-
//@"\\?\" prefix is needed for reading from long paths: https://stackoverflow.com/questions/44888844/directorynotfoundexception-when-using-long-paths-in-net-4-7
83-
var fileData = await FileExtensions.ReadAllTextAsync(@"\\?\" + fullName, context.Token);
120+
var fileData = await FileExtensions.ReadAllTextAsync(Extensions.GetLongPath(fullName), context.Token);
84121
var originalData = fileData;
85122

86123

124+
if (fullName.EndsWith(".cs"))
125+
{
126+
foreach (var replacement in CS_Replacements)
127+
{
128+
fileData = fileData.Replace(replacement.Item1, replacement.Item2);
129+
}
130+
131+
fileData = CS_FuncTaskReplaceRegex.Replace(fileData, CS_FuncTaskReplaceRegexReplacement);
132+
fileData = CS_AsyncLockReplaceRegex.Replace(fileData, CS_AsyncLockReplaceRegexReplacement);
133+
fileData = CS_TaskReplaceRegex.Replace(fileData, CS_TaskReplaceRegexReplacement);
134+
fileData = CS_TaskDelayReplaceRegex.Replace(fileData, CS_TaskDelayReplaceRegexReplacement);
135+
}
136+
else if (fullName.EndsWith(".py"))
137+
{
138+
foreach (var replacement in PY_Replacements)
139+
{
140+
fileData = fileData.Replace(replacement.Item1, replacement.Item2);
141+
}
87142

88-
fileData = FuncTaskReplaceRegex.Replace(fileData, FuncTaskReplaceRegexReplacement);
89-
fileData = AsyncLockReplaceRegex.Replace(fileData, AsyncLockReplaceRegexReplacement);
90-
fileData = TaskReplaceRegex.Replace(fileData, TaskReplaceRegexReplacement);
91-
fileData = TaskDelayReplaceRegex.Replace(fileData, TaskDelayReplaceRegexReplacement);
92-
93-
94-
foreach (var replacement in Replacements)
143+
fileData = PY_AwaitReplaceRegex.Replace(fileData, PY_AwaitReplaceRegexReplacement);
144+
fileData = PY_AsyncReplaceRegex.Replace(fileData, PY_AsyncRegexReplacement);
145+
}
146+
else
95147
{
96-
fileData = fileData.Replace(replacement.Item1, replacement.Item2);
148+
throw new NotImplementedException("Unknown file extension");
97149
}
98150

99151

100152
await ConsoleWatch.SaveFileModifications(fullName, fileData, originalData, context);
101153

102154
} //using (await Global.FileOperationAsyncLock.LockAsync())
103-
}
155+
} //public static async Task AsyncFileUpdated(string fullName, Context context)
104156
}
105157
}

0 commit comments

Comments
 (0)