hrev48721 adds 1 changeset to branch 'master' old head: 29fb42ba5501b9246751180de934fc1ea41dab0e new head: 7b2c59b9b848f467d2229dedf91ca19899b8ed13 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=7b2c59b9b848+%5E29fb42ba5501 ---------------------------------------------------------------------------- 7b2c59b9b848: HaikuDepot: Implemented light-weight package manager update No, not updating packages via HaikuDepot, but a light-weight synchronization between the system package manager list and the HaikuDepot model. After installing or removing a package, HaikuDepot performed a very costly update of all information by basically throwing everything away and reloading it. Implements #11786. [ Stephan Aßmus <superstippi@xxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev48721 Commit: 7b2c59b9b848f467d2229dedf91ca19899b8ed13 URL: http://cgit.haiku-os.org/haiku/commit/?id=7b2c59b9b848 Author: Stephan Aßmus <superstippi@xxxxxx> Date: Sun Jan 25 21:06:20 2015 UTC Ticket: https://dev.haiku-os.org/ticket/11786 ---------------------------------------------------------------------------- 6 files changed, 85 insertions(+), 7 deletions(-) src/apps/haikudepot/model/Model.cpp | 27 +++++++++++++++++++ src/apps/haikudepot/model/Model.h | 2 ++ src/apps/haikudepot/model/PackageInfo.cpp | 39 +++++++++++++++++++++++++++ src/apps/haikudepot/model/PackageInfo.h | 2 ++ src/apps/haikudepot/ui/MainWindow.cpp | 20 +++++++++----- src/apps/haikudepot/ui/MainWindow.h | 2 +- ---------------------------------------------------------------------------- diff --git a/src/apps/haikudepot/model/Model.cpp b/src/apps/haikudepot/model/Model.cpp index d03fa05..8336cd0 100644 --- a/src/apps/haikudepot/model/Model.cpp +++ b/src/apps/haikudepot/model/Model.cpp @@ -460,6 +460,33 @@ Model::AddDepot(const DepotInfo& depot) } +bool +Model::HasDepot(const BString& name) const +{ + for (int32 i = fDepots.CountItems() - 1; i >= 0; i--) { + if (fDepots.ItemAtFast(i).Name() == name) + return true; + } + return false; +} + + +bool +Model::SyncDepot(const DepotInfo& depot) +{ + for (int32 i = fDepots.CountItems() - 1; i >= 0; i--) { + const DepotInfo& existingDepot = fDepots.ItemAtFast(i); + if (existingDepot.Name() == depot.Name()) { + DepotInfo mergedDepot(existingDepot); + mergedDepot.SyncPackages(depot.Packages()); + fDepots.Replace(i, mergedDepot); + return true; + } + } + return false; +} + + void Model::Clear() { diff --git a/src/apps/haikudepot/model/Model.h b/src/apps/haikudepot/model/Model.h index 6033aaf..36454a9 100644 --- a/src/apps/haikudepot/model/Model.h +++ b/src/apps/haikudepot/model/Model.h @@ -53,8 +53,10 @@ public: PackageList CreatePackageList() const; bool AddDepot(const DepotInfo& depot); + bool HasDepot(const BString& name) const; const DepotList& Depots() const { return fDepots; } + bool SyncDepot(const DepotInfo& depot); void Clear(); diff --git a/src/apps/haikudepot/model/PackageInfo.cpp b/src/apps/haikudepot/model/PackageInfo.cpp index 8eb496a..cbb258b 100644 --- a/src/apps/haikudepot/model/PackageInfo.cpp +++ b/src/apps/haikudepot/model/PackageInfo.cpp @@ -991,3 +991,42 @@ DepotInfo::AddPackage(const PackageInfoRef& package) { return fPackages.Add(package); } + + +void +DepotInfo::SyncPackages(const PackageList& otherPackages) +{ + PackageList packages(fPackages); + + for (int32 i = otherPackages.CountItems() - 1; i >= 0; i--) { + const PackageInfoRef& otherPackage = otherPackages.ItemAtFast(i); + bool found = false; + for (int32 j = packages.CountItems() - 1; j >= 0; j--) { + const PackageInfoRef& package = packages.ItemAtFast(j); + if (package->Title() == otherPackage->Title()) { +// printf("%s: found package: '%s'\n", fName.String(), +// package->Title().String()); + package->SetState(otherPackage->State()); + package->SetLocalFilePath(otherPackage->LocalFilePath()); + package->SetSystemDependency( + otherPackage->IsSystemDependency()); + found = true; + packages.Remove(j); + break; + } + } + if (!found) { + printf("%s: new package: '%s'\n", fName.String(), + otherPackage->Title().String()); + fPackages.Add(otherPackage); + } + } + + for (int32 i = packages.CountItems() - 1; i >= 0; i--) { + const PackageInfoRef& package = packages.ItemAtFast(i); + printf("%s: removing package: '%s'\n", fName.String(), + package->Title().String()); + fPackages.Remove(package); + } +} + diff --git a/src/apps/haikudepot/model/PackageInfo.h b/src/apps/haikudepot/model/PackageInfo.h index dba6288..3026061 100644 --- a/src/apps/haikudepot/model/PackageInfo.h +++ b/src/apps/haikudepot/model/PackageInfo.h @@ -397,6 +397,8 @@ public: bool AddPackage(const PackageInfoRef& package); + void SyncPackages(const PackageList& packages); + private: BString fName; PackageList fPackages; diff --git a/src/apps/haikudepot/ui/MainWindow.cpp b/src/apps/haikudepot/ui/MainWindow.cpp index 5c292c0..c0e64d5 100644 --- a/src/apps/haikudepot/ui/MainWindow.cpp +++ b/src/apps/haikudepot/ui/MainWindow.cpp @@ -770,7 +770,7 @@ MainWindow::_RefreshRepositories(bool force) void -MainWindow::_RefreshPackageList() +MainWindow::_RefreshPackageList(bool force) { if (fSinglePackageMode) return; @@ -885,10 +885,14 @@ MainWindow::_RefreshPackageList() systemFlaggedPackages.Add(repoPackageInfo.FileName()); } - fModel.StopPopulatingAllPackages(); + bool wasEmpty = fModel.Depots().IsEmpty(); + if (force || wasEmpty) + fModel.StopPopulatingAllPackages(); BAutolock lock(fModel.Lock()); - fModel.Clear(); + + if (force) + fModel.Clear(); // filter remote packages from the found list // any packages remaining will be locally installed packages @@ -909,11 +913,15 @@ MainWindow::_RefreshPackageList() } for (DepotInfoMap::iterator it = depots.begin(); it != depots.end(); it++) { - fModel.AddDepot(it->second); + if (fModel.HasDepot(it->second.Name())) + fModel.SyncDepot(it->second); + else + fModel.AddDepot(it->second); } // start retrieving package icons and average ratings - fModel.PopulateAllPackages(); + if (force || wasEmpty) + fModel.PopulateAllPackages(); // compute the OS package dependencies try { @@ -1034,7 +1042,7 @@ MainWindow::_RefreshModelThreadWorker(void* arg) if (mainWindow->fTerminating) return B_OK; - mainWindow->_RefreshPackageList(); + mainWindow->_RefreshPackageList(parameters->forceRefresh); messenger.SendMessage(MSG_MODEL_WORKER_DONE); diff --git a/src/apps/haikudepot/ui/MainWindow.h b/src/apps/haikudepot/ui/MainWindow.h index 11e5fb2..3cae3e2 100644 --- a/src/apps/haikudepot/ui/MainWindow.h +++ b/src/apps/haikudepot/ui/MainWindow.h @@ -70,7 +70,7 @@ private: void _ClearPackage(); void _RefreshRepositories(bool force); - void _RefreshPackageList(); + void _RefreshPackageList(bool force); void _StartRefreshWorker(bool force = false); static status_t _RefreshModelThreadWorker(void* arg);