Skip to content

Commit

Permalink
Improve package manager latency by awaiting the task fetching package…
Browse files Browse the repository at this point in the history
… versions
  • Loading branch information
alnlarsen committed May 29, 2024
1 parent eb2500d commit d48ebed
Showing 1 changed file with 32 additions and 37 deletions.
69 changes: 32 additions & 37 deletions OpenTAP.TUI/Windows/PackageVersionSelectorWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,7 @@ public PackageVersionSelectorWindow(PackageViewModel package, Installation insta
Add(logFrame);

// Load packages in parallel
bool running = true;
Task.Run(() =>
var t1 = Task.Run(() =>
{
try
{
Expand All @@ -115,44 +114,40 @@ public PackageVersionSelectorWindow(PackageViewModel package, Installation insta
log.Error($"Error getting package versions: '{ex.Message}'");
log.Debug(ex);
}
finally
{
running = false;
}
}).GetAwaiter().GetResult();
});
Task.Run(() =>
{
while (running)
while (!t1.IsCompleted)
{
Application.MainLoop.Invoke(() => versionsFrame.Title = $"Versions ");
Thread.Sleep(100);
for (int i = 0; i < 3 && running; i++)
t1.Wait(100);

for (int i = 0; i < 3 && !t1.IsCompleted; i++)
{
Application.MainLoop.Invoke(() => versionsFrame.Title += ".");
Thread.Sleep(100);
t1.Wait(100);
}
}
Application.MainLoop.Invoke(() =>
{
versionsFrame.Title = $"Versions";

if (versions.Count == 0)
{ // this occurs if the architecture or OS does not match any of the packages.
MessageBox.Query("No Plugin Packages Available", "No compatible plugin packages available.",
"OK");
Application.RequestStop();
}
});
}).GetAwaiter().GetResult();
});
}

void InstallButtonClicked(bool force)
{
var selectedPackage = versions?.FirstOrDefault();
if (selectedPackage == null)
return;

for (int i = 0; i < versionsView.Source.Count; i++)
{
if (versionsView.Source.IsMarked(i))
Expand All @@ -165,26 +160,26 @@ void InstallButtonClicked(bool force)
runningThread.Abort();
return;
}

if ((installedVersion != null && installedVersion.Version == selectedPackage.Version) == false)
{
var installAction = new PackageInstallAction()
{
Packages = new[] {package.Name},
Packages = new[] { package.Name },
Version = selectedPackage.Version.ToString(),
Force = force
};
installAction.Error += exception =>
{
Application.MainLoop.Invoke(() => MessageBox.ErrorQuery(50, 7, "Installation Error", exception.Message, "Ok"));
};

installButton.Text = "Cancel";
runningThread = TapThread.Start(() =>
{
// Add tui user input
UserInput.SetInterface(new TuiUserInput());

installAction.Execute(TapThread.Current.AbortToken);
Application.MainLoop.Invoke(UpdateVersions);
runningThread = null;
Expand All @@ -194,33 +189,33 @@ void InstallButtonClicked(bool force)
{
var uninstallAction = new PackageUninstallAction()
{
Packages = new []{ package.Name },
Packages = new[] { package.Name },
Force = force
};

uninstallAction.Error += exception =>
{
Application.MainLoop.Invoke(() => MessageBox.ErrorQuery(50, 7, "Uninstallation Error", exception.Message, "Ok"));
};

installButton.Text = "Cancel";
runningThread = TapThread.Start(() =>
{
// Add tui user input
UserInput.SetInterface(new TuiUserInput());

uninstallAction.Execute(TapThread.Current.AbortToken);
Application.MainLoop.Invoke(UpdateVersions);
runningThread = null;
});
}
}
}

List<PackageViewModel> GetVersions()
{
var list = new List<PackageViewModel>();
var semvers = new HashSet<SemanticVersion>();

var repos = PackageManagerSettings.Current.Repositories.Where(r => r.IsEnabled).OrderByDescending(r => r.Manager is FilePackageRepository);
foreach (var repository in repos)
{
Expand All @@ -247,22 +242,22 @@ List<PackageViewModel> GetFilePackages(FilePackageRepository repository)
{
TuiPm.Log.Info("Loading packages from: " + repository.Url);
var list = new List<PackageViewModel>();

var versions = repository.GetPackageVersions(package.Name, TuiPm.CancellationToken, installedOpentap);
foreach (var version in versions)
{
var packageDef = repository.GetPackages(new PackageSpecifier(package.Name, VersionSpecifier.Parse(version.Version.ToString())), TuiPm.CancellationToken).FirstOrDefault();
if (packageDef != null)
list.Add(new PackageViewModel(packageDef));
}

return list;
}

List<PackageViewModel> GetHttpPackages(HttpPackageRepository repository)
{
var list = new List<PackageViewModel>();

TuiPm.Log.Info("Loading packages from: " + repository.Url);
HttpClient hc = new HttpClient();
hc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Expand All @@ -282,10 +277,10 @@ List<PackageViewModel> GetHttpPackages(HttpPackageRepository repository)
}");
var response = hc.PostAsync("http://packages.opentap.io/3.1/Query", content, TuiPm.CancellationToken).Result;
var jsonData = response.Content.ReadAsStringAsync().Result;

// Remove unicode chars
jsonData = Regex.Replace(jsonData, @"[^\u0000-\u007F]+", string.Empty);

// Parse the json response data
var jsonPackages = (JsonElement)JsonSerializer.Deserialize<Dictionary<string, object>>(jsonData)["packages"];
foreach (var item in jsonPackages.EnumerateArray())
Expand All @@ -302,23 +297,23 @@ List<PackageViewModel> GetHttpPackages(HttpPackageRepository repository)
void UpdateVersions()
{
installedVersion = installation.GetPackages().FirstOrDefault(p => p.Name == package.Name);

versionsView.SetSource(versions.Select(p => $"{p.Version}{(installedVersion?.Version == p.Version ? " (Installed)" : "")}").ToList());
versionsView.Source.SetMark(0, true);
versionsView.SelectedItem = 0;

installButton.Text = versions.FirstOrDefault()?.Version == installedVersion?.Version ? "Uninstall" : "Install";
}
public override bool ProcessKey (KeyEvent keyEvent)

public override bool ProcessKey(KeyEvent keyEvent)
{
if (KeyMapHelper.IsKey(keyEvent, KeyTypes.Cancel))
{
Running = false;
return true;
}
return base.ProcessKey (keyEvent);

return base.ProcessKey(keyEvent);
}
}
}
}

0 comments on commit d48ebed

Please sign in to comment.