Skip to content

Commit 3b98b30

Browse files
committed
Merge remote-tracking branch 'origin/v3.5' into mergev3.5
2 parents 88a6b34 + 31365e4 commit 3b98b30

File tree

7 files changed

+61
-48
lines changed

7 files changed

+61
-48
lines changed

src/NerdBank.GitVersioning/ManagedGit/DeltaStreamReader.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ public static class DeltaStreamReader
8484
{
8585
value.Size |= (byte)stream.ReadByte() << 16;
8686
}
87+
88+
// Size zero is automatically converted to 0x10000.
89+
if (value.Size == 0)
90+
{
91+
value.Size = 0x10000;
92+
}
8793
}
8894

8995
return value;

src/NerdBank.GitVersioning/ManagedGit/GitPackDeltafiedStream.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,7 @@ public override long Seek(long offset, SeekOrigin origin)
136136
if (origin == SeekOrigin.Begin && offset > this.position)
137137
{
138138
// We can optimise this by skipping over instructions rather than executing them
139-
int length = (int)(offset - this.position);
140-
141-
byte[] buffer = ArrayPool<byte>.Shared.Rent(length);
142-
this.Read(buffer, 0, length);
143-
ArrayPool<byte>.Shared.Return(buffer);
139+
this.ReadExactly(checked((int)(offset - this.position)));
144140
return this.position;
145141
}
146142
else

src/NerdBank.GitVersioning/ManagedGit/GitPackMemoryCacheStream.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,9 @@ public override long Seek(long offset, SeekOrigin origin)
8282

8383
if (offset > this.cacheStream.Length)
8484
{
85-
int toRead = (int)(offset - this.cacheStream.Length);
86-
byte[] buffer = ArrayPool<byte>.Shared.Rent(toRead);
87-
int read = this.stream.Read(buffer, 0, toRead);
8885
this.cacheStream.Seek(0, SeekOrigin.End);
89-
this.cacheStream.Write(buffer, 0, read);
90-
ArrayPool<byte>.Shared.Return(buffer);
91-
86+
int toRead = (int)(offset - this.cacheStream.Length);
87+
this.stream.ReadExactly(toRead, this.cacheStream);
9288
this.DisposeStreamIfRead();
9389
return this.cacheStream.Position;
9490
}

src/NerdBank.GitVersioning/ManagedGit/StreamExtensions.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,31 @@ internal static bool TryAdd<TKey, TValue>(this System.Collections.Generic.IDicti
151151
return true;
152152
}
153153
#endif
154+
155+
/// <summary>
156+
/// Reads the specified number of bytes from a stream, or until the end of the stream.
157+
/// </summary>
158+
/// <param name="readFrom">The stream to read from.</param>
159+
/// <param name="length">The number of bytes to be read.</param>
160+
/// <param name="copyTo">The stream to copy the read bytes to, if required.</param>
161+
/// <returns>The number of bytes actually read. This will be less than <paramref name="length"/> only if the end of <paramref name="readFrom"/> is reached.</returns>
162+
internal static int ReadExactly(this Stream readFrom, int length, Stream? copyTo = null)
163+
{
164+
int bytesRemaining = length;
165+
byte[] buffer = ArrayPool<byte>.Shared.Rent(Math.Min(50 * 1024, bytesRemaining));
166+
while (bytesRemaining > 0)
167+
{
168+
int read = readFrom.Read(buffer, 0, Math.Min(buffer.Length, bytesRemaining));
169+
if (read == 0)
170+
{
171+
break;
172+
}
173+
174+
copyTo?.Write(buffer, 0, read);
175+
bytesRemaining -= read;
176+
}
177+
178+
ArrayPool<byte>.Shared.Return(buffer);
179+
return length - bytesRemaining;
180+
}
154181
}

src/NerdBank.GitVersioning/ManagedGit/ZLibStream.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,7 @@ public override long Seek(long offset, SeekOrigin origin)
149149
if (origin == SeekOrigin.Begin && offset > this.position)
150150
{
151151
// We may be able to optimize this by skipping over the compressed data
152-
int length = (int)(offset - this.position);
153-
154-
byte[] buffer = ArrayPool<byte>.Shared.Rent(length);
155-
this.Read(buffer, 0, length);
156-
ArrayPool<byte>.Shared.Return(buffer);
152+
this.ReadExactly(checked((int)(offset - this.position)));
157153
return this.position;
158154
}
159155
else

src/Nerdbank.GitVersioning.Tasks/CompareFiles.cs

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -109,38 +109,27 @@ private bool IsContentOfFilesTheSame(string file1, string file2)
109109
return true;
110110
}
111111

112+
if (new FileInfo(file1).Length != new FileInfo(file2).Length)
113+
{
114+
return false;
115+
}
116+
112117
// If both are present, we need to do a content comparison.
113-
using (FileStream fileStream1 = File.OpenRead(file1))
118+
// Keep our comparison simple by loading both in memory.
119+
byte[] file1Content = File.ReadAllBytes(file1);
120+
byte[] file2Content = File.ReadAllBytes(file2);
121+
122+
// One more sanity check.
123+
if (file1Content.Length != file2Content.Length)
114124
{
115-
using (FileStream fileStream2 = File.OpenRead(file2))
125+
return false;
126+
}
127+
128+
for (int i = 0; i < file1Content.Length; i++)
129+
{
130+
if (file1Content[i] != file2Content[i])
116131
{
117-
if (fileStream1.Length != fileStream2.Length)
118-
{
119-
return false;
120-
}
121-
122-
byte[] buffer1 = new byte[4096];
123-
byte[] buffer2 = new byte[buffer1.Length];
124-
int bytesRead;
125-
do
126-
{
127-
bytesRead = fileStream1.Read(buffer1, 0, buffer1.Length);
128-
if (fileStream2.Read(buffer2, 0, buffer2.Length) != bytesRead)
129-
{
130-
// We should never get here since we compared file lengths, but
131-
// this is a sanity check.
132-
return false;
133-
}
134-
135-
for (int i = 0; i < bytesRead; i++)
136-
{
137-
if (buffer1[i] != buffer2[i])
138-
{
139-
return false;
140-
}
141-
}
142-
}
143-
while (bytesRead == buffer1.Length);
132+
return false;
144133
}
145134
}
146135

src/Nerdbank.GitVersioning.Tasks/build/PrivateP2PCaching.proj

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@
2222
<Target Name="SatelliteDllsProjectOutputGroup" />
2323
<Target Name="BuiltProjectOutputGroupDependencies" />
2424
<Target Name="DebugSymbolsProjectOutputGroup" />
25-
25+
2626
<!-- WinUI3 seems to want this target -->
2727
<Target Name="GetTargetPathWithTargetPlatformMoniker" />
28-
28+
2929
<!-- dotnet watch needs this target -->
3030
<Target Name="_CollectWatchItems" />
31-
31+
3232
<!-- VS Test wants to see this target -->
3333
<Target Name="VSTest" />
3434

35+
<!-- SqlServer projects want this target-->
36+
<Target Name="GetTargetPath" />
37+
3538
<Import Project="$(NBGV_PrivateP2PAuxTargets)" Condition=" '$(NBGV_PrivateP2PAuxTargets)' != '' " />
3639
</Project>

0 commit comments

Comments
 (0)