public async Task <List <TfsRestProjectCollection> > GetBuildDefinitionsGrouped(string url, string username, string password)
        {
            var resultProjectCollections = new List <TfsRestProjectCollection>();

            TfsConnectionDetails connection = new TfsConnectionDetails(url, username, password);
            var projectCollections          = await _tfsJsonService.GetProjectCollections(connection);

            foreach (var projectCollection in projectCollections)
            {
                //substitue the project name with DefaultCollection as defined in VSO REST API documenation
                projectCollection.Name = SubstituteName(url, projectCollection.Name);
                var resultProjectCollection = new TfsRestProjectCollection(projectCollection);
                var projects = await _tfsJsonService.GetProjects(connection, projectCollection.Name);

                foreach (var project in projects)
                {
                    var resultProject = new TfsRestProject(project);
                    resultProjectCollection.Projects.Add(resultProject);
                    var buildDefinitions = await GetBuildDefinitions(connection, projectCollection, project);

                    resultProject.BuildDefinitions = buildDefinitions;
                }
                resultProjectCollections.Add(resultProjectCollection);
            }
            return(resultProjectCollections);
        }
Beispiel #2
0
        private async Task <List <T> > GetFromTfs <T>(TfsConnectionDetails connection, string api, Dictionary <string, string> queryParams)
        {
            HttpClientHandler handler = new HttpClientHandler()
            {
                AllowAutoRedirect = true,
                Credentials       = connection.AsNetworkConnection()
            };

            HttpClient httpClient = new HttpClient(handler)
            {
                BaseAddress = connection.GetBaseAddress()
            };

            httpClient.DefaultRequestHeaders.Accept.Clear();
            var credentialsBase64Encoded = connection.Base64EncodeCredentials();

            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentialsBase64Encoded);
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var queryParamsAsString = string.Concat(queryParams.Select(i => "&" + i.Key + "=" + i.Value));
            var buildDefinitionsStr = await httpClient.GetStringAsync(api + "?api-version=2.0" + queryParamsAsString);

            var jsonWrapper = JsonConvert.DeserializeObject <TfsJsonWrapper <T> >(buildDefinitionsStr);

            return(jsonWrapper.Value);
        }
        private async Task <string> GetCommentOnce(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection)
        {
            var comments = await _tfsJsonService.GetComments(tfsJsonBuild, connection, projectCollection);

            var firstComment = comments.FirstOrDefault();
            var message      = firstComment?.Message;

            return(message);
        }
        public async Task FetchNewComments(List <TfsJsonBuild> projects, TfsConnectionDetails connection, Func <TfsJsonBuild, Task <string> > getCommentFunc)
        {
            var unCachedDefinitions = projects.Where(i => !_commentsCache.ContainsKey(i.Definition.Id));
            var newlyChangedBuilds  = projects.Where(i => _commentsCache.ContainsKey(i.Definition.Id) && _commentsCache[i.Definition.Id].Item1 != i.Id);

            var allInvalidCaches      = unCachedDefinitions.Concat(newlyChangedBuilds);
            var commentRetrievalTasks = allInvalidCaches.Select(tfsJsonBuild => FetchAndSaveComment(getCommentFunc, tfsJsonBuild));
            // perform all comment retrievals in parallel
            await Task.WhenAll(commentRetrievalTasks);
        }
        public async Task FetchNewComments(List<TfsJsonBuild> projects, TfsConnectionDetails connection, Func<TfsJsonBuild, Task<string>> getCommentFunc)
        {
            var unCachedDefinitions = projects.Where(i => !_commentsCache.ContainsKey(i.Definition.Id));
            var newlyChangedBuilds = projects.Where(i => _commentsCache.ContainsKey(i.Definition.Id) && _commentsCache[i.Definition.Id].Item1 != i.Id);

            var allInvalidCaches = unCachedDefinitions.Concat(newlyChangedBuilds);
            var commentRetrievalTasks = allInvalidCaches.Select(tfsJsonBuild => FetchAndSaveComment(getCommentFunc, tfsJsonBuild));
            // perform all comment retrievals in parallel
            await Task.WhenAll(commentRetrievalTasks);
        }
 public async Task<IEnumerable<TfsRestBuildStatus>> GetBuildsStatuses(CiEntryPointSetting ciEntryPointSetting, BuildDefinitionSetting[] watchedBuildDefinitions)
 {
     var connection = new TfsConnectionDetails(ciEntryPointSetting);
     var buildDefinitionsByProjectCollection = watchedBuildDefinitions.GroupBy(bd => bd.Parent);
     List<TfsRestBuildStatus> resultingBuildStatuses = new List<TfsRestBuildStatus>();
     foreach (var buildDefinitionGroup in buildDefinitionsByProjectCollection)
     {
         var projectCollection = buildDefinitionGroup.Key;
         var buildQueryParams = GetBuildQueryParams(buildDefinitionGroup.ToArray());
         var projects = await _tfsJsonService.GetBuildsStatuses(connection, buildQueryParams, projectCollection);
         await _commentsCache.FetchNewComments(projects, connection, tfsJsonBuilds => GetComment(tfsJsonBuilds, connection, projectCollection));
         var buildStatuses = projects.Select(i => new TfsRestBuildStatus(i, _commentsCache));
         resultingBuildStatuses.AddRange(buildStatuses);
     }
     return resultingBuildStatuses;
 }
 private async Task<string> GetComment(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection)
 {
     var message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection);
     if (tfsJsonBuild.Definition.Type == "xaml" && message == null)
     {
         // old style xaml builds don't get associated with a commit immediately for some annoying reason, so keep trying for 2 minutes
         const int maxRetries = 12;
         for (int i = 0; i < maxRetries && message == null; i++)
         {
             _log.Debug("Comment was null for a xaml build definition, so delaying and checking for a comment again in 10 seconds");
             await Task.Delay(10000);
             message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection);
         }
     }
     return message?.Trim();
 }
        private async Task <string> GetComment(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection)
        {
            var message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection);

            if (tfsJsonBuild.Definition.Type == "xaml" && message == null)
            {
                // old style xaml builds don't get associated with a commit immediately for some annoying reason, so keep trying for 2 minutes
                const int maxRetries = 12;
                for (int i = 0; i < maxRetries && message == null; i++)
                {
                    _log.Debug("Comment was null for a xaml build definition, so delaying and checking for a comment again in 10 seconds");
                    await Task.Delay(10000);

                    message = await GetCommentOnce(tfsJsonBuild, connection, projectCollection);
                }
            }
            return(message?.Trim());
        }
        public async Task <IEnumerable <TfsRestBuildStatus> > GetBuildsStatuses(CiEntryPointSetting ciEntryPointSetting, BuildDefinitionSetting[] watchedBuildDefinitions)
        {
            var connection = new TfsConnectionDetails(ciEntryPointSetting);
            var buildDefinitionsByProjectCollection          = watchedBuildDefinitions.GroupBy(bd => bd.Parent);
            List <TfsRestBuildStatus> resultingBuildStatuses = new List <TfsRestBuildStatus>();

            foreach (var buildDefinitionGroup in buildDefinitionsByProjectCollection)
            {
                var projectCollection = buildDefinitionGroup.Key;
                var buildQueryParams  = GetBuildQueryParams(buildDefinitionGroup.ToArray());
                var projects          = await _tfsJsonService.GetBuildsStatuses(connection, buildQueryParams, projectCollection);

                await _commentsCache.FetchNewComments(projects, connection, tfsJsonBuilds => GetComment(tfsJsonBuilds, connection, projectCollection));

                var buildStatuses = projects.Select(i => new TfsRestBuildStatus(i, _commentsCache));
                resultingBuildStatuses.AddRange(buildStatuses);
            }
            return(resultingBuildStatuses);
        }
 public async Task<List<TfsRestProjectCollection>>  GetBuildDefinitionsGrouped(string url, string username, string password)
 {
     TfsConnectionDetails connection = new TfsConnectionDetails(url, username, password);
     var projectCollections = await _tfsJsonService.GetProjectCollections(connection);
     var resultProjectCollections = new List<TfsRestProjectCollection>();
     foreach (var projectCollection in projectCollections)
     {
         var resultProjectCollection = new TfsRestProjectCollection(projectCollection);
         var projects = await _tfsJsonService.GetProjects(connection, projectCollection.Name);
         foreach (var project in projects)
         {
             var resultProject = new TfsRestProject(project);
             resultProjectCollection.Projects.Add(resultProject);
             var buildDefinitions = await GetBuildDefinitions(connection, projectCollection, project);
             resultProject.BuildDefinitions = buildDefinitions;
         }
         resultProjectCollections.Add(resultProjectCollection);
     }
     return resultProjectCollections;
 }
Beispiel #11
0
 public async Task <List <TfsJsonProjectCollection> > GetProjectCollections(TfsConnectionDetails connection)
 {
     return(await GetFromTfs <TfsJsonProjectCollection>(connection, "_apis/projectcollections", new Dictionary <string, string>()));
 }
Beispiel #12
0
        public async Task <List <TfsJsonComment> > GetComments(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection)
        {
            var comments = await GetFromTfs <TfsJsonComment>(connection, $"{projectCollection}/_apis/build/builds/{tfsJsonBuild.Id}/changes",
                                                             new Dictionary <string, string>());

            return(comments);
        }
Beispiel #13
0
 public async Task <List <TfsJsonBuildDefinition> > GetBuildDefinitions(TfsConnectionDetails connection, string projectCollection, string project)
 {
     return(await GetFromTfs <TfsJsonBuildDefinition>(connection, $"{projectCollection}/{project}/_apis/build/definitions", new Dictionary <string, string>()));
 }
Beispiel #14
0
 public async Task <List <TfsJsonBuild> > GetBuildsStatuses(TfsConnectionDetails connection, Dictionary <string, string> queryParams, string projectCollection)
 {
     return(await GetFromTfs <TfsJsonBuild>(connection, $"{projectCollection}/_apis/build/builds", queryParams));
 }
        private async Task <List <TfsRestBuildDefinition> > GetBuildDefinitions(TfsConnectionDetails connection, TfsJsonProjectCollection projectCollection, TfsJsonProject project)
        {
            var tfsJsonBuildDefinitions = await _tfsJsonService.GetBuildDefinitions(connection, projectCollection.Name, project.Name);

            return(tfsJsonBuildDefinitions.Select(i => new TfsRestBuildDefinition(i, project, projectCollection)).ToList());
        }
 private async Task<List<TfsRestBuildDefinition>> GetBuildDefinitions(TfsConnectionDetails connection, TfsJsonProjectCollection projectCollection, TfsJsonProject project)
 {
     var tfsJsonBuildDefinitions = await _tfsJsonService.GetBuildDefinitions(connection, projectCollection.Name, project.Name);
     return tfsJsonBuildDefinitions.Select(i => new TfsRestBuildDefinition(i, project, projectCollection)).ToList();
 }
 private async Task<string> GetCommentOnce(TfsJsonBuild tfsJsonBuild, TfsConnectionDetails connection, string projectCollection)
 {
     var comments = await _tfsJsonService.GetComments(tfsJsonBuild, connection, projectCollection);
     var firstComment = comments.FirstOrDefault();
     var message = firstComment?.Message;
     return message;
 }