dr 0.0.6 → 0.1.0
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/README.md +1 -1
- data/bin/dr +119 -19
- data/lib/dr/debpackage.rb +10 -10
- data/lib/dr/gitpackage.rb +104 -27
- data/lib/dr/logger.rb +26 -3
- data/lib/dr/package.rb +7 -0
- data/lib/dr/pkgversion.rb +8 -0
- data/lib/dr/repo.rb +51 -24
- data/lib/dr/shellcmd.rb +3 -3
- data/lib/dr/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
data/bin/dr
CHANGED
@@ -50,45 +50,103 @@ class Archive < ExtendedThor
|
|
50
50
|
end
|
51
51
|
|
52
52
|
class List < ExtendedThor
|
53
|
-
desc "packages", "
|
53
|
+
desc "packages", "Show a list of source packages in the repo"
|
54
54
|
def packages()
|
55
55
|
repo = get_repo_handle
|
56
56
|
log :info, "Listing all source packages in the repository"
|
57
57
|
|
58
58
|
repo.list_packages.each do |pkg|
|
59
|
-
log :info, " #{pkg.name}"
|
59
|
+
log :info, " #{pkg.name.fg "orange"}"
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
desc "versions PACKAGE", "
|
63
|
+
desc "versions PACKAGE", "Show the history of all available versions for a package"
|
64
64
|
def versions(pkg_name)
|
65
65
|
repo = get_repo_handle
|
66
|
-
log :info, "Listing all built versions of
|
66
|
+
log :info, "Listing all built versions of #{pkg_name.style "pkg-name"}"
|
67
67
|
|
68
68
|
suites = repo.get_suites
|
69
69
|
|
70
70
|
pkg = repo.get_package pkg_name
|
71
71
|
pkg.history.each do |version|
|
72
|
-
line = "#{version}"
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
72
|
+
line = "#{version.style "version"}"
|
73
|
+
|
74
|
+
if pkg.build_exists? version
|
75
|
+
debs = repo.get_build pkg.name, version
|
76
|
+
|
77
|
+
metadata = repo.get_build_metadata pkg.name, version
|
78
|
+
if metadata.has_key? "branch"
|
79
|
+
open = "{".fg "dark-grey"
|
80
|
+
close = "}".fg "dark-grey"
|
81
|
+
line << " " + open + metadata["branch"].fg("blue") + close
|
82
|
+
end
|
83
|
+
|
84
|
+
subpkgs = debs.map { |p| subpkg = File.basename(p).split("_")[0] }
|
85
|
+
end
|
86
|
+
|
87
|
+
open = "[".fg "dark-grey"
|
88
|
+
close = "]".fg "dark-grey"
|
89
|
+
|
90
|
+
if subpkgs.length == 0
|
91
|
+
line << " " + open + "broken".fg("red") + close
|
92
|
+
else
|
93
|
+
suites.each do |suite, codename|
|
94
|
+
codename = suite if codename == nil
|
95
|
+
|
96
|
+
colour = case suite
|
97
|
+
when "stable" then "red"
|
98
|
+
when "testing" then "yellow"
|
99
|
+
when "unstable" then "green"
|
100
|
+
else nil end
|
101
|
+
|
102
|
+
all_included = true
|
103
|
+
subpkgs.each do |subpkg|
|
104
|
+
unless repo.query_for_deb_version(suite, subpkg) == version
|
105
|
+
all_included = false
|
106
|
+
end
|
83
107
|
end
|
84
|
-
end
|
85
108
|
|
86
|
-
|
109
|
+
if all_included
|
110
|
+
if colour
|
111
|
+
line << " " + open + codename.fg(colour) + close
|
112
|
+
else
|
113
|
+
line << " " + open + codename + close
|
114
|
+
end
|
115
|
+
end
|
87
116
|
end
|
88
117
|
end
|
89
118
|
log :info, " #{line}"
|
90
119
|
end
|
91
120
|
end
|
121
|
+
|
122
|
+
desc "suite SUITE", "Show the names and versions of packages in the suite"
|
123
|
+
def suite(suite)
|
124
|
+
repo = get_repo_handle
|
125
|
+
|
126
|
+
suites = repo.get_suites
|
127
|
+
exists = suites.inject(false) { |r, s| r || s.include?(suite) }
|
128
|
+
raise "Suite '#{suite}' doesn't exist" unless exists
|
129
|
+
|
130
|
+
log :info, "Listing all the packages in #{suite.fg "blue"}"
|
131
|
+
|
132
|
+
suite = repo.codename_to_suite suite
|
133
|
+
suite_packages = repo.list_packages
|
134
|
+
suite_packages.each do |pkg|
|
135
|
+
versions = repo.get_subpackage_versions pkg.name
|
136
|
+
unless versions[suite].empty?
|
137
|
+
if versions[suite].length == 1 && versions[suite].has_key?(pkg.name)
|
138
|
+
log :info, " #{pkg.name.style "pkg-name"} " +
|
139
|
+
"#{versions[suite][pkg.name].style "version"}"
|
140
|
+
else
|
141
|
+
log :info, " #{pkg.name.style "pkg-name"}"
|
142
|
+
versions[suite].each do |subpkg, version|
|
143
|
+
log :info, " #{subpkg.style "subpkg-name"} " +
|
144
|
+
"#{version.style "version"}"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
92
150
|
end
|
93
151
|
|
94
152
|
class RepoCLI < ExtendedThor
|
@@ -188,6 +246,11 @@ class RepoCLI < ExtendedThor
|
|
188
246
|
pkg = repo.get_package pkg_name
|
189
247
|
version = pkg.build branch, force
|
190
248
|
|
249
|
+
unless version
|
250
|
+
log :warn, "Build stopped (add -f to build anyway)"
|
251
|
+
return
|
252
|
+
end
|
253
|
+
|
191
254
|
if options["push"] && version
|
192
255
|
if options["push"] == "push"
|
193
256
|
repo.push pkg.name, version, "testing" # FIXME: should be configurable
|
@@ -223,6 +286,7 @@ class RepoCLI < ExtendedThor
|
|
223
286
|
end
|
224
287
|
|
225
288
|
desc "list SUBCOMMAND [ARGS]", "show information about packages"
|
289
|
+
map "l" => :list, "ls" => :list
|
226
290
|
subcommand "list", List
|
227
291
|
|
228
292
|
desc "rm [pkg-name]", "remove a package completely from the build system"
|
@@ -241,7 +305,30 @@ class RepoCLI < ExtendedThor
|
|
241
305
|
repo.remove_build pkg_name, version, options["force"] == true
|
242
306
|
end
|
243
307
|
|
244
|
-
desc "
|
308
|
+
desc "update", "Update and rebuild (if necessary) all the packages in the suite"
|
309
|
+
def update(suite="testing")
|
310
|
+
log :info, "Updating all packages in the #{suite.fg "blue"} suite"
|
311
|
+
repo = get_repo_handle
|
312
|
+
|
313
|
+
updated = 0
|
314
|
+
repo.list_packages(suite).each do |pkg|
|
315
|
+
log :info, "Updating #{pkg.name.style "pkg-name"}"
|
316
|
+
begin
|
317
|
+
version = pkg.build
|
318
|
+
rescue Dr::Package::UnableToBuild
|
319
|
+
log :info, ""
|
320
|
+
next
|
321
|
+
end
|
322
|
+
|
323
|
+
log :info, ""
|
324
|
+
repo.push pkg.name, version, suite if version
|
325
|
+
updated += 1
|
326
|
+
end
|
327
|
+
|
328
|
+
log :info, "Updated #{updated.to_s.fg "blue"} packages in #{suite.fg "blue"}"
|
329
|
+
end
|
330
|
+
|
331
|
+
desc "release", "Push all the packages from testing to release"
|
245
332
|
def release
|
246
333
|
repo = get_repo_handle
|
247
334
|
|
@@ -251,6 +338,19 @@ class RepoCLI < ExtendedThor
|
|
251
338
|
end
|
252
339
|
end
|
253
340
|
|
341
|
+
desc "force-sync", "Force cloning the sources repository from scratch again"
|
342
|
+
def force_sync(pkg_name)
|
343
|
+
repo = get_repo_handle
|
344
|
+
pkg = repo.get_package pkg_name
|
345
|
+
|
346
|
+
if pkg.is_a? Dr::GitPackage
|
347
|
+
pkg.reinitialise_repo
|
348
|
+
else
|
349
|
+
raise "The source of #{pkg_name.style "pkg-name"} is not managed by " +
|
350
|
+
"#{"dr".bright}"
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
254
354
|
desc "snapshot", "save a snapshot of the archive"
|
255
355
|
def snapshot(tag)
|
256
356
|
repo = get_repo_handle
|
@@ -263,7 +363,7 @@ class RepoCLI < ExtendedThor
|
|
263
363
|
end
|
264
364
|
|
265
365
|
begin
|
266
|
-
|
366
|
+
RepoCLI.start ARGV
|
267
367
|
rescue Exception => e
|
268
368
|
Dr::Logger.log :err, e.to_s
|
269
369
|
end
|
data/lib/dr/debpackage.rb
CHANGED
@@ -10,24 +10,24 @@ module Dr
|
|
10
10
|
src_name = dpkg.out.chomp
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
deb_file_name = File.basename(deb_file)
|
14
|
+
log :info, "Adding the #{deb_file_name.style "subpkg-name"} package"
|
14
15
|
|
15
16
|
dpkg = ShellCmd.new "dpkg-deb --field #{deb_file} Version", :tag => "dpkg"
|
16
17
|
version = dpkg.out.chomp
|
17
18
|
|
18
19
|
deb_dir = "#{repo.location}/packages/#{src_name}/builds/#{version}"
|
19
20
|
|
20
|
-
if File.exists?("#{deb_dir}/#{
|
21
|
+
if File.exists?("#{deb_dir}/#{deb_file_name}") && !force
|
21
22
|
raise "This deb file is already in the repo"
|
22
23
|
end
|
23
24
|
|
24
|
-
log :info, "Adding a build to the #{src_name.
|
25
|
-
|
26
|
-
log :info, "Signing the deb file"
|
27
|
-
repo.sign_deb deb_file
|
28
|
-
|
25
|
+
log :info, "Adding a build to the #{src_name.style "pkg-name"} source package"
|
29
26
|
FileUtils.mkdir_p deb_dir
|
30
27
|
FileUtils.cp "#{deb_file}", "#{deb_dir}/"
|
28
|
+
|
29
|
+
log :info, "Signing the deb file"
|
30
|
+
repo.sign_deb "#{deb_dir}/#{deb_file_name}"
|
31
31
|
end
|
32
32
|
|
33
33
|
def initialize(name, repo)
|
@@ -35,9 +35,9 @@ module Dr
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def build(branch=nil, force=false)
|
38
|
-
log :warn, "The
|
39
|
-
"managed by #{"dr".bright}"
|
40
|
-
raise "Unable to build the package"
|
38
|
+
log :warn, "The sources of the #{@name.style "pkg-name"} package are " +
|
39
|
+
"not managed by #{"dr".bright}"
|
40
|
+
raise UnableToBuild.new "Unable to build the package"
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
data/lib/dr/gitpackage.rb
CHANGED
@@ -2,20 +2,30 @@ require "dr/package"
|
|
2
2
|
require "dr/pkgversion"
|
3
3
|
require "dr/shellcmd"
|
4
4
|
|
5
|
+
require "yaml"
|
6
|
+
|
5
7
|
module Dr
|
6
8
|
class GitPackage < Package
|
7
9
|
def self.setup(repo, git_addr, default_branch, force=false)
|
8
10
|
Dir.mktmpdir do |tmp|
|
9
|
-
git_cmd = "git clone --branch #{default_branch}
|
11
|
+
git_cmd = "git clone --mirror --branch #{default_branch} " +
|
12
|
+
"#{git_addr} #{tmp}/git"
|
13
|
+
ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
14
|
+
|
15
|
+
FileUtils.mkdir_p "#{tmp}/src"
|
16
|
+
|
17
|
+
log :info, "Extracting the sources"
|
18
|
+
git_cmd ="git --git-dir #{tmp}/git --bare archive " +
|
19
|
+
"--format tar #{default_branch} | tar x -C #{tmp}/src"
|
10
20
|
ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
11
21
|
|
12
|
-
unless File.exists? "#{tmp}/
|
22
|
+
unless File.exists? "#{tmp}/src/debian/control"
|
13
23
|
log :err, "The debian packaging files not found in the repository"
|
14
24
|
raise "Adding a package from #{git_addr} failed"
|
15
25
|
end
|
16
26
|
|
17
27
|
src_name = nil
|
18
|
-
File.open "#{tmp}/
|
28
|
+
File.open "#{tmp}/src/debian/control", "r" do |f|
|
19
29
|
f.each_line do |line|
|
20
30
|
match = line.match /^Source: (.+)$/
|
21
31
|
if match
|
@@ -36,16 +46,16 @@ module Dr
|
|
36
46
|
raise "Adding failed"
|
37
47
|
end
|
38
48
|
|
39
|
-
log :info, "Adding #{src_name.
|
49
|
+
log :info, "Adding #{src_name.style "pkg-name"} to the repository"
|
40
50
|
FileUtils.mkdir_p "#{pkg_dir}"
|
41
51
|
|
42
52
|
log :info, "Setting up builds directory"
|
43
53
|
FileUtils.mkdir_p "#{pkg_dir}/builds"
|
44
54
|
|
45
55
|
log :info, "Setting up the source directory"
|
46
|
-
FileUtils.mv "#{tmp}/git
|
56
|
+
FileUtils.mv "#{tmp}/git", "#{pkg_dir}/source"
|
47
57
|
|
48
|
-
log :info, "
|
58
|
+
log :info, "The #{src_name.style "pkg-name"} package added successfully"
|
49
59
|
end
|
50
60
|
end
|
51
61
|
|
@@ -53,11 +63,57 @@ module Dr
|
|
53
63
|
super name, repo
|
54
64
|
|
55
65
|
@git_dir = "#{repo.location}/packages/#{name}/source"
|
66
|
+
@default_branch = get_current_branch
|
67
|
+
end
|
56
68
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
69
|
+
def reinitialise_repo
|
70
|
+
git_addr = get_repo_url
|
71
|
+
|
72
|
+
log :info, "Re-downloading the source repository of " +
|
73
|
+
"#{@name.style "pkg-name"}"
|
74
|
+
Dir.mktmpdir do |tmp|
|
75
|
+
git_cmd = "git clone --mirror --branch #{@default_branch} " +
|
76
|
+
"#{git_addr} #{tmp}/git"
|
77
|
+
ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
78
|
+
|
79
|
+
src_dir = "#{tmp}/src"
|
80
|
+
FileUtils.mkdir_p src_dir
|
81
|
+
|
82
|
+
log :info, "Extracting the sources"
|
83
|
+
git_cmd ="git --git-dir #{@git_dir} --bare archive " +
|
84
|
+
"--format tar #{@default_branch} | tar x -C #{src_dir}"
|
85
|
+
ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
86
|
+
|
87
|
+
unless File.exists? "#{tmp}/src/debian/control"
|
88
|
+
log :err, "The debian packaging files not found in the repository"
|
89
|
+
raise "Adding a package from #{git_addr} failed"
|
90
|
+
end
|
91
|
+
|
92
|
+
src_name = nil
|
93
|
+
File.open "#{tmp}/src/debian/control", "r" do |f|
|
94
|
+
f.each_line do |line|
|
95
|
+
match = line.match /^Source: (.+)$/
|
96
|
+
if match
|
97
|
+
src_name = match.captures[0]
|
98
|
+
break
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
unless src_name
|
104
|
+
log :err, "Couldn't identify the source package"
|
105
|
+
raise "Adding a package from #{git_addr} failed"
|
106
|
+
end
|
107
|
+
|
108
|
+
unless src_name == @name
|
109
|
+
log :err, "The name of the package in the repo has changed"
|
110
|
+
raise "Adding a package from #{git_addr} failed"
|
111
|
+
end
|
112
|
+
|
113
|
+
src_dir = "#{@repo.location}/packages/#{@name}/source"
|
114
|
+
FileUtils.rm_rf src_dir
|
115
|
+
FileUtils.mv "#{tmp}/git", "#{src_dir}"
|
116
|
+
end
|
61
117
|
end
|
62
118
|
|
63
119
|
def build(branch=nil, force=false)
|
@@ -68,17 +124,17 @@ module Dr
|
|
68
124
|
if curr_rev != orig_rev || force
|
69
125
|
Dir.mktmpdir do |src_dir|
|
70
126
|
log :info, "Extracting the sources"
|
71
|
-
git_cmd ="git --git-dir #{@git_dir} archive " +
|
127
|
+
git_cmd ="git --git-dir #{@git_dir} --bare archive " +
|
72
128
|
"--format tar #{branch} | tar x -C #{src_dir}"
|
73
129
|
ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
74
130
|
|
75
131
|
version = PkgVersion.new get_version "#{src_dir}/debian/changelog"
|
76
|
-
log :info, "Source version: #{version}"
|
132
|
+
log :info, "Source version: #{version.to_s.style "version"}"
|
77
133
|
|
78
134
|
while build_exists? version
|
79
135
|
version.increment!
|
80
136
|
end
|
81
|
-
log :info, "Building version: #{version}"
|
137
|
+
log :info, "Building version: #{version.to_s.style "version"}"
|
82
138
|
|
83
139
|
log :info, "Updating changelog"
|
84
140
|
now = Time.new.strftime("%a, %-d %b %Y %T %z")
|
@@ -108,8 +164,9 @@ module Dr
|
|
108
164
|
end
|
109
165
|
arches.each do |arch|
|
110
166
|
@repo.buildroot(arch).open do |br|
|
111
|
-
log :info, "Building the #{@name.
|
112
|
-
"
|
167
|
+
log :info, "Building the #{@name.style "pkg-name"} package " +
|
168
|
+
"version #{version.to_s.style "version"} for #{arch}"
|
169
|
+
|
113
170
|
# Moving to the proper directory
|
114
171
|
build_dir_name = "#{@name}-#{version.upstream}"
|
115
172
|
build_dir = "#{br}/#{build_dir_name}"
|
@@ -164,15 +221,22 @@ EOS
|
|
164
221
|
debs.each do |pkg|
|
165
222
|
FileUtils.cp pkg, build_dir
|
166
223
|
|
167
|
-
|
168
|
-
|
224
|
+
deb_filename = File.basename(pkg)
|
225
|
+
log :info, "Signing the #{deb_filename.style "subpkg-name"} package"
|
226
|
+
@repo.sign_deb "#{build_dir}/#{deb_filename}"
|
227
|
+
end
|
228
|
+
|
229
|
+
log :info, "Writing package metadata"
|
230
|
+
File.open "#{build_dir}/.metadata", "w" do |f|
|
231
|
+
YAML.dump({"branch" => branch}, f)
|
169
232
|
end
|
233
|
+
log :info, "The #{@name.style "pkg-name"} package has been " +
|
234
|
+
"built successfully."
|
170
235
|
end
|
171
236
|
end
|
172
237
|
end
|
173
238
|
else
|
174
|
-
log :info, "There were no changes in the #{
|
175
|
-
log :info, "Build stopped (add -f to build anyway)"
|
239
|
+
log :info, "There were no changes in the #{@name.style "pkg-name"} package"
|
176
240
|
end
|
177
241
|
version
|
178
242
|
end
|
@@ -181,26 +245,26 @@ EOS
|
|
181
245
|
def update_from_origin(branch)
|
182
246
|
log :info, "Pulling changes from origin"
|
183
247
|
|
184
|
-
git_cmd = "git --git-dir #{@git_dir} rev-parse #{branch} 2>/dev/null"
|
248
|
+
git_cmd = "git --git-dir #{@git_dir} --bare rev-parse #{branch} 2>/dev/null"
|
185
249
|
git = ShellCmd.new git_cmd, :tag => "git"
|
186
250
|
|
187
251
|
original_rev = git.out.chomp
|
188
252
|
original_rev = nil if original_rev == branch
|
189
253
|
|
190
254
|
begin
|
191
|
-
if @default_branch == branch
|
192
|
-
git_cmd = "git --git-dir #{@git_dir}
|
255
|
+
#if @default_branch == branch
|
256
|
+
git_cmd = "git --git-dir #{@git_dir} --bare fetch origin"
|
193
257
|
ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
194
|
-
else
|
195
|
-
|
196
|
-
|
197
|
-
end
|
258
|
+
#else
|
259
|
+
# git_cmd = "git --git-dir #{@git_dir} --bare fetch origin #{branch}:#{branch}"
|
260
|
+
# ShellCmd.new git_cmd, :tag => "git", :show_out => true
|
261
|
+
#end
|
198
262
|
rescue Exception => e
|
199
263
|
log :err, "Unable to pull from origin"
|
200
264
|
raise e
|
201
265
|
end
|
202
266
|
|
203
|
-
git_cmd = "git --git-dir #{@git_dir} rev-parse #{branch} 2>/dev/null"
|
267
|
+
git_cmd = "git --git-dir #{@git_dir} --bare rev-parse #{branch} 2>/dev/null"
|
204
268
|
git = ShellCmd.new git_cmd, :tag => "git"
|
205
269
|
current_rev = git.out.chomp
|
206
270
|
|
@@ -242,5 +306,18 @@ EOS
|
|
242
306
|
|
243
307
|
arches.uniq
|
244
308
|
end
|
309
|
+
|
310
|
+
def get_repo_url
|
311
|
+
git_cmd = "git --git-dir #{@git_dir} --bare remote show origin -n"
|
312
|
+
git = ShellCmd.new git_cmd, :tag => "git"
|
313
|
+
git.out.lines.grep(/Fetch URL/)[0].chomp[13..-1]
|
314
|
+
end
|
315
|
+
|
316
|
+
def get_current_branch
|
317
|
+
git_cmd = ShellCmd.new "git --git-dir #{@git_dir} --bare branch", {
|
318
|
+
:tag => "git"
|
319
|
+
}
|
320
|
+
git_cmd.out.chomp.lines.grep(/^\*/)[0][2..-1].chomp
|
321
|
+
end
|
245
322
|
end
|
246
323
|
end
|
data/lib/dr/logger.rb
CHANGED
@@ -4,11 +4,13 @@ tco_conf = Tco::config
|
|
4
4
|
|
5
5
|
tco_conf.names["green"] = "#99ad6a"
|
6
6
|
tco_conf.names["yellow"] = "#d8ad4c"
|
7
|
-
tco_conf.names["red"] = "#cf6a4c"
|
7
|
+
tco_conf.names["red"] = "#cc333f" #"#cf6a4c"
|
8
8
|
tco_conf.names["light-grey"] = "#ababab"
|
9
9
|
tco_conf.names["dark-grey"] = "#2b2b2b"
|
10
10
|
tco_conf.names["purple"] = "#90559e"
|
11
|
-
tco_conf.names["blue"] = "#1b8efa"
|
11
|
+
tco_conf.names["blue"] = "#4D9EEB" #"#1b8efa"
|
12
|
+
tco_conf.names["orange"] = "#ff842a"
|
13
|
+
tco_conf.names["brown"] = "#6a4a3c"
|
12
14
|
|
13
15
|
tco_conf.styles["info"] = {
|
14
16
|
:fg => "green",
|
@@ -43,6 +45,27 @@ tco_conf.styles["log-head"] = {
|
|
43
45
|
:underline => false
|
44
46
|
}
|
45
47
|
|
48
|
+
tco_conf.styles["pkg-name"] = {
|
49
|
+
:fg => "orange",
|
50
|
+
:bg => "",
|
51
|
+
:bright => false,
|
52
|
+
:underline => false
|
53
|
+
}
|
54
|
+
|
55
|
+
tco_conf.styles["subpkg-name"] = {
|
56
|
+
:fg => "purple",
|
57
|
+
:bg => "",
|
58
|
+
:bright => false,
|
59
|
+
:underline => false
|
60
|
+
}
|
61
|
+
|
62
|
+
tco_conf.styles["version"] = {
|
63
|
+
:fg => "brown",
|
64
|
+
:bg => "",
|
65
|
+
:bright => false,
|
66
|
+
:underline => false
|
67
|
+
}
|
68
|
+
|
46
69
|
Tco::reconfigure tco_conf
|
47
70
|
|
48
71
|
module Dr
|
@@ -74,7 +97,7 @@ module Dr
|
|
74
97
|
end
|
75
98
|
|
76
99
|
def tag(tag, msg)
|
77
|
-
tag.fg("blue") << " " << msg
|
100
|
+
tag.fg("blue").bg("dark-grey") << " " << msg
|
78
101
|
end
|
79
102
|
end
|
80
103
|
end
|
data/lib/dr/package.rb
CHANGED
@@ -3,6 +3,9 @@ require "dr/shellcmd"
|
|
3
3
|
|
4
4
|
module Dr
|
5
5
|
class Package
|
6
|
+
class UnableToBuild < RuntimeError
|
7
|
+
end
|
8
|
+
|
6
9
|
attr_reader :name
|
7
10
|
|
8
11
|
include Logger
|
@@ -32,5 +35,9 @@ module Dr
|
|
32
35
|
raise "Build #{version.fg("blue")} not found" unless build_exists? version
|
33
36
|
FileUtils.rm_rf "#{@repo.location}/packages/#{@name}/builds/#{version}"
|
34
37
|
end
|
38
|
+
|
39
|
+
def <=>(o)
|
40
|
+
self.name <=> o.name
|
41
|
+
end
|
35
42
|
end
|
36
43
|
end
|
data/lib/dr/pkgversion.rb
CHANGED
data/lib/dr/repo.rb
CHANGED
@@ -7,6 +7,7 @@ require "dr/gnupg"
|
|
7
7
|
require "dr/buildroot"
|
8
8
|
|
9
9
|
require "fileutils"
|
10
|
+
require "yaml"
|
10
11
|
|
11
12
|
module Dr
|
12
13
|
class Repo
|
@@ -72,15 +73,23 @@ module Dr
|
|
72
73
|
|
73
74
|
def list_packages(suite=nil)
|
74
75
|
pkgs = []
|
76
|
+
|
75
77
|
if suite
|
76
|
-
|
78
|
+
Dir.foreach @packages_dir do |pkg_name|
|
79
|
+
unless pkg_name =~ /^\./
|
80
|
+
versions = get_subpackage_versions pkg_name
|
81
|
+
unless versions[codename_to_suite suite].empty?
|
82
|
+
pkgs.push get_package pkg_name
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
77
86
|
else
|
78
87
|
Dir.foreach @packages_dir do |pkg_name|
|
79
88
|
pkgs.push get_package pkg_name unless pkg_name =~ /^\./
|
80
89
|
end
|
81
90
|
end
|
82
91
|
|
83
|
-
pkgs
|
92
|
+
pkgs.sort
|
84
93
|
end
|
85
94
|
|
86
95
|
def buildroot(arch)
|
@@ -89,7 +98,7 @@ module Dr
|
|
89
98
|
|
90
99
|
def get_package(name)
|
91
100
|
unless File.exists? "#{@packages_dir}/#{name}"
|
92
|
-
raise "Package
|
101
|
+
raise "Package #{name.style "pkg-name"} doesn't exist in the repo"
|
93
102
|
end
|
94
103
|
|
95
104
|
if File.exists? "#{@packages_dir}/#{name}/source"
|
@@ -150,7 +159,8 @@ module Dr
|
|
150
159
|
versions[suite] = {}
|
151
160
|
reprepro_cmd = "reprepro --basedir #{location}/archive " +
|
152
161
|
"--list-format '${package} ${version}\n' " +
|
153
|
-
"listfilter #{suite} 'Source (== #{pkg_name})
|
162
|
+
"listfilter #{suite} 'Source (== #{pkg_name}) | " +
|
163
|
+
"Package (== #{pkg_name})' " +
|
154
164
|
"2>/dev/null"
|
155
165
|
reprepro = ShellCmd.new reprepro_cmd, :tag => "reprepro"
|
156
166
|
reprepro.out.chomp.each_line do |line|
|
@@ -189,7 +199,7 @@ module Dr
|
|
189
199
|
debs = Dir["#{@location}/packages/#{pkg.name}/builds/#{version}/*"]
|
190
200
|
names = debs.map { |deb| File.basename(deb).split("_")[0] }
|
191
201
|
|
192
|
-
used_versions = get_subpackage_versions(pkg.name)[
|
202
|
+
used_versions = get_subpackage_versions(pkg.name)[codename_to_suite(suite)]
|
193
203
|
|
194
204
|
is_of_higher_version = true
|
195
205
|
names.each do |name|
|
@@ -199,7 +209,9 @@ module Dr
|
|
199
209
|
end
|
200
210
|
|
201
211
|
unless is_of_higher_version
|
202
|
-
log :warn, "
|
212
|
+
log :warn, "The #{suite} suite already contains " +
|
213
|
+
"#{pkg.name.style "pkg-name"} version " +
|
214
|
+
"#{version.to_s.style "version"}"
|
203
215
|
if force
|
204
216
|
reprepro = "reprepro -b #{@location}/archive " +
|
205
217
|
"--gnupghome #{location}/gnupg-keyring/ removesrc " +
|
@@ -211,7 +223,8 @@ module Dr
|
|
211
223
|
end
|
212
224
|
end
|
213
225
|
|
214
|
-
log :info, "Pushing #{pkg_name} version
|
226
|
+
log :info, "Pushing #{pkg_name.style "pkg-name"} version " +
|
227
|
+
"#{version.to_s.style "version"} to #{suite}"
|
215
228
|
reprepro = "reprepro -b #{@location}/archive " +
|
216
229
|
"--gnupghome #{location}/gnupg-keyring/ includedeb " +
|
217
230
|
"#{suite} #{debs.join " "}"
|
@@ -228,7 +241,7 @@ module Dr
|
|
228
241
|
raise "Unpush failed"
|
229
242
|
end
|
230
243
|
|
231
|
-
log :info, "Removing #{pkg_name} from #{suite}"
|
244
|
+
log :info, "Removing #{pkg_name.style "pkg-name"} from #{suite}"
|
232
245
|
reprepro = "reprepro -b #{@location}/archive " +
|
233
246
|
"--gnupghome #{location}/gnupg-keyring/ removesrc " +
|
234
247
|
"#{suite} #{pkg.name}"
|
@@ -239,7 +252,7 @@ module Dr
|
|
239
252
|
pkg = get_package pkg_name
|
240
253
|
|
241
254
|
if is_used? pkg_name
|
242
|
-
log :warn, "The #{pkg_name.
|
255
|
+
log :warn, "The #{pkg_name.style "pkg-name"} package is still used"
|
243
256
|
raise "Operation canceled, add -f to remove anyway" unless force
|
244
257
|
|
245
258
|
log :info, "Will be force-removed anyway"
|
@@ -249,7 +262,7 @@ module Dr
|
|
249
262
|
end
|
250
263
|
end
|
251
264
|
|
252
|
-
log :info, "Removing #{pkg_name} from the repository"
|
265
|
+
log :info, "Removing #{pkg_name.style "pkg-name"} from the repository"
|
253
266
|
FileUtils.rm_rf "#{location}/packages/#{pkg_name}"
|
254
267
|
end
|
255
268
|
|
@@ -258,20 +271,20 @@ module Dr
|
|
258
271
|
|
259
272
|
if is_used?(pkg_name, version)
|
260
273
|
if force
|
261
|
-
log :info, "Force-removing #{version.
|
262
|
-
"#{pkg_name.
|
274
|
+
log :info, "Force-removing #{version.style "version"} version of " +
|
275
|
+
"#{pkg_name.style "pkg-name"}"
|
263
276
|
versions_by_suite = get_subpackage_versions pkg_name
|
264
277
|
versions_by_suite.each do |suite, versions|
|
265
278
|
unpush pkg_name, suite if versions.has_value? version
|
266
279
|
end
|
267
280
|
else
|
268
|
-
log :warn, "This build of #{pkg_name} is " +
|
281
|
+
log :warn, "This build of #{pkg_name.style "pkg-name"} is " +
|
269
282
|
"still being used, add -f to force-remove"
|
270
283
|
return
|
271
284
|
end
|
272
285
|
else
|
273
|
-
log :info, "Removing the #{version.
|
274
|
-
|
286
|
+
log :info, "Removing the #{version.style "version"} version of " +
|
287
|
+
"#{pkg_name.style "pkg-name"}"
|
275
288
|
end
|
276
289
|
|
277
290
|
pkg.remove_build version
|
@@ -284,11 +297,25 @@ module Dr
|
|
284
297
|
raise "The package hasn't been built yet." unless hist.length > 0
|
285
298
|
version = hist[0] unless version
|
286
299
|
|
287
|
-
|
300
|
+
unless pkg.build_exists? version
|
301
|
+
raise "Build #{version.style "version"} doesn't exist"
|
302
|
+
end
|
288
303
|
|
289
304
|
Dir["#{@location}/packages/#{pkg.name}/builds/#{version}/*"]
|
290
305
|
end
|
291
306
|
|
307
|
+
def get_build_metadata(pkg_name, version)
|
308
|
+
pkg = get_package pkg_name
|
309
|
+
raise "Build #{version} doesn't exist" unless pkg.build_exists? version
|
310
|
+
|
311
|
+
md_file = "#{@location}/packages/#{pkg.name}/builds/#{version}/.metadata"
|
312
|
+
if File.exists? md_file
|
313
|
+
YAML.load_file md_file
|
314
|
+
else
|
315
|
+
{}
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
292
319
|
def sign_deb(deb)
|
293
320
|
keyring = "#{@location}/gnupg-keyring"
|
294
321
|
gpg = GnuPG.new keyring
|
@@ -298,6 +325,14 @@ module Dr
|
|
298
325
|
ShellCmd.new cmd, :tag => "dpkg-sig", :show_out => true
|
299
326
|
end
|
300
327
|
|
328
|
+
def codename_to_suite(codename_or_suite)
|
329
|
+
get_suites.each do |suite, codename|
|
330
|
+
return suite if codename_or_suite == suite || codename_or_suite == codename
|
331
|
+
end
|
332
|
+
|
333
|
+
nil
|
334
|
+
end
|
335
|
+
|
301
336
|
private
|
302
337
|
def get_key
|
303
338
|
File.open "#{@location}/archive/conf/distributions", "r" do |f|
|
@@ -319,13 +354,5 @@ module Dr
|
|
319
354
|
end
|
320
355
|
end
|
321
356
|
end
|
322
|
-
|
323
|
-
def to_suite(codename_or_suite)
|
324
|
-
get_suites.each do |suite, codename|
|
325
|
-
return suite if codename_or_suite == suite || codename_or_suite == codename
|
326
|
-
end
|
327
|
-
|
328
|
-
nil
|
329
|
-
end
|
330
357
|
end
|
331
358
|
end
|
data/lib/dr/shellcmd.rb
CHANGED
@@ -53,14 +53,14 @@ module Dr
|
|
53
53
|
if @status.exitstatus != @expect
|
54
54
|
out_lines = @out.split "\n"
|
55
55
|
if out_lines.length > 10
|
56
|
-
out_lines = out_lines[-
|
56
|
+
out_lines = out_lines[-10..-1]
|
57
57
|
end
|
58
58
|
|
59
59
|
out_lines.each do |l|
|
60
|
-
l = @tag.fg("
|
60
|
+
l = tag(@tag, l.fg("red")) if @tag
|
61
61
|
log(:err, l.chomp)
|
62
62
|
end
|
63
|
-
raise "'#{@cmd}' failed!" if @raise_on_error
|
63
|
+
raise "'#{@cmd}' failed!".fg("red") if @raise_on_error
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
data/lib/dr/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|