prm 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/prm +37 -37
- data/lib/prm/repo.rb +253 -233
- metadata +4 -4
data/bin/prm
CHANGED
@@ -10,46 +10,46 @@ rescue LoadError
|
|
10
10
|
require 'prm'
|
11
11
|
end
|
12
12
|
|
13
|
-
version_info = "0.1.
|
13
|
+
version_info = "0.1.2"
|
14
14
|
|
15
15
|
class Main < Clamp::Command
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
option ["-t", "--type"], "TYPE", "Type of repo to create", :required => true
|
17
|
+
option ["-p", "--path"], "PATH", "Path to repo location", :required => true
|
18
|
+
option ["-c", "--component"], "COMPONENT", "Component to create", :required => true
|
19
|
+
option ["-r", "--release"], "RELEASE", "OS version to create", :required => true
|
20
|
+
option ["-a", "--arch"], "ARCH", "Architecture of repo contents", :required => true
|
21
|
+
option ["--accesskey"], "ACCESS KEY", "DHO/S3 Access Key", :default => false
|
22
|
+
option ["--secretkey"], "SECRET KEY", "DHO/S3 Secret Key", :default => false
|
23
|
+
option ["-d", "--directory"], "DIRECTORY", "Move packages from directory to target", :default => false
|
24
|
+
option ["-s", "--snapshot"], "COMPONENT", "Creates a snapshot of a component", :default => false
|
25
|
+
option ["-k", "--gpg"], :flag, "Sign release files with users GPG key", :default => false
|
26
|
+
option ["-g", "--generate"], :flag , "Generate new repository"
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
28
|
+
def execute
|
29
|
+
r = PRM::Repo.new
|
30
|
+
r.component = component
|
31
|
+
r.release = release
|
32
|
+
r.arch = arch
|
33
|
+
r.type = type
|
34
|
+
r.path = path
|
35
|
+
if gpg?
|
36
|
+
r.gpg = gpg?
|
37
|
+
end
|
38
|
+
unless accesskey.nil?
|
39
|
+
r.accesskey = accesskey
|
40
|
+
end
|
41
|
+
unless secretkey.nil?
|
42
|
+
r.secretkey = secretkey
|
43
|
+
end
|
44
|
+
unless snapshot.nil?
|
45
|
+
r.snapshot = snapshot
|
46
|
+
end
|
47
|
+
unless directory.nil?
|
48
|
+
r.directory = directory
|
49
|
+
end
|
50
|
+
|
51
|
+
r.create
|
52
|
+
end
|
53
53
|
end
|
54
54
|
|
55
55
|
Main.run
|
data/lib/prm/repo.rb
CHANGED
@@ -2,290 +2,310 @@ require 'rubygems'
|
|
2
2
|
require 'fileutils'
|
3
3
|
require 'zlib'
|
4
4
|
require 'digest/md5'
|
5
|
-
require 'peach'
|
6
5
|
require 'erb'
|
7
6
|
require 'find'
|
7
|
+
require 'thread'
|
8
|
+
require 'peach'
|
8
9
|
require 'aws/s3'
|
9
10
|
|
10
11
|
module Debian
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
28
|
-
}
|
29
|
-
generate_release(path,r,component,arch)
|
30
|
-
|
31
|
-
if gpg == true
|
32
|
-
generate_release_gpg(path,r)
|
33
|
-
end
|
12
|
+
def build_apt_repo(path, component, arch, release, gpg, silent)
|
13
|
+
release.each { |r|
|
14
|
+
component.each { |c|
|
15
|
+
arch.each { |a|
|
16
|
+
fpath = path + "/dists/" + r + "/" + c + "/" + "binary-" + a + "/"
|
17
|
+
pfpath = fpath + "Packages"
|
18
|
+
rfpath = fpath + "Release"
|
19
|
+
|
20
|
+
unless silent == true
|
21
|
+
puts "Building Path: #{fpath}"
|
22
|
+
end
|
23
|
+
|
24
|
+
FileUtils.mkpath(fpath)
|
25
|
+
FileUtils.touch(pfpath)
|
26
|
+
FileUtils.touch(rfpath)
|
27
|
+
generate_packages_gz(fpath,pfpath,path,rfpath,r,c,a, silent)
|
34
28
|
}
|
29
|
+
}
|
30
|
+
generate_release(path,r,component,arch)
|
31
|
+
|
32
|
+
if gpg == true
|
33
|
+
generate_release_gpg(path,r)
|
34
|
+
end
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def move_packages(path,component,arch,release,directory)
|
39
|
+
unless File.exists?(directory)
|
40
|
+
puts "ERROR: #{directory} doesn't exist... not doing anything\n"
|
41
|
+
return false
|
35
42
|
end
|
36
43
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
44
|
+
files_moved = Array.new
|
45
|
+
release.each { |r|
|
46
|
+
component.each { |c|
|
47
|
+
arch.each { |a|
|
48
|
+
puts a
|
49
|
+
Dir.glob(directory + "/*.deb") do |file|
|
50
|
+
if file =~ /^.*#{a}.*\.deb$/i || file =~ /^.*all.*\.deb$/i || file =~ /^.*any.*\.deb$/i
|
51
|
+
if file =~ /^.*#{r}.*\.deb$/i
|
52
|
+
# Lets do this here to help mitigate packages like "asdf-123+wheezy.deb"
|
53
|
+
FileUtils.cp(file, "#{path}/dists/#{r}/#{c}/binary-#{a}/")
|
54
|
+
FileUtils.rm(file)
|
55
|
+
else
|
56
|
+
FileUtils.cp(file, "#{path}/dists/#{r}/#{c}/binary-#{a}/")
|
57
|
+
files_moved << file
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
53
61
|
}
|
54
|
-
|
55
|
-
|
56
|
-
end
|
62
|
+
}
|
63
|
+
}
|
57
64
|
|
58
|
-
|
59
|
-
|
60
|
-
|
65
|
+
files_moved.each do |f|
|
66
|
+
if File.exists?(f)
|
67
|
+
FileUtils.rm(f)
|
61
68
|
end
|
69
|
+
end
|
70
|
+
# Regex?
|
71
|
+
#/^.*#{arch}.*\.deb$/i
|
72
|
+
end
|
62
73
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
Dir.glob("#{fpath}*.deb").peach do |deb|
|
68
|
-
md5sum = ''
|
69
|
-
tdeb = deb.split('/').last
|
70
|
-
md5sum_path = path + "/dists/" + r + "/" + c + "/" + "binary-" + a + "/md5-results/" + tdeb
|
71
|
-
|
72
|
-
FileUtils.mkdir_p "tmp/#{tdeb}/"
|
73
|
-
FileUtils.mkdir_p path + "/dists/" + r + "/" + c + "/" + "binary-" + a + "/md5-results/"
|
74
|
-
`ar p #{deb} control.tar.gz | tar zx -C tmp/#{tdeb}/`
|
75
|
-
|
76
|
-
init_size = `wc -c < #{deb}`
|
77
|
-
|
78
|
-
if File.exists? md5sum_path
|
79
|
-
file = File.open(md5sum_path, 'r')
|
80
|
-
md5sum = file.read
|
81
|
-
file.close
|
82
|
-
else
|
83
|
-
md5sum = Digest::MD5.file(deb)
|
84
|
-
File.open(md5sum_path, 'w') { |file| file.write(md5sum) }
|
85
|
-
end
|
86
|
-
|
87
|
-
package_info = [
|
88
|
-
"Filename: #{npath}#{tdeb}",
|
89
|
-
"MD5sum: #{md5sum}",
|
90
|
-
"Size: #{init_size}"
|
91
|
-
]
|
74
|
+
def generate_packages_gz(fpath,pfpath,path,rfpath,r,c,a,silent)
|
75
|
+
unless silent == true
|
76
|
+
puts "Generating Packages: #{r} : #{c} : binary-#{a}"
|
77
|
+
end
|
92
78
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
79
|
+
npath = "dists/" + r + "/" + c + "/" + "binary-" + a + "/"
|
80
|
+
packages_text = []
|
81
|
+
|
82
|
+
d = File.open(pfpath, "w+")
|
83
|
+
write_mutex = Mutex.new
|
84
|
+
|
85
|
+
Dir.glob("#{fpath}*.deb").peach do |deb|
|
86
|
+
md5sum = ''
|
87
|
+
tdeb = deb.split('/').last
|
88
|
+
md5sum_path = path + "/dists/" + r + "/" + c + "/" + "binary-" + a + "/md5-results/" + tdeb
|
89
|
+
|
90
|
+
FileUtils.mkdir_p "tmp/#{tdeb}/"
|
91
|
+
FileUtils.mkdir_p path + "/dists/" + r + "/" + c + "/" + "binary-" + a + "/md5-results/"
|
92
|
+
`ar p #{deb} control.tar.gz | tar zx -C tmp/#{tdeb}/`
|
93
|
+
|
94
|
+
init_size = `wc -c < #{deb}`
|
95
|
+
|
96
|
+
if File.exists? md5sum_path
|
97
|
+
file = File.open(md5sum_path, 'r')
|
98
|
+
md5sum = file.read
|
99
|
+
file.close
|
100
|
+
else
|
101
|
+
md5sum = Digest::MD5.file(deb)
|
102
|
+
File.open(md5sum_path, 'w') { |file| file.write(md5sum) }
|
103
|
+
end
|
104
|
+
|
105
|
+
package_info = [
|
106
|
+
"Filename: #{npath}#{tdeb}",
|
107
|
+
"MD5sum: #{md5sum}",
|
108
|
+
"Size: #{init_size}"
|
109
|
+
]
|
110
|
+
|
111
|
+
write_mutex.synchronize do
|
112
|
+
# Copy the control file data into the Packages list
|
113
|
+
d.write(File.read("tmp/#{tdeb}/control"))
|
114
|
+
d.write(package_info.join("\n"))
|
115
|
+
d.write("\n") # blank line between package info in the Packages file
|
116
|
+
end
|
117
|
+
end
|
98
118
|
|
99
|
-
|
119
|
+
FileUtils.rmtree 'tmp/'
|
100
120
|
|
101
|
-
|
121
|
+
d.close
|
102
122
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
123
|
+
Zlib::GzipWriter.open(pfpath + ".gz") do |gz|
|
124
|
+
f = File.new(pfpath, "r")
|
125
|
+
f.each do |line|
|
126
|
+
gz.write(line)
|
127
|
+
end
|
109
128
|
end
|
129
|
+
end
|
110
130
|
|
111
|
-
|
112
|
-
|
131
|
+
def generate_release(path,release,component,arch)
|
132
|
+
date = Time.now.utc
|
113
133
|
|
114
|
-
|
115
|
-
|
116
|
-
|
134
|
+
release_info = Hash.new()
|
135
|
+
unreasonable_array = Array.new
|
136
|
+
unreasonable_array = ["Packages", "Packages.gz", "Release"]
|
117
137
|
|
118
|
-
|
138
|
+
component.clear
|
119
139
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
140
|
+
Dir.glob(path + "/dists/" + release + "/*").select { |f|
|
141
|
+
f.slice!(path + "/dists/" + release + "/")
|
142
|
+
unless f == "Release" or f == "Release.gpg"
|
143
|
+
component << f
|
144
|
+
end
|
145
|
+
}
|
126
146
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
147
|
+
component.each do |c|
|
148
|
+
arch.each do |ar|
|
149
|
+
unreasonable_array.each do |unr|
|
150
|
+
tmp_path = "#{path}/dists/#{release}/#{c}/binary-#{ar}"
|
151
|
+
tmp_hash = Hash.new
|
152
|
+
filename = "#{c}/binary-#{ar}/#{unr}".chomp
|
133
153
|
|
134
|
-
|
135
|
-
|
154
|
+
byte_size = File.size("#{tmp_path}/#{unr}").to_s
|
155
|
+
md5sum = Digest::MD5.file("#{tmp_path}/#{unr}").to_s
|
136
156
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
end
|
141
|
-
end
|
157
|
+
tmp_hash['size'] = byte_size
|
158
|
+
tmp_hash['md5sum'] = md5sum
|
159
|
+
release_info[filename] = tmp_hash
|
142
160
|
end
|
161
|
+
end
|
162
|
+
end
|
143
163
|
|
144
|
-
|
145
|
-
template_dir = File.join(File.dirname(__FILE__), "..", "..", "templates")
|
146
|
-
erb = ERB.new(File.open("#{template_dir}/deb_release.erb") { |file|
|
147
|
-
file.read
|
148
|
-
}).result(binding)
|
149
164
|
|
150
|
-
|
151
|
-
|
152
|
-
|
165
|
+
template_dir = File.join(File.dirname(__FILE__), "..", "..", "templates")
|
166
|
+
erb = ERB.new(File.open("#{template_dir}/deb_release.erb") { |file|
|
167
|
+
file.read
|
168
|
+
}).result(binding)
|
153
169
|
|
154
|
-
|
155
|
-
|
170
|
+
release_file = File.new("#{path}/dists/#{release}/Release.tmp","wb")
|
171
|
+
release_file.puts erb
|
172
|
+
release_file.close
|
156
173
|
|
157
|
-
#
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
174
|
+
FileUtils.move("#{path}/dists/#{release}/Release.tmp", "#{path}/dists/#{release}/Release")
|
175
|
+
end
|
176
|
+
|
177
|
+
# We expect that GPG is installed and a key has already been made
|
178
|
+
def generate_release_gpg(path,release)
|
179
|
+
Dir.chdir("#{path}/dists/#{release}") do
|
180
|
+
system "gpg --yes --output Release.gpg -b Release"
|
162
181
|
end
|
182
|
+
end
|
163
183
|
end
|
164
184
|
|
165
185
|
module SNAP
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
186
|
+
def snapshot_to(path,component,release,snapname,type)
|
187
|
+
if type != "deb"
|
188
|
+
puts "Only deb supported"
|
189
|
+
return
|
190
|
+
end
|
171
191
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
192
|
+
release.each do |r|
|
193
|
+
time = Time.new
|
194
|
+
now = time.strftime("%Y-%m-%d-%H-%M")
|
195
|
+
new_snap = "#{snapname}-#{now}"
|
176
196
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
197
|
+
if File.exists?("#{path}/dists/#{r}/#{snapname}")
|
198
|
+
puts "Snapshot target is a filesystem, remove it or rename your snap target"
|
199
|
+
return
|
200
|
+
end
|
181
201
|
|
182
|
-
|
183
|
-
|
184
|
-
|
202
|
+
unless File.exists?("#{path}/dists/#{r}/#{new_snap}/")
|
203
|
+
Dir.mkdir("#{path}/dists/#{r}/#{new_snap}")
|
204
|
+
end
|
185
205
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
end
|
206
|
+
FileUtils.cp_r(Dir["#{path}/dists/#{r}/#{component}/*"], "#{path}/dists/#{r}/#{new_snap}")
|
207
|
+
FileUtils.ln_s "#{new_snap}", "#{path}/dists/#{r}/#{snapname}", :force => true
|
208
|
+
puts "Created #{snapname} snapshot of #{component}\n"
|
190
209
|
end
|
210
|
+
end
|
191
211
|
end
|
192
212
|
|
193
213
|
module DHO
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
214
|
+
def sync_to_dho(path, accesskey, secretkey,pcomponent,prelease)
|
215
|
+
component = pcomponent.join
|
216
|
+
release = prelease.join
|
217
|
+
AWS::S3::Base.establish_connection!(
|
218
|
+
:server => 'objects.dreamhost.com',
|
219
|
+
:use_ssl => true,
|
220
|
+
:access_key_id => accesskey,
|
221
|
+
:secret_access_key => secretkey
|
222
|
+
)
|
223
|
+
|
224
|
+
AWS::S3::Service.buckets.each do |bucket|
|
225
|
+
unless bucket == path
|
226
|
+
AWS::S3::Bucket.create(path)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
new_content = Array.new
|
231
|
+
Find.find(path + "/") do |object|
|
232
|
+
object.slice!(path + "/")
|
233
|
+
if (object =~ /deb$/) || (object =~ /Release$/) || (object =~ /Packages.gz$/) || (object =~ /Packages$/) || (object =~ /gpg$/)
|
234
|
+
f = path + "/" + object
|
235
|
+
new_content << object
|
236
|
+
AWS::S3::S3Object.store(
|
237
|
+
object,
|
238
|
+
open(f),
|
239
|
+
path
|
202
240
|
)
|
203
|
-
|
204
|
-
AWS::S3::Service.buckets.each do |bucket|
|
205
|
-
unless bucket == path
|
206
|
-
AWS::S3::Bucket.create(path)
|
207
|
-
end
|
208
|
-
end
|
209
241
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
new_content << object
|
216
|
-
AWS::S3::S3Object.store(
|
217
|
-
object,
|
218
|
-
open(f),
|
219
|
-
path
|
220
|
-
)
|
221
|
-
|
222
|
-
policy = AWS::S3::S3Object.acl(object, path)
|
223
|
-
policy.grants = [ AWS::S3::ACL::Grant.grant(:public_read) ]
|
224
|
-
AWS::S3::S3Object.acl(object,path,policy)
|
225
|
-
end
|
226
|
-
end
|
242
|
+
policy = AWS::S3::S3Object.acl(object, path)
|
243
|
+
policy.grants = [ AWS::S3::ACL::Grant.grant(:public_read) ]
|
244
|
+
AWS::S3::S3Object.acl(object,path,policy)
|
245
|
+
end
|
246
|
+
end
|
227
247
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
end
|
235
|
-
end
|
248
|
+
bucket_info = AWS::S3::Bucket.find(path)
|
249
|
+
bucket_info.each do |obj|
|
250
|
+
o = obj.key
|
251
|
+
if (o =~ /deb$/) || (o =~ /Release$/) || (o =~ /Packages.gz$/) || (o =~ /Packages$/) || (o =~ /gpg$/)
|
252
|
+
unless new_content.include?(o)
|
253
|
+
AWS::S3::S3Object.delete(o,path)
|
236
254
|
end
|
237
|
-
|
238
|
-
puts "Add the following to your apt sources.list"
|
239
|
-
puts "deb http://objects.dreamhost.com/#{path}/ #{release} #{component}"
|
255
|
+
end
|
240
256
|
end
|
257
|
+
puts "Your apt repository is located at http://objects.dreamhost.com/#{path}/"
|
258
|
+
puts "Add the following to your apt sources.list"
|
259
|
+
puts "deb http://objects.dreamhost.com/#{path}/ #{release} #{component}"
|
260
|
+
end
|
241
261
|
end
|
242
262
|
|
243
263
|
module PRM
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
end
|
273
|
-
end
|
274
|
-
silent = false
|
275
|
-
build_apt_repo(path,pcomponent,parch,prelease,gpg,silent)
|
276
|
-
end
|
277
|
-
elsif "#{@type}" == "sync"
|
278
|
-
sync_to_dho(path, accesskey, secretkey,pcomponent,prelease)
|
279
|
-
elsif "#{@type}" == "rpm"
|
280
|
-
# add rpm stuff here
|
264
|
+
class PRM::Repo
|
265
|
+
include Debian
|
266
|
+
include DHO
|
267
|
+
include SNAP
|
268
|
+
|
269
|
+
attr_accessor :path
|
270
|
+
attr_accessor :type
|
271
|
+
attr_accessor :component
|
272
|
+
attr_accessor :arch
|
273
|
+
attr_accessor :release
|
274
|
+
attr_accessor :gpg
|
275
|
+
attr_accessor :secretkey
|
276
|
+
attr_accessor :accesskey
|
277
|
+
attr_accessor :snapshot
|
278
|
+
attr_accessor :directory
|
279
|
+
|
280
|
+
def create
|
281
|
+
parch,pcomponent,prelease = _parse_vars(arch,component,release)
|
282
|
+
|
283
|
+
if "#{@type}" == "deb"
|
284
|
+
if snapshot
|
285
|
+
snapshot_to(path,pcomponent,prelease,snapshot,type)
|
286
|
+
else
|
287
|
+
if directory
|
288
|
+
silent = true
|
289
|
+
build_apt_repo(path,pcomponent,parch,prelease,gpg,silent)
|
290
|
+
if move_packages(path,pcomponent,parch,prelease,directory) == false
|
291
|
+
return
|
281
292
|
end
|
293
|
+
end
|
294
|
+
silent = false
|
295
|
+
build_apt_repo(path,pcomponent,parch,prelease,gpg,silent)
|
282
296
|
end
|
297
|
+
elsif "#{@type}" == "sync"
|
298
|
+
sync_to_dho(path, accesskey, secretkey,pcomponent,prelease)
|
299
|
+
elsif "#{@type}" == "rpm"
|
300
|
+
# add rpm stuff here
|
301
|
+
end
|
302
|
+
end
|
283
303
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
end
|
304
|
+
def _parse_vars(arch_ar,component_ar,release_ar)
|
305
|
+
arch_ar = arch.split(",")
|
306
|
+
component_ar = component.split(",")
|
307
|
+
release_ar = release.split(",")
|
308
|
+
return [arch_ar,component_ar,release_ar]
|
290
309
|
end
|
310
|
+
end
|
291
311
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Brett Gailey
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-
|
18
|
+
date: 2013-05-11 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|