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);
        }