From acc9a7ca8554bc2413dee2d6d0f407b3a59c628c Mon Sep 17 00:00:00 2001 From: Andrew Janke Date: Sun, 10 Apr 2016 22:53:56 -0400 Subject: brew test, install, update-test: add --keep-tmp option Also enables sandbox for --interactive and --debug use of install and test, using automatic retention. Closes #66. Signed-off-by: Andrew Janke --- Library/Homebrew/extend/ARGV.rb | 4 ++ Library/Homebrew/extend/fileutils.rb | 93 ++++++++++++++++++++++++++---------- 2 files changed, 71 insertions(+), 26 deletions(-) (limited to 'Library/Homebrew/extend') diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb index 65be4bcf1..eec2172a2 100644 --- a/Library/Homebrew/extend/ARGV.rb +++ b/Library/Homebrew/extend/ARGV.rb @@ -120,6 +120,10 @@ module HomebrewArgvExtension include?("--dry-run") || switch?("n") end + def keep_tmp? + include? "--keep-tmp" + end + def git? flag? "--git" end diff --git a/Library/Homebrew/extend/fileutils.rb b/Library/Homebrew/extend/fileutils.rb index ee6735e27..af17d4eff 100644 --- a/Library/Homebrew/extend/fileutils.rb +++ b/Library/Homebrew/extend/fileutils.rb @@ -6,42 +6,83 @@ require "etc" # @see http://ruby-doc.org/stdlib-1.8.7/libdoc/fileutils/rdoc/FileUtils.html Ruby's FileUtils API module FileUtils # Create a temporary directory then yield. When the block returns, - # recursively delete the temporary directory. - def mktemp(prefix = name) - prev = pwd - tmp = Dir.mktmpdir(prefix, HOMEBREW_TEMP) - - # Make sure files inside the temporary directory have the same group as the - # brew instance. - # - # Reference from `man 2 open` - # > When a new file is created, it is given the group of the directory which - # contains it. - group_id = if HOMEBREW_BREW_FILE.grpowned? - HOMEBREW_BREW_FILE.stat.gid - else - Process.gid + # recursively delete the temporary directory. Passing opts[:retain] + # or calling `do |staging| ... staging.retain!` in the block will skip + # the deletion and retain the temporary directory's contents. + def mktemp(prefix = name, opts = {}) + Mktemp.new(prefix, opts).run do |staging| + yield staging end - begin - # group_id.to_s makes OS X 10.6.7 (ruby-1.8.7-p174) and earlier happy. - chown(nil, group_id.to_s, tmp) - rescue Errno::EPERM - opoo "Failed setting group \"#{Etc.getgrgid(group_id).name}\" on #{tmp}" + end + + module_function :mktemp + + # Performs mktemp's functionality, and tracks the results. + # Each instance is only intended to be used once. + class Mktemp + include FileUtils + + # Path to the tmpdir used in this run, as a Pathname. + attr_reader :tmpdir + + def initialize(prefix = name, opts = {}) + @prefix = prefix + @retain = opts[:retain] + @quiet = false + end + + # Instructs this Mktemp to retain the staged files + def retain! + @retain = true + end + + # True if the staged temporary files should be retained + def retain? + @retain end - begin - cd(tmp) + # Instructs this Mktemp to not emit messages when retention is triggered + def quiet! + @quiet = true + end + + def to_s + "[Mktemp: #{tmpdir} retain=#{@retain} quiet=#{@quiet}]" + end + def run + @tmpdir = Pathname.new(Dir.mktmpdir("#{@prefix}-", HOMEBREW_TEMP)) + + # Make sure files inside the temporary directory have the same group as the + # brew instance. + # + # Reference from `man 2 open` + # > When a new file is created, it is given the group of the directory which + # contains it. + group_id = if HOMEBREW_BREW_FILE.grpowned? + HOMEBREW_BREW_FILE.stat.gid + else + Process.gid + end begin - yield + # group_id.to_s makes OS X 10.6.7 (ruby-1.8.7-p174) and earlier happy. + chown(nil, group_id.to_s, tmpdir) + rescue Errno::EPERM + opoo "Failed setting group \"#{Etc.getgrgid(group_id).name}\" on #{tmp}" + end + + begin + Dir.chdir(tmpdir) { yield self } ensure - cd(prev) + ignore_interrupts { rm_rf(tmpdir) } unless retain? end ensure - ignore_interrupts { rm_rf(tmp) } + if retain? && !@tmpdir.nil? && !@quiet + ohai "Kept temporary files" + puts "Temporary files retained at #{@tmpdir}" + end end end - module_function :mktemp # @private alias_method :old_mkdir, :mkdir -- cgit v1.2.3