Class: RPGem

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

Constant Summary collapse

HOME_DIR =
`echo ~`.strip
CWD =
`pwd`.strip
TMP =
"/tmp/rpgem"
RPMBUILD_DIR =
"#{HOME_DIR}/rpmbuild"
SOURCES_DIR =
"#{RPMBUILD_DIR}/SOURCES"
SPECS_DIR =
"#{RPMBUILD_DIR}/SPECS"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ RPGem

Returns a new instance of RPGem.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/rpgem.rb', line 40

def initialize(name, options={})
  @name = name
  @options = options.rmerge!({
    :version => nil,
    :recursive => false,
    :version_reqs => [],
    :ruby_cmd => "ruby",
    :prefix => '/usr',
    :dependencies => [],
    :build_dependencies => [],
    :ree => false,
    :rake_tasks => [],
  })

  @options.each do |k,v|
    instance_variable_set("@#{k}", v)
  end
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



65
66
67
# File 'lib/rpgem.rb', line 65

def name
  @name
end

#versionObject (readonly)

Returns the value of attribute version.



65
66
67
# File 'lib/rpgem.rb', line 65

def version
  @version
end

Instance Method Details

#build!Object



148
149
150
151
152
153
154
155
156
# File 'lib/rpgem.rb', line 148

def build!
  make_spec!
  puts
  puts "-*- Building RPM rpgem-#{self.to_s} -*-"
  FileUtils.cd RPMBUILD_DIR do
    system("rpmbuild -ba -v #{spec_loc}")
  end
  puts "-*- Done Building RPM rpgem-#{self.to_s} -*-"
end

#fetch!Object



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/rpgem.rb', line 112

def fetch!
  v = self.fetched_version(@name, @version_reqs)
  if (@version.nil? && v) || (!@version.nil? && self.fetched?)
    @version = v
    puts "Skipping fetch of #{self.to_s}"
  else
    puts "Fetching the gem #{self.to_s}"
    if @version.nil?
      system("rm -rf #{TMP}")
      system("mkdir #{TMP}")
      FileUtils.cd TMP do
        system("gem fetch #{@name} #{sh_version_reqs}")
        gem_title = `ls`
        @version = gem_title.match(/-(\d+(\.\d+)+)\.gem$/)[1]
      end
      system("mv #{TMP}/* #{SOURCES_DIR}/")
    else
      FileUtils.cd SOURCES_DIR do
        system("gem fetch #{@name} --version #{@version}")
      end
    end
  end
end

#fetched?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/rpgem.rb', line 108

def fetched?
  return File.exists?(self.gem_loc)
end

#fetched_version(name_or_dep, requirements = []) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/rpgem.rb', line 91

def fetched_version(name_or_dep, requirements=[])
  if name_or_dep.is_a? Gem::Dependency
    d = name_or_dep
  else
    d = Gem::Dependency.new(name_or_dep, requirements)
  end

  currents = `ls #{SOURCES_DIR} | grep '^#{d.name}'`.split($/)
  return nil if currents.empty?

  currents.each do |c|
    ver = c.match(/-(\d+(\.\d+)+)(\.gem)?$/)[1]
    return ver if d.match?(d.name, ver)
  end
  return nil
end

#formatObject



83
84
85
# File 'lib/rpgem.rb', line 83

def format
  @format ||= Gem::Format.from_file_by_path(gem_loc)
end

#gem_locObject



75
76
77
# File 'lib/rpgem.rb', line 75

def gem_loc
  "#{SOURCES_DIR}/#{self.to_s}.gem"
end

#make_spec!Object



136
137
138
139
140
141
142
143
144
145
146
# File 'lib/rpgem.rb', line 136

def make_spec!
  puts "Rendering specfile for #{self.to_s}"
  template = File.read("#{LIB_DIR}/template.spec.erb")
  specfile = ERB.new(template).result(binding)
  puts "rendered:"
  puts "==============="
  puts specfile
  puts "==============="
  File.write(spec_loc, specfile)
  puts "rendered to #{spec_loc}"
end

#recurse!(action = :setup!) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/rpgem.rb', line 158

def recurse!(action=:setup!)
  #TODO: add an option for dev dependencies
  #TODO: don't choke on circular dependencies
  deps = self.spec.runtime_dependencies
  deps.each do |d|
    puts
    puts "#{self.to_s} depends on #{d.name}"
    g = self.class.new(d.name,
      :version_reqs => d.requirements_list,
      :recursive => true,
      :prefix => @prefix,
      :ree => @ree
    )
    g.fetch!
    g.recurse!(action)
    g.send(action) unless action == :fetch!
  end
end

#sh_version_reqsObject



59
60
61
62
63
# File 'lib/rpgem.rb', line 59

def sh_version_reqs
  @version_reqs.map do |r|
    "--version '#{r}'"
  end.join ' '
end

#specObject



87
88
89
# File 'lib/rpgem.rb', line 87

def spec
  @spec ||= format.spec
end

#spec_locObject



79
80
81
# File 'lib/rpgem.rb', line 79

def spec_loc
  "#{SPECS_DIR}/rpgem-#{self.to_s}.spec"
end

#to_sObject



67
68
69
70
71
72
73
# File 'lib/rpgem.rb', line 67

def to_s
  if @version.nil?
    @name
  else
    "#{@name}-#{@version}"
  end
end