Skip to content
This repository was archived by the owner on Sep 30, 2023. It is now read-only.

Commit f98f8e5

Browse files
ArXa1Lmadetara
authored andcommitted
refactor(updaters): добавил отображение прогресса при скачивании новой версии приложения
1 parent 3c74920 commit f98f8e5

6 files changed

+71
-30
lines changed

Commands/SelfUpdate.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ protected override int Execute()
101101

102102
ICementUpdater updater = server == null
103103
? new GitHubReleaseCementUpdater(Log)
104-
: new ServerCementUpdater(Log, server, branch);
104+
: new ServerCementUpdater(Log, ConsoleWriter.Shared, server, branch);
105105

106106
Log.LogInformation("Updater: {CementUpdaterName}", updater.Name);
107107
return UpdateBinary(updater);

Common/Common.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<Nullable>warnings</Nullable>
77
</PropertyGroup>
88
<ItemGroup>
9+
<PackageReference Include="Humanizer" Version="2.14.1" />
910
<PackageReference Include="JetBrains.Annotations" Version="2019.1.1" />
1011
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.0.0" />
1112
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0.0" />

Common/Extensions/StreamExtensions.cs

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using System.Buffers;
3+
using System.IO;
4+
using System.Text;
5+
6+
namespace Common.Extensions;
7+
8+
internal static class StreamExtensions
9+
{
10+
public static byte[] ReadAllBytes(this Stream stream)
11+
{
12+
using var buffer = new MemoryStream();
13+
stream.CopyTo(buffer);
14+
15+
return buffer.ToArray();
16+
}
17+
18+
public static byte[] ReadAllBytesWithProgress(this Stream source, Action<long> reportProgress)
19+
{
20+
using var destination = new MemoryStream();
21+
using var streamReader = new StreamReader(source, Encoding.UTF8);
22+
23+
// This value was originally picked to be the largest multiple of 4096 that is still smaller than
24+
// the large object heap threshold (85K).
25+
const int readBufferSize = 4096 * 20;
26+
var readBuffer = ArrayPool<byte>.Shared.Rent(readBufferSize);
27+
28+
var totalBytesRead = 0L;
29+
30+
try
31+
{
32+
int bytesRead;
33+
while ((bytesRead = source.Read(readBuffer, 0, readBuffer.Length)) != 0)
34+
{
35+
destination.Write(readBuffer, 0, bytesRead);
36+
totalBytesRead += bytesRead;
37+
38+
reportProgress(totalBytesRead);
39+
}
40+
}
41+
finally
42+
{
43+
ArrayPool<byte>.Shared.Return(readBuffer);
44+
}
45+
46+
return destination.ToArray();
47+
}
48+
}

Common/Updaters/GitHubReleaseCementUpdater.cs

+2-15
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Net.Http.Headers;
55
using System.Text;
66
using System.Threading;
7+
using Common.Extensions;
78
using JetBrains.Annotations;
89
using Microsoft.Extensions.Logging;
910
using Newtonsoft.Json;
@@ -116,21 +117,7 @@ private static byte[] LoadGitHubReleaseAsset(GitHubAsset gitHubAsset)
116117
httpResponseMessage.EnsureSuccessStatusCode();
117118

118119
using var stream = httpResponseMessage.Content.ReadAsStream(cts.Token);
119-
return ReadAllBytes(stream);
120-
}
121-
122-
private static byte[] ReadAllBytes(Stream stream)
123-
{
124-
if (stream is MemoryStream ms)
125-
{
126-
stream.CopyTo(ms);
127-
return ms.ToArray();
128-
}
129-
130-
using var buffer = new MemoryStream();
131-
stream.CopyTo(buffer);
132-
133-
return buffer.ToArray();
120+
return stream.ReadAllBytes();
134121
}
135122

136123
public string Name => "GitHub";

Common/Updaters/LocalPathCementUpdater.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ public byte[] GetNewCementZip()
3232
return null;
3333
}
3434

35-
public static string GetZipCementDirectory()
35+
private static string GetZipCementDirectory()
3636
{
3737
var zipDir = Path.Combine(Helper.HomeDirectory(), "work");
38+
3839
if (!Directory.Exists(zipDir))
3940
Directory.CreateDirectory(zipDir);
41+
4042
return zipDir;
4143
}
4244

Common/Updaters/ServerCementUpdater.cs

+16-13
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Net.Http.Headers;
55
using System.Text;
66
using System.Threading;
7+
using Common.Extensions;
8+
using Humanizer;
79
using JetBrains.Annotations;
810
using Microsoft.Extensions.Logging;
911
using Newtonsoft.Json;
@@ -19,12 +21,14 @@ public sealed class ServerCementUpdater : ICementUpdater
1921
private readonly ILogger log;
2022
private readonly string server;
2123
private readonly string branch;
24+
private readonly ConsoleWriter consoleWriter;
2225

23-
public ServerCementUpdater(ILogger log, string server, string branch)
26+
public ServerCementUpdater(ILogger log, ConsoleWriter consoleWriter, string server, string branch)
2427
{
2528
this.server = server;
2629
this.branch = branch;
2730
this.log = log;
31+
this.consoleWriter = consoleWriter;
2832
}
2933

3034
public string GetNewCommitHash()
@@ -63,7 +67,7 @@ public string GetNewCommitHash()
6367
catch (Exception ex)
6468
{
6569
log.LogError(ex, "Failed to look for updates on server");
66-
ConsoleWriter.Shared.WriteWarning("Failed to look for updates on server: " + ex.Message);
70+
consoleWriter.WriteWarning("Failed to look for updates on server: " + ex.Message);
6771

6872
return null;
6973
}
@@ -91,29 +95,28 @@ public byte[] GetNewCementZip()
9195
}
9296
};
9397

94-
using var httpResponseMessage = httpClient.Send(httpRequestMessage, cts.Token);
98+
using var httpResponseMessage = httpClient.Send(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token);
9599
httpResponseMessage.EnsureSuccessStatusCode();
96100

97101
using var stream = httpResponseMessage.Content.ReadAsStream(cts.Token);
98-
return ReadAllBytes(stream);
102+
103+
return stream.ReadAllBytesWithProgress(ReportProgress);
104+
105+
void ReportProgress(long totalBytes)
106+
{
107+
var readableBytes = totalBytes.Bytes().ToString();
108+
consoleWriter.WriteProgress($"Downloading: {readableBytes}");
109+
}
99110
}
100111
catch (Exception ex)
101112
{
102113
log.LogError(ex, "Failed to look for updates on server, channel='{CementServerReleaseChannel}'", branch);
103-
ConsoleWriter.Shared.WriteWarning("Failed to look for updates on server: " + ex.Message);
114+
consoleWriter.WriteWarning("Failed to look for updates on server: " + ex.Message);
104115

105116
return null;
106117
}
107118
}
108119

109-
private static byte[] ReadAllBytes(Stream stream)
110-
{
111-
using var buffer = new MemoryStream();
112-
stream.CopyTo(buffer);
113-
114-
return buffer.ToArray();
115-
}
116-
117120
public string Name => server;
118121
}
119122
}

0 commit comments

Comments
 (0)