Class: Smithy::Formula

Inherits:
Object
  • Object
show all
Defined in:
lib/smithy/formula.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(passed_package = nil) ⇒ Formula

Returns a new instance of Formula.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/smithy/formula.rb', line 12

def initialize(passed_package = nil)
  @formula_file = __FILE__
  raise "no install method implemented" unless self.respond_to?(:install)
  raise "homepage must be specified" if homepage.blank?
  raise "url must be specified" if url.blank?
  if passed_package
    set_package(passed_package)
  else
    # guess name and build_name
    @name = self.formula_name
    @build_name = operating_system
    initialize_modules
  end
end

Instance Attribute Details

#build_nameObject

Returns the value of attribute build_name.



3
4
5
# File 'lib/smithy/formula.rb', line 3

def build_name
  @build_name
end

#formula_fileObject

Returns the value of attribute formula_file.



3
4
5
# File 'lib/smithy/formula.rb', line 3

def formula_file
  @formula_file
end

#module_setupObject

Returns the value of attribute module_setup.



3
4
5
# File 'lib/smithy/formula.rb', line 3

def module_setup
  @module_setup
end

#nameObject

Returns the value of attribute name.



3
4
5
# File 'lib/smithy/formula.rb', line 3

def name
  @name
end

#packageObject

Returns the value of attribute package.



3
4
5
# File 'lib/smithy/formula.rb', line 3

def package
  @package
end

#prefixObject

Returns the value of attribute prefix.



3
4
5
# File 'lib/smithy/formula.rb', line 3

def prefix
  @prefix
end

Class Method Details

.disable_group_writable(value = true) ⇒ Object

DLS Version Method, can set a version or guess based on the filename



89
90
91
92
# File 'lib/smithy/formula.rb', line 89

def self.disable_group_writable(value = true)
  @disable_group_writable = true
  @disable_group_writable
end

.formula_nameObject



5
6
7
# File 'lib/smithy/formula.rb', line 5

def self.formula_name
  self.to_s.underscore.split("/").last.gsub /_formula$/, ""
end

.version(value = nil) ⇒ Object

DLS Version Method, can set a version or guess based on the filename



72
73
74
75
76
77
78
79
80
81
# File 'lib/smithy/formula.rb', line 72

def self.version(value = nil)
  unless @version
    if value
      @version = value
    else
      @version = url_filename_version_number(url) if url.present?
    end
  end
  @version
end

Instance Method Details

#check_dependenciesObject



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/smithy/formula.rb', line 175

def check_dependencies
  @depends_on = [depends_on] if depends_on.is_a? String
  missing_packages = []
  notice "Searching for dependencies"
  depends_on.each do |package|
    name, version, build = package.split('/')
    path = Package.all(:name => name, :version => version, :build => build).first
    if path
      notice_using(path)
      p = Package.new(:path => path)
      new_name = p.name.underscore
      class_eval %Q{
        def #{new_name}
          @#{new_name} = Package.new(:path => "#{path}") if @#{new_name}.nil?
          @#{new_name}
        end
      }
    else
      missing_packages << package
      #TODO build package instead?
    end
  end
  unless missing_packages.empty?
    raise "#{self.class} depends on: #{missing_packages.join(" ")}"
  end
end

#create_modulefileObject



105
106
107
108
109
110
111
112
113
114
# File 'lib/smithy/formula.rb', line 105

def create_modulefile
  return false if modulefile.blank?
  notice "Creating Modulefile for #{package.prefix}"
  m = ModuleFile.new :package => package
  FileUtils.mkdir_p(File.dirname(m.module_file))
  FileOperations.render_erb(:erb_string => modulefile, :binding => m.get_binding, :destination => m.module_file)
  FileOperations.make_group_writable(m.module_file)
  FileOperations.set_group(m.module_file, package.group)
  return true
end

#fail_commandObject



142
143
144
145
146
147
148
149
150
# File 'lib/smithy/formula.rb', line 142

def fail_command
  $stdout.flush
  $stderr.flush
  raise <<-EOF.strip_heredoc
    The last command exited with status: #{$?.exitstatus}
      Formula: #{formula_file}
      Build Directory: #{@package.source_directory}
  EOF
end

#formula_nameObject



8
9
10
# File 'lib/smithy/formula.rb', line 8

def formula_name
  self.class.formula_name
end

#group_writable?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/smithy/formula.rb', line 94

def group_writable?
  ! self.class.instance_variables.include?(:@disable_group_writable)
end

#initialize_modulesObject

setup module environment by purging and loading only what’s needed



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/smithy/formula.rb', line 28

def initialize_modules
  @modules = nil # re-evaluate modules block
  @module_commands = nil # re-evaluate module_commands block
  @module_setup = ""
  raise "please specify modules OR modules_command, not both" if modules.present? && module_commands.present?
  if ENV["MODULESHOME"]
    @modulecmd = "modulecmd sh"
    @modulecmd = "#{ENV["MODULESHOME"]}/bin/modulecmd sh" if File.exists?("#{ENV["MODULESHOME"]}/bin/modulecmd")
    if modules.present?
      @module_setup << `#{@module_setup} #{@modulecmd} purge 2>/dev/null` << " "
      raise "modules must return a list of strings" unless modules.is_a? Array
      @module_setup << `#{@module_setup} #{@modulecmd} load #{modules.join(" ")}` << " "
    elsif module_commands.present?
      module_commands.each do |command|
        @module_setup << `#{@module_setup} #{@modulecmd} #{command}` << " "
      end
    end
  end
end

#module_environment_variable(mod, var) ⇒ Object



133
134
135
136
137
138
139
140
# File 'lib/smithy/formula.rb', line 133

def module_environment_variable(mod, var)
  module_display = `#{@modulecmd} display #{mod} 2>&1`
  if module_display =~ /(\S+)\s+#{var}\s+(.*)$/
    return $2
  else
    return ""
  end
end

#module_is_available?(mod) ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
126
127
128
129
130
131
# File 'lib/smithy/formula.rb', line 123

def module_is_available?(mod)
  return false unless @modulecmd

  if `#{@modulecmd} avail #{mod} 2>&1` =~ /#{mod}/
    true
  else
    false
  end
end

#module_listObject



116
117
118
119
120
121
# File 'lib/smithy/formula.rb', line 116

def module_list
  if ENV['MODULESHOME']
    notice "module list"
    Kernel.system @module_setup + "#{@modulecmd} list 2>&1"
  end
end

#patch(content, *args) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
# File 'lib/smithy/formula.rb', line 152

def patch(content, *args)
  patch_file_name = "patch.diff"
  File.open(patch_file_name, "w+") do |f|
    f.write(content)
  end
  args << "-p1" if args.empty?
  patch_command = "patch #{args.join(' ')} <#{patch_file_name}"
  notice patch_command
  Kernel.system patch_command
  fail_command if $?.exitstatus != 0
end

#run_installObject



98
99
100
101
102
103
# File 'lib/smithy/formula.rb', line 98

def run_install
  check_dependencies if depends_on
  install
  notice_success "SUCCESS #{@prefix}"
  return true
end

#set_package(p) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/smithy/formula.rb', line 48

def set_package(p)
  @package    = p
  @name       = p.name
  @version    = p.version
  @build_name = p.build_name
  @prefix     = p.prefix
  initialize_modules
end

#system(*args) ⇒ Object



164
165
166
167
168
169
170
171
172
173
# File 'lib/smithy/formula.rb', line 164

def system(*args)
  notice args.join(' ')
  if args.first == :nomodules
    args.shift
    Kernel.system args.join(' ')
  else
    Kernel.system @module_setup + args.join(' ')
  end
  fail_command if $?.exitstatus != 0
end

#versionObject



83
84
85
86
# File 'lib/smithy/formula.rb', line 83

def version
  @version = self.class.version unless @version
  @version
end