[DRE-commits] [gem2deb] 01/01: Gem2Deb::Metadata: workaround git usage in gemspecs

Antonio Terceiro terceiro at moszumanska.debian.org
Tue Mar 8 07:44:46 UTC 2016


This is an automated email from the git hooks/post-receive script.

terceiro pushed a commit to branch master
in repository gem2deb.

commit c0ecb012f4788ba451117753c61f7a75ff0a288c
Author: Antonio Terceiro <terceiro at debian.org>
Date:   Tue Mar 8 10:45:00 2016 +0700

    Gem2Deb::Metadata: workaround git usage in gemspecs
---
 debian/changelog           | 10 ++++++++++
 debian/control             |  1 +
 lib/gem2deb/metadata.rb    | 25 +++++++++++++++++++++++++
 test/unit/metadata_test.rb | 44 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 80 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index ede1581..1ff8994 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+gem2deb (0.30) UNRELEASED; urgency=medium
+
+  * Gem2Deb::Metadata: workaround git usage in gemspecs. The fact that Debian
+    source packages are *not* git repositories makes it necessary to patch
+    upstream gemspec to drop usage of `git ls-files` in several packages. This
+    change makes gem2deb try to override that with sane defaults for a Debian
+    package.
+
+ -- Antonio Terceiro <terceiro at debian.org>  Tue, 08 Mar 2016 10:24:48 +0700
+
 gem2deb (0.29) unstable; urgency=medium
 
   * gem2tgz:
diff --git a/debian/control b/debian/control
index 1bcc9d1..ae1c9c7 100644
--- a/debian/control
+++ b/debian/control
@@ -12,6 +12,7 @@ Build-Depends: dctrl-tools <!nocheck>,
                debhelper (>= 9.20141010),
                devscripts <!nocheck>,
                dpkg-dev (>= 1.17.14),
+               git,
                lintian <!nocheck>,
                python3-debian <!nocheck>,
                rake <!nocheck>,
diff --git a/lib/gem2deb/metadata.rb b/lib/gem2deb/metadata.rb
index 0b45681..451c1fd 100644
--- a/lib/gem2deb/metadata.rb
+++ b/lib/gem2deb/metadata.rb
@@ -15,6 +15,7 @@
 
 require 'rubygems'
 require 'rubygems/specification'
+require 'tempfile'
 require 'time'
 require 'yaml'
 
@@ -108,6 +109,9 @@ module Gem2Deb
         gemspec_files = Dir.glob('*.gemspec')
         if gemspec_files.size == 1
           @gemspec = Gem::Specification.load(gemspec_files.first)
+          if @gemspec.nil?
+            @gemspec = load_modified_gemspec(gemspec_files.first)
+          end
         else
           unless gemspec_files.empty?
             raise "More than one .gemspec file in this directory: #{gemspec_files.join(', ')}"
@@ -116,6 +120,27 @@ module Gem2Deb
       end
     end
 
+    GIT_USAGE_MODIFIERS = {
+      /\.files\s*=\s*`[^`]*git\s+ls-files[^`]*`.*/ => '.files = (Dir["**/*"] - Dir["debian/**/*"]).select { |f| !File.directory?(f) }',
+      /\.test_files\s*=\s*`[^`]*git\s+ls-files[^`]*`.*/ => '.test_files = []',
+      /(\w+)\.executables\s*=\s*`[^`]*git\s+ls-files[^`]*`.*/ => '\1.executables = Dir[\1.bindir + "/*"]',
+    }
+
+    def load_modified_gemspec(original_gemspec_path)
+      gemspec_text = File.read(original_gemspec_path)
+
+      modified_gemspec = Tempfile.new('gemspec')
+      GIT_USAGE_MODIFIERS.each do |find,replacement|
+        gemspec_text.gsub!(find, replacement)
+      end
+
+      File.open(modified_gemspec.path, 'w') do |f|
+        f.puts(gemspec_text)
+      end
+
+      Gem::Specification.load(modified_gemspec.path)
+    end
+
     def set_gemspec_date
       if @gemspec && File.exist?('debian/changelog')
         @gemspec.date = Time.parse(`dpkg-parsechangelog -SDate`.strip)
diff --git a/test/unit/metadata_test.rb b/test/unit/metadata_test.rb
index 7f51489..b75a7da 100644
--- a/test/unit/metadata_test.rb
+++ b/test/unit/metadata_test.rb
@@ -168,5 +168,49 @@ class MetaDataTest < Gem2DebTestCase
     end
   end
 
+  context 'when upstream abuses git in gemspecs' do
+
+    should 'workaround git usage' do
+      # create
+      dir = File.join(tmpdir, 'gitabuser')
+      FileUtils.mkdir_p(dir)
+      Dir.chdir dir do
+        run_command 'git init'
+        File.open('gitabuser.gemspec', 'w') do |f|
+          f.puts($GIT_ABUSER_GEMSPEC)
+        end
+        FileUtils.mkdir 'lib'
+        File.open('lib/gitabuser.rb', 'w') do |f|
+          f.puts 'module GitAbuser; end'
+        end
+        run_command 'git add .'
+        run_command 'git commit -m "there you go"'
+      end
+
+      @metadata = self.class.silently { Gem2Deb::Metadata.new(dir) }
+      assert_not_nil @metadata.gemspec
+      assert_equal ['gitabuser.gemspec', 'lib/gitabuser.rb'], @metadata.gemspec.files
+    end
+
+  end
+
 end
 
+$GIT_ABUSER_GEMSPEC = <<EOF
+Gem::Specification.new do |s|
+  s.name        = "gitabuser"
+  s.version     = "1"
+  s.platform    = Gem::Platform::RUBY
+  s.authors     = ["Antonio Terceiro"]
+  s.email       = ["terceiro at debian.org"]
+  s.homepage    = ""
+  s.summary     = %q{Sample gem that }
+  s.description = %q{This gem is used to test the case where dh-make-ruby is called on a directory}
+
+  s.rubyforge_project = "simplegit"
+  s.files             = `/unexisting/git ls-files`.split
+  s.executables       = `/unexisting/git ls-files`.split.select { |f| File.executable?(f) }
+  s.test_files        = `/unexisting/git ls-files`.split.select { |f| f                     = ~ /^(test|spec|features)/ }
+  s.require_paths     = ["lib"]
+end
+EOF

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/gem2deb.git



More information about the Pkg-ruby-extras-commits mailing list