static async Task <bool> PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action <Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken) { model.IsGitHub = repository.IsGitHubRepository; model.Origin = repository.Origin; model.Reference = repository.Reference; //rev info stuff Models.RevisionInformation revisionInfo = null; var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, lastOriginCommitSha, x => revisionInfo = x, cancellationToken).ConfigureAwait(false); model.RevisionInformation = revisionInfo.ToApi(); revInfoSink?.Invoke(revisionInfo); return(needsDbUpdate); }
async Task <bool> LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action <Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken) { var repoSha = repository.Head; IQueryable <Models.RevisionInformation> ApplyQuery(IQueryable <Models.RevisionInformation> query) => query .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id) .Include(x => x.CompileJobs) .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy); var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); // If the DB doesn't have it, check the local set if (revisionInfo == default) { revisionInfo = databaseContext .RevisionInformations .Local .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id) .FirstOrDefault(); } var needsDbUpdate = revisionInfo == default; if (needsDbUpdate) { // needs insertion revisionInfo = new Models.RevisionInformation { Instance = instance, CommitSha = repoSha, CompileJobs = new List <Models.CompileJob>(), ActiveTestMerges = new List <RevInfoTestMerge>() // non null vals for api returns }; lock (databaseContext) // cleaner this way databaseContext.RevisionInformations.Add(revisionInfo); } revisionInfo.OriginCommitSha ??= lastOriginCommitSha; if (revisionInfo.OriginCommitSha == null) { revisionInfo.OriginCommitSha = repoSha; Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha); } revInfoSink?.Invoke(revisionInfo); return(needsDbUpdate); }
async Task <bool> PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken) { model.RemoteGitProvider = repository.RemoteGitProvider; model.RemoteRepositoryOwner = repository.RemoteRepositoryOwner; model.RemoteRepositoryName = repository.RemoteRepositoryName; model.Origin = repository.Origin; model.Reference = repository.Reference; // rev info stuff Models.RevisionInformation revisionInfo = null; var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false); model.RevisionInformation = revisionInfo.ToApi(); return(needsDbUpdate); }
static async Task <bool> LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action <Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken) { var repoSha = repository.Head; IQueryable <Models.RevisionInformation> queryTarget = databaseContext.RevisionInformations; var revisionInfo = await databaseContext.RevisionInformations.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id) .Include(x => x.CompileJobs) .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge) //minimal info, they can query the rest if they're allowed .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); //search every rev info because LOL SHA COLLISIONS if (revisionInfo == default) { revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha).FirstOrDefault(); } var needsDbUpdate = revisionInfo == default; if (needsDbUpdate) { //needs insertion revisionInfo = new Models.RevisionInformation { Instance = instance, CommitSha = repoSha, CompileJobs = new List <Models.CompileJob>(), ActiveTestMerges = new List <RevInfoTestMerge>() //non null vals for api returns }; lock (databaseContext) //cleaner this way databaseContext.RevisionInformations.Add(revisionInfo); } revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha ?? repository.Head; revInfoSink?.Invoke(revisionInfo); return(needsDbUpdate); }