Skip to content

Commit edf6303

Browse files
authored
Merge pull request #1841 from microsoft/milestones/m258
M258 release
2 parents af1e234 + 2b251c0 commit edf6303

File tree

1 file changed

+34
-45
lines changed

1 file changed

+34
-45
lines changed

GVFS/GVFS.Common/Git/GitObjects.cs

Lines changed: 34 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -706,64 +706,53 @@ private LooseObjectToWrite GetLooseObjectDestination(string sha)
706706

707707
bytesDownloaded += packLength;
708708

709-
// We will try to build an index if the server does not send one
710-
if (pack.IndexStream == null)
709+
// We can't trust the index file from the server, so we will always build our own.
710+
// We still need to consume and handle any exceptions from the index stream though.
711+
var canContinue = true;
712+
GitProcess.Result result;
713+
if (this.TryBuildIndex(activity, packTempPath, out result, gitProcess))
711714
{
712-
GitProcess.Result result;
713-
if (!this.TryBuildIndex(activity, packTempPath, out result, gitProcess))
715+
tempPacks.Add(new TempPrefetchPackAndIdx(pack.Timestamp, packName, packTempPath, packFlushTask, idxName, idxTempPath, idxFlushTask: null));
716+
if (pack.IndexStream != null)
714717
{
715-
if (packFlushTask != null)
718+
try
716719
{
717-
packFlushTask.Wait();
720+
bytesDownloaded += pack.IndexStream.Length;
721+
if (pack.IndexStream.CanSeek)
722+
{
723+
pack.IndexStream.Seek(0, SeekOrigin.End);
724+
}
725+
else
726+
{
727+
pack.IndexStream.CopyTo(Stream.Null);
728+
}
729+
}
730+
catch (Exception e)
731+
{
732+
canContinue = false;
733+
EventMetadata metadata = CreateEventMetadata(e);
734+
activity.RelatedWarning(metadata, "Failed to read to end of index stream");
718735
}
719-
720-
// Move whatever has been successfully downloaded so far
721-
Exception moveException;
722-
this.TryFlushAndMoveTempPacks(tempPacks, ref latestTimestamp, out moveException);
723-
724-
return new RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.CallbackResult(null, true);
725736
}
726-
727-
tempPacks.Add(new TempPrefetchPackAndIdx(pack.Timestamp, packName, packTempPath, packFlushTask, idxName, idxTempPath, idxFlushTask: null));
728737
}
729738
else
730739
{
731-
Task indexFlushTask;
732-
if (this.TryWriteTempFile(activity, pack.IndexStream, idxTempPath, out indexLength, out indexFlushTask))
740+
canContinue = false;
741+
}
742+
743+
if (!canContinue)
744+
{
745+
if (packFlushTask != null)
733746
{
734-
tempPacks.Add(new TempPrefetchPackAndIdx(pack.Timestamp, packName, packTempPath, packFlushTask, idxName, idxTempPath, indexFlushTask));
747+
packFlushTask.Wait();
735748
}
736-
else
737-
{
738-
bytesDownloaded += indexLength;
739-
740-
// Try to build the index manually, then retry the prefetch
741-
GitProcess.Result result;
742-
if (this.TryBuildIndex(activity, packTempPath, out result, gitProcess))
743-
{
744-
// If we were able to recreate the failed index
745-
// we can start the prefetch at the next timestamp
746-
tempPacks.Add(new TempPrefetchPackAndIdx(pack.Timestamp, packName, packTempPath, packFlushTask, idxName, idxTempPath, idxFlushTask: null));
747-
}
748-
else
749-
{
750-
if (packFlushTask != null)
751-
{
752-
packFlushTask.Wait();
753-
}
754-
}
755749

756-
// Move whatever has been successfully downloaded so far
757-
Exception moveException;
758-
this.TryFlushAndMoveTempPacks(tempPacks, ref latestTimestamp, out moveException);
750+
// Move whatever has been successfully downloaded so far
751+
Exception moveException;
752+
this.TryFlushAndMoveTempPacks(tempPacks, ref latestTimestamp, out moveException);
759753

760-
// The download stream will not be in a good state if the index download fails.
761-
// So we have to restart the prefetch
762-
return new RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.CallbackResult(null, true);
763-
}
754+
return new RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.CallbackResult(null, true);
764755
}
765-
766-
bytesDownloaded += indexLength;
767756
}
768757

769758
Exception exception = null;

0 commit comments

Comments
 (0)