GetChangesets() asks changesets by parts

This commit is contained in:
Arkady Shapkin
2014-01-24 17:42:37 +04:00
parent 3ed7d570dc
commit 84272bab5a
3 changed files with 33 additions and 6 deletions
+4 -4
View File
@@ -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)
+5 -2
View File
@@ -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;
}