// setRevision sets the latest revision in the Repository // database to the revision sent from the projects page. func (uis *UIServer) setRevision(w http.ResponseWriter, r *http.Request) { MustHaveUser(r) vars := mux.Vars(r) id := vars["project_id"] data, err := ioutil.ReadAll(r.Body) if err != nil { uis.LoggedError(w, r, http.StatusNotFound, err) return } revision := string(data) if revision == "" { uis.LoggedError(w, r, http.StatusBadRequest, fmt.Errorf("revision sent was empty")) return } // update the latest revision to be the revision id err = model.UpdateLastRevision(id, revision) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } // update the projectRef too projectRef, err := model.FindOneProjectRef(id) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } projectRef.RepotrackerError.Exists = false projectRef.RepotrackerError.InvalidRevision = "" projectRef.RepotrackerError.MergeBaseRevision = "" err = projectRef.Upsert() if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } uis.WriteJSON(w, http.StatusOK, nil) }
// The FetchRevisions method is used by a RepoTracker to run the pipeline for // tracking repositories. It performs everything from polling the repository to // persisting any changes retrieved from the repository reference. func (repoTracker *RepoTracker) FetchRevisions(numNewRepoRevisionsToFetch int) ( err error) { settings := repoTracker.Settings projectRef := repoTracker.ProjectRef projectIdentifier := projectRef.String() if !projectRef.Enabled { evergreen.Logger.Logf(slogger.INFO, "Skipping disabled project “%v”", projectRef) return nil } repository, err := model.FindRepository(projectIdentifier) if err != nil { return fmt.Errorf("error finding repository '%v': %v", projectIdentifier, err) } var revisions []model.Revision var lastRevision string if repository != nil { lastRevision = repository.LastRevision } if lastRevision == "" { // if this is the first time we're running the tracker for this project, // fetch the most recent `numNewRepoRevisionsToFetch` revisions evergreen.Logger.Logf(slogger.INFO, "No last recorded repository revision "+ "for “%v”. Proceeding to fetch most recent %v revisions", projectRef, numNewRepoRevisionsToFetch) revisions, err = repoTracker.GetRecentRevisions(numNewRepoRevisionsToFetch) } else { evergreen.Logger.Logf(slogger.INFO, "Last recorded repository revision for "+ "“%v” is “%v”", projectRef, lastRevision) revisions, err = repoTracker.GetRevisionsSince(lastRevision, settings.RepoTracker.MaxRepoRevisionsToSearch) } if err != nil { evergreen.Logger.Logf(slogger.ERROR, "error fetching revisions for "+ "repository “%v”: %v", projectRef, err) repoTracker.sendFailureNotification(lastRevision, err) return nil } var lastVersion *version.Version if len(revisions) > 0 { lastVersion, err = repoTracker.StoreRevisions(revisions) if err != nil { evergreen.Logger.Logf(slogger.ERROR, "error storing revisions for "+ "repository %v: %v", projectRef, err) return err } err = model.UpdateLastRevision(lastVersion.Identifier, lastVersion.Revision) if err != nil { evergreen.Logger.Logf(slogger.ERROR, "error updating last revision for "+ "repository %v: %v", projectRef, err) return err } } else { lastVersion, err = version.FindOne(version.ByMostRecentForRequester(projectIdentifier, evergreen.RepotrackerVersionRequester)) if err != nil { evergreen.Logger.Logf(slogger.ERROR, "error getting most recent version for "+ "repository %v: %v", projectRef, err) return err } } if lastVersion == nil { evergreen.Logger.Logf(slogger.WARN, "no version to activate for repository %v", projectIdentifier) return nil } err = repoTracker.activateElapsedBuilds(lastVersion) if err != nil { evergreen.Logger.Logf(slogger.ERROR, "error activating variants: %v", err) return err } return nil }