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