You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by do...@apache.org on 2014/08/28 23:17:49 UTC

[2/4] git commit: BUILDR-702: Retain unix permissions when merging zip files

BUILDR-702: Retain unix permissions when merging zip files


Project: http://git-wip-us.apache.org/repos/asf/buildr/repo
Commit: http://git-wip-us.apache.org/repos/asf/buildr/commit/5b7933a5
Tree: http://git-wip-us.apache.org/repos/asf/buildr/tree/5b7933a5
Diff: http://git-wip-us.apache.org/repos/asf/buildr/diff/5b7933a5

Branch: refs/heads/master
Commit: 5b7933a57bbc53ba80c90538c8681fabe7b82568
Parents: 8f54965
Author: Pepijn Van Eeckhoudt <pe...@vaneeckhoudt.net>
Authored: Thu Aug 28 17:12:59 2014 +0200
Committer: Pepijn Van Eeckhoudt <pe...@vaneeckhoudt.net>
Committed: Thu Aug 28 17:12:59 2014 +0200

----------------------------------------------------------------------
 CHANGELOG                       |  2 ++
 lib/buildr/packaging/archive.rb | 16 +++++++++++++++-
 lib/buildr/packaging/tar.rb     |  2 +-
 lib/buildr/packaging/ziptask.rb |  3 ++-
 spec/packaging/archive_spec.rb  | 34 ++++++++++++++++++++++++++++++++++
 5 files changed, 54 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/buildr/blob/5b7933a5/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index d648bd3..b959b9c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,6 @@
 1.4.21 (Pending)
+* Fixed : BUILDR-702 - Retain Unix permission flags when merging
+          zip files into another zip or tar archive. Submitted by Pepijn Van Eeckhoudt.
 
 1.4.20 (2014-08-23)
 * Fixed : BUILDR-688 - Disregard package-info.java files when determining if

http://git-wip-us.apache.org/repos/asf/buildr/blob/5b7933a5/lib/buildr/packaging/archive.rb
----------------------------------------------------------------------
diff --git a/lib/buildr/packaging/archive.rb b/lib/buildr/packaging/archive.rb
index 0462fee..cc053b7 100644
--- a/lib/buildr/packaging/archive.rb
+++ b/lib/buildr/packaging/archive.rb
@@ -298,7 +298,7 @@ module Buildr #:nodoc:
                !@excludes.any? { |pattern| File.fnmatch(pattern, entry.name) }
               dest = path =~ /^\/?$/ ? entry.name : Util.relative_path(path + "/" + entry.name)
               trace "Adding #{dest}"
-              file_map[dest] = lambda { |output| output.write source.read(entry) }
+              file_map[dest] = ZipEntryData.new(source, entry)
             end
           end
         end
@@ -306,6 +306,20 @@ module Buildr #:nodoc:
 
     end
 
+    class ZipEntryData
+      def initialize(zipfile, entry)
+        @zipfile = zipfile
+        @entry = entry
+      end
+
+      def call(output)
+        output.write @zipfile.read(@entry)
+      end
+
+      def mode
+        @entry.unix_perms
+      end
+    end
 
     def initialize(*args) #:nodoc:
       super

http://git-wip-us.apache.org/repos/asf/buildr/blob/5b7933a5/lib/buildr/packaging/tar.rb
----------------------------------------------------------------------
diff --git a/lib/buildr/packaging/tar.rb b/lib/buildr/packaging/tar.rb
index e681821..fe1da78 100644
--- a/lib/buildr/packaging/tar.rb
+++ b/lib/buildr/packaging/tar.rb
@@ -92,7 +92,7 @@ module Buildr #:nodoc:
 
         file_map.each do |path, content|
           if content.respond_to?(:call)
-            tar.add_file(path, options) { |os, opts| content.call os }
+            tar.add_file(path, content.respond_to?(:mode) ? options.merge(:mode => content.mode) : options) { |os, _| content.call os }
           elsif content.nil?
           elsif File.directory?(content.to_s)
             stat = File.stat(content.to_s)

http://git-wip-us.apache.org/repos/asf/buildr/blob/5b7933a5/lib/buildr/packaging/ziptask.rb
----------------------------------------------------------------------
diff --git a/lib/buildr/packaging/ziptask.rb b/lib/buildr/packaging/ziptask.rb
index f4e7a0d..f57b4da 100644
--- a/lib/buildr/packaging/ziptask.rb
+++ b/lib/buildr/packaging/ziptask.rb
@@ -67,7 +67,8 @@ module Buildr #:nodoc:
           warn "Warning:  Path in zipfile #{name} contains backslash: #{path}" if path =~ /\\/
           mkpath.call File.dirname(path)
           if content.respond_to?(:call)
-            zip.put_next_entry(path, compression_level)
+            entry = zip.put_next_entry(path, compression_level)
+            entry.unix_perms = content.mode & 07777 if content.respond_to?(:mode)
             content.call zip
           elsif content.nil? || File.directory?(content.to_s)
             mkpath.call path

http://git-wip-us.apache.org/repos/asf/buildr/blob/5b7933a5/spec/packaging/archive_spec.rb
----------------------------------------------------------------------
diff --git a/spec/packaging/archive_spec.rb b/spec/packaging/archive_spec.rb
index 42d7e47..b911baf 100644
--- a/spec/packaging/archive_spec.rb
+++ b/spec/packaging/archive_spec.rb
@@ -445,6 +445,23 @@ describe TarTask do
       unzip('target' => 'foo.tgz').extract
       (File.stat('target/hello').mode & 0777).should == 0777
     end
+
+    it 'should preserve file permissions when merging zip files' do
+      # with JRuby it's important to use absolute paths with File.chmod()
+      # http://jira.codehaus.org/browse/JRUBY-3300
+      hello = File.expand_path('src/main/bin/hello')
+      write hello, 'echo hi'
+      File.chmod(0777,  hello)
+      fail("Failed to set permission on #{hello}") unless (File.stat(hello).mode & 0777) == 0777
+
+      foo = zip('foo.zip')
+      foo.include('src/main/bin/*').invoke
+      bar = tar('bar.tgz')
+      bar.merge(foo)
+      bar.invoke
+      unzip('target' => 'bar.tgz').extract
+      (File.stat('target/hello').mode & 0777).should == 0777
+    end
   end
 
 end
@@ -567,6 +584,23 @@ describe "ZipTask" do
       unzip('target' => 'foo.zip').extract
       (File.stat('target/hello').mode & 0777).should == 0777
     end
+
+    it 'should preserve file permissions when merging zip files' do
+      # with JRuby it's important to use absolute paths with File.chmod()
+      # http://jira.codehaus.org/browse/JRUBY-3300
+      hello = File.expand_path('src/main/bin/hello')
+      write hello, 'echo hi'
+      File.chmod(0777,  hello)
+      fail("Failed to set permission on #{hello}") unless (File.stat(hello).mode & 0777) == 0777
+
+      foo = zip('foo.zip')
+      foo.include('src/main/bin/*').invoke
+      bar = zip('bar.zip')
+      bar.merge(foo)
+      bar.invoke
+      unzip('target' => 'bar.zip').extract
+      (File.stat('target/hello').mode & 0777).should == 0777
+    end
   end
 
 end