Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(GH-769) Prevent automatic outdated package check #771

Merged
merged 4 commits into from
May 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,15 @@ public async Task<IEnumerable<Package>> GetInstalledPackages()
}
}

public async Task<IReadOnlyList<OutdatedPackage>> GetOutdatedPackages(bool includePrerelease = false, string packageName = null)
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;
Expand Down Expand Up @@ -132,7 +139,7 @@ public async Task<IReadOnlyList<OutdatedPackage>> GetOutdatedPackages(bool inclu
var results = packages
.Where(p => !p.Value.Inconclusive)
.Select(p => new OutdatedPackage
{ Id = p.Value.Package.Id, VersionString = p.Value.Package.Version.ToNormalizedString() })
{ Id = p.Value.Package.Id, VersionString = p.Value.Package.Version.ToNormalizedString() })
.ToArray();

try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows.Input;
using System.Xml;
using AutoMapper;
using Caliburn.Micro;
Expand All @@ -38,6 +39,7 @@ public sealed class LocalSourceViewModel : Screen, ISourceViewModelBase, IHandle
private readonly IChocolateyService _chocolateyService;
private readonly List<IPackageViewModel> _packages;
private readonly IPersistenceService _persistenceService;
private readonly IChocolateyGuiCacheService _chocolateyGuiCacheService;
private readonly IProgressService _progressService;
private readonly IConfigService _configService;
private readonly IEventAggregator _eventAggregator;
Expand All @@ -60,6 +62,7 @@ public LocalSourceViewModel(
IChocolateyService chocolateyService,
IProgressService progressService,
IPersistenceService persistenceService,
IChocolateyGuiCacheService chocolateyGuiCacheService,
IConfigService configService,
IEventAggregator eventAggregator,
string displayName,
Expand All @@ -68,6 +71,7 @@ public LocalSourceViewModel(
_chocolateyService = chocolateyService;
_progressService = progressService;
_persistenceService = persistenceService;
_chocolateyGuiCacheService = chocolateyGuiCacheService;
_configService = configService;

DisplayName = displayName;
Expand Down Expand Up @@ -250,6 +254,17 @@ public bool CanExportAll()
return _exportAll;
}

public bool CanCheckForOutdatedPackages()
{
return HasLoaded && !IsLoading;
}

public async Task CheckForOutdatedPackages()
{
_chocolateyGuiCacheService.PurgeOutdatedPackages();
await CheckOutdated(true);
}

public bool CanRefreshPackages()
{
return HasLoaded && !IsLoading;
Expand All @@ -276,7 +291,7 @@ public async Task Handle(PackageChangedMessage message)
else
{
var outOfDatePackages =
await _chocolateyService.GetOutdatedPackages(package.IsPrerelease, package.Id);
await _chocolateyService.GetOutdatedPackages(package.IsPrerelease, package.Id, false);
foreach (var update in outOfDatePackages)
{
await _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version));
Expand Down Expand Up @@ -406,30 +421,36 @@ private async Task LoadPackages()
}

IsLoading = true;

IsShowOnlyPackagesWithUpdateEnabled = false;

try
_packages.Clear();
Packages.Clear();

var packages = (await _chocolateyService.GetInstalledPackages())
.Select(Mapper.Map<IPackageViewModel>).ToList();

foreach (var packageViewModel in packages)
{
_packages.Clear();
Packages.Clear();
_packages.Add(packageViewModel);
Packages.Add(packageViewModel);
}

var packages = (await _chocolateyService.GetInstalledPackages())
.Select(Mapper.Map<IPackageViewModel>).ToList();
FirstLoadIncomplete = false;

foreach (var packageViewModel in packages)
{
_packages.Add(packageViewModel);
Packages.Add(packageViewModel);
}
await CheckOutdated(false);
}

FirstLoadIncomplete = false;
private async Task CheckOutdated(bool forceCheckForOutdated)
{
IsLoading = true;

var updates = await _chocolateyService.GetOutdatedPackages();
foreach (var update in updates)
{
await _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version));
}
try
{
var updates = await _chocolateyService.GetOutdatedPackages(false, null, forceCheckForOutdated);

// Use a list of task for correct async loop
var listOfTasks = updates.Select(update => _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version))).ToList();
await Task.WhenAll(listOfTasks);

PackageSource.Refresh();
}
Expand All @@ -446,7 +467,17 @@ private async Task LoadPackages()
{
IsLoading = false;

IsShowOnlyPackagesWithUpdateEnabled = true;
// Only enable the "Show only outdated packages" when it makes sense.
// It does not make sense to enable the checkbox when we haven't checked for
// outdated packages. We should only enable the checkbox here when: (or)
// 1. the "Prevent Automated Outdated Packages Check" is disabled
// 2. forced a check for outdated packages.
IsShowOnlyPackagesWithUpdateEnabled = !_configService.GetAppConfiguration().PreventAutomatedOutdatedPackagesCheck || forceCheckForOutdated;

// Force invalidating the command stuff.
// This helps us to prevent disabled buttons after executing this routine.
// But IMO it has something to do with Caliburn.
CommandManager.InvalidateRequerySuggested();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public sealed class RemoteSourceViewModel : Screen, ISourceViewModelBase
private static readonly ILogger Logger = Log.ForContext<RemoteSourceViewModel>();
private readonly IChocolateyService _chocolateyPackageService;
private readonly IProgressService _progressService;
private readonly IChocolateyGuiCacheService _chocolateyGuiCacheService;
private readonly IConfigService _configService;
private readonly IEventAggregator _eventAggregator;
private readonly IMapper _mapper;
Expand All @@ -58,6 +59,7 @@ public sealed class RemoteSourceViewModel : Screen, ISourceViewModelBase
public RemoteSourceViewModel(
IChocolateyService chocolateyPackageService,
IProgressService progressService,
IChocolateyGuiCacheService chocolateyGuiCacheService,
IConfigService configService,
IEventAggregator eventAggregator,
ChocolateySource source,
Expand All @@ -66,6 +68,7 @@ public RemoteSourceViewModel(
Source = source;
_chocolateyPackageService = chocolateyPackageService;
_progressService = progressService;
_chocolateyGuiCacheService = chocolateyGuiCacheService;
_configService = configService;
_eventAggregator = eventAggregator;
_mapper = mapper;
Expand Down Expand Up @@ -221,11 +224,11 @@ public bool CanLoadRemotePackages()
public void RefreshRemotePackages()
{
#pragma warning disable 4014
LoadPackages();
LoadPackages(false);
#pragma warning restore 4014
}

public async Task LoadPackages()
public async Task LoadPackages(bool forceCheckForOutdatedPackages)
{
try
{
Expand Down Expand Up @@ -265,7 +268,7 @@ public async Task LoadPackages()
MatchWord,
Source.Value));
var installed = await _chocolateyPackageService.GetInstalledPackages();
var outdated = await _chocolateyPackageService.GetOutdatedPackages();
var outdated = await _chocolateyPackageService.GetOutdatedPackages(false, null, forceCheckForOutdatedPackages);

PageCount = (int)Math.Ceiling((double)result.TotalCount / (double)PageSize);
Packages.Clear();
Expand Down Expand Up @@ -312,6 +315,17 @@ await _progressService.ShowMessageAsync(
}
}

public bool CanCheckForOutdatedPackages()
{
return HasLoaded;
}

public async void CheckForOutdatedPackages()
{
_chocolateyGuiCacheService.PurgeOutdatedPackages();
await LoadPackages(true);
}

protected override void OnViewAttached(object view, object context)
{
_eventAggregator.Subscribe(view);
Expand Down Expand Up @@ -341,7 +355,7 @@ protected override void OnInitialize()
});

#pragma warning disable 4014
LoadPackages();
LoadPackages(false);
#pragma warning restore 4014

var immediateProperties = new[]
Expand All @@ -358,7 +372,7 @@ protected override void OnInitialize()
.Where(e => immediateProperties.Contains(e.EventArgs.PropertyName))
.ObserveOnDispatcher()
#pragma warning disable 4014
.Subscribe(e => LoadPackages());
.Subscribe(e => LoadPackages(false));
#pragma warning restore 4014

Observable.FromEventPattern<PropertyChangedEventArgs>(this, "PropertyChanged")
Expand All @@ -367,7 +381,7 @@ protected override void OnInitialize()
.DistinctUntilChanged()
.ObserveOnDispatcher()
#pragma warning disable 4014
.Subscribe(e => LoadPackages());
.Subscribe(e => LoadPackages(false));
#pragma warning restore 4014
}
catch (InvalidOperationException ex)
Expand All @@ -394,7 +408,7 @@ private void SubscribeToLoadPackagesOnSearchQueryChange()
.DistinctUntilChanged()
.ObserveOnDispatcher()
#pragma warning disable 4014
.Subscribe(e => LoadPackages());
.Subscribe(e => LoadPackages(false));
#pragma warning restore 4014
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,15 @@
IsEnabled="{Binding IsShowOnlyPackagesWithUpdateEnabled}"/>
</WrapPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10,6">
<Button Command="{commands:DataContextCommandAdapter CheckForOutdatedPackages, CanCheckForOutdatedPackages}"
ToolTipService.ShowOnDisabled="True"
VerticalAlignment="Center"
Style="{DynamicResource IconFlatButtonStyle}" ToolTip="{x:Static properties:Resources.LocalSourceView_ButtonCheckForOutdatedPkgs}" Margin="0,0,2,0">
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconFontAwesome Kind="SyncSolid" />
<iconPacks:PackIconFontAwesome Kind="BoxSolid" Margin="2 0 0 0" />
</StackPanel>
</Button>
<Button Command="{commands:DataContextCommandAdapter RefreshPackages, CanRefreshPackages}"
ToolTipService.ShowOnDisabled="True"
VerticalAlignment="Center"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,15 @@
<ComboBox Name="SortBox" Margin="5 1" ItemsSource="{Binding SortOptions}" SelectedValue="{Binding SortSelection}"/>
</WrapPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10,6">
<Button Command="{commands:DataContextCommandAdapter CheckForOutdatedPackages, CanCheckForOutdatedPackages}"
ToolTipService.ShowOnDisabled="True"
VerticalAlignment="Center"
Style="{DynamicResource IconFlatButtonStyle}" ToolTip="{x:Static properties:Resources.RemoteSourceView_ButtonCheckForOutdatedPkgs}" Margin="0,0,2,0">
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconFontAwesome Kind="SyncSolid" />
<iconPacks:PackIconFontAwesome Kind="BoxSolid" Margin="2 0 0 0" />
</StackPanel>
</Button>
<Button Command="{commands:DataContextCommandAdapter RefreshRemotePackages, CanLoadRemotePackages}"
ToolTipService.ShowOnDisabled="True"
VerticalAlignment="Center"
Expand Down
4 changes: 4 additions & 0 deletions Source/ChocolateyGui.Common/Models/AppConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ public class AppConfiguration
[Feature]
public bool PreventPreload { get; set; }

[LocalizedDescription("SettingsView_TogglePreventAutomatedOutdatedPackagesCheckDescription")]
[Feature]
public bool PreventAutomatedOutdatedPackagesCheck { get; set; }

[LocalizedDescription("SettingsView_ToggleExcludeInstalledPackagesDescription")]
[Feature]
public bool ExcludeInstalledPackages { get; set; }
Expand Down
27 changes: 27 additions & 0 deletions Source/ChocolateyGui.Common/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading