diff --git a/.travis.yml b/.travis.yml index a78b9f7a..82675b1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,27 @@ language: c +notifications: + irc: + channels: + - "irc.freenode.org#git-tfs" + template: + - "travis build %{build_number} (%{branch} - %{commit} - %{author}): %{message} #{build_url}" + on_success: change + on_failure: always + install: - - sudo apt-get install mono-devel mono-gmcs + - sudo apt-get install cmake mono-devel mono-gmcs script: - git submodule update --init + - cd lib/libgit2sharp + - git submodule update --init + - mkdir cmake-build + - cd cmake-build + - cmake -DTHREADSAFE=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_CLAR=OFF -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=./libgit2-bin ../libgit2 + - export LD_LIBRARY_PATH=$PWD/libgit2-bin/lib + - cmake --build . --target install + - cp -Rpv libgit2-bin/lib ../Lib/NativeBinaries/ + - cd .. + - cd ../.. - xbuild CI.proj diff --git a/GitTfs.Vs11/GitTfs.Vs11.csproj b/GitTfs.Vs11/GitTfs.Vs11.csproj index 3cc837b4..d19a7e51 100644 --- a/GitTfs.Vs11/GitTfs.Vs11.csproj +++ b/GitTfs.Vs11/GitTfs.Vs11.csproj @@ -66,6 +66,9 @@ Properties\CommonAssemblyInfo.cs + + Wrappers.PostVs2010.cs + Properties\Version.cs diff --git a/GitTfs.Vs2010/GitTfs.Vs2010.csproj b/GitTfs.Vs2010/GitTfs.Vs2010.csproj index 3100d51c..b9d21892 100644 --- a/GitTfs.Vs2010/GitTfs.Vs2010.csproj +++ b/GitTfs.Vs2010/GitTfs.Vs2010.csproj @@ -104,6 +104,9 @@ Wrappers.cs + + Wrappers.PostVs2010.cs + Properties\Version.cs diff --git a/GitTfs.VsCommon/TfsHelper.Common.cs b/GitTfs.VsCommon/TfsHelper.Common.cs index 8b78f893..596f7468 100644 --- a/GitTfs.VsCommon/TfsHelper.Common.cs +++ b/GitTfs.VsCommon/TfsHelper.Common.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Net; +using Microsoft.TeamFoundation; using Microsoft.TeamFoundation.Server; using Microsoft.TeamFoundation.VersionControl.Client; using Microsoft.TeamFoundation.WorkItemTracking.Client; @@ -47,13 +48,6 @@ namespace Sep.Git.Tfs.VsCommon private string[] _legacyUrls; - - public string[] LegacyUrls - { - get { return _legacyUrls ?? (_legacyUrls = new string[0]); } - set { _legacyUrls = value; } - } - protected NetworkCredential GetCredential() { var idx = Username.IndexOf('\\'); @@ -108,11 +102,18 @@ namespace Sep.Git.Tfs.VsCommon get { return GetService(); } } + private ILinking _linking; + private ILinking Linking + { + get { return _linking ?? (_linking = GetService()); } + } + public IEnumerable GetChangesets(string path, long startVersion, GitTfsRemote remote) { var changesets = VersionControl.QueryHistory(path, VersionSpec.Latest, 0, RecursionType.Full, null, new ChangesetVersionSpec((int) startVersion), VersionSpec.Latest, int.MaxValue, true, true, true); + return changesets.Cast() .OrderBy(changeset => changeset.ChangesetId) .Select(changeset => BuildTfsChangeset(changeset, remote)); @@ -120,7 +121,12 @@ namespace Sep.Git.Tfs.VsCommon public virtual bool CanGetBranchInformation { get { return false; } } - public virtual IEnumerable GetAllTfsBranchesOrderedByCreation() + public virtual IEnumerable GetAllTfsRootBranchesOrderedByCreation() + { + throw new NotImplementedException(); + } + + public virtual IEnumerable GetBranches() { throw new NotImplementedException(); } @@ -133,12 +139,25 @@ namespace Sep.Git.Tfs.VsCommon private ITfsChangeset BuildTfsChangeset(Changeset changeset, GitTfsRemote remote) { var tfsChangeset = _container.With(this).With(_bridge.Wrap(changeset)).GetInstance(); - tfsChangeset.Summary = new TfsChangesetInfo {ChangesetId = changeset.ChangesetId, Remote = remote}; + tfsChangeset.Summary = new TfsChangesetInfo { ChangesetId = changeset.ChangesetId, Remote = remote }; + + if (changeset.WorkItems != null) + { + tfsChangeset.Summary.Workitems = changeset.WorkItems.Select(wi => new TfsWorkitem + { + Id = wi.Id, + Title = wi.Title, + Description = wi.Description, + Url = Linking.GetArtifactUrl(wi.Uri.AbsoluteUri) + }); + } + return tfsChangeset; } public void WithWorkspace(string localDirectory, IGitTfsRemote remote, TfsChangesetInfo versionToFetch, Action action) { + Trace.WriteLine("Setting up a TFS workspace at " + localDirectory); var workspace = GetWorkspace(localDirectory, remote.TfsRepositoryPath); try { @@ -258,7 +277,7 @@ namespace Sep.Git.Tfs.VsCommon shelvesets = shelvesets.OrderBy(s => s.CreationDate); break; case "owner": - shelvesets = shelvesets.OrderBy(s => s.OwnerName); + shelvesets = shelvesets.OrderBy(s => s.OwnerName).ThenBy(s => s.CreationDate); break; case "name": shelvesets = shelvesets.OrderBy(s => s.Name); @@ -271,6 +290,9 @@ namespace Sep.Git.Tfs.VsCommon return GitTfsExitCodes.InvalidArguments; } } + else + shelvesets = shelvesets.OrderBy(s => s.CreationDate); + if (shelveList.FullFormat) WriteShelvesetsToStdoutDetailed(shelvesets); else @@ -282,7 +304,7 @@ namespace Sep.Git.Tfs.VsCommon { foreach (var shelveset in shelvesets) { - _stdout.WriteLine(" {0,-20} {1,-20}", shelveset.OwnerName, shelveset.Name); + _stdout.WriteLine("{0,-22} {1,-20}", shelveset.OwnerName, shelveset.Name); } } @@ -499,11 +521,6 @@ namespace Sep.Git.Tfs.VsCommon return BuildTfsChangeset(VersionControl.GetChangeset(changesetId), remote); } - public bool MatchesUrl(string tfsUrl) - { - return Url == tfsUrl || LegacyUrls.Contains(tfsUrl); - } - public IEnumerable GetWorkItemInfos(IEnumerable workItems, TfsWorkItemCheckinAction checkinAction) { return @@ -558,9 +575,10 @@ namespace Sep.Git.Tfs.VsCommon return new WorkItemCheckedInfo(Convert.ToInt32(workitem), true, checkinAction); } - public IEnumerable GetLabels(string tfsPathBranch) + public IEnumerable GetLabels(string tfsPathBranch, string nameFilter = null) { - var labels = VersionControl.QueryLabels(null, tfsPathBranch, null, true, tfsPathBranch, VersionSpec.Latest); + var labels = VersionControl.QueryLabels(nameFilter, tfsPathBranch, null, true, tfsPathBranch, VersionSpec.Latest); + return labels.Select(e => new TfsLabel { Id = e.LabelId, Name = e.Name, @@ -573,4 +591,4 @@ namespace Sep.Git.Tfs.VsCommon } } -} \ No newline at end of file +} diff --git a/GitTfs.VsCommon/TfsHelper.PostVs2010.Common.cs b/GitTfs.VsCommon/TfsHelper.PostVs2010.Common.cs index 63b6c9c0..f3b3155e 100644 --- a/GitTfs.VsCommon/TfsHelper.PostVs2010.Common.cs +++ b/GitTfs.VsCommon/TfsHelper.PostVs2010.Common.cs @@ -4,23 +4,36 @@ using System.IO; using System.Linq; using Microsoft.TeamFoundation.VersionControl.Client; using Sep.Git.Tfs.Core; +using Sep.Git.Tfs.Core.BranchVisitors; +using Sep.Git.Tfs.Core.TfsInterop; using StructureMap; namespace Sep.Git.Tfs.VsCommon { - public abstract class TfsHelperVs2010Base : TfsHelperBase { + TfsApiBridge _bridge; + public TfsHelperVs2010Base(TextWriter stdout, TfsApiBridge bridge, IContainer container) : base(stdout, bridge, container) { + _bridge = bridge; } public override bool CanGetBranchInformation { get { return true; } } - public override IEnumerable GetAllTfsBranchesOrderedByCreation() + public override IEnumerable GetAllTfsRootBranchesOrderedByCreation() { - return VersionControl.QueryRootBranchObjects(RecursionType.Full).Select(b => b.Properties.RootItem.Item); + return VersionControl.QueryRootBranchObjects(RecursionType.Full) + .Where(b => b.Properties.ParentBranch == null) + .Select(b => b.Properties.RootItem.Item); + } + + public override IEnumerable GetBranches() + { + var branches = VersionControl.QueryRootBranchObjects(RecursionType.Full) + .Where(b => b.Properties.RootItem.IsDeleted == false); + return _bridge.Wrap(branches); } public override int GetRootChangesetForBranch(string tfsPathBranchToCreate, string tfsPathParentBranch = null) @@ -46,10 +59,12 @@ namespace Sep.Git.Tfs.VsCommon throw new GitTfsException("An unexpected error occured when trying to find the root changeset.\nFailed to find first changeset for " + tfsPathBranchToCreate); } - var mergedItemsToFirstChangesetInBranchToCreate = - VersionControl.TrackMerges(new int[] {firstChangesetInBranchToCreate.ChangesetId}, - new ItemIdentifier(tfsPathBranchToCreate), - new ItemIdentifier[] {new ItemIdentifier(tfsPathParentBranch),}, null); + var mergedItemsToFirstChangesetInBranchToCreate = VersionControl + .TrackMerges(new int[] {firstChangesetInBranchToCreate.ChangesetId}, + new ItemIdentifier(tfsPathBranchToCreate), + new ItemIdentifier[] {new ItemIdentifier(tfsPathParentBranch),}, + null) + .OrderBy(x => x.SourceChangeset.ChangesetId); var lastChangesetsMergeFromParentBranch = mergedItemsToFirstChangesetInBranchToCreate.LastOrDefault(); diff --git a/GitTfs.VsCommon/Wrappers.PostVs2010.cs b/GitTfs.VsCommon/Wrappers.PostVs2010.cs new file mode 100644 index 00000000..cd6a5211 --- /dev/null +++ b/GitTfs.VsCommon/Wrappers.PostVs2010.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.TeamFoundation.VersionControl.Client; +using Sep.Git.Tfs.Core.TfsInterop; + +namespace Sep.Git.Tfs.VsCommon +{ + public class WrapperForBranchObject : WrapperFor, IBranchObject + { + BranchObject _branch; + + public WrapperForBranchObject(BranchObject branch) : base(branch) + { + _branch = branch; + } + + public string Path + { + get { return _branch.Properties.RootItem.Item; } + } + + public bool IsRoot + { + get { return _branch.Properties.ParentBranch == null; } + } + + public string ParentPath + { + get { return _branch.Properties.ParentBranch.Item; } + } + } +} diff --git a/GitTfs.VsCommon/Wrappers.cs b/GitTfs.VsCommon/Wrappers.cs index a3301249..c2a3a775 100644 --- a/GitTfs.VsCommon/Wrappers.cs +++ b/GitTfs.VsCommon/Wrappers.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using Microsoft.TeamFoundation.Server; using Microsoft.TeamFoundation.VersionControl.Client; +using Sep.Git.Tfs.Core; using Sep.Git.Tfs.Core.TfsInterop; using Sep.Git.Tfs.Util; diff --git a/GitTfs.VsFake/TfsHelper.VsFake.cs b/GitTfs.VsFake/TfsHelper.VsFake.cs index 7be32532..4c505f44 100644 --- a/GitTfs.VsFake/TfsHelper.VsFake.cs +++ b/GitTfs.VsFake/TfsHelper.VsFake.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using Sep.Git.Tfs.Commands; @@ -15,12 +16,14 @@ namespace Sep.Git.Tfs.VsFake #region misc/null IContainer _container; - private TextWriter _stdout; + TextWriter _stdout; + Script _script; - public TfsHelper(IContainer container, TextWriter stdout) + public TfsHelper(IContainer container, TextWriter stdout, Script script) { _container = container; _stdout = stdout; + _script = script; } public string TfsClientLibraryVersion { get { return "(FAKE)"; } } @@ -28,7 +31,6 @@ namespace Sep.Git.Tfs.VsFake public string Url { get; set; } public string Username { get; set; } public string Password { get; set; } - public string[] LegacyUrls { get; set; } public void EnsureAuthenticated() {} @@ -50,12 +52,12 @@ namespace Sep.Git.Tfs.VsFake public ITfsChangeset GetLatestChangeset(GitTfsRemote remote) { - return TfsPlugin.Script.Changesets.LastOrDefault().AndAnd(x => BuildTfsChangeset(x, remote)); + return _script.Changesets.LastOrDefault().AndAnd(x => BuildTfsChangeset(x, remote)); } public IEnumerable GetChangesets(string path, long startVersion, GitTfsRemote remote) { - return TfsPlugin.Script.Changesets.Where(x => x.Id > startVersion).Select(x => BuildTfsChangeset(x, remote)); + return _script.Changesets.Where(x => x.Id >= startVersion).Select(x => BuildTfsChangeset(x, remote)); } private ITfsChangeset BuildTfsChangeset(ScriptedChangeset changeset, GitTfsRemote remote) @@ -185,8 +187,14 @@ namespace Sep.Git.Tfs.VsFake public void WithWorkspace(string directory, IGitTfsRemote remote, TfsChangesetInfo versionToFetch, Action action) { + Trace.WriteLine("Setting up a TFS workspace at " + directory); var fakeWorkspace = new FakeWorkspace(directory, remote.TfsRepositoryPath); - var workspace = new TfsWorkspace(fakeWorkspace, directory, _stdout, versionToFetch, remote, null, this, null); + var workspace = _container.With("localDirectory").EqualTo(directory) + .With("remote").EqualTo(remote) + .With("contextVersion").EqualTo(versionToFetch) + .With("workspace").EqualTo(fakeWorkspace) + .With("tfsHelper").EqualTo(this) + .GetInstance(); action(workspace); } @@ -317,11 +325,6 @@ namespace Sep.Git.Tfs.VsFake throw new NotImplementedException(); } - public bool MatchesUrl(string tfsUrl) - { - throw new NotImplementedException(); - } - public bool HasShelveset(string shelvesetName) { throw new NotImplementedException(); @@ -349,12 +352,17 @@ namespace Sep.Git.Tfs.VsFake throw new NotImplementedException(); } - public IEnumerable GetAllTfsBranchesOrderedByCreation() + public IEnumerable GetAllTfsRootBranchesOrderedByCreation() { throw new NotImplementedException(); } - public IEnumerable GetLabels(string tfsPathBranch) + public IEnumerable GetBranches() + { + throw new NotImplementedException(); + } + + public IEnumerable GetLabels(string tfsPathBranch, string nameFilter = null) { throw new NotImplementedException(); } diff --git a/GitTfs.VsFake/TfsPlugin.cs b/GitTfs.VsFake/TfsPlugin.cs index e25db00f..b0922f0c 100644 --- a/GitTfs.VsFake/TfsPlugin.cs +++ b/GitTfs.VsFake/TfsPlugin.cs @@ -10,11 +10,12 @@ namespace Sep.Git.Tfs.VsFake { base.Initialize(scan); } + */ public override void Initialize(StructureMap.ConfigurationExpression config) { + config.For