public async Task GetDependencies(HashSet <int> dependecies, HashSet <int> returnDependencies) { foreach (int depPackageId in dependecies) { if (!returnDependencies.Contains(depPackageId) && !InstalledPackages.Any(x => x.PackageId == depPackageId)) { Package dependencyPackage = CachedPackages.FirstOrDefault(x => x.PackageId == depPackageId); if (dependencyPackage == default) { dependencyPackage = await WebWrapper.GetPackage(depPackageId); lock (CachedPackages) { CachedPackages.Add(dependencyPackage); } } if (!dependencyPackage.IsPaid) { returnDependencies.Add(depPackageId); } await GetDependencies(dependencyPackage.Dependencies.ToHashSet(), returnDependencies); } } }
/// <summary> /// Package by ID /// </summary> /// <param name="id">Package ID</param> /// <returns>Package</returns> public Package FindById(string id) { if (!Security.IsAuthorizedTo(Rights.ManagePackages)) { throw new UnauthorizedAccessException(); } Package galPkg = CachedPackages.FirstOrDefault(p => p.Id == id); Package locPkg = Packaging.FileSystem.LoadThemes().FirstOrDefault(p => p.Id == id); if (locPkg == null) { locPkg = Packaging.FileSystem.LoadExtensions().FirstOrDefault(p => p.Id == id); } if (locPkg == null) { locPkg = Packaging.FileSystem.LoadWidgets().FirstOrDefault(p => p.Id == id); } if (locPkg != null && galPkg != null) { // package installed fro gallery galPkg.SettingsUrl = locPkg.SettingsUrl; } return(galPkg == null ? locPkg : galPkg); }
/// <summary> /// Package by ID /// </summary> /// <param name="id">Package ID</param> /// <returns>Package</returns> public Package FindById(string id) { if (!Security.IsAuthorizedTo(BlogEngine.Core.Rights.ManagePackages)) { throw new System.UnauthorizedAccessException(); } return(CachedPackages.FirstOrDefault(pkg => pkg.Id == id)); }
public async Task <List <int> > FindFile(string file_name, bool withDeps = true) { Package package = InstalledPackages.FirstOrDefault(x => x.FilesContained.Contains(file_name)); if (package != default) { return new List <int>() { package.PackageId } } ; lock (CachedPackages) package = CachedPackages.FirstOrDefault(x => x.FilesContained.Contains(file_name)); if (package != default) { return new List <int>() { package.PackageId } } ; Package onlinePackage = await WebWrapper.SearchForFile(file_name); if (onlinePackage != null && onlinePackage.PackageId > 0) { lock (CachedPackages) { if (!CachedPackages.Any(x => x.PackageId == onlinePackage.PackageId)) { CachedPackages.Add(onlinePackage); } } HashSet <int> dependencyPkgIds = new HashSet <int>(); if (withDeps) { await GetDependencies(new HashSet <int>() { onlinePackage.PackageId }, dependencyPkgIds); } return(new List <int>() { onlinePackage.PackageId }.Union(dependencyPkgIds).ToList()); } return(new List <int>()); }
public async Task <HashSet <string> > GetDownloadableDependencies(HashSet <string> globalDependencies, HashSet <string> existing, MainWindow mw) { InstalledPackages = SqLiteAdapter.LoadInstalledPackages(); HashSet <string> allDownloadableDeps = await WebWrapper.QueryArray("listFiles"); HashSet <string> conflictDeps = existing.Intersect(allDownloadableDeps).Except(InstalledPackages.SelectMany(x => x.FilesContained)).ToHashSet(); HashSet <int> conflictPackages = new HashSet <int>(); int maxThreads = Math.Min(Environment.ProcessorCount, conflictDeps.Count); Parallel.For(0, maxThreads, workerId => { Task.Run(async() => { int max = conflictDeps.Count * (workerId + 1) / maxThreads; for (int i = conflictDeps.Count * workerId / maxThreads; i < max; i++) { List <int> packages = await FindFile(conflictDeps.ElementAt(i), false); Trace.Assert(packages.Count > 0, $"FindFile for {conflictDeps.ElementAt(i)} returned no packages!"); if (packages.Count > 0) { int id = packages.First(); lock (conflictPackages) { if (conflictPackages.Contains(id)) { continue; } conflictPackages.Add(id); } } } }).Wait(); }); bool rewriteAll = false; bool keepAll = false; for (int i = 0; i < conflictPackages.Count; i++) { int id = conflictPackages.ElementAt(i); if (Settings.Default.IgnoredPackages?.Contains(id) == true) { continue; } Package p = CachedPackages.FirstOrDefault(x => x.PackageId == id); bool rewrite = false; if (!rewriteAll && !keepAll) { Task <ContentDialogResult> t = null; mw.Dispatcher.Invoke(() => { MainWindow.ContentDialog = new ConflictPackageDialog(p.DisplayName); t = MainWindow.ContentDialog.ShowAsync(); }); ContentDialogResult result = await t; ConflictPackageDialog dlg = (ConflictPackageDialog)MainWindow.ContentDialog; rewrite = dlg.RewriteLocal; rewriteAll = dlg.RewriteAll; keepAll = dlg.KeepAll; } if (rewrite || rewriteAll) { PkgsToDownload.Add(id); HashSet <int> depsPkgs = new HashSet <int>(); await GetDependencies(new HashSet <int>() { id }, depsPkgs); PkgsToDownload.UnionWith(depsPkgs); } else { if (Settings.Default.IgnoredPackages == null) { Settings.Default.IgnoredPackages = new List <int>(); } Settings.Default.IgnoredPackages.Add(id); Settings.Default.Save(); } } CheckUpdates(); DownloadableDeps = allDownloadableDeps.Intersect(globalDependencies).ToHashSet(); return(DownloadableDeps); }
public async Task ResolveConflicts() { HashSet <string> conflictDeps = MainWindow.RW.AllInstalledDeps.Intersect(DownloadableDeps).Except(InstalledPackages.SelectMany(x => x.FilesContained)).ToHashSet(); HashSet <int> conflictPackages = new HashSet <int>(); while (conflictDeps.Count > 0) { Package pkg = CachedPackages.First(x => x.FilesContained.Contains(conflictDeps.First())); conflictPackages.Add(pkg.PackageId); conflictDeps.ExceptWith(pkg.FilesContained); } //HashSet<int> conflictPackages = conflictPkgs.Select(x => x.PackageId).ToHashSet(); bool rewriteAll = false; bool keepAll = false; for (int i = 0; i < conflictPackages.Count; i++) { int id = conflictPackages.ElementAt(i); if (Settings.Default.IgnoredPackages?.Contains(id) == true) { continue; } Package p = CachedPackages.FirstOrDefault(x => x.PackageId == id); bool rewrite = false; if (!rewriteAll && !keepAll) { Task <ContentDialogResult> t = null; MainWindow.Dispatcher.Invoke(() => { MainWindow.ContentDialog = new ConflictPackageDialog(p.DisplayName); t = MainWindow.ContentDialog.ShowAsync(); }); ContentDialogResult result = await t; ConflictPackageDialog dlg = (ConflictPackageDialog)MainWindow.ContentDialog; rewrite = dlg.RewriteLocal; rewriteAll = dlg.RewriteAll; keepAll = dlg.KeepAll; } if (rewrite || rewriteAll) { PkgsToDownload.Add(id); HashSet <int> depsPkgs = new HashSet <int>(); await GetDependencies(new HashSet <int>() { id }, depsPkgs); PkgsToDownload.UnionWith(depsPkgs); } else { if (Settings.Default.IgnoredPackages == null) { Settings.Default.IgnoredPackages = new List <int>(); } Settings.Default.IgnoredPackages.Add(id); Settings.Default.Save(); } } }
/// <summary> /// Package by ID /// </summary> /// <param name="pkgId">Package ID</param> /// <returns>Package</returns> public static JsonPackage GetPackage(string pkgId) { return(CachedPackages.FirstOrDefault(pkg => pkg.Id == pkgId)); }