tags:

views:

86

answers:

1

I am looking for some quick ways to do some (more) complex queries across who has what checked out and things like that (eg. which files have >1 person checked out).

I have been learning F# over the last year or so and saw the potential to use both the functional aspects of F# to quickly create some useful and more complex TFS commands.

I was wondering if anyone else has done this, or have any ideas on how I would go about doing this.

PS: I am using TFS 2005.

Thanks

Russell

+6  A: 

Hi Russell,

You'll need the Visual Studio 2005 SDK to get the needed assemblies. The SDK also includes a few examples in C# you can use as reference, and some dokumentation. Neither is very good (IMHO) so you'll probably have to do some googling.

I wrote the following code as proof of concept, but it might help you to get started. Note this is written in VS2010 so you might have to use #I statements to reference the right assemblies.

#light
// #I @"C:\Program Files (x86)\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Common\Assemblies\"
#r "Microsoft.TeamFoundation"
#r "Microsoft.TeamFoundation.Client"
#r "Microsoft.TeamFoundation.WorkItemTracking.Client"
#r "Microsoft.TeamFoundation.VersionControl.Client"

open System
open System.Collections.Generic
open System.Net
open Microsoft.TeamFoundation
open Microsoft.TeamFoundation.Client
open Microsoft.TeamFoundation.WorkItemTracking.Client
open Microsoft.TeamFoundation.VersionControl.Client


type TeamFoundationClient(uri, credentials : ICredentials) =
    let server = new TfsTeamProjectCollection (Uri uri, credentials)
    let workitemStore = server.GetService(typeof<WorkItemStore>) :?> WorkItemStore
    let versionControlServer = server.GetService(typeof<VersionControlServer>) :?> VersionControlServer

    member this.ExecuteQuery wiql =
        workitemStore.Query(wiql) 
            |> Seq.cast<WorkItem>

    member this.GetWorkItem id =
        workitemStore.GetWorkItem (id : int)

    member this.GetChangeset changesetUri =
        versionControlServer.ArtifactProvider.GetChangeset (Uri changesetUri)

    member this.GetChangesets (wi : WorkItem) =
        let isChangeset (link : Link) = 
            match link with 
            | :? ExternalLink as link' when link'.LinkedArtifactUri.Contains("Changeset") -> Some (link')
            | _ -> None
        wi.Links
            |> Seq.cast<Link>
            |> Seq.choose isChangeset
            |> Seq.map (fun l -> l.LinkedArtifactUri)

    static member CreateCredentials (username : string) (password : string) (domain : string) = 
        (NetworkCredential (username, password, domain)) :> ICredentials

//Huusom

Huusom
Thanks, that is a great start. :) I am using VS2010 too so this will make it even easier! I'll give it a try and see how it goes.
Russell
Actually, you don't need the Visual Studio 2005 SDK. The needed assemblies are installed when the Team Explorer client is installed (or automatically along with VS2010 Ultimate).
Robaticus