Hello community,
here is the log from the commit of package yast2-ruby-bindings
checked in at Wed Apr 16 18:23:54 CEST 2008.
--------
--- yast2-ruby-bindings/yast2-ruby-bindings.changes 2008-02-29 10:05:44.000000000 +0100
+++ /mounts/work_src_done/STABLE/yast2-ruby-bindings/yast2-ruby-bindings.changes 2008-04-16 17:46:51.000000000 +0200
@@ -1,0 +2,9 @@
+Wed Apr 16 17:27:57 CEST 2008 - dmacvicar@suse.de
+
+- find yast pugins without requiring LD_LIBRARY_PATH
+ (bnc #353405)
+- require 'yast' is now require 'ycp'
+- misc. fixes
+- 0.3.2
+
+-------------------------------------------------------------------
Old:
----
yast2-ruby-bindings-0.3.1.tar.bz2
New:
----
yast2-ruby-bindings-0.3.2.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ yast2-ruby-bindings.spec ++++++
--- /var/tmp/diff_new_pack.vU5642/_old 2008-04-16 18:22:40.000000000 +0200
+++ /var/tmp/diff_new_pack.vU5642/_new 2008-04-16 18:22:40.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package yast2-ruby-bindings (Version 0.3.1)
+# spec file for package yast2-ruby-bindings (Version 0.3.2)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -12,7 +12,7 @@
Name: yast2-ruby-bindings
-Version: 0.3.1
+Version: 0.3.2
Release: 1
License: GPL v2 or later
Group: System/YaST
@@ -66,6 +66,12 @@
%{_libdir}/ruby/vendor_ruby/%{rb_ver}/yast.rb
%{_libdir}/ruby/vendor_ruby/%{rb_ver}/ycp.rb
%changelog
+* Wed Apr 16 2008 dmacvicar@suse.de
+- find yast pugins without requiring LD_LIBRARY_PATH
+ (bnc #353405)
+- require 'yast' is now require 'ycp'
+- misc. fixes
+- 0.3.2
* Thu Feb 21 2008 sh@suse.de
- Added new UI packages to Requires/BuildRequires in .spec file
- V 0.3.1
++++++ yast2-ruby-bindings-0.3.1.tar.bz2 -> yast2-ruby-bindings-0.3.2.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/examples/ruby/Bar.rb new/yast2-ruby-bindings-0.3.2/examples/ruby/Bar.rb
--- old/yast2-ruby-bindings-0.3.1/examples/ruby/Bar.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/examples/ruby/Bar.rb 2008-04-16 17:46:52.000000000 +0200
@@ -1,8 +1,9 @@
-require 'yast'
+require 'ycp'
+require 'ycp/scr'
module Bar
def self.try
- m = YaST::Module.new("SCR")
- return m.Execute(".target.bash", "firefox").class.to_s
+ m = YaST::SCR
+ return m.execute(".target.bash", "firefox").class.to_s
end
end
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/examples/ruby/logger.rb new/yast2-ruby-bindings-0.3.2/examples/ruby/logger.rb
--- old/yast2-ruby-bindings-0.3.1/examples/ruby/logger.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/examples/ruby/logger.rb 2008-04-16 17:46:52.000000000 +0200
@@ -1,5 +1,3 @@
-require 'yast'
-include YaST
-#ui = YaST::Module.new("UI")
+require 'ycp'
-y2milestone("Hello")
\ No newline at end of file
+YCP::y2milestone("Hello")
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/examples/ruby/scr.rb new/yast2-ruby-bindings-0.3.2/examples/ruby/scr.rb
--- old/yast2-ruby-bindings-0.3.1/examples/ruby/scr.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/examples/ruby/scr.rb 2008-04-16 17:46:52.000000000 +0200
@@ -1,10 +1,10 @@
require 'yast'
+require 'ycp/scr'
-m = YaST::Module.new("SCR")
-modules = m.Read(".proc.modules")
+modules = YCP::SCR::read(".proc.modules")
modules.each do | k, v |
puts "#{k}:"
v.each do | a, b |
puts " #{a} - #{b}"
end
-end
\ No newline at end of file
+end
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/examples/ruby/ui.rb new/yast2-ruby-bindings-0.3.2/examples/ruby/ui.rb
--- old/yast2-ruby-bindings-0.3.1/examples/ruby/ui.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/examples/ruby/ui.rb 2008-04-16 17:46:52.000000000 +0200
@@ -1,6 +1,7 @@
-require 'yast'
-ui = YaST::Module.new("UI")
-YaST::Ui::init("qt")
+require 'ycp'
+require 'ycp/ui'
+
+YCP::Ui::init("qt")
include YaST::Ui
t = HBox( Label("Welcome to Ruby!"), PushButton("Push me") )
@@ -19,4 +20,4 @@
ui.UserInput()
-exit
\ No newline at end of file
+exit
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/examples/ruby/ycp-1.rb new/yast2-ruby-bindings-0.3.2/examples/ruby/ycp-1.rb
--- old/yast2-ruby-bindings-0.3.1/examples/ruby/ycp-1.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/examples/ruby/ycp-1.rb 2008-04-16 17:46:52.000000000 +0200
@@ -1,5 +1,4 @@
require 'ycp'
-include Ycpx
f = File.new('/usr/share/YaST2/modules/Arch.ycp')
p = Parser.new( f.fileno, 'Arch')
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/package/yast2-ruby-bindings.changes new/yast2-ruby-bindings-0.3.2/package/yast2-ruby-bindings.changes
--- old/yast2-ruby-bindings-0.3.1/package/yast2-ruby-bindings.changes 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/package/yast2-ruby-bindings.changes 2008-04-16 17:46:52.000000000 +0200
@@ -1,4 +1,13 @@
-------------------------------------------------------------------
+Wed Apr 16 17:27:57 CEST 2008 - dmacvicar@suse.de
+
+- find yast pugins without requiring LD_LIBRARY_PATH
+ (bnc #353405)
+- require 'yast' is now require 'ycp'
+- misc. fixes
+- 0.3.2
+
+-------------------------------------------------------------------
Thu Feb 21 17:56:05 CET 2008 - sh@suse.de
- Added new UI packages to Requires/BuildRequires in .spec file
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/CMakeLists.txt new/yast2-ruby-bindings-0.3.2/src/CMakeLists.txt
--- old/yast2-ruby-bindings-0.3.1/src/CMakeLists.txt 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/CMakeLists.txt 2008-04-16 17:46:52.000000000 +0200
@@ -1,2 +1,2 @@
-ADD_SUBDIRECTORY(swig)
+
ADD_SUBDIRECTORY(ruby)
\ No newline at end of file
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/ruby/CMakeLists.txt new/yast2-ruby-bindings-0.3.2/src/ruby/CMakeLists.txt
--- old/yast2-ruby-bindings-0.3.1/src/ruby/CMakeLists.txt 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/ruby/CMakeLists.txt 2008-04-16 17:46:52.000000000 +0200
@@ -28,20 +28,31 @@
Y2RubyTypePath.h
Y2RubyTypeTerm.h
)
+
+# skip the full RPATH for the build tree
+SET(CMAKE_SKIP_BUILD_RPATH TRUE)
+# when building, use the install RPATH already
+# (so it doesn't need to relink when installing)
+SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+# the RPATH to be used when installing
+SET(CMAKE_INSTALL_RPATH "${LIB_INSTALL_DIR}/YaST2/plugins")
+# add the automatically determined parts of the RPATH
+# which point to directories outside the build tree to the install RPATH
+SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
INCLUDE_DIRECTORIES( ${RUBY_INCLUDE_PATH} )
INCLUDE_DIRECTORIES( ${YAST_INCLUDE_DIR} )
-ADD_LIBRARY( yastx SHARED ${yast_ruby_module_SRCS})
-SET_TARGET_PROPERTIES( yastx PROPERTIES PREFIX "" )
-TARGET_LINK_LIBRARIES( yastx ${YAST_LIBRARY} )
-TARGET_LINK_LIBRARIES( yastx ${YAST_YCP_LIBRARY} )
-TARGET_LINK_LIBRARIES( yastx ${YAST_PLUGIN_WFM_LIBRARY} )
-TARGET_LINK_LIBRARIES( yastx ${YAST_PLUGIN_SCR_LIBRARY} )
-TARGET_LINK_LIBRARIES( yastx ${RUBY_LIBRARY} )
-INSTALL(TARGETS yastx LIBRARY DESTINATION ${RUBY_VENDORARCH_DIR} )
+ADD_LIBRARY( ycpx SHARED ${yast_ruby_module_SRCS})
+SET_TARGET_PROPERTIES( ycpx PROPERTIES PREFIX "" )
+TARGET_LINK_LIBRARIES( ycpx ${YAST_LIBRARY} )
+TARGET_LINK_LIBRARIES( ycpx ${YAST_YCP_LIBRARY} )
+TARGET_LINK_LIBRARIES( ycpx ${YAST_PLUGIN_WFM_LIBRARY} )
+TARGET_LINK_LIBRARIES( ycpx ${YAST_PLUGIN_SCR_LIBRARY} )
+TARGET_LINK_LIBRARIES( ycpx ${RUBY_LIBRARY} )
+INSTALL(TARGETS ycpx LIBRARY DESTINATION ${RUBY_VENDORARCH_DIR} )
-INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/yast.rb DESTINATION ${RUBY_VENDORLIB_DIR} )
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/ycp.rb DESTINATION ${RUBY_VENDORLIB_DIR} )
ADD_LIBRARY( py2lang_ruby SHARED ${ruby_yast_plugin_SRCS})
TARGET_LINK_LIBRARIES( py2lang_ruby ${YAST_LIBRARY} )
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/ruby/Y2RubyTypeConv.cc new/yast2-ruby-bindings-0.3.2/src/ruby/Y2RubyTypeConv.cc
--- old/yast2-ruby-bindings-0.3.1/src/ruby/Y2RubyTypeConv.cc 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/ruby/Y2RubyTypeConv.cc 2008-04-16 17:46:52.000000000 +0200
@@ -113,7 +113,7 @@
VALUE rbhash;
rbhash = rb_hash_new();
YCPMap map = ycpval->asMap();
- y2internal("map size %d\n", (int) map.size());
+ //y2internal("map size %d\n", (int) map.size());
for ( YCPMapIterator it = map.begin(); it != map.end(); ++it )
{
@@ -128,7 +128,7 @@
VALUE rblist;
rblist = rb_ary_new();
YCPList list = ycpval->asList();
- y2internal("list size %d\n",list.size());
+ //y2internal("list size %d\n",list.size());
for (int i=0; i < list.size(); i++)
{
rb_ary_push( rblist, ycpvalue_2_rbvalue(list.value(i)));
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/ruby/yast.rb new/yast2-ruby-bindings-0.3.2/src/ruby/yast.rb
--- old/yast2-ruby-bindings-0.3.1/src/ruby/yast.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/ruby/yast.rb 1970-01-01 01:00:00.000000000 +0100
@@ -1,176 +0,0 @@
-# -----------------------------------------------------------------------\
-# | |
-# | __ __ ____ _____ ____ |
-# | \ \ / /_ _/ ___|_ _|___ \ |
-# | \ V / _` \___ \ | | __) | |
-# | | | (_| |___) || | / __/ |
-# | |_|\__,_|____/ |_| |_____| |
-# | |
-# | |
-# | ruby language support (C) Novell Inc. |
-# \----------------------------------------------------------------------/
-#
-# Author: Duncan Mac-Vicar
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version
-# 2 of the License, or (at your option) any later version.
-#
-
-ENV['LD_LIBRARY_PATH'] = "/usr/lib/YaST2/plugin"
-
-# Load the native part (.so)
-require 'yastx'
-
-module YCP
- def self.method_missing(id, *args)
- puts "stop"
- end
-
- def self.add_ycp_module(mname)
- puts "import #{mname}"
- YCP::import(mname)
- m = Module.new
- YCP::each_symbol(mname) do |sname,stype|
- if (stype == :function) and !sname.empty?
- m.module_eval <<-"END"
- def self.#{sname}(*args)
- return YCP::forward_call("#{mname}", :#{sname}, *args)
- end
- END
- end # if function
- end
- YCP.const_set(mname, m)
- end
-end
-
-module Kernel
- alias require_ require
- def require(name)
- if name =~ /^ycp\/(.+)$/
- ycpns = $1
- YCP::add_ycp_module(ycpns.capitalize)
- return true
- end
- return require_(name)
- end
-end
-
-
-module YCP
- module Ui
- #my @e_logging = qw(y2debug y2milestone y2warning y2error y2security y2internal);
-
- # Define symbols for the UI
- ui_terms = [ :BarGraph, :Bottom, :CheckBox, :ColoredLabel, :ComboBox, :Date,
- :DownloadProgress, :DumbTab, :DummySpecialWidget, :Empty, :Frame, :HBox, :HBoxvHCenter,
- :HMultiProgressMeter, :HSpacing, :HSquash, :HStretch, :HVCenter, :HVSquash,
- :HVStretch, :HWeight, :Heading, :IconButton, :Image, :IntField, :Label, :Left, :LogView,
- :MarginBox, :MenuButton, :MinHeight, :MinSize, :MinWidth, :MultiLineEdit,
- :MultiSelectionBox, :PackageSelector, :PatternSelector, :PartitionSplitter,
- :Password, :PkgSpecial, :ProgressBar, :PushButton, :RadioButton,
- :RadioButtonGroup, :ReplacePoint, :RichText, :Right, :SelectionBox, :Slider, :Table,
- :TextEntry, :Time, :Top, :Tree, :VBox, :VCenter, :VMultiProgressMeter, :VSpacing,
- :VSquash, :VStretch, :VWeight, :Wizard,
- :id, :opt ]
-
-# buffer = String.new
-# buffer << "["
-# ui_terms.each do |t|
-# buffer << " :" << t.to_s.downcase << ","
-# end
-# buffer << " ]"
-# puts buffer
- # If the method name contains underscores, convert to camel case
-# while method =~ /([^_]*)_(.)(.*)/
-# method = $1 + $2.upcase + $3
-# end
-
- # for each symbol define a util function that will create a term
- ui_terms.each do | term_name |
- define_method(term_name) do | *args |
- t = YaST::Term.new(term_name.to_s)
- args.each do |arg|
- t.add(arg)
- end
- return t
- end
- alias_method term_name.to_s.downcase, term_name
- end
-
- end # end Ui module
-end
-
-module YaST
-
- class TermBuilder
- # blank slate
- instance_methods.each { |m| undef_method m unless (m =~ /^__|instance_eval$/)}
-
- def initialize(&block)
- @term = nil
- @term = instance_eval(&block)
- end
-
- def method_missing(name, *args, &block )
- # puts "hi #{name.to_s} | #{args}"
- term = nil
- elements = block ? nil : args
- @__to_s = nil # invalidate to_s cache
- term = YaST::Term.new(name.to_s)
- if not elements.nil?
- elements.each do | e |
- term.add(e)
- end
- return term
- else
- r = instance_eval(&block)
- puts term.class
- term.add(r) if not r.nil?
- end
- return term
- end
-
- def to_s
- return @term.to_s
- end
-
- def term
- return @term
- end
-
- end
-
- def y2_logger_helper(*args)
- level = args.shift
-
- caller[0] =~ /(.+):(\d+):in `([^']+)'/
- y2_logger(level,"Ruby",$1,$2.to_i,"",args[0])
- end
-
- def y2debug(*args)
- y2_logger_helper(0, args)
- end
-
- def y2milestone(*args)
- y2_logger_helper(1, args)
- end
-
- def y2warning(*args)
- y2_logger_helper(2, args)
- end
-
- def y2error(*args)
- y2_logger_helper(3, args)
- end
-
- def y2security(*args)
- y2_logger_helper(4, args)
- end
-
- def y2internal(*args)
- y2_logger_helper(5, args)
- end
-
-end # module YaST
\ No newline at end of file
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/ruby/YCP.cc new/yast2-ruby-bindings-0.3.2/src/ruby/YCP.cc
--- old/yast2-ruby-bindings-0.3.1/src/ruby/YCP.cc 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/ruby/YCP.cc 2008-04-16 17:46:52.000000000 +0200
@@ -75,6 +75,9 @@
Y2Component *owned_uic = 0;
Y2Component *owned_wfmc = 0;
+//Y2Component *owned_scr = 0;
+
+extern "C" {
static
Y2Namespace *
@@ -84,7 +87,7 @@
Y2Namespace *ns = import.nameSpace();
if (ns == NULL)
{
- y2error ("Ruby call: Can't import namespace '%s'", ns_name);
+ y2error ("ruby call: Can't import namespace '%s'", ns_name);
}
else
{
@@ -107,6 +110,20 @@
// }
}
+// void init_scr()
+// {
+// y2milestone("init_scr");
+// // if (Y2WFMComponent::instance () == 0)
+// // {
+// y2milestone("WFM init");
+// owned_scr = Y2ComponentBroker::createClient ("scr");
+// if (owned_scr == 0)
+// {
+// y2error ("Cannot create WFM component");
+// }
+// // }
+// }
+
static VALUE
rb_init_ui( int argc, VALUE *argv, VALUE self )
{
@@ -119,7 +136,7 @@
}
else if (argc != 0)
{
- y2error ("Zero or one arguments required (ui name, default %s", ui_name);
+ y2error ("zero or one arguments required (ui name, default %s", ui_name);
return Qnil;
}
@@ -131,13 +148,13 @@
c = Y2ComponentBroker::createServer (ui_name);
if (c == 0)
{
- y2error ("Cannot create component %s", ui_name);
+ y2error ("can't create component %s", ui_name);
return Qnil;
}
if (YUIComponent::uiComponent () == 0)
{
- y2error ("Component %s is not a UI", ui_name);
+ y2error ("component %s is not a UI", ui_name);
return Qnil;
}
else
@@ -154,59 +171,8 @@
return Qnil;
}
-typedef struct brokerinfo
-{
- Y2Component *component;
- Y2Namespace *ns;
-}
-BrokerInfo;
-
-// mark for garbage collection
-// NOT USED, ONLY WHEN USING DATA_WRAP_STRUCT
-void
-yast_module_mark( BrokerInfo *info )
-{}
-
-// dispose a namespace
-// NOT USED, ONLY WHEN USING DATA_WRAP_STRUCT
-void
-yast_module_free( BrokerInfo *info )
-{
- //std::cout << "Deleting namespace." << std::endl;
- //delete info;
-}
-
-VALUE
-yast_module_allocate( VALUE klass )
-{
- BrokerInfo *info = new BrokerInfo;
- return Data_Wrap_Struct( klass, yast_module_mark, RB_FINALIZER(yast_module_free), info );
-}
-
-VALUE
-yast_module_initialize( VALUE self, VALUE param_ns_name )
-{
- Check_Type(param_ns_name, T_STRING);
- rb_iv_set(self, "@namespace_name", param_ns_name);
- init_wfm();
- return self;
-}
-
-
-VALUE
-yast_module_name( VALUE self )
-{
- return rb_iv_get(self, "@namespace_name");
-}
-
-VALUE
-yast_module_methods( VALUE self )
-{
- return Qnil;
-}
-
//forward declaration
-YCPValue ycp_call_builtin ( const string &module_name, const string &func_name, int argc, VALUE *argv );
+YCPValue _call_ycp_builtin ( const string &module_name, const string &func_name, int argc, VALUE *argv );
/**
* looks a component for a namespace
@@ -219,8 +185,8 @@
c = Y2ComponentBroker::getNamespaceComponent(RSTRING(name)->ptr);
if (c == NULL)
{
- y2internal("No component can provide namespace %s\n", RSTRING (name)->ptr);
- rb_raise( rb_eRuntimeError, "No YaST component can provide namespace %s\n", RSTRING (name)->ptr);
+ y2internal("no component can provide namespace %s\n", RSTRING (name)->ptr);
+ rb_raise( rb_eRuntimeError, "no YaST component can provide namespace %s\n", RSTRING (name)->ptr);
}
y2internal("component name %s\n", c->name().c_str());
return Qtrue;
@@ -236,12 +202,12 @@
Y2Namespace *ns = getNs( RSTRING (namespace_name)->ptr);
if (ns == NULL)
{
- rb_raise( rb_eNameError, "Component cannot import namespace '%s'", RSTRING (namespace_name)->ptr);
+ rb_raise( rb_eNameError, "component cannot import namespace '%s'", RSTRING (namespace_name)->ptr);
return Qnil;
}
else
{
- y2internal("Namespace created from %s\n", ns->filename().c_str());
+ y2internal("namespace created from %s\n", ns->filename().c_str());
}
return Qtrue;
}
@@ -257,18 +223,18 @@
* iterates all symbols in a namespace and yields the
* symbol name and category
*/
-VALUE
+static VALUE
ycp_module_each_symbol(VALUE self, VALUE namespace_name)
{
Y2Namespace *ns = getNs( RSTRING (namespace_name)->ptr);
if (ns == NULL)
{
- rb_raise( rb_eRuntimeError, "Error getting namespace '%s'", RSTRING (namespace_name)->ptr );
+ rb_raise( rb_eRuntimeError, "error getting namespace '%s'", RSTRING (namespace_name)->ptr );
return Qnil;
}
else
{
- y2internal("Got namespace from %s\n", ns->filename().c_str());
+ y2internal("got namespace from %s\n", ns->filename().c_str());
}
for (unsigned int i=0; i < ns->symbolCount(); ++i)
@@ -283,12 +249,76 @@
}
/**
+ * helper method
+ */
+static bool _yield_symbol_entry(const SymbolEntry & s)
+{
+ VALUE arr = rb_ary_new();
+ rb_ary_push(arr, rb_str_new2(s.name()));
+ rb_ary_push(arr, ID2SYM(rb_intern(s.catString().c_str())));
+ rb_yield(arr);
+ return true;
+}
+
+/**
+ * helper for each_builtin_symbol
+ */
+static const SymbolEntry * __symbol = 0L;
+static string __name;
+
+static
+bool __find_symbol(const SymbolEntry & s)
+{
+ if (s.name() == __name)
+ {
+ __symbol = &s;
+ return false;
+ }
+ return true;
+}
+
+/**
+ * iterates all symbols in a namespace and yields the
+ * symbol name and category
+ */
+static VALUE
+ycp_module_each_builtin_symbol(VALUE self, VALUE name)
+{
+ extern StaticDeclaration static_declarations;
+ __name = RSTRING(name)->ptr;
+ static_declarations.symbolTable()->forEach(__find_symbol);
+
+ const SymbolEntry *se = __symbol;
+ if (se == NULL)
+ {
+ y2error ("no such builtin '%s'", RSTRING(name)->ptr);
+ rb_raise( rb_eRuntimeError, "no YCP builtin %s\n", RSTRING(name)->ptr);
+ }
+
+ // convert to a YSymbol to access child symbols
+ const YSymbolEntry *ys = dynamic_cast(se);
+ if ( ys )
+ {
+ if ( ys->table() ) ys->table()->forEach(_yield_symbol_entry);
+ }
+ return Qnil;
+}
+
+static VALUE
+ycp_module_each_builtin(VALUE self)
+{
+ extern StaticDeclaration static_declarations;
+ static_declarations.symbolTable()->forEach(_yield_symbol_entry);
+ return Qnil;
+}
+
+/**
* Forwards a ruby call to the namespace
* First argument is the namespace
* then function name and arguments
*/
-VALUE
-ycp_module_forward_call(int argc, VALUE *argv, VALUE self)
+static VALUE
+ycp_module_call_ycp_function(int argc, VALUE *argv, VALUE self)
{
y2internal("Dynamic Proxy: [%d] params\n", argc);
VALUE symbol = argv[1];
@@ -306,18 +336,6 @@
// get the name of the module
//VALUE namespace_name = rb_funcall(self, rb_intern("name"), 0);
-
-
- // SCR
- // this is a hack before the builtin namespaces get a uniform interface:
- if (! strcmp (RSTRING (namespace_name)->ptr, "SCR"))
- {
- y2internal("Dynamic Proxy: [%s::%s] is a call to SCR\n", RSTRING(namespace_name)->ptr, RSTRING(symbol_str)->ptr);
- YCPValue res;
- res = ycp_call_builtin( RSTRING(namespace_name)->ptr, RSTRING(symbol_str)->ptr, argc, argv);
- return ycpvalue_2_rbvalue(res);
- //return Qnil;
- }
ycp_module_lookup_namespace_component(self, namespace_name);
@@ -358,8 +376,8 @@
if (call == NULL)
{
- y2internal ("Cannot create function call %s\n", RSTRING(symbol_str)->ptr);
- rb_raise( rb_eRuntimeError, "Can't create call to %s::%s", RSTRING (namespace_name)->ptr, RSTRING(symbol_str)->ptr);
+ y2internal ("cannot create function call %s\n", RSTRING(symbol_str)->ptr);
+ rb_raise( rb_eRuntimeError, "can't create call to %s::%s", RSTRING (namespace_name)->ptr, RSTRING(symbol_str)->ptr);
}
// add the parameters
@@ -372,39 +390,28 @@
YCPValue res = call->evaluateCall ();
delete call;
- y2internal ("Call succeded\n");
+ y2internal ("call succeded\n");
//y2internal ("Result: %i\n", res->asList()->size());
return ycpvalue_2_rbvalue(res);
}
return Qnil;
}
-YCPValue ycp_call_builtin ( const string &module_name, const string &func_name, int argc, VALUE *argv )
+YCPValue _call_ycp_builtin ( const string &module_name, const string &func_name, int argc, VALUE *argv )
{
// access directly the statically declared builtins
extern StaticDeclaration static_declarations;
+
string qualified_name_s = module_name + "::" + func_name;
const char *qualified_name = qualified_name_s.c_str ();
- y2milestone("Qualified name '%s'", qualified_name);
- /*
- this does not work across namespaces
- TableEntry *bi_te = static_declarations.symbolTable ()->find (qualified_name);
- if (bi_te == NULL)
- {
- y2error ("No such builtin %s",qualified_name);
- return YCPNull ();
- }
+ y2milestone("qualified name '%s', %d args", qualified_name, argc);
- SymbolEntry *bi_se = bi_te->sentry ();
- assert (bi_se != NULL);
- assert (bi_se->isBuiltin ());
- declaration_t bi_dt = bi_se->declaration ();
- */
declaration_t *bi_dt = static_declarations.findDeclaration (qualified_name);
if (bi_dt == NULL)
{
- y2error ("No such builtin '%s'", qualified_name);
+ y2error ("no such builtin '%s'", qualified_name);
+ rb_raise( rb_eRuntimeError, "no YCP builtin %s\n", RSTRING(qualified_name)->ptr);
return YCPNull ();
}
y2milestone("builtin '%s' found.", module_name.c_str());
@@ -416,26 +423,22 @@
// we would like to know the destination type so that we could
// convert eg a Ruby scalar to a YCP symbol, but because the
// builtins may be overloaded, let's say we want Any
-
// maybe a special exceptional hack to make Path for the 1st argument?
-
// go through the actual parameters
int j;
- for (j = 1; j < argc; ++j)
+ for (j = 0; j < argc; ++j)
{
- y2milestone("builtin param '%d'", j-1);
// convert the value according to the expected type:
constTypePtr param_tp = (j == 0)? Type::Path : Type::Any;
- y2milestone("builtin param '%d' 1", j-1);
// convert the first argument to a path
YCPValue param_v;
- if ( j == 1 )
+ // HACK SCR path conversion
+ if ( (j == 0) && (module_name == "SCR") )
param_v = rbvalue_2_ycppath(argv[j]);
else
param_v = rbvalue_2_ycpvalue(argv[j] /*, param_tp */);
- y2milestone("builtin param '%d' 2", j-1);
if (param_v.isNull ())
{
// an error has already been reported, now refine it.
@@ -489,8 +492,21 @@
return ret_yv;
}
+VALUE
+ycp_module_call_ycp_builtin( int argc, VALUE *argv, VALUE self )
+{
+ VALUE symbol = argv[1];
+ VALUE namespace_name = argv[0];
+ // the func name (1st argument, is a symbol
+ // lets convert it to string
+ VALUE symbol_str = rb_funcall(symbol, rb_intern("to_s"), 0);
+ y2internal("builtin proxy: [%s::%s] is a builtin call with %d params\n", RSTRING(namespace_name)->ptr, RSTRING(symbol_str)->ptr, argc);
+ YCPValue res;
+ res = _call_ycp_builtin( RSTRING(namespace_name)->ptr, RSTRING(symbol_str)->ptr, argc-2, argv+2);
+ return ycpvalue_2_rbvalue(res);
+}
//y2_logger_helper
//y2_logger (level, comp, file, line, function, "%s", message);
@@ -513,16 +529,19 @@
return Qnil;
}
+} //extern C
+
extern "C"
{
void
- Init_yastx()
+ Init_ycpx()
{
YCPPathSearch::initialize ();
-
+ init_wfm();
+
for ( list<string>::const_iterator it = YCPPathSearch::searchListBegin (YCPPathSearch::Module); it != YCPPathSearch::searchListEnd (YCPPathSearch::Module) ; ++it )
{
- y2internal("%s\n", (*it).c_str() );
+ y2internal("search path %s\n", (*it).c_str() );
}
rb_mYaST = rb_define_module("YaST");
@@ -530,15 +549,21 @@
//rb_mYCP = rb_define_module_under(rb_mYaST, "YCP");
rb_mYCP = rb_define_module("YCP");
rb_define_singleton_method( rb_mYCP, "import", RB_METHOD(ycp_module_import), 1);
- rb_define_singleton_method( rb_mYCP, "forward_call", RB_METHOD(ycp_module_forward_call), -1);
+ rb_define_singleton_method( rb_mYCP, "call_ycp_function", RB_METHOD(ycp_module_call_ycp_function), -1);
+ rb_define_singleton_method( rb_mYCP, "call_ycp_builtin", RB_METHOD(ycp_module_call_ycp_builtin), -1);
+
rb_define_singleton_method( rb_mYCP, "each_symbol", RB_METHOD(ycp_module_each_symbol), 1);
+ rb_define_singleton_method( rb_mYCP, "each_builtin_symbol", RB_METHOD(ycp_module_each_builtin_symbol), 1);
+ rb_define_singleton_method( rb_mYCP, "each_builtin", RB_METHOD(ycp_module_each_builtin), 0);
rb_mUi = rb_define_module_under(rb_mYCP, "Ui");
rb_define_singleton_method( rb_mUi, "init", RB_METHOD(rb_init_ui), -1);
+
rb_define_method( rb_mYaST, "y2_logger", RB_METHOD(rb_y2_logger), -1);
ryast_path_init(rb_mYaST);
ryast_term_init(rb_mYaST);
}
}
+
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/ruby/ycp.rb new/yast2-ruby-bindings-0.3.2/src/ruby/ycp.rb
--- old/yast2-ruby-bindings-0.3.1/src/ruby/ycp.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/ruby/ycp.rb 2008-04-16 17:46:52.000000000 +0200
@@ -0,0 +1,218 @@
+# -----------------------------------------------------------------------\
+# | |
+# | __ __ ____ _____ ____ |
+# | \ \ / /_ _/ ___|_ _|___ \ |
+# | \ V / _` \___ \ | | __) | |
+# | | | (_| |___) || | / __/ |
+# | |_|\__,_|____/ |_| |_____| |
+# | |
+# | |
+# | ruby language support (C) Novell Inc. |
+# \----------------------------------------------------------------------/
+#
+# Author: Duncan Mac-Vicar
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version
+# 2 of the License, or (at your option) any later version.
+#
+
+# Load the native part (.so)
+require 'ycpx'
+
+module YaST
+ def y2_logger_helper(*args)
+ level = args.shift
+
+ caller[0] =~ /(.+):(\d+):in `([^']+)'/
+ y2_logger(level,"Ruby",$1,$2.to_i,"",args[0])
+ end
+
+ def y2debug(*args)
+ y2_logger_helper(0, args)
+ end
+
+ def y2milestone(*args)
+ y2_logger_helper(1, args)
+ end
+
+ def y2warning(*args)
+ y2_logger_helper(2, args)
+ end
+
+ def y2error(*args)
+ y2_logger_helper(3, args)
+ end
+
+ def y2security(*args)
+ y2_logger_helper(4, args)
+ end
+
+ def y2internal(*args)
+ y2_logger_helper(5, args)
+ end
+end # module YaST
+
+module YCP
+
+ # inserts a builtin in the
+ # ycp module
+ def self.import_builtin(name)
+ YCP::each_builtin do |bi, cat|
+ if name == bi
+ if cat == :namespace
+ m = Module.new
+ YCP::each_builtin_symbol(bi) do |bs, scat|
+ if scat == :builtin
+ m.module_eval <<-"END"
+ def self.#{bs.downcase.to_s}(*args)
+ return YCP::call_ycp_builtin("SCR", "#{bs.to_s}", *args)
+ end
+ END
+ end
+ end # each builtin symbol
+ YCP.const_set(bi.to_s, m)
+ return
+ else
+ raise "builtin #{bi} can't be imported (not namespace)"
+ end # if namespace
+ end
+ end # each builtin
+ raise "can't import builtin '#{bi}'"
+ end
+
+ # initialize builtins and add them to
+ # the ycp module
+ def self.init_builtins
+
+ end
+
+ def self.add_ycp_module(mname)
+ #y2internal("tryng to add import #{mname}")
+ YCP::import(mname)
+ m = Module.new
+ YCP::each_symbol(mname) do |sname,stype|
+ if (stype == :function) and !sname.empty?
+ m.module_eval <<-"END"
+ def self.#{sname}(*args)
+ return YCP::call_ycp_function("#{mname}", :#{sname}, *args)
+ end
+ END
+ end # if function
+ end
+ YCP.const_set(mname, m)
+ end
+end
+
+YCP::init_builtins
+
+module Kernel
+ alias require_ require
+ def require(name)
+ if name =~ /^ycp\/(.+)$/
+ ycpns = $1
+
+ YCP::each_builtin do |bi, cat|
+ if bi.downcase == ycpns.downcase
+ YCP::import_builtin(bi)
+ return
+ end
+ end
+
+ begin
+ YCP::add_ycp_module(ycpns.upcase)
+ rescue RuntimeError => e
+ puts e
+ YCP::add_ycp_module(ycpns.capitalize)
+ end
+ return true
+ end
+ return require_(name)
+ end
+end
+
+
+module YCP
+ module Ui
+ #my @e_logging = qw(y2debug y2milestone y2warning y2error y2security y2internal);
+
+ # Define symbols for the UI
+ ui_terms = [ :BarGraph, :Bottom, :CheckBox, :ColoredLabel, :ComboBox, :Date,
+ :DownloadProgress, :DumbTab, :DummySpecialWidget, :Empty, :Frame, :HBox, :HBoxvHCenter,
+ :HMultiProgressMeter, :HSpacing, :HSquash, :HStretch, :HVCenter, :HVSquash,
+ :HVStretch, :HWeight, :Heading, :IconButton, :Image, :IntField, :Label, :Left, :LogView,
+ :MarginBox, :MenuButton, :MinHeight, :MinSize, :MinWidth, :MultiLineEdit,
+ :MultiSelectionBox, :PackageSelector, :PatternSelector, :PartitionSplitter,
+ :Password, :PkgSpecial, :ProgressBar, :PushButton, :RadioButton,
+ :RadioButtonGroup, :ReplacePoint, :RichText, :Right, :SelectionBox, :Slider, :Table,
+ :TextEntry, :Time, :Top, :Tree, :VBox, :VCenter, :VMultiProgressMeter, :VSpacing,
+ :VSquash, :VStretch, :VWeight, :Wizard,
+ :id, :opt ]
+
+# buffer = String.new
+# buffer << "["
+# ui_terms.each do |t|
+# buffer << " :" << t.to_s.downcase << ","
+# end
+# buffer << " ]"
+# puts buffer
+ # If the method name contains underscores, convert to camel case
+# while method =~ /([^_]*)_(.)(.*)/
+# method = $1 + $2.upcase + $3
+# end
+
+ # for each symbol define a util function that will create a term
+ ui_terms.each do | term_name |
+ define_method(term_name) do | *args |
+ t = YaST::Term.new(term_name.to_s)
+ args.each do |arg|
+ t.add(arg)
+ end
+ return t
+ end
+ alias_method term_name.to_s.downcase, term_name
+ end
+
+ end # end Ui module
+end
+
+module YaST
+ class TermBuilder
+ # blank slate
+ instance_methods.each { |m| undef_method m unless (m =~ /^__|instance_eval$/)}
+
+ def initialize(&block)
+ @term = nil
+ @term = instance_eval(&block)
+ end
+
+ def method_missing(name, *args, &block )
+ # puts "hi #{name.to_s} | #{args}"
+ term = nil
+ elements = block ? nil : args
+ @__to_s = nil # invalidate to_s cache
+ term = YaST::Term.new(name.to_s)
+ if not elements.nil?
+ elements.each do | e |
+ term.add(e)
+ end
+ return term
+ else
+ r = instance_eval(&block)
+ puts term.class
+ term.add(r) if not r.nil?
+ end
+ return term
+ end
+
+ def to_s
+ return @term.to_s
+ end
+
+ def term
+ return @term
+ end
+
+ end
+end # module YaST
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/swig/CMakeLists.txt new/yast2-ruby-bindings-0.3.2/src/swig/CMakeLists.txt
--- old/yast2-ruby-bindings-0.3.1/src/swig/CMakeLists.txt 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/swig/CMakeLists.txt 2008-04-16 17:46:52.000000000 +0200
@@ -1,32 +1,41 @@
-SET( SWIG_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ycp_wrap.cxx" )
-SET( SWIG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}/ycp.i" )
+MACRO(swig_wrap_lib name)
+ SET( SWIG_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}_wrap.cxx" )
+ SET( SWIG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}/${name}.i" )
-ADD_CUSTOM_COMMAND (
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ycp_wrap.cxx
+ ADD_CUSTOM_COMMAND (
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}_wrap.cxx
COMMAND ${CMAKE_COMMAND} -E echo_append "Creating wrapper code..."
-#COMMAND ${SWIG_EXECUTABLE} -c++ -ruby -autorename -xmlout parse.xml -I/usr/include swig/zypp.i
- COMMAND ${SWIG_EXECUTABLE} -I${YAST_INCLUDE_DIR} -c++ -ruby -autorename -xmlout ${CMAKE_CURRENT_BINARY_DIR}/parse.xml -o ${CMAKE_CURRENT_BINARY_DIR}/ycp_wrap.cxx -I${ZYPP_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/ycp.i
+ #COMMAND ${SWIG_EXECUTABLE} -c++ -ruby -autorename -xmlout parse.xml -I/usr/include swig/zypp.i
+ COMMAND ${SWIG_EXECUTABLE} -I${YAST_INCLUDE_DIR} -c++ -ruby -autorename -xmlout ${CMAKE_CURRENT_BINARY_DIR}/parse.xml -o ${CMAKE_CURRENT_BINARY_DIR}/${name}_wrap.cxx -I${ZYPP_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${name}.i
COMMAND ${CMAKE_COMMAND} -E echo "Done."
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ycp.i
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${name}.i
)
-ADD_CUSTOM_TARGET( glue
- DEPENDS ${SWIG_OUTPUT}
-)
-
-ADD_LIBRARY( ycpx SHARED "${CMAKE_CURRENT_BINARY_DIR}/ycp_wrap.cxx" )
-SET_TARGET_PROPERTIES( ycpx PROPERTIES PREFIX "" )
-ADD_DEPENDENCIES( ycpx glue )
+ ADD_CUSTOM_TARGET( ${name}_glue
+ DEPENDS ${SWIG_OUTPUT}
+ )
+
+ ADD_LIBRARY( ${name}x SHARED "${CMAKE_CURRENT_BINARY_DIR}/${name}_wrap.cxx" )
+ SET_TARGET_PROPERTIES( ${name}x PROPERTIES PREFIX "" )
+ ADD_DEPENDENCIES( ${name}x ${name}_glue )
+ENDMACRO(swig_wrap_lib)
INCLUDE_DIRECTORIES( ${RUBY_INCLUDE_PATH} )
INCLUDE_DIRECTORIES( ${YAST_INCLUDE_DIR} )
+
+swig_wrap_lib(ycp)
+
+
TARGET_LINK_LIBRARIES( ycpx ${YAST_LIBRARY} )
-TARGET_LINK_LIBRARIES( ycpx ${YAST_YCP_LIBRARY} )
-TARGET_LINK_LIBRARIES( ycpx ${YAST_PLUGIN_WFM_LIBRARY} )
+TARGET_LINK_LIBRARIES( ycpx ${YAST_${NAME}_LIBRARY} )
+#TARGET_LINK_LIBRARIES( ycpx ${YAST_PLUGIN_WFM_LIBRARY} )
TARGET_LINK_LIBRARIES( ycpx ${RUBY_LIBRARY} )
INSTALL(TARGETS ycpx LIBRARY DESTINATION ${RUBY_ARCH_DIR} )
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/ycp.rb DESTINATION
+${RUBY_VENDORLIB_DIR} )
+
+
-INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/ycp.rb DESTINATION ${RUBY_VENDORLIB_DIR} )
\ No newline at end of file
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/swig/ycp.rb new/yast2-ruby-bindings-0.3.2/src/swig/ycp.rb
--- old/yast2-ruby-bindings-0.3.1/src/swig/ycp.rb 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/swig/ycp.rb 2008-04-16 17:46:52.000000000 +0200
@@ -21,4 +21,4 @@
ENV['LD_LIBRARY_PATH'] = "/usr/lib/YaST2/plugin"
# Load the native part (.so)
-require 'ycpx'
\ No newline at end of file
+require 'ycpx'
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/swig/yui.i new/yast2-ruby-bindings-0.3.2/src/swig/yui.i
--- old/yast2-ruby-bindings-0.3.1/src/swig/yui.i 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/swig/yui.i 2008-04-16 17:46:52.000000000 +0200
@@ -0,0 +1,7 @@
+%module yuix
+
+%{
+#include
+%}
+%ignore start_ui_thread;
+%include
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/src/swig/yui.rb new/yast2-ruby-bindings-0.3.2/src/swig/yui.rb
--- old/yast2-ruby-bindings-0.3.1/src/swig/yui.rb 1970-01-01 01:00:00.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/src/swig/yui.rb 2008-04-16 17:46:52.000000000 +0200
@@ -0,0 +1,24 @@
+# -----------------------------------------------------------------------\
+# | |
+# | __ __ ____ _____ ____ |
+# | \ \ / /_ _/ ___|_ _|___ \ |
+# | \ V / _` \___ \ | | __) | |
+# | | | (_| |___) || | / __/ |
+# | |_|\__,_|____/ |_| |_____| |
+# | |
+# | |
+# | ruby language support (C) Novell Inc. |
+# \----------------------------------------------------------------------/
+#
+# Author: Duncan Mac-Vicar
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version
+# 2 of the License, or (at your option) any later version.
+#
+
+ENV['LD_LIBRARY_PATH'] = "/usr/lib/YaST2/plugin"
+
+# Load the native part (.so)
+require 'yuix'
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/yast2-ruby-bindings-0.3.1/VERSION.cmake new/yast2-ruby-bindings-0.3.2/VERSION.cmake
--- old/yast2-ruby-bindings-0.3.1/VERSION.cmake 2008-02-29 10:05:44.000000000 +0100
+++ new/yast2-ruby-bindings-0.3.2/VERSION.cmake 2008-04-16 17:46:52.000000000 +0200
@@ -1,3 +1,3 @@
SET(VERSION_MAJOR "0")
SET(VERSION_MINOR "3")
-SET(VERSION_PATCH "1")
+SET(VERSION_PATCH "2")
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org