public ProjectState GetProjectState(int projectId)
 {
     return(TaskRunnerContext.GetProjectVersionState(projectId));
 }
        private static void BuildProjects(AspNetDeployEntities entities)
        {
            List <BundleVersion> bundleVersions = entities.BundleVersion
                                                  .Include("Properties")
                                                  .Include("ProjectVersions.SourceControlVersion.Properties")
                                                  .ToList();

            foreach (BundleVersion bundleVersion in bundleVersions)
            {
                List <ProjectVersion> projectVersions = bundleVersion.ProjectVersions.Where(pv =>
                                                                                            (
                                                                                                pv.ProjectType.HasFlag(ProjectType.Database) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.WindowsApplication) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Service) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Console) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Web) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.GulpFile) ||
                                                                                                pv.ProjectType.HasFlag(ProjectType.Test)
                                                                                            ))
                                                        .ToList();

                IList <ProjectVersion> errorProjects = projectVersions.Where(pv => pv.GetStringProperty("LastBuildResult") == "Error").ToList();

                foreach (ProjectVersion projectVersion in errorProjects)
                {
                    TaskRunnerContext.SetProjectVersionState(projectVersion.Id, ProjectState.Error);
                }

                List <ProjectVersion> projectVersionsToRebuild = projectVersions.Where(pv => pv.SourceControlVersion.GetStringProperty("Revision") != pv.GetStringProperty("LastBuildRevision")).ToList();

                if (projectVersionsToRebuild.Count == 0)
                {
                    if (errorProjects.Count > 0)
                    {
                        TaskRunnerContext.SetBundleVersionState(bundleVersion.Id, BundleState.Error);
                    }

                    continue;
                }

                List <BundleVersion> affectedBundleVersions = projectVersionsToRebuild
                                                              .SelectMany(pv => pv.BundleVersions)
                                                              .Where(bv => !bv.IsDeleted)
                                                              .ToList();

                DateTime buildStartDate = DateTime.UtcNow;

                foreach (BundleVersion affectedBundleVersion in affectedBundleVersions)
                {
                    TaskRunnerContext.SetBundleVersionState(affectedBundleVersion.Id, BundleState.Building);
                }

                bundleVersion.SetStringProperty("LastBuildStartDate", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture));
                entities.SaveChanges();

                ProjectsBuildStrategy buildStrategy = new ProjectsBuildStrategy(entities);
                buildStrategy.Build(projectVersionsToRebuild);

                bool buildFailed = projectVersionsToRebuild.Any(pv => pv.GetStringProperty("LastBuildResult") == "Error");

                foreach (BundleVersion affectedBundleVersion in affectedBundleVersions)
                {
                    if (buildFailed)
                    {
                        TaskRunnerContext.SetBundleVersionState(affectedBundleVersion.Id, BundleState.Error);
                        continue;
                    }

                    TaskRunnerContext.SetBundleVersionState(affectedBundleVersion.Id, BundleState.Idle);
                }

                if (bundleVersion.ProjectVersions.All(pv => TaskRunnerContext.GetProjectVersionState(pv.Id) == ProjectState.Idle))
                {
                    bundleVersion.SetStringProperty("LastBuildDuration", (DateTime.UtcNow - buildStartDate).TotalSeconds.ToString(CultureInfo.InvariantCulture));
                }

                entities.SaveChanges();
            }
        }