Don't pointlessly make copies of every file when verifying. (#225)

pull/233/head
Rick Gibbed 5 years ago committed by GitHub
parent bdc6ebf7ee
commit ad72f53cd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1067,7 +1067,8 @@ namespace DepotDownloader
{ {
neededChunks = new List<ProtoManifest.ChunkData>(); neededChunks = new List<ProtoManifest.ChunkData>();
if (Config.VerifyAll || !oldManifestFile.FileHash.SequenceEqual(file.FileHash)) var hashMatches = oldManifestFile.FileHash.SequenceEqual(file.FileHash);
if (Config.VerifyAll || !hashMatches)
{ {
// we have a version of this file, but it doesn't fully match what we want // we have a version of this file, but it doesn't fully match what we want
if (Config.VerifyAll) if (Config.VerifyAll)
@ -1092,8 +1093,35 @@ namespace DepotDownloader
var orderedChunks = matchingChunks.OrderBy(x => x.OldChunk.Offset); var orderedChunks = matchingChunks.OrderBy(x => x.OldChunk.Offset);
var copyChunks = new List<ChunkMatch>();
using (var fsOld = File.Open(fileFinalPath, FileMode.Open))
{
foreach (var match in orderedChunks)
{
fsOld.Seek((long)match.OldChunk.Offset, SeekOrigin.Begin);
byte[] tmp = new byte[match.OldChunk.UncompressedLength];
fsOld.Read(tmp, 0, tmp.Length);
byte[] adler = Util.AdlerHash(tmp);
if (!adler.SequenceEqual(match.OldChunk.Checksum))
{
neededChunks.Add(match.NewChunk);
}
else
{
copyChunks.Add(match);
}
}
}
if (!hashMatches || neededChunks.Count > 0)
{
File.Move(fileFinalPath, fileStagingPath); File.Move(fileFinalPath, fileStagingPath);
using (var fsOld = File.Open(fileStagingPath, FileMode.Open))
{
fs = File.Open(fileFinalPath, FileMode.Create); fs = File.Open(fileFinalPath, FileMode.Create);
try try
{ {
@ -1104,31 +1132,22 @@ namespace DepotDownloader
throw new ContentDownloaderException(String.Format("Failed to resize file to expected size {0}: {1}", fileFinalPath, ex.Message)); throw new ContentDownloaderException(String.Format("Failed to resize file to expected size {0}: {1}", fileFinalPath, ex.Message));
} }
using (var fsOld = File.Open(fileStagingPath, FileMode.Open)) foreach (var match in copyChunks)
{
foreach (var match in orderedChunks)
{ {
fsOld.Seek((long)match.OldChunk.Offset, SeekOrigin.Begin); fsOld.Seek((long)match.OldChunk.Offset, SeekOrigin.Begin);
byte[] tmp = new byte[match.OldChunk.UncompressedLength]; byte[] tmp = new byte[match.OldChunk.UncompressedLength];
fsOld.Read(tmp, 0, tmp.Length); fsOld.Read(tmp, 0, tmp.Length);
byte[] adler = Util.AdlerHash(tmp);
if (!adler.SequenceEqual(match.OldChunk.Checksum))
{
neededChunks.Add(match.NewChunk);
}
else
{
fs.Seek((long)match.NewChunk.Offset, SeekOrigin.Begin); fs.Seek((long)match.NewChunk.Offset, SeekOrigin.Begin);
fs.Write(tmp, 0, tmp.Length); fs.Write(tmp, 0, tmp.Length);
} }
} }
}
File.Delete(fileStagingPath); File.Delete(fileStagingPath);
} }
} }
}
else else
{ {
// No old manifest or file not in old manifest. We must validate. // No old manifest or file not in old manifest. We must validate.

Loading…
Cancel
Save