private GetCommits()

in Extensions/CircleCI/Src/Tasks/DownloadCircleCIArtifacts/commitsdownloader.ts [97:162]


    private GetCommits(startBuildId: string, endBuildId: string): Q.Promise<string> {
        let connection = tl.getInput("connection", true);
        let definitionId = tl.getInput("definition", true);
        var endpointUrl = tl.getEndpointUrl(connection, false);
        let defer = Q.defer<string>();
        let url: string = `${endpointUrl}/api/v1.1/project/${definitionId}/${startBuildId}`;
        url = url.replace(/([^:]\/)\/+/g, "$1");
        let commits = [];
        
        this.executeWithRetries("getCommits", (url, headers) => { return this.webProvider.webClient.get(url, headers) }, url, { 'Accept': 'application/json' }).then((res: HttpClientResponse) => {
            if (res && res.message.statusCode === 200) {
                res.readBody().then((body: string) => {
                    let jsonResult = JSON.parse(body);
                    let branch;
                    if (!!jsonResult) {
                        branch = jsonResult.branch;
                    }
                    else {
                        defer.reject(tl.loc("BranchNotFound"));
                        return;
                    }

                    let buildsUrl = `${endpointUrl}/api/v1.1/project/${definitionId}/tree/${branch}`;
                    buildsUrl = buildsUrl.replace(/([^:]\/)\/+/g, "$1");
                    this.webProvider.webClient.get(buildsUrl, { 'Accept': 'application/json' }).then((res: HttpClientResponse) => {
                        res.readBody().then((body: string) => {
                            let builds = JSON.parse(body);
                            let commitsIdsMap = {};
                            if (!!builds) {
                                builds.forEach(build => {
                                    if (Number(build.build_num) <= Number(endBuildId) && Number(build.build_num) >= Number(startBuildId) && build.all_commit_details[0]) {
                                        build.all_commit_details.forEach(c => {
                                            let commit = {
                                                "Id": c.commit,
                                                "Message": c.subject,
                                                "Author": {
                                                    "displayName": c.author_name
                                                },
                                                "DisplayUri": c.commit_url,
                                                "Timestamp": c.author_date
                                            };
        
                                            if (!commitsIdsMap[commit.Id]) {
                                                commits.push(commit);
                                                commitsIdsMap[commit.Id] = true;
                                            }
                                        });
                                    }
                                });
                            }
                            
                            tl.debug("Downloaded " + commits.length + " commits");
                            defer.resolve(JSON.stringify(commits));
                        }, (error) => {
                            defer.reject(error);
                        });

                    }, (error) => {
                        defer.reject(error);
                    });
                });
            }
        });

        return defer.promise;
    }