public PackageManifest Execute(string packagePath, bool disableIndexing, bool enableSecurityInstall, bool analyzeOnly, bool summeryOnly, string version)
        {
            if (!File.Exists(packagePath))
            {
                throw new NotFoundException();
            }

            using (new ShutdownGuard())
            {
                if (disableIndexing)
                {
                    Sitecore.Configuration.Settings.Indexing.Enabled = false;
                }

                var    installationInfo         = GetInstallationInfo(packagePath);
                string historyPath              = null;
                List <ContingencyEntry> entries = null;

                var logger = Sitecore.Diagnostics.LoggerFactory.GetLogger(this); // TODO abstractions


                var manifestReporter = new ManifestReporter(logger);
                var manifestReport   = manifestReporter.ReportPackage(packagePath);

                if (analyzeOnly)
                {
                    manifestReport.AnalyzeOnly = true;
                    var manifest = new PackageManifest();

                    manifest.ManifestReport = manifestReport;
                    return(manifest);
                }

                if (!string.IsNullOrWhiteSpace(version))
                {
                    var targetPath = manifestReporter.SessionTempDirectory + "package.zip";
                    // open reader
                    using (var zipFile = new ZipFile(manifestReporter.ExtractedTempPackagePath))
                    {
                        var existingVersionEntry = zipFile.Entries.FirstOrDefault(entry => entry.FileName.ToLower().EndsWith("sc_version.txt"));
                        if (existingVersionEntry != null)
                        {
                            zipFile.RemoveEntry(existingVersionEntry);
                        }

                        zipFile.AddEntry("metadata\\sc_version.txt", version);
                        zipFile.Save(targetPath);
                    }

                    // and now replace the ziped update file
                    System.IO.File.Delete(packagePath);
                    Utilities.ZipFile(targetPath, packagePath);
                }

                try
                {
                    entries = UpdateHelper.Install(installationInfo, logger, out historyPath);

                    string error = string.Empty;

                    logger.Info("Executing post installation actions.");

                    MetadataView metadata = PreviewMetadataWizardPage.GetMetadata(packagePath, out error);

                    if (string.IsNullOrEmpty(error))
                    {
                        ShipInstaller diffInstaller = new ShipInstaller(UpgradeAction.Upgrade);
                        using (new SecurityDisabler())
                        {
                            if (enableSecurityInstall)
                            {
                                diffInstaller.InstallSecurity(packagePath);
                            }

                            diffInstaller.ExecutePostInstallationInstructions(packagePath, historyPath, installationInfo.Mode, metadata, logger, ref entries);
                        }
                    }
                    else
                    {
                        if (!manifestReport.ErrorOccured)
                        {
                            manifestReport.SetError(error);
                        }
                        logger.Info("Post installation actions error.");
                        logger.Error(error);
                    }

                    logger.Info("Executing post installation actions finished.");

                    var manifest = _manifestRepository.GetManifest(packagePath);
                    manifest.ManifestReport = manifestReport;
                    BuildSummery(manifest, entries);

                    if (summeryOnly)
                    {
                        manifest.ManifestReport.Databases = null;
                    }



                    return(manifest);
                }
                catch (PostStepInstallerException exception)
                {
                    entries     = exception.Entries;
                    historyPath = exception.HistoryPath;
                    throw;
                }
                finally
                {
                    if (disableIndexing)
                    {
                        Sitecore.Configuration.Settings.Indexing.Enabled = true;
                    }

                    manifestReporter.Dispose();

                    try
                    {
                        SaveInstallationMessages(entries, historyPath);
                    }
                    catch (Exception)
                    {
                        logger.Error("Failed to record installation messages");
                        foreach (var entry in entries ?? Enumerable.Empty <ContingencyEntry>())
                        {
                            logger.Info(string.Format("Entry [{0}]-[{1}]-[{2}]-[{3}]-[{4}]-[{5}]-[{6}]-[{7}]-[{8}]-[{9}]-[{10}]-[{11}]",
                                                      entry.Action,
                                                      entry.Behavior,
                                                      entry.CommandKey,
                                                      entry.Database,
                                                      entry.Level,
                                                      entry.LongDescription,
                                                      entry.MessageGroup,
                                                      entry.MessageGroupDescription,
                                                      entry.MessageID,
                                                      entry.MessageType,
                                                      entry.Number,
                                                      entry.ShortDescription));
                        }
                        throw;
                    }
                }
            }
        }
        public PackageManifest Execute(string packagePath, bool disableIndexing)
        {
            if (!File.Exists(packagePath))
            {
                throw new NotFoundException();
            }

            using (new ShutdownGuard())
            {
                if (disableIndexing)
                {
                    Sitecore.Configuration.Settings.Indexing.Enabled = false;
                }

                var    installationInfo         = GetInstallationInfo(packagePath);
                string historyPath              = null;
                List <ContingencyEntry> entries = null;

                var logger = Sitecore.Diagnostics.LoggerFactory.GetLogger(this); // TODO abstractions
                try
                {
                    entries = UpdateHelper.Install(installationInfo, logger, out historyPath);

                    string error = string.Empty;

                    logger.Info("Executing post installation actions.");

                    MetadataView metadata = PreviewMetadataWizardPage.GetMetadata(packagePath, out error);

                    if (string.IsNullOrEmpty(error))
                    {
                        DiffInstaller diffInstaller = new DiffInstaller(UpgradeAction.Upgrade);
                        using (new SecurityDisabler())
                        {
                            diffInstaller.ExecutePostInstallationInstructions(packagePath, historyPath, installationInfo.Mode, metadata, logger, ref entries);
                        }
                    }
                    else
                    {
                        logger.Info("Post installation actions error.");
                        logger.Error(error);
                    }

                    logger.Info("Executing post installation actions finished.");

                    return(_manifestRepository.GetManifest(packagePath));
                }
                catch (PostStepInstallerException exception)
                {
                    entries     = exception.Entries;
                    historyPath = exception.HistoryPath;
                    throw;
                }
                finally
                {
                    if (disableIndexing)
                    {
                        Sitecore.Configuration.Settings.Indexing.Enabled = true;
                    }

                    try
                    {
                        SaveInstallationMessages(entries, historyPath);
                    }
                    catch (Exception)
                    {
                        logger.Error("Failed to record installation messages");
                        foreach (var entry in entries ?? Enumerable.Empty <ContingencyEntry>())
                        {
                            logger.Info(string.Format("Entry [{0}]-[{1}]-[{2}]-[{3}]-[{4}]-[{5}]-[{6}]-[{7}]-[{8}]-[{9}]-[{10}]-[{11}]",
                                                      entry.Action,
                                                      entry.Behavior,
                                                      entry.CommandKey,
                                                      entry.Database,
                                                      entry.Level,
                                                      entry.LongDescription,
                                                      entry.MessageGroup,
                                                      entry.MessageGroupDescription,
                                                      entry.MessageID,
                                                      entry.MessageType,
                                                      entry.Number,
                                                      entry.ShortDescription));
                        }
                        throw;
                    }
                }
            }
        }