VsoClient.queryParamsToStringHelper is incorrectly expanding array-typed query parameters. Query parameters of type string[] must be expanded such that the query parameter name is repeated for each value in the array-typed value. For instance, to filter commits in Commits - Get Commits endpoint, searchCriteria.ids must be specified for each commit to be filtered. However, when using IGitApi.getCommits, the URL that gets generated when searchCriteria.ids is specified has a .n appended to the name of the query string parameter (where n is the index of the value in the searchCriteria.ids). For example, searchCriteria.ids.0=e7514f6eb6d7b0a159b8c9059fcfc9cf53e57c02&searchCriteria.ids.1=d35a7a4f31b2d72eadb2e87f9808c88647b6087d is the query string parameter string that gets generated when two commit identifiers are specified in searchCriteria.ids As a result, the filtering is broken because query parameters with .n in the name are ignored by the service.
Demonstration
import { getPersonalAccessTokenHandler, WebApi } from "./WebApi";
import { GitQueryCommitsCriteria } from "./interfaces/GitInterfaces";
async function main() {
const token = process.env.AZURE_DEVOPS_PAT || "";
const handler = getPersonalAccessTokenHandler(token);
const webApi = new WebApi("https://dev.azure.com/organization/", handler);
const gitApi = await webApi.getGitApi();
const repository = await gitApi.getRepository("project", "repository");
if (repository?.id) {
var searchCriteria: GitQueryCommitsCriteria = {
ids: [
"e7514f6eb6d7b0a159b8c9059fcfc9cf53e57c02",
"d35a7a4f31b2d72eadb2e87f9808c88647b6087d",
],
};
var commits = await gitApi.getCommits(repository.id, searchCriteria);
console.log(`# Commits: ${commits.length}`);
console.log("5 Most Recent Commits\n");
commits.slice(0, 5).forEach((commit, idx) => {
console.log(` ${idx + 1}. ${commit.commitId}`);
});
}
}
main();
Output
searchCriteria.ids is expected to filter the commits to only those specified but, as shown in the output below, 100 commits (the default number of commits) are returned.
$ npx ts-node api/scratch.ts
# Commits: 100
5 Most Recent Commits
1. e7514f6eb6d7b0a159b8c9059fcfc9cf53e57c02
2. d35a7a4f31b2d72eadb2e87f9808c88647b6087d
3. 97e6de8b8dc8edcbe0477d2520d31c7502e2034f
4. 5af4f0554285b7c89c54bf6c8ddf5620203c8b09
5. 7157c2513b3ef1585326f589cbdbc34f279cf13d
VsoClient.queryParamsToStringHelperis incorrectly expanding array-typed query parameters. Query parameters of typestring[]must be expanded such that the query parameter name is repeated for each value in the array-typed value. For instance, to filter commits in Commits - Get Commits endpoint,searchCriteria.idsmust be specified for each commit to be filtered. However, when usingIGitApi.getCommits, the URL that gets generated whensearchCriteria.idsis specified has a.nappended to the name of the query string parameter (wherenis the index of the value in thesearchCriteria.ids). For example,searchCriteria.ids.0=e7514f6eb6d7b0a159b8c9059fcfc9cf53e57c02&searchCriteria.ids.1=d35a7a4f31b2d72eadb2e87f9808c88647b6087dis the query string parameter string that gets generated when two commit identifiers are specified insearchCriteria.idsAs a result, the filtering is broken because query parameters with.nin the name are ignored by the service.Demonstration
Output
searchCriteria.idsis expected to filter the commits to only those specified but, as shown in the output below, 100 commits (the default number of commits) are returned.