Auto-refresh services before loading repos.
authorJán Kupec <jkupec@suse.cz>
Fri, 15 Oct 2010 12:00:44 +0000 (14:00 +0200)
committerJán Kupec <jkupec@suse.cz>
Fri, 15 Oct 2010 12:00:44 +0000 (14:00 +0200)
src/Zypper.h
src/repos.cc

index fdfc7cb..50ef29e 100644 (file)
@@ -176,8 +176,13 @@ public:
   const std::string & commandHelp() const { return _command_help; }
   const ArgList & arguments() const { return _arguments; }
   RuntimeData & runtimeData() { return _rdata; }
+
   zypp::RepoManager & repoManager()
   { if (!_rm) _rm.reset(new zypp::RepoManager(_gopts.rm_options)); return *_rm; }
+
+  void initRepoManager()
+  { _rm.reset(new zypp::RepoManager(_gopts.rm_options)); }
+
   int exitCode() const { return _exit_code; }
   void setExitCode(int exit) { _exit_code = exit; }
   bool runningShell() const { return _running_shell; }
@@ -206,9 +211,6 @@ private:
   void setRunningShell(bool value = true) { _running_shell = value; }
   void setRunningHelp(bool value = true) { _running_help = value; }
 
-  void initRepoManager()
-  { _rm.reset(new zypp::RepoManager(_gopts.rm_options)); }
-
 private:
 
   int     _argc;
index 9fe6e71..e25ece1 100644 (file)
@@ -43,6 +43,8 @@ extern ZYpp::Ptr God;
 
 typedef list<RepoInfoBase_Ptr> ServiceList;
 
+static bool refresh_service(Zypper & zypper, const ServiceInfo & service);
+
 // ----------------------------------------------------------------------------
 
 template <typename Target, typename Source>
@@ -512,12 +514,30 @@ unsigned repo_specs_to_aliases(Zypper & zypper,
 template <class Container>
 void do_init_repos(Zypper & zypper, const Container & container)
 {
-  MIL << "Going to initialize repositories." << endl;
+  RepoManager & manager = zypper.repoManager();
   RuntimeData & gData = zypper.runtimeData();
 
+  MIL << "Refreshing autorefresh services." << endl;
+
+  const list<ServiceInfo> & services = manager.knownServices();
+  for_(s, services.begin(), services.end())
+  {
+    bool called_refresh = false;
+    if (s->enabled() && s->autorefresh())
+    {
+      refresh_service(zypper, *s);
+      called_refresh = true;
+    }
+
+    // reinitialize the repo manager to re-read the list of repos
+    if (called_refresh)
+      zypper.initRepoManager();
+  }
+
+  MIL << "Going to initialize repositories." << endl;
+
   // load gpg keys
   init_target(zypper);
-  RepoManager & manager = zypper.repoManager();
 
   // get repositories specified with --repo or --catalog or in the container