public RecursiveCallResult <Commit?> ReferenceOrCopyCommit( Repository sourceRepo, Commit commit, Repository targetRepo, int maxDepth) { _progressHandler?.OnStartCopy(commit); if (!_referenceOrCopyCommitPromises.TryGetValue(commit.Id, out var promise)) { promise = ReferenceOrCopyCommitImpl(sourceRepo, commit, targetRepo, maxDepth); _referenceOrCopyCommitPromises[commit.Id] = promise; } var awaiter = promise.GetAwaiter(); if (awaiter.IsCompleted) { _progressHandler?.OnCopiedOneCommit(commit, awaiter.GetResult()); } else { var progressHandler = _progressHandler; awaiter.OnCompleted(() => { progressHandler?.OnCopiedOneCommit(commit, awaiter.GetResult()); }); } return(promise); }