GetChangesets() asks changesets by parts
This commit is contained in:
@@ -115,11 +115,11 @@ namespace Sep.Git.Tfs.VsCommon
|
||||
get { return _linking ?? (_linking = GetService<ILinking>()); }
|
||||
}
|
||||
|
||||
public IEnumerable<ITfsChangeset> GetChangesets(string path, long startVersion, IGitTfsRemote remote)
|
||||
public virtual IEnumerable<ITfsChangeset> GetChangesets(string path, long startVersion, IGitTfsRemote remote)
|
||||
{
|
||||
var changesets = VersionControl.QueryHistory(path, VersionSpec.Latest, 0, RecursionType.Full,
|
||||
var changesets = Retry.Do(() => VersionControl.QueryHistory(path, VersionSpec.Latest, 0, RecursionType.Full,
|
||||
null, new ChangesetVersionSpec((int)startVersion), VersionSpec.Latest, int.MaxValue, true, true, true)
|
||||
.Cast<Changeset>().OrderBy(changeset => changeset.ChangesetId).ToArray();
|
||||
.Cast<Changeset>().OrderBy(changeset => changeset.ChangesetId).ToArray());
|
||||
|
||||
// don't take the enumerator produced by a foreach statement or a yield statement, as there are references
|
||||
// to the old (iterated) elements and thus the referenced changesets won't be disposed until all elements were iterated.
|
||||
@@ -194,7 +194,7 @@ namespace Sep.Git.Tfs.VsCommon
|
||||
}
|
||||
}
|
||||
|
||||
private ITfsChangeset BuildTfsChangeset(Changeset changeset, IGitTfsRemote remote)
|
||||
protected ITfsChangeset BuildTfsChangeset(Changeset changeset, IGitTfsRemote remote)
|
||||
{
|
||||
var tfsChangeset = _container.With<ITfsHelper>(this).With<IChangeset>(_bridge.Wrap<WrapperForChangeset, Changeset>(changeset)).GetInstance<TfsChangeset>();
|
||||
tfsChangeset.Summary = new TfsChangesetInfo { ChangesetId = changeset.ChangesetId, Remote = remote };
|
||||
|
||||
@@ -31,6 +31,30 @@ namespace Sep.Git.Tfs.VsCommon
|
||||
}
|
||||
}
|
||||
|
||||
public override IEnumerable<ITfsChangeset> GetChangesets(string path, long startVersion, IGitTfsRemote remote)
|
||||
{
|
||||
const int batchCount = 100;
|
||||
var start = (int)startVersion;
|
||||
Changeset[] changesets;
|
||||
do
|
||||
{
|
||||
var startChangeset = new ChangesetVersionSpec(start);
|
||||
changesets = Retry.Do(() => VersionControl.QueryHistory(path, VersionSpec.Latest, 0, RecursionType.Full,
|
||||
null, startChangeset, null, batchCount, true, true, true, true)
|
||||
.Cast<Changeset>().ToArray());
|
||||
if (changesets.Length > 0)
|
||||
start = changesets[changesets.Length - 1].ChangesetId + 1;
|
||||
|
||||
// don't take the enumerator produced by a foreach statement or a yield statement, as there are references
|
||||
// to the old (iterated) elements and thus the referenced changesets won't be disposed until all elements were iterated.
|
||||
for (int i = 0; i < changesets.Length; i++)
|
||||
{
|
||||
yield return BuildTfsChangeset(changesets[i], remote);
|
||||
changesets[i] = null;
|
||||
}
|
||||
} while (changesets.Length == batchCount);
|
||||
}
|
||||
|
||||
public override IEnumerable<string> GetAllTfsRootBranchesOrderedByCreation()
|
||||
{
|
||||
return VersionControl.QueryRootBranchObjects(RecursionType.Full)
|
||||
|
||||
@@ -312,13 +312,15 @@ namespace Sep.Git.Tfs.Core
|
||||
public IFetchResult FetchWithMerge(long mergeChangesetId, bool stopOnFailMergeCommit = false, params string[] parentCommitsHashes)
|
||||
{
|
||||
var fetchResult = new FetchResult{IsSuccess = true};
|
||||
var fetchedChangesets = FetchChangesets().ToList();
|
||||
fetchResult.NewChangesetCount = fetchedChangesets.Count;
|
||||
var fetchedChangesets = FetchChangesets();
|
||||
int count = 0;
|
||||
foreach (var changeset in fetchedChangesets)
|
||||
{
|
||||
count++;
|
||||
var log = Apply(MaxCommitHash, changeset);
|
||||
if (changeset.IsMergeChangeset && !ProcessMergeChangeset(changeset, stopOnFailMergeCommit, log))
|
||||
{
|
||||
fetchResult.NewChangesetCount = count;
|
||||
fetchResult.IsSuccess = false;
|
||||
fetchResult.LastFetchedChangesetId = MaxChangesetId;
|
||||
return fetchResult;
|
||||
@@ -333,6 +335,7 @@ namespace Sep.Git.Tfs.Core
|
||||
ProcessChangeset(changeset, log);
|
||||
DoGcIfNeeded();
|
||||
}
|
||||
fetchResult.NewChangesetCount = count;
|
||||
return fetchResult;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user