为什么TFS Rest API用于获取仅返回256个项目的TFVC变更集?

时间:2016-07-19 12:22:55

标签: api tfs devops alm tfvc

为什么用于获取TFVC变更集的TFS Rest API仅返回256个项目。我尝试使用$ Top获得超过256个结果。但没用。

获取Git存储库提交的API工作正常。

我指的是https://www.visualstudio.com/en-us/docs/integrate/api/tfvc/changesets

示例请求 ?https://tfs.domain.com/tfs/defaultcollection/projectname/_apis/tfvc/changesets $ searchCriteria.fromDate = 2016-07-12T17:49:01&安培; $跳过= 0&安培; $顶部= 500

我试过没有$ skip和$ searchcriteria.fromdate。请帮助我了解如何获得所有结果。

2 个答案:

答案 0 :(得分:4)

我设法解决了这个奇怪的逻辑(谢谢MSFT你摇滚的人:/)。 在我的情况下,我想获得所有变更集。

1)你需要获得前256个变更集(我在响应中使用了orderby以便顺序):

<projectName>/_apis/tfvc/changesets?$top=256&orderby=id desc&searchCriteria.itemPath=<your_path>&api-version=1.0

2)如果您有超过0个项目作为响应从响应中获取changesetNumber的最后一个值。如果为0 - 您获得了所有变更集。

3)从changesetNumber开始接下来的256个项目:

  <projectName>/_apis/tfvc/changesets?searchCriteria.toId=<changesetNumber>&$top=256&orderby=id desc&searchCriteria.itemPath=<your_path>&api-version=1.0

你需要跳过第一个变更集(你已经有了这个值)作为回应。

4)转到第2步

因此,您需要使用searchCriteria.fromDate将createdsetId替换为createdDate,将searchCriteria.toId替换为searchCriteria.toId。 我希望我的解决方案可以帮到你。

P.S。我无法在连接网站上找到任何反馈。

答案 1 :(得分:0)

根据上面的@Vitaly评论,我在posh here中实现了解决方案。还提取了下面的脚本:

function Get-MaxChangeset($Project, $LastChngset)
{
    $projectUri = "$rootTfsUri/$($Project.name)/_apis/tfvc/changesets?api-version=3.1&`$top=256&orderby=id desc"
    $lastchangeset = $LastChngset
    if($lastchangeset -ne $null){
        $projectUri += "&searchCriteria.toId=$($lastchangeset.changesetId)"
    }

    $nestedsubresponse = Invoke-WebRequest -Uri $projectUri -UseDefaultCredentials -Method Get -Verbose -UseBasicParsing
    $nestedsubresponseObject = $nestedsubresponse.Content | ConvertFrom-Json
    if($nestedsubresponseObject.count -ge 1)
    {
        # exclude false positives.
        $lastchangeset = $nestedsubresponseObject.value | `
                    where-object {
                        ($_.checkedInBy.displayName -notlike "*Project Collection Service Accounts*") } | `
                    Sort-Object changesetId -Descending | Select-Object -First 1

        if( ($lastchangeset -eq $null) -and ($nestedsubresponseObject.count -ge 256) )
        {
            # More records to search. Pick the bottom from current list and send it back for next batch api call.
            $lastchangeset = $nestedsubresponseObject.value | Sort-Object changesetId | Select-Object -First 1
            $lastchangeset = Get-MaxChangeset $Project $lastchangeset
        }
    }

    return $lastchangeset
}

$rootTfsUri = "http://tfs:8080/tfs/DefaultCollection"
$allProjectsUri = "$rootTfsUri/_apis/projects?api-version=3.1&`$top=256"
$projectStats = @{}
$response = Invoke-WebRequest -Uri $allProjectsUri -UseDefaultCredentials -Method Get -Verbose -UseBasicParsing
$responseObject = $response.Content | ConvertFrom-Json
if($responseObject.count -ge 1)
{
    foreach($prj in $responseObject.value)
    {
        $lastchangeset = Get-MaxChangeset $prj $null
        if($lastchangeset -ne $null)
        {
            $projectStats.Add("$($prj.name)", $lastchangeset.createdDate)
        }
        else
        {
            $projectStats.Add("$($prj.name)", $lastchangeset)
        }
    }

    $projectStats.GetEnumerator() | Export-Csv "CheckInHistory.csv"
}

HTH, 萨姆