From cf35626f713a63d11c25eb7f46559778a696d49b Mon Sep 17 00:00:00 2001 From: Philippe Miossec Date: Mon, 23 Jun 2014 11:17:53 +0200 Subject: [PATCH 1/2] Don't retrieve all changes when getting just last changeset id --- GitTfs.VsCommon/TfsHelper.Common.cs | 16 +++++++++++++--- GitTfs.VsFake/TfsHelper.VsFake.cs | 5 +++++ GitTfs/Core/GitTfsRemote.cs | 9 ++++++++- GitTfs/Core/TfsInterop/ITfsHelper.cs | 1 + 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/GitTfs.VsCommon/TfsHelper.Common.cs b/GitTfs.VsCommon/TfsHelper.Common.cs index f6870997..3d2085b0 100644 --- a/GitTfs.VsCommon/TfsHelper.Common.cs +++ b/GitTfs.VsCommon/TfsHelper.Common.cs @@ -640,16 +640,26 @@ namespace Sep.Git.Tfs.VsCommon return _bridge.Wrap(Retry.Do(() => GroupSecurityService.ReadIdentity(SearchFactor.AccountName, username, QueryMembership.None))); } - public ITfsChangeset GetLatestChangeset(IGitTfsRemote remote) + public Changeset GetLatestChangeset(IGitTfsRemote remote, bool includeChanges) { var history = VersionControl.QueryHistory(remote.TfsRepositoryPath, VersionSpec.Latest, 0, - RecursionType.Full, null, null, VersionSpec.Latest, 1, true, false, + RecursionType.Full, null, null, VersionSpec.Latest, 1, includeChanges, false, false).Cast().ToList(); if (history.Empty()) throw new GitTfsException("error: remote TFS repository path was not found"); - return BuildTfsChangeset(history.Single(), remote); + return history.Single(); + } + + public ITfsChangeset GetLatestChangeset(IGitTfsRemote remote) + { + return BuildTfsChangeset(GetLatestChangeset(remote, true), remote); + } + + public int GetLatestChangesetId(IGitTfsRemote remote) + { + return GetLatestChangeset(remote, false).ChangesetId; } public IChangeset GetChangeset(int changesetId) diff --git a/GitTfs.VsFake/TfsHelper.VsFake.cs b/GitTfs.VsFake/TfsHelper.VsFake.cs index 8be74261..36348c8c 100644 --- a/GitTfs.VsFake/TfsHelper.VsFake.cs +++ b/GitTfs.VsFake/TfsHelper.VsFake.cs @@ -68,6 +68,11 @@ namespace Sep.Git.Tfs.VsFake return _script.Changesets.LastOrDefault().Try(x => BuildTfsChangeset(x, remote)); } + public int GetLatestChangesetId(IGitTfsRemote remote) + { + return _script.Changesets.LastOrDefault().Id; + } + public IEnumerable GetChangesets(string path, long startVersion, IGitTfsRemote remote) { if (!_script.Changesets.Any(c => c.IsBranchChangeset) && _script.Changesets.Any(c => c.IsMergeChangeset)) diff --git a/GitTfs/Core/GitTfsRemote.cs b/GitTfs/Core/GitTfsRemote.cs index c557aba6..00b13280 100644 --- a/GitTfs/Core/GitTfsRemote.cs +++ b/GitTfs/Core/GitTfsRemote.cs @@ -594,7 +594,7 @@ namespace Sep.Git.Tfs.Core private IEnumerable FetchChangesets() { // TFS 2010 doesn't like when we ask for history past its last changeset. - if (MaxChangesetId == GetLatestChangeset().Summary.ChangesetId) + if (MaxChangesetId == GetLatestChangesetId()) return Enumerable.Empty(); if(!IsSubtreeOwner) @@ -623,6 +623,13 @@ namespace Sep.Git.Tfs.Core } } + private int GetLatestChangesetId() + { + if (!string.IsNullOrEmpty(TfsRepositoryPath)) + return Tfs.GetLatestChangesetId(this); + return globals.Repository.GetSubtrees(this).Select(x => Tfs.GetLatestChangesetId(x)).Max(); + } + public void UpdateTfsHead(string commitHash, long changesetId) { MaxCommitHash = commitHash; diff --git a/GitTfs/Core/TfsInterop/ITfsHelper.cs b/GitTfs/Core/TfsInterop/ITfsHelper.cs index 1bab190e..07095dc1 100644 --- a/GitTfs/Core/TfsInterop/ITfsHelper.cs +++ b/GitTfs/Core/TfsInterop/ITfsHelper.cs @@ -18,6 +18,7 @@ namespace Sep.Git.Tfs.Core.TfsInterop ICheckinNote CreateCheckinNote(Dictionary checkinNotes); IIdentity GetIdentity(string username); ITfsChangeset GetLatestChangeset(IGitTfsRemote remote); + int GetLatestChangesetId(IGitTfsRemote remote); ITfsChangeset GetChangeset(int changesetId, IGitTfsRemote remote); IChangeset GetChangeset(int changesetId); bool HasShelveset(string shelvesetName); From 992a829c8da31120ab7d6fc3f66c9304729fcd5f Mon Sep 17 00:00:00 2001 From: Philippe Miossec Date: Mon, 23 Jun 2014 11:18:11 +0200 Subject: [PATCH 2/2] refactoring --- GitTfs/Core/GitTfsRemote.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/GitTfs/Core/GitTfsRemote.cs b/GitTfs/Core/GitTfsRemote.cs index 00b13280..163a4418 100644 --- a/GitTfs/Core/GitTfsRemote.cs +++ b/GitTfs/Core/GitTfsRemote.cs @@ -612,15 +612,10 @@ namespace Sep.Git.Tfs.Core private ITfsChangeset GetLatestChangeset() { - if (!string.IsNullOrEmpty(this.TfsRepositoryPath)) - { + if (!string.IsNullOrEmpty(TfsRepositoryPath)) return Tfs.GetLatestChangeset(this); - } - else - { - var changesetId = globals.Repository.GetSubtrees(this).Select(x => Tfs.GetLatestChangeset(x)).Max(x => x.Summary.ChangesetId); - return GetChangeset(changesetId); - } + var changesetId = globals.Repository.GetSubtrees(this).Select(x => Tfs.GetLatestChangeset(x)).Max(x => x.Summary.ChangesetId); + return GetChangeset(changesetId); } private int GetLatestChangesetId()