* Add Rubygem 2.0.0 and Ruby 2.0.0 support which wouldn't enabled yet.
* Use Ruby code format for gemspec to build/install instead of YAML.
* Add --backtrace option to "gem install".

files/update-gemspec.rb:
* Allow rename name attribute in gemspec.
* Handle Ruby code format of gemspec.
This commit is contained in:
taca 2013-03-07 16:42:53 +00:00
parent ba6e8e6eb1
commit e79e6ac62a
2 changed files with 56 additions and 34 deletions

View file

@ -1,9 +1,9 @@
#!/usr/pkg/bin/ruby
# -*- coding: utf-8 -*-
#
# $NetBSD: update-gemspec.rb,v 1.4 2012/03/02 03:46:09 taca Exp $
# $NetBSD: update-gemspec.rb,v 1.5 2013/03/07 16:42:53 taca Exp $
#
# Copyright (c) 2011, 2012 The NetBSD Foundation, Inc.
# Copyright (c) 2011, 2012, 2013 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
@ -39,45 +39,43 @@ require 'rubygems'
require 'fileutils'
require 'optparse'
begin
# Since newer rubygems load psych instead of syck, don't load yaml directly.
Gem.load_yaml
rescue NoMethodError
# Older rubygems don't have load_yaml() and don't know about psych.
end
class GemSpecUpdater
OrigSuffix = '.orig_gemspec'
def initialize(file)
@file = file
open(file) { |f|
@spec = Gem::Specification.from_yaml(f)
}
@spec = Gem::Specification.load(@file)
@requirements = {}
@attr = {}
end
#
# rule should be:
# rule ::= [ dependecy_specs ] [ attr_specs ]
# dependency_specs ::= dependency_spec [ dependency_spec ]
# rule ::= dependecy_specs | attr_specs
# dependency_specs ::= dependency_spec [ SPACE dependency_spec ]
# dependency_spec ::= name_spec [ dependency ]
# name_spec ::= name [ ":" new_name ]
# dependency ::= "pkgsrc's dependecy operator and version string"
# command ::= ":" attr_name" attr_operations
# attr_operations ::= attr_op [ attr_op ]
# dependency ::= <Rubygem's dependecy operator and version string>
# attr_specs ::= ":" attr_name attr_operations
# attr_operations ::= assign_operation | array_operation
# assign_operation ::= "=" [ new_value ]
# array_operations ::= attr_op [ attr_op ]
# attr_op ::= new | old=new | old=
#
def parse_rules(rules)
key = nil
rules.each do |s|
s.split.each do |ru|
if /^:([a-z_]+)+/ =~ ru
if /^:([a-z_]+)=*(\S+)*/ =~ ru
key = $1
var = $2
@attr[key] = var
key = nil
elsif /^:([a-z_]+)+/ =~ ru
key = $1
@attr[key] = []
elsif not key.nil?
@attr[key].push ru
@attr[key].push ru unless key.nil?
else
if /([a-z0-9_:-]+)([=!><\~][=>]*)(.*)/ =~ ru
names = $1
@ -104,7 +102,6 @@ class GemSpecUpdater
def modify
dependencies = @spec.instance_variable_get(:@dependencies)
dependencies.each do |dep|
next if dep.type != :runtime
update = @requirements[dep.name]
@ -122,24 +119,40 @@ class GemSpecUpdater
update = @requirements[dep.name]
not update.nil? and update[:method] == :delete
}
@attr.keys.each do |name|
av = @spec.instance_variable_get('@' + name)
if av.class == Array
modified = false
av = eval "@spec.#{name}"
if av.class == String
nv = @attr[name]
av = nv
modified = true
elsif av.class == Array
operation = @attr[name]
operation.each do |op|
if /^([^=]+)=([^=]+)$/ =~ op
ov = $1
nv = $2
av.delete_if {|a| a == ov}
av.push nv unless av.include? nv
if av.include? ov
av.delete ov
modified = true
end
unless av.include? nv
av.push nv
modified = true
end
elsif /^([^=]+)=$/ =~ op
ov = $1
av.delete_if {|a| a == ov}
else
av.push op unless av.include? op
if av.include? ov
av.delete(ov)
modified = true
end
end
end
end
if modified
eval "@spec.#{name} = av"
end
end
end
@ -147,7 +160,7 @@ class GemSpecUpdater
FileUtils.cp(@file, @file + OrigSuffix, :preserve => true)
open(@file, "w") { |f|
f.print YAML.dump(@spec) + "\n"
f.print @spec.to_ruby
}
end

View file

@ -1,4 +1,4 @@
# $NetBSD: gem.mk,v 1.16 2012/10/03 12:58:34 asau Exp $
# $NetBSD: gem.mk,v 1.17 2013/03/07 16:42:53 taca Exp $
#
# This Makefile fragment is intended to be included by packages that build
# and install Ruby gems.
@ -10,6 +10,7 @@
#
# ruby18-base: none
# ruby193-base: 1.8.11
# ruby200-base: 2.0.0
#
# If newer version of rubygems is resuiqred, set RUBYGEMS_REQD to
# minimum version.
@ -37,7 +38,12 @@
#
# OVERRIDE_GEMSPEC+= json:
#
# (2) Modify files in gemspec.
# (2) Modify instance of gemspec.
#
# Example:
# Rename gem's name to "foo" (setting instance @name):
#
# OVERRIDE_GEMSPEC+= :name=foo
#
# Example:
# Remove files (a.rb and b.rb) from 'files':
@ -163,6 +169,7 @@ DEPENDS+= ${RUBY_PKGPREFIX}-rubygems>=1.0.1:../../misc/rubygems
. if defined(RUBYGEMS_REQD)
RUBY193_RUBYGEMS_VERS= 1.8.11
RUBY200_RUBYGEMS_VERS= 2.0.0
_RUBYGEMS_REQD_MAJOR= ${RUBYGEMS_REQD:C/\.[0-9\.]+$//}
_RUBYGEMS_REQD_MINORS= ${RUBYGEMS_REQD:C/^([0-9]+)\.*//}
@ -170,6 +177,9 @@ _RUBYGEMS_REQD_MINORS= ${RUBYGEMS_REQD:C/^([0-9]+)\.*//}
. if ${RUBY_VER} == "193"
_RUBYGEMS_MAJOR= ${RUBY193_RUBYGEMS_VERS:C/\.[0-9\.]+$//}
_RUBYGEMS_MINORS= ${RUBY193_RUBYGEMS_VERS:C/^([0-9]+)\.*//}
. elif ${RUBY_VER} == "200"
_RUBYGEMS_MAJOR= ${RUBY200_RUBYGEMS_VERS:C/\.[0-9\.]+$//}
_RUBYGEMS_MINORS= ${RUBY200_RUBYGEMS_VERS:C/^([0-9]+)\.*//}
. else
PKG_FAIL_REASON+= "Unknown Ruby version specified: ${RUBY_VER}."
. endif
@ -244,11 +254,10 @@ post-extract: gem-extract
gem-extract: fake-home
. for _gem_ in ${DISTFILES:M*.gem}
${RUN} cd ${WRKDIR} && ${SETENV} ${MAKE_ENV} ${RUBYGEM_ENV} \
${RUBYGEM} unpack ${RUBYGEM_INSTALL_ROOT_OPTION} \
${_DISTDIR:Q}/${_gem_:Q}
${RUBYGEM} unpack ${_DISTDIR:Q}${_gem_:Q}
${RUN} cd ${WRKDIR} && \
${SETENV} ${MAKE_ENV} TZ=UTC ${RUBYGEM_ENV} \
${RUBYGEM} spec ${_DISTDIR:Q}/${_gem_:Q} > ${_gem_}spec
${RUBYGEM} spec --ruby ${_DISTDIR:Q}${_gem_:Q} > ${_gem_}spec
. endfor
.endif
@ -321,7 +330,7 @@ RUBYGEM_INSTALL_ROOT_OPTION= --install-root ${RUBYGEM_INSTALL_ROOT}
_gem-build-install-root:
@${STEP_MSG} "Installing gem into installation root"
${RUN} ${SETENV} ${MAKE_ENV} ${RUBYGEM_ENV} \
${RUBYGEM} install ${RUBYGEM_OPTIONS} ${_RUBYGEM_OPTIONS}
${RUBYGEM} install --backtrace ${RUBYGEM_OPTIONS} ${_RUBYGEM_OPTIONS}
# The ``gem'' command doesn't exit with a non-zero result even if the
# install of the gem failed, so we do the check and return the proper exit