ports/188084: ports-mgmt/portupgrade : not working without ruby-bdb

Christoph Moench-Tegeder cmt at burggraben.net
Sun Mar 30 14:20:01 UTC 2014


>Number:         188084
>Category:       ports
>Synopsis:       ports-mgmt/portupgrade : not working without ruby-bdb
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 30 14:20:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Christoph Moench-Tegeder
>Release:        FreeBSD 10.0-RELEASE amd64
>Organization:
>Environment:
System: FreeBSD elch.exwg.net 10.0-RELEASE FreeBSD 10.0-RELEASE #2 r260689: Wed Jan 15 18:32:44 CET 2014 cmt at elch.exwg.net:/usr/obj/usr/src/sys/ELCH amd64


	portupgrade-2.4.12,2           ports-mgmt/portupgrade

>Description:
	When upgrading my ruby stack to ruby 2.1, I disconvered that ruby-bdb
	is utterly broken with recent versions of ruby (ports/188083).
	Trying to use portupgrade without ruby-bdb gave me

: /usr/local/lib/ruby/site_ruby/2.1/pkgtools/pkgdbtools.rb:104:in `rescue in db_driver=': uninitialized constant PkgDBTools::DBError (NameError)
:         from /usr/local/lib/ruby/site_ruby/2.1/pkgtools/pkgdbtools.rb:63:in `db_driver='
:         from /usr/local/lib/ruby/site_ruby/2.1/pkgtools/portsdb.rb:168:in `setup'
:         from /usr/local/lib/ruby/site_ruby/2.1/pkgtools/pkgtools.rb:242:in `init_pkgtools_global'
:         from /usr/local/sbin/portupgrade:530:in `block in main'
:         from /usr/local/lib/ruby/2.1/optparse.rb:880:in `initialize'
:         from /usr/local/sbin/portupgrade:237:in `new'
:         from /usr/local/sbin/portupgrade:237:in `main'
:         from /usr/local/sbin/portupgrade:2371:in `<main>'

	so I set out to integrate yet another dbm into portupgrade.
	I happened to choose qdbm, which may not have been such a good idea,
	as ruby-qdbm itself is quite behind current ruby and needed
	patching, too (ports/188079).
	I'm proposing three patches:
	 1. do not try to use databases/ruby-bdb when on ruby 2.1 (it's already
	    blacklisted for ruby 2.0)
     2. explicitly stringify port_info when inserting it @db
        (portsdb.rb l.598) - some databases do not do that implicitly
     3. switch pkgtools to using qdbm (even as a default).
        I'm open to discussion and suggestions on this one (what DBM
        does the ruby community prefer these days?), as I'm not feeling
        too good about qdbm myself (see above).
        For the same reason I've not added ruby-qdbm as a dependency
        to portupgrade's Makefile.

>How-To-Repeat:
	
>Fix:

Part 1, blacklist ruby-bdb for ruby 2.1:
Index: Makefile
===================================================================
--- Makefile	(revision 349592)
+++ Makefile	(working copy)
@@ -38,8 +38,8 @@
 INSTALL_TARGET+=	install-doc
 .endif
 
-# Reported that ruby-bdb is BROKEN with 2.0
-.if ${RUBY_VER} != 2.0
+# Reported that ruby-bdb is BROKEN with 2.0 and 2.1
+.if ${RUBY_VER} != 2.0 && ${RUBY_VER} != 2.1
 # For PKG_DBDRIVER={bdb_btree,bdb_hash}
 RUN_DEPENDS+=	${RUBY_SITEARCHLIBDIR}/bdb.so:${PORTSDIR}/databases/ruby-bdb
 .endif


Patches to be applied to the pkgtools source (not the port):
Part 2, explicitly stringify port_info:
--- lib/pkgtools/portsdb.rb.orig	2014-03-30 15:42:56.000000000 +0200
+++ lib/pkgtools/portsdb.rb	2014-03-30 15:46:49.000000000 +0200
@@ -595,7 +595,7 @@
 	    @origins << origin
 	    @pkgnames << pkgname
 
-	    @db[origin] = port_info
+	    @db[origin] = port_info.to_s
 	    @db[pkgname.to_s] = origin
 	  rescue => e
 	    STDERR.puts index_file + ":#{lineno}:#{e.message}"


Part 3, switch to qdbm:
--- lib/pkgtools/pkgdbtools.rb.orig	2014-03-30 15:42:40.000000000 +0200
+++ lib/pkgtools/pkgdbtools.rb	2014-03-30 15:49:38.000000000 +0200
@@ -61,7 +61,7 @@
 
   def db_driver=(new_db_driver)
     begin
-      case new_db_driver || ENV['PKG_DBDRIVER'] || 'bdb_btree'
+      case new_db_driver || ENV['PKG_DBDRIVER'] || 'qdbm'
       when 'pkg'
         @db_driver = :pkg
       when 'bdb_btree'
@@ -72,6 +72,8 @@
 	@db_driver = :bdb1_btree
       when 'bdb1_hash', 'hash', 'bdb1'
 	@db_driver = :bdb1_hash
+      when 'qdbm'
+	@db_driver = :qdbm
       else
 	@db_driver = :dbm_hash
       end
@@ -95,6 +97,9 @@
 	next_driver = 'dbm'
 	require 'bdb1'
 	@db_params = ["set_pagesize" => 1024, "set_cachesize" => 32 * 1024]
+      when :qdbm
+	next_driver = 'dbm'
+	require 'depot'
       else
 	next_driver = nil
 	require 'dbm'
@@ -200,6 +205,9 @@
       db = BDB1::Btree.open @db_file, mode, perm, *@db_params
     when :bdb1_hash
       db = BDB1::Hash.open @db_file, mode, perm, *@db_params
+    when :qdbm
+      qmode = mode == 'r' ? Depot::OREADER : (Depot::OWRITER | Depot::OCREAT)
+      db = Depot::new(@db_file, qmode, perm)
     else
       if mode == 'w+'
 	File.unlink(@db_file) if File.exist?(@db_file)
--- etc/pkgtools.conf.orig	2014-03-30 16:02:36.000000000 +0200
+++ etc/pkgtools.conf	2014-03-30 16:03:06.000000000 +0200
@@ -130,7 +130,7 @@
   #   failed too, it will fall to 'dbm_hash' that require no external
   #   modules.
   #   Possible values for ENV['PKG_DBDRIVER'] are bdb_btree, bdb_hash,
-  #   bdb1_btree, bdb1_hash and dbm_hash.
+  #   bdb1_btree, bdb1_hash, dbm_hash and qdbm.
   #
   # e.g.:
   #   ENV['PORTSDIR'] ||= '/export/freebsd/ports'


Any thought?


Best Regards,
Christoph
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-ports-bugs mailing list