How to get Workspace object in new TeamFoundation 2013 Templates

c#, tfs, tfsbuild

Solution

I went with a hack using internal classes from `Microsoft.TeamFoundation.Build.Activities.dll` (used by microsoft to create workspace name). You need to create custom activity with following code:

public sealed class GetDefaultWorkspace : BaseActivity<Workspace>
{     
    public override Activity CreateBody()
    {
        var type = typeof(TfGetSources).Assembly.GetType("Microsoft.TeamFoundation.Build.Activities.TeamFoundation.TfGetSources+GetDefaultWorkspaceName");

        var activity = (CodeActivity<string>)Activator.CreateInstance(type);
        var sequence = new Sequence();
        var workspaceName = new Variable<string>();

        sequence.Variables.Add(workspaceName);
        sequence.Activities.Add(activity);
        activity.Result = (OutArgument<string>) workspaceName;

        sequence.Activities.Add(new GetWorkspace
            {
                Name = workspaceName,
                Result = new LambdaReference<Workspace>(ctx => Result.Get(ctx))
            });

        return sequence;
    }
}

Problem

In new version of TeamFoundation 2013 default build templates, the `Workspace` variable is missing. It is needed as intput parameter for few key activities like `ConvertWorkspaceItem`. How do I get current workspace for TfvcTemplate.12.xaml templates? I've tried to use this msdn thread but it's not working for me (returns null workspace name). Any suggestions?

Original source