Class: Mktemp Private

Inherits:
Object show all
Includes:
FileUtils
Defined in:
mktemp.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Performs Formula#mktemp's functionality and tracks the results. Each instance is only intended to be used once.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(prefix, opts = {}) ⇒ Mktemp

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns a new instance of Mktemp.



12
13
14
15
16
17
# File 'mktemp.rb', line 12

def initialize(prefix, opts = {})
  @prefix = prefix
  @retain_in_cache = opts[:retain_in_cache]
  @retain = opts[:retain] || @retain_in_cache
  @quiet = false
end

Instance Attribute Details

#tmpdirObject (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Path to the tmpdir used in this run, as a Pathname.



10
11
12
# File 'mktemp.rb', line 10

def tmpdir
  @tmpdir
end

Instance Method Details

#quiet!void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Instructs this Mktemp to not emit messages when retention is triggered.



37
38
39
# File 'mktemp.rb', line 37

def quiet!
  @quiet = true
end

#retain!void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Instructs this Mktemp to retain the staged files.



21
22
23
# File 'mktemp.rb', line 21

def retain!
  @retain = true
end

#retain?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

True if the staged temporary files should be retained.

Returns:

  • (Boolean)


26
27
28
# File 'mktemp.rb', line 26

def retain?
  @retain
end

#retain_in_cache?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

True if the source files should be retained.

Returns:

  • (Boolean)


31
32
33
# File 'mktemp.rb', line 31

def retain_in_cache?
  @retain_in_cache
end

#runObject

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'mktemp.rb', line 46

def run
  prefix_name = @prefix.tr "@", "AT"
  @tmpdir = if retain_in_cache?
    tmp_dir = HOMEBREW_CACHE/"Sources/#{prefix_name}"
    chmod_rm_rf(tmp_dir) # clear out previous staging directory
    tmp_dir.mkpath
    tmp_dir
  else
    Pathname.new(Dir.mktmpdir("#{prefix_name}-", HOMEBREW_TEMP))
  end

  # 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
    chown(nil, group_id, @tmpdir)
  rescue Errno::EPERM
    opoo "Failed setting group \"#{T.must(Etc.getgrgid(group_id)).name}\" on #{@tmpdir}"
  end

  begin
    Dir.chdir(tmpdir) { yield self }
  ensure
    ignore_interrupts { chmod_rm_rf(@tmpdir) } unless retain?
  end
ensure
  if retain? && @tmpdir.present? && !@quiet
    message = retain_in_cache? ? "Source files for debugging available at:" : "Temporary files retained at:"
    ohai message, @tmpdir.to_s
  end
end