func (uis *UIServer) buildPage(w http.ResponseWriter, r *http.Request) { projCtx := MustHaveProjectContext(r) if projCtx.Build == nil { uis.LoggedError(w, r, http.StatusNotFound, fmt.Errorf("not found")) return } flashes := PopFlashes(uis.CookieStore, r, w) buildAsUI := &uiBuild{ Build: *projCtx.Build, CurrentTime: time.Now().UnixNano(), Elapsed: time.Now().Sub(projCtx.Build.StartTime), RepoOwner: projCtx.ProjectRef.Owner, Repo: projCtx.ProjectRef.Repo, Version: *projCtx.Version, } uiTasks, err := getUiTaskCache(projCtx.Build) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } buildAsUI.Tasks = uiTasks if projCtx.Build.Requester == evergreen.PatchVersionRequester { buildOnBaseCommit, err := projCtx.Build.FindBuildOnBaseCommit() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if buildOnBaseCommit == nil { evergreen.Logger.Logf(slogger.WARN, "Could not find build for base commit of patch build: %v", projCtx.Build.Id) } diffs := model.StatusDiffBuilds(buildOnBaseCommit, projCtx.Build) baseId := "" if buildOnBaseCommit != nil { baseId = buildOnBaseCommit.Id } buildAsUI.PatchInfo = &uiPatch{Patch: *projCtx.Patch, BaseBuildId: baseId, StatusDiffs: diffs.Tasks} } // set data for plugin data function injection pluginContext := projCtx.ToPluginContext(uis.Settings, GetUser(r)) pluginContent := getPluginDataAndHTML(uis, plugin.BuildPage, pluginContext) uis.WriteHTML(w, http.StatusOK, struct { ProjectData projectContext User *user.DBUser Flashes []interface{} Build *uiBuild PluginContent pluginData }{projCtx, GetUser(r), flashes, buildAsUI, pluginContent}, "base", "build.html", "base_angular.html", "menu.html") }
func (uis *UIServer) versionPage(w http.ResponseWriter, r *http.Request) { projCtx := MustHaveProjectContext(r) if projCtx.Project == nil || projCtx.Version == nil { http.Error(w, "not found", http.StatusNotFound) return } // Set the config to blank to avoid writing it to the UI unnecessarily. projCtx.Version.Config = "" versionAsUI := uiVersion{ Version: *projCtx.Version, RepoOwner: projCtx.ProjectRef.Owner, Repo: projCtx.ProjectRef.Repo, } dbBuilds, err := build.Find(build.ByIds(projCtx.Version.BuildIds)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } var canEditPatch bool currentUser := GetUser(r) if projCtx.Patch != nil { canEditPatch = uis.canEditPatch(currentUser, projCtx.Patch) versionAsUI.PatchInfo = &uiPatch{Patch: *projCtx.Patch} // diff builds for each build in the version baseBuilds, err := build.Find(build.ByRevision(projCtx.Version.Revision)) if err != nil { http.Error(w, fmt.Sprintf("error loading base builds for patch: %v", err), http.StatusInternalServerError) return } baseBuildsByVariant := map[string]*build.Build{} for i := range baseBuilds { baseBuildsByVariant[baseBuilds[i].BuildVariant] = &baseBuilds[i] } // diff all patch builds with their original build diffs := []model.TaskStatusDiff{} for i := range dbBuilds { diff := model.StatusDiffBuilds( baseBuildsByVariant[dbBuilds[i].BuildVariant], &dbBuilds[i], ) if diff.Name != "" { // append the tasks instead of the build for better usability diffs = append(diffs, diff.Tasks...) } } versionAsUI.PatchInfo.StatusDiffs = diffs } uiBuilds := make([]uiBuild, 0, len(projCtx.Version.BuildIds)) for _, build := range dbBuilds { buildAsUI := uiBuild{Build: build} uiTasks := make([]uiTask, 0, len(build.Tasks)) for _, t := range build.Tasks { uiTasks = append(uiTasks, uiTask{ Task: task.Task{ Id: t.Id, Activated: t.Activated, StartTime: t.StartTime, TimeTaken: t.TimeTaken, Status: t.Status, Details: t.StatusDetails, DisplayName: t.DisplayName, }}) if t.Activated { versionAsUI.ActiveTasks++ } } buildAsUI.Tasks = uiTasks uiBuilds = append(uiBuilds, buildAsUI) } versionAsUI.Builds = uiBuilds pluginContext := projCtx.ToPluginContext(uis.Settings, GetUser(r)) pluginContent := getPluginDataAndHTML(uis, plugin.VersionPage, pluginContext) flashes := PopFlashes(uis.CookieStore, r, w) uis.WriteHTML(w, http.StatusOK, struct { ProjectData projectContext User *user.DBUser Flashes []interface{} Version *uiVersion PluginContent pluginData CanEdit bool }{projCtx, currentUser, flashes, &versionAsUI, pluginContent, canEditPatch}, "base", "version.html", "base_angular.html", "menu.html") }