štvrtok, 4. februára 2010

PowerShell and Team Foundation Server API

Team Foundation Server has a great API and you can use it to extend its capabilities or automatize tasks and so on. This API can be also used from PowerShell, which demonstrates this post. You have to know only how to use .NET from PowerShell. Following code uses TFS API to get count of new lines of code added in specified changeset:



   1:  ################################################################################

   2:  #

   3:  #  Get-AddedLinesCountInChangeset

   4:  #

   5:  ################################################################################

   6:   

   7:  param 

   8:  (

   9:      [string] $tfsUrl      = $(throw "TFS URL is required"),

  10:      [int]    $changeSetId = $(throw "Changeset ID is required")

  11:  )

  12:   

  13:  [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")

  14:  [void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")

  15:   

  16:  function LinesCountInFile($item, $version)

  17:  {

  18:      $tempFile = [System.IO.Path]::GetTempFileName()

  19:   

  20:      $itemVersion = $vcs.GetItem($item.ServerItem, $version)

  21:      $itemVersion.DownloadFile($tempFile)

  22:      $linesCount = (Get-Content $tempFile | Measure-Object).Count

  23:      Remove-Item -Force $tempFile

  24:   

  25:      $linesCount

  26:  }

  27:   

  28:  function ProcessChange($change)

  29:  {

  30:      if($change.Item.ItemType -eq "Folder")

  31:      {

  32:          return $False

  33:      }

  34:   

  35:      $extensions = ".cs", ".aspx", ".ascx", ".xml", ".xaml", ".config"

  36:   

  37:      foreach ($extension in $extensions)

  38:      {

  39:          if ($change.Item.ServerItem.EndsWith($extension))

  40:          {

  41:              return $True

  42:          }

  43:      }

  44:   

  45:      return $False

  46:  }

  47:   

  48:  $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsUrl)

  49:  $vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])

  50:   

  51:  $thisVersionSpec = New-Object Microsoft.TeamFoundation.VersionControl.Client.ChangesetVersionSpec $changeSetId

  52:  $previousVersionSpec = New-Object Microsoft.TeamFoundation.VersionControl.Client.ChangesetVersionSpec ($changeSetId - 1)

  53:   

  54:  $chs = $vcs.GetChangeset($changeSetId)

  55:  $totalLinesCount = 0

  56:  Write-Host

  57:   

  58:  foreach ($change in $chs.Changes)

  59:  {

  60:      if (ProcessChange($change))

  61:      {

  62:          $nameParts = $change.Item.ServerItem.Split("/")

  63:          $fileName = $nameParts[$nameParts.Length - 1]

  64:   

  65:          $thisLength = LinesCountInFile $change.Item $thisVersionSpec

  66:   

  67:          if ($change.ChangeType.ToString().Contains("Add"))

  68:          {

  69:              $previousLength = 0

  70:          }

  71:          else

  72:          {

  73:              $previousLength = LinesCountInFile $change.Item $previousVersionSpec

  74:          }

  75:   

  76:          $added = $thisLength - $previousLength

  77:   

  78:          Write-Host "$fileName             $added" -Fore Yellow

  79:          if ($added -gt 0) { $totalLinesCount = $totalLinesCount + $added }

  80:      }   

  81:  }

  82:   

  83:  Write-Host "------------------------------------------------------"

  84:  Write-Host "Total Lines:            $totalLinesCount" -Fore Green

  85:  Write-Host


If you use TFS 2005/2008 then specify only server url, when TFS 2010 then specify url including the collection.


PowerShell console
Manning - Team Foundation Server 2008 in ActionWrox - Professional Visual Studio 2005 Team System

Žiadne komentáre: