public async Task <IReadOnlyList <OutdatedPackage> > GetOutdatedPackages(bool includePrerelease = false, string packageName = null, bool forceCheckForOutdatedPackages = false) { var preventAutomatedOutdatedPackagesCheck = _configService.GetAppConfiguration().PreventAutomatedOutdatedPackagesCheck; if (preventAutomatedOutdatedPackagesCheck && !forceCheckForOutdatedPackages) { return(new List <OutdatedPackage>()); } var outdatedPackagesFile = _fileSystem.combine_paths(_localAppDataPath, "outdatedPackages.xml"); var outdatedPackagesCacheDurationInMinutesSetting = _configService.GetAppConfiguration().OutdatedPackagesCacheDurationInMinutes; int outdatedPackagesCacheDurationInMinutes = 0; if (!string.IsNullOrWhiteSpace(outdatedPackagesCacheDurationInMinutesSetting)) { int.TryParse(outdatedPackagesCacheDurationInMinutesSetting, out outdatedPackagesCacheDurationInMinutes); } if (_fileSystem.file_exists(outdatedPackagesFile) && (DateTime.Now - _fileSystem.get_file_modified_date(outdatedPackagesFile)).TotalMinutes < outdatedPackagesCacheDurationInMinutes) { return(_xmlService.deserialize <List <OutdatedPackage> >(outdatedPackagesFile)); } else { var choco = Lets.GetChocolatey(); choco.Set( config => { config.CommandName = "outdated"; config.PackageNames = packageName ?? chocolatey.infrastructure.app.ApplicationParameters.AllPackages; config.UpgradeCommand.NotifyOnlyAvailableUpgrades = true; config.RegularOutput = false; config.QuietOutput = true; config.Prerelease = false; }); var chocoConfig = choco.GetConfiguration(); // If there are no Sources configured, for example, if they are all disabled, then figuring out // which packages are outdated can't be completed. if (chocoConfig.Sources != null) { var nugetService = choco.Container().GetInstance <INugetService>(); var packages = await Task.Run(() => nugetService.upgrade_noop(chocoConfig, null)); var results = packages .Where(p => !p.Value.Inconclusive) .Select(p => new OutdatedPackage { Id = p.Value.Package.Id, VersionString = p.Value.Package.Version.ToNormalizedString() }) .ToArray(); try { _xmlService.serialize(results, outdatedPackagesFile); } catch (Exception ex) { Logger.Error(ex, "Unable to serialize Outdated Packages Cache file."); } return(results.ToList()); } else { return(new List <OutdatedPackage>()); } } }
protected override void Load(ContainerBuilder builder) { var viewModelAssembly = typeof(ShellViewModel).Assembly; var viewAssembly = typeof(ShellView).Assembly; // Register Providers builder.RegisterType <VersionNumberProvider>().As <IVersionNumberProvider>().SingleInstance(); builder.RegisterType <Elevation>().SingleInstance(); builder.RegisterType <ChocolateyConfigurationProvider>().As <IChocolateyConfigurationProvider>().SingleInstance(); builder.RegisterType <ChocolateyService>().As <IChocolateyService>().SingleInstance(); builder.RegisterType <DotNetFileSystem>().As <chocolatey.infrastructure.filesystem.IFileSystem>().SingleInstance(); // Register ViewModels builder.RegisterAssemblyTypes(viewModelAssembly) .Where(type => type.Name.EndsWith("ViewModel", StringComparison.Ordinal)) .Where(type => type.GetInterface(typeof(INotifyPropertyChanged).Name) != null) .AsSelf() .InstancePerDependency(); builder.RegisterType <PackageViewModel>().As <IPackageViewModel>(); var choco = Lets.GetChocolatey(); builder.RegisterInstance(choco.Container().GetInstance <IChocolateyConfigSettingsService>()) .As <IChocolateyConfigSettingsService>().SingleInstance(); builder.RegisterInstance(choco.Container().GetInstance <IXmlService>()) .As <IXmlService>().SingleInstance(); // Register Views builder.RegisterAssemblyTypes(viewAssembly) .Where(type => type.Name.EndsWith("View", StringComparison.Ordinal)) .AsSelf() .InstancePerDependency(); // Register the single window manager for this container builder.Register <IWindowManager>(c => new WindowManager()).InstancePerLifetimeScope(); // Register the single event aggregator for this container builder.Register <IEventAggregator>(c => new EventAggregator()).InstancePerLifetimeScope(); // Register Services builder.RegisterType <DialogService>().As <IDialogService>().SingleInstance(); builder.RegisterType <ProgressService>().As <IProgressService>().SingleInstance(); builder.RegisterType <PersistenceService>().As <IPersistenceService>().SingleInstance(); builder.RegisterType <LiteDBFileStorageService>().As <IFileStorageService>().SingleInstance(); builder.RegisterType <ChocolateyGuiCacheService>().As <IChocolateyGuiCacheService>().SingleInstance(); builder.RegisterType <AllowedCommandsService>().As <IAllowedCommandsService>().SingleInstance(); // Register Mapper var mapperConfiguration = new MapperConfiguration(config => { config.CreateMap <IPackageViewModel, IPackageViewModel>() .ForMember(vm => vm.IsInstalled, options => options.Ignore()); config.CreateMap <DataServicePackage, Package>() .ForMember(dest => dest.Authors, opt => opt.MapFrom(src => src.Authors.Split(new[] { ',' }))) .ForMember(dest => dest.Owners, opt => opt.MapFrom(src => src.Owners.Split(new[] { ',' }))); config.CreateMap <IPackage, Package>(); config.CreateMap <ConfigFileFeatureSetting, ChocolateyFeature>(); config.CreateMap <ConfigFileConfigSetting, ChocolateySetting>(); config.CreateMap <ConfigFileSourceSetting, Common.Models.ChocolateySource>() .ForMember(dest => dest.Password, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.Password))) .ForMember(dest => dest.CertificatePassword, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.CertificatePassword))); config.CreateMap <ChocolateySource, Common.Models.ChocolateySource>() .ForMember(dest => dest.VisibleToAdminsOnly, opt => opt.MapFrom(src => src.VisibleToAdminOnly)); }); builder.RegisterType <BundledThemeService>().As <IBundledThemeService>().SingleInstance(); builder.RegisterInstance(mapperConfiguration.CreateMapper()).As <IMapper>(); try { var userDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.LocalAppDataPath, "data.db")};upgrade=true"); LiteDatabase globalDatabase; if (Hacks.IsElevated) { string dir = Path.Combine(Bootstrapper.AppDataPath, "Config"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } globalDatabase = new LiteDatabase($"filename={Path.Combine(dir, "data.db")};upgrade=true"); } else { if (!File.Exists(Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db"))) { // Since the global configuration database file doesn't exist, we must be running in a state where an administrator user // has never run Chocolatey GUI. In this case, use null, which will mean attempts to use the global database will be ignored. globalDatabase = null; } else { // Since this is a non-administrator user, they should only have read permissions to this database globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};readonly=true"); } } if (globalDatabase != null) { builder.RegisterInstance(globalDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.GlobalConfigurationDatabaseName); } var configService = new ConfigService(globalDatabase, userDatabase); configService.SetEffectiveConfiguration(); var iconService = new PackageIconService(userDatabase); builder.RegisterInstance(iconService).As <IPackageIconService>().SingleInstance(); builder.RegisterInstance(configService).As <IConfigService>().SingleInstance(); builder.RegisterInstance(new LiteDBFileStorageService(userDatabase)).As <IFileStorageService>().SingleInstance(); // Since there are two instances of LiteDB, they are added as named instances, so that they can be retrieved when required builder.RegisterInstance(userDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.UserConfigurationDatabaseName); } catch (IOException ex) { Bootstrapper.Logger.Error(ex, Resources.Error_DatabaseAccessGui); throw; } builder.RegisterType <ImageService>().As <IImageService>().SingleInstance(); builder.RegisterType <VersionService>().As <IVersionService>().SingleInstance(); builder.RegisterType <SplashScreenService>().As <ISplashScreenService>().SingleInstance(); }
protected override void Load(ContainerBuilder builder) { // Register Providers builder.RegisterType <VersionNumberProvider>().As <IVersionNumberProvider>().SingleInstance(); builder.RegisterType <ChocolateyConfigurationProvider>().As <IChocolateyConfigurationProvider>().SingleInstance(); builder.RegisterType <DotNetFileSystem>().As <chocolatey.infrastructure.filesystem.IFileSystem>().SingleInstance(); var choco = Lets.GetChocolatey(); builder.RegisterInstance(choco.Container().GetInstance <IChocolateyConfigSettingsService>()) .As <IChocolateyConfigSettingsService>().SingleInstance(); builder.RegisterInstance(choco.Container().GetInstance <IXmlService>()) .As <IXmlService>().SingleInstance(); builder.RegisterType <ChocolateyGuiCacheService>().As <IChocolateyGuiCacheService>().SingleInstance(); try { var userDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.LocalAppDataPath, "data.db")};upgrade=true"); LiteDatabase globalDatabase; if (Hacks.IsElevated) { globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};upgrade=true"); } else { if (!File.Exists(Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db"))) { // Since the global configuration database file doesn't exist, we must be running in a state where an administrator user // has never run Chocolatey GUI. In this case, use null, which will mean attempts to use the global database will be ignored. globalDatabase = null; } else { // Since this is a non-administrator user, they should only have read permissions to this database globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};readonly=true"); } } if (globalDatabase != null) { builder.RegisterInstance(globalDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.GlobalConfigurationDatabaseName); } var configService = new ConfigService(globalDatabase, userDatabase); configService.SetEffectiveConfiguration(); builder.RegisterInstance(configService).As <IConfigService>().SingleInstance(); builder.RegisterInstance(new LiteDBFileStorageService(userDatabase)).As <IFileStorageService>().SingleInstance(); // Since there are two instances of LiteDB, they are added as named instances, so that they can be retrieved when required builder.RegisterInstance(userDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.UserConfigurationDatabaseName); } catch (IOException ex) { Bootstrapper.Logger.Error(ex, Resources.Error_DatabaseAccessCli); Environment.Exit(-1); } // Services builder.RegisterType <VersionService>().As <IVersionService>().SingleInstance(); // Commands // These are using Named registrations to aid with the "finding" of these components // within the Container. As suggested in this Stack Overflow question: // https://stackoverflow.com/questions/4999000/replace-registration-in-autofac builder.RegisterType <FeatureCommand>().As <ICommand>().SingleInstance().Named <ICommand>(FeatureCommandName); builder.RegisterType <ConfigCommand>().As <ICommand>().SingleInstance().Named <ICommand>(ConfigCommandName); builder.RegisterType <PurgeCommand>().As <ICommand>().SingleInstance().Named <ICommand>(PurgeCommandName); }
public override void Because() { _chocolatey1 = Lets.GetChocolatey(); _chocolatey2 = Lets.GetChocolatey(); }