示例#1
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }