diff --git a/GitTfs/Core/TfsChangeset.cs b/GitTfs/Core/TfsChangeset.cs index 1d75db08..62081b95 100644 --- a/GitTfs/Core/TfsChangeset.cs +++ b/GitTfs/Core/TfsChangeset.cs @@ -83,8 +83,7 @@ namespace Sep.Git.Tfs.Core private string GetPathBeforeRename(IItem item) { - return item.GetVersion(item.ChangesetId - 1).ServerItem; - //return item.VersionControlServer.GetItem(item.ItemId, item.ChangesetId - 1).ServerItem; + return item.VersionControlServer.GetItem(item.ItemId, item.ChangesetId - 1).ServerItem; } private void Update(IChange change, string pathInGitRepo, GitIndexInfo index, IDictionary initialTree) diff --git a/GitTfs/Core/TfsInterop/IChangeset.cs b/GitTfs/Core/TfsInterop/IChangeset.cs index 25d211cc..ce844c98 100644 --- a/GitTfs/Core/TfsInterop/IChangeset.cs +++ b/GitTfs/Core/TfsInterop/IChangeset.cs @@ -1,11 +1,10 @@ using System; -using System.Collections.Generic; namespace Sep.Git.Tfs.Core.TfsInterop { public interface IChangeset { - IEnumerable Changes { get; } + IChange [] Changes { get; } string Committer { get; } DateTime CreationDate { get; } string Comment { get; } diff --git a/GitTfs/Core/TfsInterop/IItem.cs b/GitTfs/Core/TfsInterop/IItem.cs index b2fd4416..11b4eee0 100644 --- a/GitTfs/Core/TfsInterop/IItem.cs +++ b/GitTfs/Core/TfsInterop/IItem.cs @@ -2,11 +2,12 @@ namespace Sep.Git.Tfs.Core.TfsInterop { public interface IItem { - IItem GetVersion(int changeset); + IVersionControlServer VersionControlServer { get; } int ChangesetId { get; } string ServerItem { get; } decimal DeletionId { get; } TfsItemType ItemType { get; } + int ItemId { get; } void DownloadFile(string file); } } \ No newline at end of file diff --git a/GitTfs/Core/TfsInterop/IVersionControlServer.cs b/GitTfs/Core/TfsInterop/IVersionControlServer.cs new file mode 100644 index 00000000..fa7fe256 --- /dev/null +++ b/GitTfs/Core/TfsInterop/IVersionControlServer.cs @@ -0,0 +1,7 @@ +namespace Sep.Git.Tfs.Core.TfsInterop +{ + public interface IVersionControlServer + { + IItem GetItem(int itemId, int changesetNumber); + } +} \ No newline at end of file diff --git a/GitTfs/Core/TfsInterop/IWorkspace.cs b/GitTfs/Core/TfsInterop/IWorkspace.cs index 2997f1c7..00971956 100644 --- a/GitTfs/Core/TfsInterop/IWorkspace.cs +++ b/GitTfs/Core/TfsInterop/IWorkspace.cs @@ -1,11 +1,9 @@ -using System.Collections.Generic; - namespace Sep.Git.Tfs.Core.TfsInterop { public interface IWorkspace { - IEnumerable GetPendingChanges(); - void Shelve(IShelveset shelveset, IEnumerable changes, TfsShelvingOptions options); + IPendingChange[] GetPendingChanges(); + void Shelve(IShelveset shelveset, IPendingChange [] changes, TfsShelvingOptions options); int PendAdd(string path); int PendEdit(string path); int PendDelete(string path); diff --git a/GitTfs/Core/TfsInterop/NeedsToBeReflected.cs b/GitTfs/Core/TfsInterop/NeedsToBeReflected.cs index 46047478..fee0021d 100644 --- a/GitTfs/Core/TfsInterop/NeedsToBeReflected.cs +++ b/GitTfs/Core/TfsInterop/NeedsToBeReflected.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Microsoft.TeamFoundation.Server; @@ -8,6 +7,23 @@ using Microsoft.TeamFoundation.VersionControl.Client; namespace Sep.Git.Tfs.Core.TfsInterop { // These things should be auto-generated, or reflected, or duck-typed, or something to break the explicit dependence on the TF dlls. + class NeedsToBeReflectedVersionControlServer :WrapperFor, IVersionControlServer + { + private readonly TfsApiBridge _bridge; + private readonly VersionControlServer _versionControlServer; + + public NeedsToBeReflectedVersionControlServer(TfsApiBridge bridge, VersionControlServer versionControlServer) : base(versionControlServer) + { + _bridge = bridge; + _versionControlServer = versionControlServer; + } + + public IItem GetItem(int itemId, int changesetNumber) + { + return _bridge.Wrap(_versionControlServer.GetItem(itemId, changesetNumber)); + } + } + class NeedsToBeReflectedChangeset : WrapperFor, IChangeset { private readonly TfsApiBridge _bridge; @@ -19,9 +35,9 @@ namespace Sep.Git.Tfs.Core.TfsInterop _changeset = changeset; } - public IEnumerable Changes + public IChange [] Changes { - get { return _changeset.Changes.Select(c => _bridge.Wrap(c)); } + get { return _changeset.Changes.Select(c => _bridge.Wrap(c)).ToArray(); } } public string Committer @@ -78,9 +94,9 @@ namespace Sep.Git.Tfs.Core.TfsInterop _item = item; } - public IItem GetVersion(int changeset) + public IVersionControlServer VersionControlServer { - return _bridge.Wrap(_item.VersionControlServer.GetItem(_item.ItemId, _item.ChangesetId - 1)); + get { return _bridge.Wrap(_item.VersionControlServer); } } public int ChangesetId @@ -103,6 +119,11 @@ namespace Sep.Git.Tfs.Core.TfsInterop get { return _bridge.Convert(_item.ItemType); } } + public int ItemId + { + get { return _item.ItemId; } + } + public void DownloadFile(string file) { _item.DownloadFile(file); @@ -185,12 +206,12 @@ namespace Sep.Git.Tfs.Core.TfsInterop _workspace = workspace; } - public IEnumerable GetPendingChanges() + public IPendingChange [] GetPendingChanges() { - return _workspace.GetPendingChanges().Select(c => _bridge.Wrap(c)); + return _workspace.GetPendingChanges().Select(c => _bridge.Wrap(c)).ToArray(); } - public void Shelve(IShelveset shelveset, IEnumerable changes, TfsShelvingOptions options) + public void Shelve(IShelveset shelveset, IPendingChange [] changes, TfsShelvingOptions options) { _workspace.Shelve(_bridge.Unwrap(shelveset), changes.Select(c => _bridge.Unwrap(c)).ToArray(), _bridge.Convert(options)); } diff --git a/GitTfs/Core/TfsInterop/TfsApiBridge.cs b/GitTfs/Core/TfsInterop/TfsApiBridge.cs index 67d1fd58..34e8c522 100644 --- a/GitTfs/Core/TfsInterop/TfsApiBridge.cs +++ b/GitTfs/Core/TfsInterop/TfsApiBridge.cs @@ -62,6 +62,11 @@ namespace Sep.Git.Tfs.Core.TfsInterop return new NeedsToBeReflectedWorkItemCheckinInfo(workItemCheckinInfo); } + public IVersionControlServer Wrap(VersionControlServer versionControlServer) + { + return new NeedsToBeReflectedVersionControlServer(this, versionControlServer); + } + public WorkItemCheckinInfo Unwrap(IWorkItemCheckinInfo info) { return WrapperFor.Unwrap(info); diff --git a/GitTfs/GitTfs.csproj b/GitTfs/GitTfs.csproj index c63390fb..de428dc4 100644 --- a/GitTfs/GitTfs.csproj +++ b/GitTfs/GitTfs.csproj @@ -106,6 +106,7 @@ +