Implemented single package mode for update and list-updates,
authorMartin Vidner <mvidner@suse.cz>
Sun, 5 Nov 2006 21:38:19 +0000 (21:38 +0000)
committerMartin Vidner <mvidner@suse.cz>
Sun, 5 Nov 2006 21:38:19 +0000 (21:38 +0000)
 made it the default in rug-compatible mode.

VERSION
doc/TODO
doc/zypper.8
package/zypper.changes
src/zmart-misc.cc
src/zypper.cc

diff --git a/VERSION b/VERSION
index c41d483..57d9535 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -5,6 +5,6 @@ dnl
 dnl
 dnl ==================================================
 m4_define([ZYPPER_MAJOR],       [0])
-m4_define([ZYPPER_MINOR],       [5])
-m4_define([ZYPPER_PATCH],       [3])
+m4_define([ZYPPER_MINOR],       [6])
+m4_define([ZYPPER_PATCH],       [0])
 dnl ==================================================
index 4c4ff89..5c211f8 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,7 +1,10 @@
 TODO
 
-script progress
-? does the output contain newline??
+General
+
+- script progress: does the output contain newline??
+- installation and deletion notifications
+- --dry-run (use ZYppCommitPolicy.h)
 
 Patches
 
@@ -14,9 +17,6 @@ Patches
 
 Packages
 
-- update: 
-  update -t package --mode=simple
-  = for all packages, zypp::solver::detail::Helper::findUpdateItem
 - upgrade
   = Resolver::doUpgrade
 
index 6b785ca..0c8a21a 100644 (file)
@@ -70,6 +70,9 @@ List available updates.
 \fI\-t, --type\fR
 Type of resolvable (default: patch)
 
+See also the NOTE at
+.BR update .
+
 .TP
 .B remove (rm) [name]..
 Remove resolvables.
@@ -91,9 +94,10 @@ Type of resolvable (default: patch)
 Don't require user confirmation.
 
 .B NOTE:
-Update currently only works on patches! That is, it will only update a
-package if there is a patch description for it. It will not update if
-there is simply a package with a higher version. But coming soon.
+Zypper prefers to update only those packages for which a patch
+description exists, like on the SUSE update servers. To operate on all
+packages for which there is a better version instead, select \fI--type
+package\fR which is also the default in rug compatibility mode.
 
 .TP
 \fBsearch\fR (\fBse\fR) [\fIoptions\fR] [\fBquerystring\fR] ...
index 155f57c..8cba513 100644 (file)
@@ -1,8 +1,11 @@
 -------------------------------------------------------------------
-Sun Nov  5 19:35:42 CET 2006 - mvidner@suse.cz
+Sun Nov  5 22:37:08 CET 2006 - mvidner@suse.cz
 
+- Implemented single package mode for update and list-updates,
+  made it the default in rug-compatible mode.
 - Added logrotate support (#216911).
 - Added callbacks for script execution.
+- 0.6.0
 
 -------------------------------------------------------------------
 Sat Nov  4 15:33:46 CET 2006 - mvidner@suse.cz
index b14935d..da9c4bb 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <zypp/Patch.h>
 #include <zypp/base/Algorithm.h>
+#include <zypp/solver/detail/Helper.h>
 
 using namespace zypp::detail;
 
@@ -432,36 +433,29 @@ void show_patches()
   cout << tbl;
 }
 
-void list_updates( const ResObject::Kind &kind )
+void list_patch_updates ()
 {
-  bool k_is_patch = kind == ResTraits<Patch>::kind;
-
   Table tbl;
   Table pm_tbl;        // only those that affect packagemanager: they have priority
   TableHeader th;
   unsigned cols;
-  if (k_is_patch) {
-    th << "Catalog" << "Name" << "Version" << "Category" << "Status";
-    cols = 5;
-  }
-  else {
-    th << "S" << "Catalog" << "" /*Bundle*/ << "Name" << "Version" << "Arch";
-    cols = 6;
-  }
+
+  th << "Catalog" << "Name" << "Version" << "Category" << "Status";
+  cols = 5;
   tbl << th;
   pm_tbl << th;
 
+  const zypp::ResPool& pool = God->pool();
   ResPool::byKind_iterator
-    it = God->pool().byKindBegin (kind),
-    e  = God->pool().byKindEnd (kind);
+    it = pool.byKindBegin<Patch> (),
+    e  = pool.byKindEnd<Patch> ();
   for (; it != e; ++it )
   {
     ResObject::constPtr res = it->resolvable();
+    if ( it->status().isNeeded() ) {
+      Patch::constPtr patch = asKind<Patch>(res);
 
-    if (k_is_patch) {
-      if ( it->status().isNeeded() ) {
-       Patch::constPtr patch = asKind<Patch>(res);
-
+      if (true) {
        TableRow tr (cols);
        tr << patch->source ().alias ();
        tr << res->name () << res->edition ().asString();
@@ -473,18 +467,6 @@ void list_updates( const ResObject::Kind &kind )
          pm_tbl << tr;
       }
     }
-    else {
-      // TODO: isNeeded only applies to patches (aggregates?)
-      // determine what packages (or non-patches, non-aggregates?) to update
-      if (false) {
-       TableRow tr (cols);
-       tr << "?" << res->source ().alias () << "";
-       tr << res->name ()
-          << res->edition ().asString ()
-          << res->arch ().asString ();
-       tbl << tr;
-      }
-    }
   }
 
   // those that affect the package manager go first
@@ -496,6 +478,69 @@ void list_updates( const ResObject::Kind &kind )
   cout << tbl;
 }
 
+typedef set<PoolItem_Ref> Candidates;
+
+void find_updates( const ResObject::Kind &kind, Candidates &candidates )
+{
+  const zypp::ResPool& pool = God->pool();
+  ResPool::byKind_iterator
+    it = pool.byKindBegin (kind),
+    e  = pool.byKindEnd (kind);
+  cerr_vv << "Finding update candidates" << endl;
+  for (; it != e; ++it)
+  {
+    if (it->status().isUninstalled())
+      continue;
+    // (actually similar to ProvideProcess?)
+    PoolItem_Ref candidate = solver::detail::Helper::findUpdateItem (pool, *it);
+    if (!candidate.resolvable())
+      continue;
+
+    cerr_vv << "item " << *it << endl;
+    cerr_vv << "cand " << candidate << endl;
+    candidates.insert (candidate);
+  }
+}
+
+void list_updates( const ResObject::Kind &kind )
+{
+  bool k_is_patch = kind == ResTraits<Patch>::kind;
+  if (k_is_patch)
+    list_patch_updates ();
+  else {
+    Table tbl;
+    TableHeader th;
+    unsigned cols = 5;
+    th << "S" << "Catalog";
+    if (gSettings.is_rug_compatible) {
+      th << "Bundle";
+      ++cols;
+    }
+    th << "Name" << "Version" << "Arch";
+    tbl << th;
+
+    Candidates candidates;
+    find_updates (kind, candidates);
+
+    Candidates::iterator cb = candidates.begin (), ce = candidates.end (), ci;
+    for (ci = cb; ci != ce; ++ci) {
+//      ResStatus& candstat = ci->status();
+//      candstat.setToBeInstalled (ResStatus::USER);
+      ResObject::constPtr res = ci->resolvable();
+      TableRow tr (cols);
+      tr << "v" << res->source ().alias ();
+      if (gSettings.is_rug_compatible)
+       tr << "";               // Bundle
+      tr << res->name ()
+        << res->edition ().asString ()
+        << res->arch ().asString ();
+      tbl << tr;
+    }
+    tbl.sort (1);              // Name
+    cout << tbl;
+  }
+}
+
 // may be useful as a functor
 bool mark_item_install (const PoolItem& pi) {
   bool result = pi.status().setToBeInstalled( zypp::ResStatus::USER );
@@ -505,19 +550,16 @@ bool mark_item_install (const PoolItem& pi) {
   return result;
 }
 
-void mark_updates( const ResObject::Kind &kind )
+void mark_patch_updates ()
 {
-  bool k_is_patch = kind == ResTraits<Patch>::kind;
-
-
-  if (k_is_patch) {
+  if (true) {
     // search twice: if there are none with affects_pkg_manager, retry on all
     bool nothing_found = true;
     for (int attempt = 0;
         nothing_found && attempt < 2; ++attempt) {
       ResPool::byKind_iterator
-       it = God->pool().byKindBegin (kind),
-       e  = God->pool().byKindEnd (kind);
+       it = God->pool().byKindBegin<Patch> (),
+       e  = God->pool().byKindEnd<Patch> ();
       for (; it != e; ++it )
       {
        ResObject::constPtr res = it->resolvable();
@@ -532,12 +574,19 @@ void mark_updates( const ResObject::Kind &kind )
       }
     }
   }
+}
+
+void mark_updates( const ResObject::Kind &kind )
+{
+  bool k_is_patch = kind == ResTraits<Patch>::kind;
+
+  if (k_is_patch) {
+    mark_patch_updates ();
+  }
   else {
-    // TODO: isNeeded only applies to patches (aggregates?)
-    // determine what packages (or non-patches, non-aggregates?) to update
-    // something like ProvideProcess
-    if (false) {
-    }
+    Candidates candidates;
+    find_updates (kind, candidates);
+    invokeOnEach (candidates.begin(), candidates.end(), mark_item_install);
   }
 }
 
index f7ae108..e68eade 100644 (file)
@@ -265,7 +265,7 @@ int one_command(const string& command, int argc, char **argv)
     };
     specific_options = remove_options;
     specific_help = "  Command options:\n"
-      "\t--type,-t\t\tType of resolvable (default: patch)\n"
+      "\t--type,-t\t\tType of resolvable (default: patch!)\n"
       ;
   }
   else if (command == "update" || command == "up") {
@@ -276,7 +276,7 @@ int one_command(const string& command, int argc, char **argv)
     };
     specific_options = remove_options;
     specific_help = "  Command options:\n"
-      "\t--type,-t\t\tType of resolvable (default: patch)\n"
+      "\t--type,-t\t\tType of resolvable (default: patch!)\n"
       "\t--no-confirm,-y\tDon't require user confirmation\n"
       ;
   }
@@ -707,7 +707,8 @@ int one_command(const string& command, int argc, char **argv)
       return !help;
     }
 
-    string skind = copts.count("type")?  copts["type"].front() : "patch";
+    string skind = copts.count("type")?  copts["type"].front() :
+      gSettings.is_rug_compatible? "package" : "patch";
     kind = string_to_kind (skind);
     if (kind == ResObject::Kind ()) {
        cerr << "Unknown resolvable type " << skind << endl;
@@ -734,7 +735,8 @@ int one_command(const string& command, int argc, char **argv)
       return !help;
     }
 
-    string skind = copts.count("type")?  copts["type"].front() : "patch";
+    string skind = copts.count("type")?  copts["type"].front() :
+      gSettings.is_rug_compatible? "package" : "patch";
     kind = string_to_kind (skind);
     if (kind == ResObject::Kind ()) {
        cerr << "Unknown resolvable type " << skind << endl;