示例#1
0
        public IEnumerable <MigrationExectutionSummary> ExecutePendingMigrations()
        {
            var executedMigrations = _contentMigrationStateService.GetExecutedMigrations().ToList();

            foreach (var provider in _contentMigrationProviders)
            {
                var pendingMigrations = provider.GetAvailableMigrations().Where(m => !executedMigrations.Contains(m)).ToList();

                if (!pendingMigrations.Any())
                {
                    continue;
                }

                var result = provider.ExecuteMigrations(pendingMigrations);

                foreach (var successfulMigration in result.SuccessfulMigrations)
                {
                    _contentMigrationStateService.MarkMigrationAsExecuted(successfulMigration);
                }

                foreach (var failedMigration in result.FailedMigrations)
                {
                    var message = string.Format("Content Migration {0} failed.", failedMigration);

                    _notifier.Add(NotifyType.Error, T(message));
                    Logger.Error(message);
                }

                yield return(result);
            }
        }
示例#2
0
        /*
         * <ExecutedDataMigrations>
         *  <Migration Name="~/Modules/CJP.ContentSync/ContentMigrations/CJP.ContentSync/TestMigration1" />
         */
        //Save any migrations that are in the list, delete migrations that aren't in the list
        public void ExecuteRecipeStep(RecipeContext recipeContext)
        {
            if (!String.Equals(recipeContext.RecipeStep.Name, "ExecutedDataMigrations", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            _realtimeFeedbackService.Info(T("Entering the 'Executed Data Migrations' step. This step will reset the local record of content migrations to the state of the remote server"));

            var migrations     = recipeContext.RecipeStep.Step.Descendants();
            var migrationNames = migrations.Where(f => f.Name == "Migration").Select(f => f.Attribute("Name").Value).ToList();

            _realtimeFeedbackService.Info(T("Found {0} migrations that have ran remotely:", migrationNames.Count()));
            foreach (var migrationName in migrationNames)
            {
                _realtimeFeedbackService.Info(T(migrationName));
            }

            var locallyRanMigrations = _contentMigrationStateService.GetExecutedMigrations().ToList();

            _realtimeFeedbackService.Info(T("Found {0} migrations that have ran locally:", locallyRanMigrations.Count()));
            foreach (var migrationName in locallyRanMigrations)
            {
                _realtimeFeedbackService.Info(T(migrationName));
            }

            foreach (var migration in locallyRanMigrations.Where(m => !migrationNames.Contains(m)))
            {//migrations that have been executed locally, but not in the recipe that is being executed
                _realtimeFeedbackService.Info(T("Marking migration '{0}' as pending", migration));
                _contentMigrationStateService.MarkMigrationAsPending(migration);
            }

            foreach (var migrationToAdd in migrationNames.Where(m => !locallyRanMigrations.Contains(m)))
            {
                _realtimeFeedbackService.Info(T("Marking migration '{0}' as executed", migrationToAdd));
                _contentMigrationStateService.MarkMigrationAsExecuted(migrationToAdd);
            }

            _realtimeFeedbackService.Info(T("The 'Executed Data Migrations' step is finished"));
            recipeContext.Executed = true;
        }