public void save_package_information(ChocolateyPackageInformation packageInformation) { _fileSystem.create_directory_if_not_exists(ApplicationParameters.ChocolateyPackageInfoStoreLocation); _fileSystem.ensure_file_attribute_set(ApplicationParameters.ChocolateyPackageInfoStoreLocation, FileAttributes.Hidden); if (packageInformation.Package == null) { this.Log().Debug("No package information to save as package is null."); return; } var pkgStorePath = _fileSystem.combine_paths(ApplicationParameters.ChocolateyPackageInfoStoreLocation, "{0}.{1}".format_with(packageInformation.Package.Id, packageInformation.Package.Version.to_string())); _fileSystem.create_directory_if_not_exists(pkgStorePath); if (packageInformation.RegistrySnapshot != null) { _registryService.save_to_file(packageInformation.RegistrySnapshot, _fileSystem.combine_paths(pkgStorePath, REGISTRY_SNAPSHOT_FILE)); } if (packageInformation.FilesSnapshot != null) { _filesService.save_to_file(packageInformation.FilesSnapshot, _fileSystem.combine_paths(pkgStorePath, FILES_SNAPSHOT_FILE)); } if (!string.IsNullOrWhiteSpace(packageInformation.Arguments)) { var argsFile = _fileSystem.combine_paths(pkgStorePath, ARGS_FILE); if (_fileSystem.file_exists(argsFile)) { _fileSystem.delete_file(argsFile); } _fileSystem.write_file(argsFile, packageInformation.Arguments); } if (packageInformation.HasSilentUninstall) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, SILENT_UNINSTALLER_FILE), string.Empty, Encoding.ASCII); } if (packageInformation.IsSideBySide) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, SIDE_BY_SIDE_FILE), string.Empty, Encoding.ASCII); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, SIDE_BY_SIDE_FILE)); } if (packageInformation.IsPinned) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, PIN_FILE), string.Empty, Encoding.ASCII); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, PIN_FILE)); } }
public void install_noop(ChocolateyConfiguration config, Action <PackageResult> continueAction) { //todo: noop should see if packages are already installed and adjust message, amiright?! this.Log().Info("{0} would have used NuGet to install packages (if they are not already installed):{1}{2}".format_with( ApplicationParameters.Name, Environment.NewLine, config.PackageNames )); var tempInstallsLocation = _fileSystem.combine_paths(_fileSystem.get_temp_path(), ApplicationParameters.Name, "TempInstalls_" + DateTime.Now.ToString("yyyyMMdd_HHmmss_ffff")); _fileSystem.create_directory_if_not_exists(tempInstallsLocation); ApplicationParameters.PackagesLocation = tempInstallsLocation; install_run(config, continueAction); _fileSystem.delete_directory(tempInstallsLocation, recursive: true); }
public void save_package_information(ChocolateyPackageInformation packageInformation) { _fileSystem.create_directory_if_not_exists(ApplicationParameters.ChocolateyPackageInfoStoreLocation); _fileSystem.ensure_file_attribute_set(ApplicationParameters.ChocolateyPackageInfoStoreLocation, FileAttributes.Hidden); var pkgStorePath = _fileSystem.combine_paths(ApplicationParameters.ChocolateyPackageInfoStoreLocation, "{0}.{1}".format_with(packageInformation.Package.Id, packageInformation.Package.Version.to_string())); _fileSystem.create_directory_if_not_exists(pkgStorePath); if (packageInformation.RegistrySnapshot != null) { _registryService.save_to_file(packageInformation.RegistrySnapshot, _fileSystem.combine_paths(pkgStorePath, REGISTRY_SNAPSHOT_FILE)); } if (packageInformation.HasSilentUninstall) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, SILENT_UNINSTALLER_FILE), string.Empty, Encoding.ASCII); } if (packageInformation.IsSideBySide) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, SIDE_BY_SIDE_FILE), string.Empty, Encoding.ASCII); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, SIDE_BY_SIDE_FILE)); } if (packageInformation.IsPinned) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, PIN_FILE), string.Empty, Encoding.ASCII); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, PIN_FILE)); } }
private void handle_extension_packages(ChocolateyConfiguration config, PackageResult packageResult) { if (packageResult == null) { return; } _fileSystem.create_directory_if_not_exists(ApplicationParameters.ExtensionsLocation); if (!packageResult.Name.to_lower().EndsWith(".extension")) { return; } var pkgExtensions = _fileSystem.combine_paths(ApplicationParameters.ExtensionsLocation, packageResult.Name); FaultTolerance.try_catch_with_logging_exception( () => _fileSystem.delete_directory_if_exists(pkgExtensions, recursive: true), "Attempted to remove '{0}' but had an error".format_with(pkgExtensions)); if (!config.CommandName.is_equal_to(CommandNameType.uninstall.to_string())) { if (packageResult.InstallLocation == null) { return; } _fileSystem.create_directory_if_not_exists(pkgExtensions); FaultTolerance.try_catch_with_logging_exception( () => _fileSystem.copy_directory(packageResult.InstallLocation, pkgExtensions, overwriteExisting: true), "Attempted to copy{0} '{1}'{0} to '{2}'{0} but had an error".format_with(Environment.NewLine, packageResult.InstallLocation, pkgExtensions)); string logMessage = "Installed/updated extension for {0}. You will be able to use it on next run.".format_with(packageResult.Name); this.Log().Warn(logMessage); packageResult.Messages.Add(new ResultMessage(ResultType.Note, logMessage)); } }
public void save_package_information(ChocolateyPackageInformation packageInformation) { _fileSystem.create_directory_if_not_exists(ApplicationParameters.ChocolateyPackageInfoStoreLocation); _fileSystem.ensure_file_attribute_set(ApplicationParameters.ChocolateyPackageInfoStoreLocation, FileAttributes.Hidden); if (packageInformation.Package == null) { this.Log().Debug("No package information to save as package is null."); return; } var pkgStorePath = _fileSystem.combine_paths(ApplicationParameters.ChocolateyPackageInfoStoreLocation, "{0}.{1}".format_with(packageInformation.Package.Id, packageInformation.Package.Version.to_string())); _fileSystem.create_directory_if_not_exists(pkgStorePath); if (packageInformation.RegistrySnapshot != null) { _registryService.save_to_file(packageInformation.RegistrySnapshot, _fileSystem.combine_paths(pkgStorePath, REGISTRY_SNAPSHOT_FILE)); } if (packageInformation.FilesSnapshot != null) { FaultTolerance.try_catch_with_logging_exception( () => { _filesService.save_to_file(packageInformation.FilesSnapshot, _fileSystem.combine_paths(pkgStorePath, FILES_SNAPSHOT_FILE)); }, "Unable to save files snapshot", throwError: false, logWarningInsteadOfError: true ); } if (!string.IsNullOrWhiteSpace(packageInformation.Arguments)) { var argsFile = _fileSystem.combine_paths(pkgStorePath, ARGS_FILE); if (_fileSystem.file_exists(argsFile)) { _fileSystem.delete_file(argsFile); } _fileSystem.write_file(argsFile, packageInformation.Arguments); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, ARGS_FILE)); } if (!string.IsNullOrWhiteSpace(packageInformation.ExtraInformation)) { var extraFile = _fileSystem.combine_paths(pkgStorePath, EXTRA_FILE); if (_fileSystem.file_exists(extraFile)) { _fileSystem.delete_file(extraFile); } _fileSystem.write_file(extraFile, packageInformation.ExtraInformation); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, EXTRA_FILE)); } if (packageInformation.VersionOverride != null) { var versionOverrideFile = _fileSystem.combine_paths(pkgStorePath, VERSION_OVERRIDE_FILE); if (_fileSystem.file_exists(versionOverrideFile)) { _fileSystem.delete_file(versionOverrideFile); } _fileSystem.write_file(versionOverrideFile, packageInformation.VersionOverride.to_string()); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, VERSION_OVERRIDE_FILE)); } if (packageInformation.HasSilentUninstall) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, SILENT_UNINSTALLER_FILE), string.Empty, Encoding.ASCII); } if (packageInformation.IsSideBySide) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, SIDE_BY_SIDE_FILE), string.Empty, Encoding.ASCII); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, SIDE_BY_SIDE_FILE)); } if (packageInformation.IsPinned) { _fileSystem.write_file(_fileSystem.combine_paths(pkgStorePath, PIN_FILE), string.Empty, Encoding.ASCII); } else { _fileSystem.delete_file(_fileSystem.combine_paths(pkgStorePath, PIN_FILE)); } }
public void generate(ChocolateyConfiguration configuration) { var logger = ChocolateyLoggers.Normal; if (configuration.QuietOutput) { logger = ChocolateyLoggers.LogFileOnly; } var packageLocation = _fileSystem.combine_paths(configuration.OutputDirectory ?? _fileSystem.get_current_directory(), configuration.NewCommand.Name); if (_fileSystem.directory_exists(packageLocation) && !configuration.Force) { throw new ApplicationException( "The location for the template already exists. You can:{0} 1. Remove '{1}'{0} 2. Use --force{0} 3. Specify a different name".format_with(Environment.NewLine, packageLocation)); } if (configuration.RegularOutput) { this.Log().Info(logger, () => "Creating a new package specification at {0}".format_with(packageLocation)); } try { _fileSystem.delete_directory_if_exists(packageLocation, recursive: true); } catch (Exception ex) { if (configuration.RegularOutput) { this.Log().Warn(() => "{0}".format_with(ex.Message)); } } _fileSystem.create_directory_if_not_exists(packageLocation); var packageToolsLocation = _fileSystem.combine_paths(packageLocation, "tools"); _fileSystem.create_directory_if_not_exists(packageToolsLocation); var tokens = new TemplateValues(); if (configuration.NewCommand.AutomaticPackage) { tokens.set_auto(); } // now override those values foreach (var property in configuration.NewCommand.TemplateProperties) { try { tokens.GetType().GetProperty(property.Key, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase).SetValue(tokens, property.Value, null); this.Log().Debug(() => "Set token for '{0}' to '{1}'".format_with(property.Key, property.Value)); } catch (Exception) { if (configuration.RegularOutput) { this.Log().Debug("Property {0} will be added to additional properties.".format_with(property.Key)); } tokens.AdditionalProperties.Add(property.Key, property.Value); } } this.Log().Debug(() => "Token Values after merge:"); foreach (var propertyInfo in tokens.GetType().GetProperties()) { this.Log().Debug(() => " {0}={1}".format_with(propertyInfo.Name, propertyInfo.GetValue(tokens, null))); } foreach (var additionalProperty in tokens.AdditionalProperties.or_empty_list_if_null()) { this.Log().Debug(() => " {0}={1}".format_with(additionalProperty.Key, additionalProperty.Value)); } // Attempt to set the name of the template that will be used to generate the new package // If no template name has been passed at the command line, check to see if there is a defaultTemplateName set in the // chocolatey.config file. If there is, and this template exists on disk, use it. // Otherwise, revert to the built in default template. // In addition, if the command line option to use the built-in template has been set, respect that // and use the built in template. var defaultTemplateName = configuration.DefaultTemplateName; if (string.IsNullOrWhiteSpace(configuration.NewCommand.TemplateName) && !string.IsNullOrWhiteSpace(defaultTemplateName) && !configuration.NewCommand.UseOriginalTemplate) { var defaultTemplateNameLocation = _fileSystem.combine_paths(ApplicationParameters.TemplatesLocation, defaultTemplateName); if (!_fileSystem.directory_exists(defaultTemplateNameLocation)) { this.Log().Warn(() => "defaultTemplateName configuration value has been set to '{0}', but no template with that name exists in '{1}'. Reverting to default template.".format_with(defaultTemplateName, ApplicationParameters.TemplatesLocation)); } else { this.Log().Debug(() => "Setting TemplateName to '{0}'".format_with(defaultTemplateName)); configuration.NewCommand.TemplateName = defaultTemplateName; } } var defaultTemplateOverride = _fileSystem.combine_paths(ApplicationParameters.TemplatesLocation, "default"); if (string.IsNullOrWhiteSpace(configuration.NewCommand.TemplateName) && (!_fileSystem.directory_exists(defaultTemplateOverride) || configuration.NewCommand.UseOriginalTemplate)) { generate_file_from_template(configuration, tokens, NuspecTemplate.Template, _fileSystem.combine_paths(packageLocation, "{0}.nuspec".format_with(tokens.PackageNameLower)), utf8WithoutBOM); generate_file_from_template(configuration, tokens, ChocolateyInstallTemplate.Template, _fileSystem.combine_paths(packageToolsLocation, "chocolateyinstall.ps1"), Encoding.UTF8); generate_file_from_template(configuration, tokens, ChocolateyBeforeModifyTemplate.Template, _fileSystem.combine_paths(packageToolsLocation, "chocolateybeforemodify.ps1"), Encoding.UTF8); generate_file_from_template(configuration, tokens, ChocolateyUninstallTemplate.Template, _fileSystem.combine_paths(packageToolsLocation, "chocolateyuninstall.ps1"), Encoding.UTF8); generate_file_from_template(configuration, tokens, ChocolateyLicenseFileTemplate.Template, _fileSystem.combine_paths(packageToolsLocation, "LICENSE.txt"), Encoding.UTF8); generate_file_from_template(configuration, tokens, ChocolateyVerificationFileTemplate.Template, _fileSystem.combine_paths(packageToolsLocation, "VERIFICATION.txt"), Encoding.UTF8); generate_file_from_template(configuration, tokens, ChocolateyReadMeTemplate.Template, _fileSystem.combine_paths(packageLocation, "ReadMe.md"), Encoding.UTF8); generate_file_from_template(configuration, tokens, ChocolateyTodoTemplate.Template, _fileSystem.combine_paths(packageLocation, "_TODO.txt"), Encoding.UTF8); } else { configuration.NewCommand.TemplateName = string.IsNullOrWhiteSpace(configuration.NewCommand.TemplateName) ? "default" : configuration.NewCommand.TemplateName; var templatePath = _fileSystem.combine_paths(ApplicationParameters.TemplatesLocation, configuration.NewCommand.TemplateName); if (!_fileSystem.directory_exists(templatePath)) { throw new ApplicationException("Unable to find path to requested template '{0}'. Path should be '{1}'".format_with(configuration.NewCommand.TemplateName, templatePath)); } this.Log().Info(configuration.QuietOutput ? logger : ChocolateyLoggers.Important, "Generating package from custom template at '{0}'.".format_with(templatePath)); // Create directory structure from template so as to include empty directories foreach (var directory in _fileSystem.get_directories(templatePath, "*.*", SearchOption.AllDirectories)) { var packageDirectoryLocation = directory.Replace(templatePath, packageLocation); this.Log().Debug("Creating directory {0}".format_with(packageDirectoryLocation)); _fileSystem.create_directory_if_not_exists(packageDirectoryLocation); } foreach (var file in _fileSystem.get_files(templatePath, "*.*", SearchOption.AllDirectories)) { var packageFileLocation = file.Replace(templatePath, packageLocation); var fileExtension = _fileSystem.get_file_extension(packageFileLocation); if (fileExtension.is_equal_to(".nuspec")) { packageFileLocation = _fileSystem.combine_paths(packageLocation, "{0}.nuspec".format_with(tokens.PackageNameLower)); generate_file_from_template(configuration, tokens, _fileSystem.read_file(file), packageFileLocation, utf8WithoutBOM); } else if (_templateBinaryExtensions.Contains(fileExtension)) { this.Log().Debug(" Treating template file ('{0}') as binary instead of replacing templated values.".format_with(_fileSystem.get_file_name(file))); _fileSystem.copy_file(file, packageFileLocation, overwriteExisting: true); } else { generate_file_from_template(configuration, tokens, _fileSystem.read_file(file), packageFileLocation, Encoding.UTF8); } } } this.Log().Info(configuration.QuietOutput ? logger : ChocolateyLoggers.Important, "Successfully generated {0}{1} package specification files{2} at '{3}'".format_with( configuration.NewCommand.Name, configuration.NewCommand.AutomaticPackage ? " (automatic)" : string.Empty, Environment.NewLine, packageLocation)); }