[packages/ruby-rubygems] add operating_system.rb (from ruby/ package) to handle proper install paths

glen glen at pld-linux.org
Thu Nov 2 23:27:59 CET 2017


commit 705db36e50ecfd374a98e9ee16fe4bd03646f9a7
Author: Elan Ruusamäe <glen at pld-linux.org>
Date:   Fri Nov 3 00:27:28 2017 +0200

    add operating_system.rb (from ruby/ package) to handle proper install paths

 operating_system.rb | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 ruby-rubygems.spec  |   6 +++
 2 files changed, 152 insertions(+)
---
diff --git a/ruby-rubygems.spec b/ruby-rubygems.spec
index 97f7d3c..e4b4adb 100644
--- a/ruby-rubygems.spec
+++ b/ruby-rubygems.spec
@@ -12,6 +12,7 @@ License:	GPL
 Group:		Development/Languages
 Source0:	https://rubygems.org/gems/rubygems-update-%{version}.gem
 # Source0-md5:	cad98b534ae8e1d65f9a5cf00fdaa89f
+Source1:	operating_system.rb
 URL:		https://rubygems.org/
 BuildRequires:	rpm-rubyprov
 BuildRequires:	rpmbuild(macros) >= 1.665
@@ -74,6 +75,10 @@ install -d $RPM_BUILD_ROOT{%{ruby_vendorlibdir},%{ruby_specdir}}
 cp -a lib/* $RPM_BUILD_ROOT%{ruby_vendorlibdir}
 cp -p %{pkgname}-update-%{version}.gemspec $RPM_BUILD_ROOT%{ruby_specdir}
 
+# Install custom operating_system.rb.
+install -d $RPM_BUILD_ROOT%{ruby_vendorlibdir}/rubygems/defaults
+cp -p %{SOURCE1} $RPM_BUILD_ROOT%{ruby_vendorlibdir}/rubygems/defaults
+
 # please use system ca-certificagtes
 %{__rm} -r $RPM_BUILD_ROOT%{ruby_vendorlibdir}/rubygems/ssl_certs
 
@@ -100,6 +105,7 @@ rm -rf $RPM_BUILD_ROOT
 %{ruby_vendorlibdir}/rubygems/*.rb
 %{ruby_vendorlibdir}/rubygems/commands
 %{ruby_vendorlibdir}/rubygems/core_ext
+%{ruby_vendorlibdir}/rubygems/defaults
 %{ruby_vendorlibdir}/rubygems/ext
 %{ruby_vendorlibdir}/rubygems/package
 %{ruby_vendorlibdir}/rubygems/request
diff --git a/operating_system.rb b/operating_system.rb
new file mode 100644
index 0000000..4b2903d
--- /dev/null
+++ b/operating_system.rb
@@ -0,0 +1,146 @@
+module Gem
+  class << self
+
+    ##
+    # Returns full path of previous but one directory of dir in path
+    # E.g. for '/usr/share/ruby', 'ruby', it returns '/usr'
+
+    def previous_but_one_dir_to(path, dir)
+      return unless path
+
+      split_path = path.split(File::SEPARATOR)
+      File.join(split_path.take_while { |one_dir| one_dir !~ /^#{dir}$/ }[0..-2])
+    end
+    private :previous_but_one_dir_to
+
+    ##
+    # Detects --install-dir option specified on command line.
+
+    def opt_install_dir?
+      @opt_install_dir ||= ARGV.include?('--install-dir') || ARGV.include?('-i')
+    end
+    private :opt_install_dir?
+
+    ##
+    # Detects --build-root option specified on command line.
+
+    def opt_build_root?
+      @opt_build_root ||= ARGV.include?('--build-root')
+    end
+    private :opt_build_root?
+
+    ##
+    # Tries to detect, if arguments and environment variables suggest that
+    # 'gem install' is executed from rpmbuild.
+
+    def rpmbuild?
+      @rpmbuild ||= ENV['RPM_PACKAGE_NAME'] && (opt_install_dir? || opt_build_root?)
+    end
+    private :rpmbuild?
+
+    ##
+    # Default gems locations allowed on FHS system (/usr, /usr/share).
+    # The locations are derived from directories specified during build
+    # configuration.
+
+    def default_locations
+      @default_locations ||= {
+        :system => previous_but_one_dir_to(RbConfig::CONFIG['vendordir'], RbConfig::CONFIG['RUBY_INSTALL_NAME']),
+        :local => previous_but_one_dir_to(RbConfig::CONFIG['sitedir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'])
+      }
+    end
+
+    ##
+    # For each location provides set of directories for binaries (:bin_dir)
+    # platform independent (:gem_dir) and dependent (:ext_dir) files.
+
+    def default_dirs
+      @libdir ||= case RUBY_PLATFORM
+      when 'java'
+        RbConfig::CONFIG['datadir']
+      else
+        RbConfig::CONFIG['libdir']
+      end
+
+      @default_dirs ||= default_locations.inject(Hash.new) do |hash, location|
+        destination, path = location
+
+        hash[destination] = if path
+          {
+            :bin_dir => File.join(path, RbConfig::CONFIG['bindir'].split(File::SEPARATOR).last),
+            :gem_dir => File.join(path, RbConfig::CONFIG['datadir'].split(File::SEPARATOR).last, 'gems'),
+            :ext_dir => File.join(path, @libdir.split(File::SEPARATOR).last, 'gems')
+          }
+        else
+          {
+            :bin_dir => '',
+            :gem_dir => '',
+            :ext_dir => ''
+          }
+        end
+
+        hash
+      end
+    end
+
+    ##
+    # Remove methods we are going to override. This avoids "method redefined;"
+    # warnings otherwise issued by Ruby.
+
+    remove_method :default_dir if method_defined? :default_dir
+    remove_method :default_path if method_defined? :default_path
+    remove_method :default_bindir if method_defined? :default_bindir
+    remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for
+
+    ##
+    # RubyGems default overrides.
+
+    def default_dir
+      if opt_build_root?
+        Gem.default_dirs[:system][:gem_dir]
+      elsif Process.uid == 0
+        Gem.default_dirs[:local][:gem_dir]
+      else
+        Gem.user_dir
+      end
+    end
+
+    def default_path
+      path = default_dirs.collect {|location, paths| paths[:gem_dir]}
+      path.unshift Gem.user_dir if File.exist? Gem.user_home
+    end
+
+    def default_bindir
+      if opt_build_root?
+        Gem.default_dirs[:system][:bin_dir]
+      elsif Process.uid == 0
+        Gem.default_dirs[:local][:bin_dir]
+      else
+        File.join [Dir.home, 'bin']
+      end
+    end
+
+    def default_ext_dir_for base_dir
+      dir = if rpmbuild?
+        build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
+        if build_dir != base_dir
+          File.join build_dir, Gem.default_dirs[:system][:ext_dir]
+        end
+      else
+        dirs = Gem.default_dirs.detect {|location, paths| paths[:gem_dir] == base_dir}
+        dirs && dirs.last[:ext_dir]
+      end
+      dir && File.join(dir, RbConfig::CONFIG['RUBY_INSTALL_NAME'])
+    end
+
+    # This method should be available since RubyGems 2.2 until RubyGems 3.0.
+    # https://github.com/rubygems/rubygems/issues/749
+    if method_defined? :install_extension_in_lib
+      remove_method :install_extension_in_lib
+
+      def install_extension_in_lib
+        false
+      end
+    end
+  end
+end
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/ruby-rubygems.git/commitdiff/705db36e50ecfd374a98e9ee16fe4bd03646f9a7



More information about the pld-cvs-commit mailing list