Added Table class for rug-like tabular output.
authorMartin Vidner <mvidner@suse.cz>
Sat, 30 Sep 2006 05:57:20 +0000 (05:57 +0000)
committerMartin Vidner <mvidner@suse.cz>
Sat, 30 Sep 2006 05:57:20 +0000 (05:57 +0000)
Started patch-check.

tools/zmart/Makefile.am
tools/zmart/zmart-misc.cc
tools/zmart/zmart-misc.h
tools/zmart/zmart-sources.cc
tools/zmart/zmart-sources.h
tools/zmart/zypper-tabulator.cc [new file with mode: 0644]
tools/zmart/zypper-tabulator.h [new file with mode: 0644]
tools/zmart/zypper.cc

index 288e6d8..fe358b7 100644 (file)
@@ -23,6 +23,8 @@ zmart_SOURCES =       zmart.cc zmart-sources.cc zmart-misc.cc \
        zmart-source-callbacks.h \
        zmart-sources.h \
        zmart-misc.h \
+       zypper-tabulator.h \
+       zypper-tabulator.cc \
   zmart.h
 
 zypper_SOURCES =       zypper.cc zmart-sources.cc zmart-misc.cc \
@@ -33,9 +35,13 @@ zypper_SOURCES =     zypper.cc zmart-sources.cc zmart-misc.cc \
        zmart-source-callbacks.h \
        zmart-sources.h \
        zmart-misc.h \
+       zypper-tabulator.h \
+       zypper-tabulator.cc \
   zmart.h
 
 zypp_checkpatches_SOURCES =    zypp-checkpatches.cc zmart-sources.cc \
+       zypper-tabulator.h \
+       zypper-tabulator.cc \
        checkpatches-keyring-callbacks.h
 #zmart_LDFLAGS =       -static
 
index 32d984d..fa53126 100644 (file)
@@ -2,6 +2,7 @@
 #include <boost/format.hpp>
 #include "zmart.h"
 #include "zmart-misc.h"
+#include "zypper-tabulator.h"
 
 #include <zypp/Patch.h>
 #include <zypp/base/Algorithm.h>
@@ -246,6 +247,18 @@ std::string calculate_token()
   return token;
 }
 
+void cond_load_resolvables ()
+{      
+  // something changed
+  cerr_v << "loading sources" << endl;
+  load_sources();
+    
+  if ( ! gSettings.disable_system_resolvables ) {
+    cerr_v << "loading target" << endl;
+    load_target();
+  }
+}
+
 void load_target()
 {
   cout << "Adding system resolvables to pool..." << endl;
@@ -268,30 +281,45 @@ void load_sources()
   }
 }
 
-void resolve()
+void establish ()
 {
-  cout << "Resolving dependencies ..." << endl;
+  cerr_v << "Establishing status of aggregates" << endl;
   God->resolver()->establishPool();
+}
+
+void resolve()
+{
+  establish ();
+  cerr_v << "Resolving dependencies ..." << endl;
   God->resolver()->resolvePool();
 }
 
 void show_pool()
 {
   MIL << "Pool contains " << God->pool().size() << " items. Checking whether available patches are needed." << std::endl;
-  for ( ResPool::byKind_iterator it = God->pool().byKindBegin<Patch>(); it != God->pool().byKindEnd<Patch>(); ++it )
+
+  Table tbl;
+  ResPool::byKind_iterator
+    it = God->pool().byKindBegin<Patch>(),
+    e = God->pool().byKindEnd<Patch>();
+  for (; it != e; ++it )
   {
     Resolvable::constPtr res = it->resolvable();
     Patch::constPtr patch = asKind<Patch>(res);
-    //cout << patch->name() << " " << patch->edition() << " " << "[" << patch->category() << "]" << ( it->status().isNeeded() ? " [needed]" : " [unneeded]" )<< std::endl;
+
     if ( it->status().isNeeded() )
     {
       gData.patches_count++;
       if (patch->category() == "security")
         gData.security_patches_count++;
-        
-      cerr << patch->name() << " " << patch->edition() << " " << "[" << patch->category() << "]" << std::endl;
+
+      TableRow tr;
+      tr << patch->name() << patch->edition().asString() << patch->category();
+      tbl << tr;
     }
-  } 
+  }
+  cout << tbl;
+
   cout << gData.patches_count << " patches needed. ( " << gData.security_patches_count << " security patches )"  << std::endl;
 }
 
index c36ede5..a13d520 100644 (file)
@@ -22,8 +22,11 @@ void mark_for_uninstall( const zypp::ResObject::Kind &kind,
                         const std::string &name );
 void show_summary();
 std::string calculate_token();
+//! load all resolvables that the user wants
+void cond_load_resolvables ();
 void load_target();
 void load_sources();
+void establish ();
 void resolve();
 void show_pool();
 void usage(int argc, char **argv);
index 46cd582..6b3d5ce 100644 (file)
@@ -1,6 +1,7 @@
 
 #include "zmart.h"
 #include "zmart-sources.h"
+#include "zypper-tabulator.h"
 
 #include <boost/format.hpp>
 #include <boost/lexical_cast.hpp>
@@ -17,6 +18,20 @@ extern ZYpp::Ptr God;
 extern RuntimeData gData;
 extern Settings gSettings;
 
+void cond_init_system_sources ()
+{
+  if ( geteuid() != 0 ) {
+    cerr << "Sorry, you need root privileges to use system sources, disabling them..." << endl;
+    gSettings.disable_system_sources = true;
+    MIL << "system sources disabled" << endl;
+  }
+
+  if ( ! gSettings.disable_system_sources ) {
+    cerr_v << "initializing sources" << endl;
+    init_system_sources();
+  }
+} 
+
 void init_system_sources()
 {
   SourceManager_Ptr manager;
@@ -80,17 +95,19 @@ static void print_source_list_rug_style( const std::list<zypp::source::SourceInf
   cout << " Sub'd? | Name                                                   | Service" << endl;
   cout << "-------+--------------------------------------------------------+-------------------------------------------------------" << endl;
   
+  Table tbl;
   for( std::list<zypp::source::SourceInfo>::const_iterator it = sources.begin() ;
        it != sources.end() ; ++it )
   {
     SourceInfo source = *it;
-    cout << ( source.enabled() ? "[x]" : "[ ]" );
-    cout << ( source.autorefresh() ? "* " : "  " );
-    if ( source.alias() != source.url().asString() )
-      cout << source.alias() << " (" << source.url() << ")" << endl;
-    else
-      cout << source.url() << endl;
+    TableRow tr;
+    tr << ( source.enabled() ? "[x]" : "[ ]" );
+    tr << ( source.autorefresh() ? "* " : "  " );
+    tr << source.alias();
+    tr << source.url().asString();
+    tbl << tr;
   }
+  cout << tbl;
   
   /*   
   Sub'd? | Name                                                   | Service
@@ -122,7 +139,7 @@ void list_system_sources()
     exit(-1); 
   }
   
-  print_source_list(sources);
+  print_source_list_rug_style(sources);
 }
 
 static
index b933717..3191586 100644 (file)
@@ -12,6 +12,8 @@
 
 #include "zypp/Url.h"
 
+//! calls init_system_sources if not disabled by user (or non-root)
+void cond_init_system_sources();
 void init_system_sources();
 void include_source_by_url( const zypp::Url &url );
 void add_source_by_url( const zypp::Url &url, std::string alias );
diff --git a/tools/zmart/zypper-tabulator.cc b/tools/zmart/zypper-tabulator.cc
new file mode 100644 (file)
index 0000000..19ca70a
--- /dev/null
@@ -0,0 +1,73 @@
+#include <iostream>
+#include "zypper-tabulator.h"
+using namespace std;
+
+void TableRow::add (const string& s) {
+  _columns.push_back (s);
+}
+
+// 1st implementation: no width calculation, just tabs
+void TableRow::dumbDumpTo (ostream &stream) const {
+  bool seen_first = false;
+  for (container::const_iterator i = _columns.begin (); i != _columns.end (); ++i) {
+    if (seen_first)
+      stream << '\t';
+    seen_first = true;
+
+    stream << *i;
+  }
+  stream << endl;
+}
+
+void TableRow::dumpTo (ostream &stream, const vector<unsigned>& widths) const {
+  const char* separator = " | ";
+  bool seen_first = false;
+  container::const_iterator
+    i = _columns.begin (),
+    e = _columns.end ();
+  
+  stream.setf (ios::left, ios::adjustfield);
+  for (unsigned c = 0; i != e ; ++i, ++c) {
+    if (seen_first) {
+      stream.width (0);
+      stream << separator;
+    }
+    seen_first = true;
+
+    stream.width (widths[c]);
+    stream << *i;
+  }
+  stream << endl;
+}
+
+void Table::add (const TableRow& tr) {
+  _rows.push_back (tr);
+
+  // update column widths
+  TableRow::container::const_iterator
+    i = tr._columns.begin (),
+    e = tr._columns.end ();
+  for (unsigned c = 0; i != e; ++i, ++c) {
+    // ensure that _max_width[c] exists
+    if (_max_col < c)
+      _max_col = c;
+    _max_width.resize (_max_col + 1);
+
+    unsigned &max = _max_width[c];
+    // FIXME: i18n: screen columns
+    unsigned cur = i->length();
+    if (max < cur)
+      max = cur;
+  }
+}
+
+// 1st implementation: no width calculation, just tabs
+void Table::dumpTo (ostream &stream) const {
+  container::const_iterator
+    b = _rows.begin (),
+    e = _rows.end (),
+    i;
+  for (i = b; i != e; ++i) {
+    i->dumpTo (stream, _max_width);
+  }
+}
diff --git a/tools/zmart/zypper-tabulator.h b/tools/zmart/zypper-tabulator.h
new file mode 100644 (file)
index 0000000..d670b16
--- /dev/null
@@ -0,0 +1,69 @@
+/*-----------------------------------------------------------*- c++ -*-\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+
+#ifndef ZYPPER_TABULATOR_H
+#define ZYPPER_TABULATOR_H
+
+#include <string>
+#include <iosfwd>
+#include <list>
+#include <vector>
+using std::string;
+using std::ostream;
+using std::list;
+using std::vector;
+
+class TableRow {
+public:
+  void add (const string& s);
+
+  //! tab separated output
+  void dumbDumpTo (ostream &stream) const;
+  //! output with field widths
+  void dumpTo (ostream &stream, const vector<unsigned>& widths) const;
+
+  typedef list<string> container;
+private:
+  container _columns;
+  friend class Table;
+};
+
+inline
+TableRow& operator << (TableRow& tr, const string& s) {
+  tr.add (s);
+  return tr;
+}
+
+class Table {
+public:
+  void add (const TableRow& tr);
+  void dumpTo (ostream& stream) const;
+
+  typedef list<TableRow> container;
+private:
+  container _rows;
+  //! maximum column index seen in this table
+  unsigned _max_col;
+  //! maximum width of respective columns
+  vector<unsigned> _max_width;
+};
+
+inline
+Table& operator << (Table& table, const TableRow& tr) {
+  table.add (tr);
+  return table;
+}
+
+inline
+ostream& operator << (ostream& stream, const Table& table) {
+  table.dumpTo (stream);
+  return stream;
+}
+
+#endif
index c156454..b759731 100644 (file)
@@ -114,7 +114,6 @@ static struct option global_options[] = {
   {"verbose",  no_argument, 0, 'v'},
   {"version",  no_argument, 0, 'V'},
   {"terse",    no_argument, 0, 't'},
-  {"req",      required_argument, 0, 'r'},
   {"opt",      optional_argument, 0, 'o'},
   {0, 0, 0, 0}
 };
@@ -187,14 +186,6 @@ int main(int argc, char **argv)
     cerr << endl;
   }
 
-  // testing option
-  if (gopts.count("req")) {
-    cerr << "Req arg: ";
-    std::copy (gopts["req"].begin(), gopts["req"].end(),
-              ostream_iterator<string> (cerr, ", "));
-    cerr << endl;
-  }
-
   string command;
 
   if (optind < argc) {
@@ -230,6 +221,7 @@ int main(int argc, char **argv)
       "\tservice-add, sa\t\tAdd a new service\n"
       "\tservice-delete, sd\tDelete a service\n"
       "\tservice-rename, sr\tRename a service\n"
+      "\tpatch-check,pchk\tCheck for patches\n"
       ;
 
   string help_global_source_options = "  Source options:\n"
@@ -364,7 +356,6 @@ int main(int argc, char **argv)
     ZYPP_CAUGHT (excpt_r);
     ERR  << "a ZYpp transaction is already in progress." << endl;
     cerr << "a ZYpp transaction is already in progress." << endl;
-    cout << RANDOM_TOKEN;
     return 1;
   }
   
@@ -496,26 +487,11 @@ int main(int argc, char **argv)
        return 1;
     }
 
-    std::string previous_token;
-  
-    SourceManager_Ptr manager;
-    manager = SourceManager::sourceManager();
-  
     KeyRingCallbacks keyring_callbacks;
     DigestCallbacks digest_callbacks;
-  
-    if ( geteuid() != 0 )
-    {
-      cerr << "Sorry, you need root privileges to use system sources, disabling them..." << endl;
-      gSettings.disable_system_sources = true;
-      MIL << "system sources disabled" << endl;
-    }
 
-    if ( ! gSettings.disable_system_sources ) {
-      cerr_v << "initializing sources" << endl;
-      init_system_sources();
-    }
-  
+    cond_init_system_sources ();
+
     for ( std::list<Url>::const_iterator it = gSettings.additional_sources.begin(); it != gSettings.additional_sources.end(); ++it )
       {
        include_source_by_url( *it );
@@ -532,17 +508,11 @@ int main(int argc, char **argv)
   
     cerr_v << "calculating token" << endl;
     std::string token = calculate_token();
+    cerr_v << "token:" << token << endl;
   
     if ( token != gSettings.previous_token )
       {
-       // something changed
-       cerr_v << "loading sources" << endl;
-       load_sources();
-    
-       if ( ! gSettings.disable_system_resolvables ) {
-         cerr_v << "loading target" << endl;
-         load_target();
-       }
+       cond_load_resolvables ();
 
        for ( vector<string>::const_iterator it = gData.packages_to_install.begin(); it != gData.packages_to_install.end(); ++it ) {
          mark_for_install(kind, *it);
@@ -591,6 +561,32 @@ int main(int argc, char **argv)
            cerr << result << std::endl; 
          }
       }
+    else {
+      cerr_v << "Token unchanged" << endl;
+    }
+    return 0;
   }
+
+  if (command == "patch-check" || command == "pchk") {
+    KeyRingCallbacks keyring_callbacks;
+    DigestCallbacks digest_callbacks;
+
+    cond_init_system_sources ();
+    // TODO additional_sources
+    // TODO warn_no_sources
+
+    // dont add rpms
+    cerr_v << "initializing target" << endl;
+    God->initializeTarget("/"); 
+    // TODO calc token?
+
+    // now load resolvables:
+
+    cond_load_resolvables ();
+
+    establish ();
+    show_pool ();
+  }
+
   return 0;
 }