dr 0.2.5 → 1.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ba4035bfe641151aba4792cf6ebedbc80d1fd2e6
4
- data.tar.gz: 715befd405538961117520a551330201fb57c22b
3
+ metadata.gz: 48dfeab96a546a1ea867447378a4db3d2004a87a
4
+ data.tar.gz: f9002254094f0d190ce164e74c39118e44a0aaee
5
5
  SHA512:
6
- metadata.gz: bcc322d82a50e31a7c230fc5f7bf9ec66beb1206f4a8c79bd4a427a3a2b931f32ff14183a37f71bfad47d5cd5025ed3759bb0726fbd85ba5cffb43c547301dfb
7
- data.tar.gz: e2b1950538b9f104945f86efcaa55a471a2fbbabca3cc8c1f76b27e5e61c5037f7a99e6d6cd63a6951d9c225d2d4723e551fa64a17deb1e5138916da3f940ace
6
+ metadata.gz: 93d864a9d2c275c1c90bee88d8f2d91c91797659c86648183fb8df996a71ec6563ce801b553775598d3a28e35bd1836ff49270b72c22365e2f0cf21e2d71a244
7
+ data.tar.gz: 0eaa169652f489a898171edb18758306c276a46bd149260fb425bf7d94fb7683067dad0e6dd16fd91eb074d19992631d08ad9942ac43bdfa18eb707980bcb6fc
data/bin/dr CHANGED
@@ -12,6 +12,7 @@ require "dr/repo"
12
12
  require "dr/gitpackage"
13
13
  require "dr/debpackage"
14
14
  require "dr/buildroot"
15
+ require "dr/pkgversion"
15
16
 
16
17
  require "dr/shellcmd"
17
18
  require "dr/logger"
@@ -59,6 +60,79 @@ class Archive < ExtendedThor
59
60
  #end
60
61
  end
61
62
 
63
+ class Conf < ExtendedThor
64
+ desc "repo", "Configuration of the whole repository"
65
+ def repo(key, value=nil)
66
+ repo = get_repo_handle
67
+
68
+ metadata = repo.get_configuration
69
+
70
+ if value == nil
71
+ value = dot_get_value metadata, key
72
+ puts value if value
73
+ else
74
+ repo.set_configuration dot_set_value metadata, key, value
75
+ end
76
+ end
77
+
78
+ desc "package", "Package-specific configuration options"
79
+ def package(pkg_name, key, value=nil)
80
+ repo = get_repo_handle
81
+ pkg = repo.get_package pkg_name
82
+
83
+ metadata = pkg.get_configuration
84
+
85
+ if value == nil
86
+ value = dot_get_value metadata, key
87
+ puts value if value
88
+ else
89
+ pkg.set_configuration dot_set_value metadata, key, value
90
+ end
91
+ end
92
+
93
+ private
94
+ def dot_set_value(dict, key, value)
95
+ levels = key.split(".").map {|l| l.to_sym}
96
+ raise "Incorrect key" if levels.length == 0
97
+
98
+ begin
99
+ last = levels.pop
100
+ object = dict
101
+ levels.each do |l|
102
+ object[l] = {} unless object.has_key? l
103
+ object = object[l]
104
+ end
105
+
106
+ if value.length > 0
107
+ object[last] = value
108
+ else
109
+ object.delete last
110
+ end
111
+ rescue
112
+ log :err, "The configuration key '#{key}' isn't right"
113
+ raise "Incorrect key"
114
+ end
115
+
116
+ dict
117
+ end
118
+
119
+ def dot_get_value(dict, key)
120
+ levels = key.split(".").map {|l| l.to_sym}
121
+ raise "Incorrect key" if levels.length == 0
122
+
123
+ begin
124
+ last = levels.pop
125
+ object = dict
126
+ levels.each do |l|
127
+ object = object[l]
128
+ end
129
+ return object[last]
130
+ rescue
131
+ log :err, "The configuration key '#{key}' isn't right"
132
+ raise "Incorrect key"
133
+ end
134
+ end
135
+ end
62
136
 
63
137
  class List < ExtendedThor
64
138
  desc "packages", "Show a list of source packages in the repo"
@@ -71,11 +145,16 @@ class List < ExtendedThor
71
145
  end
72
146
  end
73
147
 
74
-
75
- desc "versions PACKAGE", "Show the history of all available versions for a package"
148
+ desc "versions PACKAGE", "DEPRECATED, please use builds instead"
76
149
  def versions(pkg_name)
150
+ log :warn, "This subcommand is deprecated, please use builds instead"
151
+ builds pkg_name
152
+ end
153
+
154
+ desc "builds PACKAGE", "Show the history of all builds of a package"
155
+ def builds(pkg_name)
77
156
  repo = get_repo_handle
78
- log :info, "Listing all built versions of #{pkg_name.style "pkg-name"}"
157
+ log :info, "Listing all buils of #{pkg_name.style "pkg-name"}"
79
158
 
80
159
  suites = repo.get_suites
81
160
 
@@ -178,7 +257,7 @@ class RepoCLI < ExtendedThor
178
257
  :arches => ["amd64"],
179
258
  :components => ["main"],
180
259
  :suites => ["stable", "testing", "unstable"],
181
- :distro => "Kano OS",
260
+ :build_environment => :kano,
182
261
  :codenames => []
183
262
  }
184
263
 
@@ -188,40 +267,38 @@ class RepoCLI < ExtendedThor
188
267
  desc = ask " Description [#{repo_conf[:desc]}]:"
189
268
  repo_conf[:desc] = desc if desc.length > 0
190
269
 
191
- distro_map = {}
192
- puts " Distribution [pick one]: "
193
- Dr::config.distros.each_with_index do |distro, index|
194
- distro_name = distro[0]
195
- distro_map[index+1] = distro_name
196
-
197
- distro_name = distro_name.fg "yellow" if distro_name == repo_conf[:distro]
198
- puts " [#{index+1}] #{distro_name}"
270
+ puts " Default build environment [pick one]: "
271
+ Dr::config.build_environments.each do |id, benv|
272
+ puts " [#{id.to_s.fg "blue"}] #{benv[:name]}"
199
273
  end
200
274
 
201
- distro = ask " Your choice: "
202
- until distro.length == 0 || distro_map.has_key?(distro.to_i)
203
- distro = ask " Your choice: "
275
+ benv = nil
276
+ loop do
277
+ benv_str = ask " Your choice [#{repo_conf[:build_environment].to_s.fg "yellow"}]:"
278
+ benv = benv_str.to_sym
279
+ break if Dr::config.build_environments.has_key? benv_str.to_sym
204
280
  end
205
- repo_conf[:distro] = distro_map[distro.to_i] if distro.length > 0
281
+ repo_conf[:build_environment] = benv
206
282
 
207
- require 'pp'
208
- # guess default arch
209
- pp Dr::config.distros
210
- pp Dr::config.distros[repo_conf[:distro]]
211
- repo_conf[:arches] = [Dr::config.distros[repo_conf[:distro]][:arches][0]]
283
+ # guess repo arches
284
+ repo_conf[:arches] = Dr::config.build_environments[benv][:arches]
212
285
 
213
- while true
286
+ loop do
214
287
  str = ask " Architectures [#{repo_conf[:arches].join(" ").fg("yellow")}]:"
215
288
  break if str.length == 0
216
289
 
290
+ # Determine the available architectures
291
+ avail = Dr.config.build_environments[benv][:arches]
292
+
217
293
  arches = str.split(/\s+/)
218
294
  arches_valid = arches.reduce(true) do |acc, arch|
219
- supported = Dr::config.distros[repo_conf[:distro]][:arches].include?(arch)
220
- if !supported
221
- puts " " + "#{arch.fg "yellow"}" + " not supported by the distro"
295
+ if !avail.include?(arch)
296
+ puts " " + "#{arch.fg "yellow"}" +
297
+ " not supported by the build environments you selected"
298
+ acc = false
222
299
  end
223
300
 
224
- supported
301
+ acc
225
302
  end
226
303
  next if !arches_valid
227
304
 
@@ -321,7 +398,7 @@ class RepoCLI < ExtendedThor
321
398
  desc "push [pkg-name]", "push a built package to a specified suite"
322
399
  method_option :suite, :aliases => "-s", :type => :string,
323
400
  :desc => "the target suite (defaults to testing)"
324
- method_option :version, :aliases => "-v", :type => :string,
401
+ method_option :build, :aliases => "-b", :type => :string,
325
402
  :desc => "which version to push (defaults to the highest one build)"
326
403
  method_option :force, :aliases => "-f", :type => :boolean,
327
404
  :desc => "force inclusion of the package to the suite"
@@ -332,7 +409,7 @@ class RepoCLI < ExtendedThor
332
409
  suite = options["suite"] if options.has_key? "suite"
333
410
 
334
411
  version = nil
335
- version = options["version"] if options.has_key? "version"
412
+ version = options["build"] if options.has_key? "build"
336
413
 
337
414
  repo.push pkg_name, version, suite, options["force"] == true
338
415
  end
@@ -344,11 +421,15 @@ class RepoCLI < ExtendedThor
344
421
  repo.unpush pkg_name, suite
345
422
  end
346
423
 
347
-
348
424
  desc "list SUBCOMMAND [ARGS]", "show information about packages"
349
425
  map "l" => :list, "ls" => :list
350
426
  subcommand "list", List
351
427
 
428
+
429
+ desc "config SUBCOMMAND [ARGS]", "configure your repository"
430
+ map "c" => :config, "conf" => :config, "configure" => :config
431
+ subcommand "config", Conf
432
+
352
433
  desc "rm [pkg-name]", "remove a package completely from the build system"
353
434
  method_option :force, :aliases => "-f", :type => :boolean,
354
435
  :desc => "force removal even if the package is still used"
@@ -459,25 +540,75 @@ class RepoCLI < ExtendedThor
459
540
 
460
541
 
461
542
  desc "force-sync", "Force cloning the sources repository from scratch again"
543
+ method_option :url, :aliases => "-u", :type => :string,
544
+ :desc => "The URL to clone from"
545
+ method_option :branch, :aliases => "-b", :type => :string,
546
+ :desc => "The default branch to use for building"
462
547
  def force_sync(pkg_name)
463
548
  repo = get_repo_handle
464
549
  pkg = repo.get_package pkg_name
465
550
 
466
551
  if pkg.is_a? Dr::GitPackage
467
- pkg.reinitialise_repo
552
+ pkg.reinitialise_repo options["url"], options["branch"]
468
553
  else
469
554
  raise "The source of #{pkg_name.style "pkg-name"} is not managed by " +
470
555
  "#{"dr".bright}"
471
556
  end
472
557
  end
473
558
 
474
- desc "snapshot", "save a snapshot of the archive"
475
- def snapshot(tag)
559
+ #desc "snapshot", "save a snapshot of the archive"
560
+ #def snapshot(tag)
561
+ # repo = get_repo_handle
562
+ #end
563
+
564
+ desc "cleanup", "Remove builds beyond certain date or number"
565
+ method_option :package, :aliases => "-p", :type => :string,
566
+ :desc => "Cleanup this package only"
567
+ method_option :date, :aliases => "-d", :type => :string,
568
+ :desc => "Remove builds beyond this date (YYYYMMDD)"
569
+ method_option :number, :aliases => "-n", :type => :string,
570
+ :desc => "Keep only N newest builds"
571
+ def cleanup
476
572
  repo = get_repo_handle
477
573
 
478
- log :info, "Releasing all packages from testing"
479
- repo.list_packages.each do |pkg|
480
- repo.push pkg.name, nil, "stable"
574
+ if options["date"] != nil && options["number"] != nil
575
+ log :err, "Can't use -n and -d at the same time"
576
+ raise "Bad arguments"
577
+ end
578
+
579
+ date = options["date"]
580
+ number = options["number"]
581
+
582
+ if options["date"] == nil && options["number"] == nil
583
+ number = 10
584
+ end
585
+
586
+ packages = unless options["package"] == nil
587
+ [repo.get_package(options["package"])]
588
+ else
589
+ repo.list_packages
590
+ end
591
+
592
+ packages.each do |pkg|
593
+ kept = 0
594
+ pkg.history.each do |version_string|
595
+ # Can't remove a used build
596
+ if repo.is_used? pkg.name, version_string
597
+ kept += 1
598
+ next
599
+ end
600
+
601
+ if date != nil
602
+ version = Dr::PkgVersion.new version_string
603
+ if version.date.to_i < date.to_i
604
+ rmbuild pkg.name, version_string
605
+ end
606
+ elsif number != nil && kept >= number.to_i
607
+ rmbuild pkg.name, version_string
608
+ else
609
+ kept += 1
610
+ end
611
+ end
481
612
  end
482
613
  end
483
614
  end
@@ -493,4 +624,8 @@ begin
493
624
  RepoCLI.start ARGV
494
625
  rescue StandardError => e
495
626
  Dr::Logger.log :err, e.to_s
627
+ e.backtrace.each do |line|
628
+ line = " #{line}" if line.length > 0 && line[0] == '/'
629
+ Dr::Logger.log :err, line.fg("grey")
630
+ end
496
631
  end
@@ -9,3 +9,18 @@ repositories:
9
9
 
10
10
  - name: "sandbox"
11
11
  location: "/path/to/the/sandbox/repo"
12
+
13
+ build_environments:
14
+ basic_wheezy:
15
+ name: "Test Build Environment"
16
+ arches: [armhf, x86_64]
17
+ repos:
18
+ wheezy:
19
+ url: "http://ftp.uk.debian.org/debian/"
20
+ key: "https://ftp-master.debian.org/keys/archive-key-7.0.asc"
21
+ src: false
22
+ codename: wheezy
23
+ components: main nonfree
24
+ base_repo: wheezy
25
+ packages: []
26
+
@@ -1,12 +1,12 @@
1
1
  # Copyright (C) 2014 Kano Computing Ltd.
2
2
  # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
3
3
 
4
-
5
4
  module Dr
6
- module Distros
7
- @@distros = {
8
- "Kano OS" => {
9
- :arches => ["armhf", "armel"],
5
+ module BuildEnvironments
6
+ @@build_environments = {
7
+ :kano => {
8
+ :name =>"Kano OS",
9
+ :arches => ["armhf"],
10
10
  :repos => {
11
11
  :raspbian => {
12
12
  :url => "http://mirror.ox.ac.uk/sites/archive.raspbian.org/archive/raspbian/",
@@ -17,8 +17,8 @@ module Dr
17
17
  },
18
18
 
19
19
  :raspi_foundation => {
20
- :url => "http://archive.raspberrypi.org/debian/",
21
- :key => "http://archive.raspberrypi.org/debian/raspberrypi.gpg.key",
20
+ :url => "http://dev.kano.me/mirrors/raspberrypi/",
21
+ :key => "http://dev.kano.me/mirrors/raspberrypi/raspberrypi.gpg.key",
22
22
  :src => false,
23
23
  :codename => "wheezy",
24
24
  :components => "main"
@@ -34,15 +34,31 @@ module Dr
34
34
  },
35
35
  :base_repo => :raspbian,
36
36
  :packages => []
37
+ },
38
+
39
+ :wheezy => {
40
+ :name => "Debian Wheezy",
41
+ :arches => ["x86_64"],
42
+ :repos => {
43
+ :wheezy => {
44
+ :url => "http://ftp.uk.debian.org/debian/",
45
+ :key => "https://ftp-master.debian.org/keys/archive-key-7.0.asc",
46
+ :src => true,
47
+ :codename => "wheezy",
48
+ :components => "main contrib non-free"
49
+ }
50
+ },
51
+ :base_repo => :wheezy,
52
+ :packages => []
37
53
  }
38
54
  }
39
55
 
40
- def distros
41
- @@distros
56
+ def build_environments
57
+ @@build_environments
42
58
  end
43
59
 
44
- def add_distro(name, distro)
45
- @@distros[name] = distro
60
+ def add_build_environment(name, benv)
61
+ @@build_environments[name.to_sym] = benv
46
62
  end
47
63
  end
48
64
  end
@@ -11,23 +11,31 @@ module Dr
11
11
  class BuildRoot
12
12
  include Logger
13
13
 
14
- def initialize(base, arch, br_cache)
15
- @location = "#{br_cache}/#{base.strip.downcase.gsub(" ", "_")}-#{arch}.tar.gz"
16
- @base = base
14
+ def initialize(env, arch, br_cache)
17
15
  @arch = arch
16
+ if arch == "all"
17
+ unless Dr::config.build_environments.has_key? env
18
+ log :err, "Unkown build environment: #{env.to_s.fg "red"}"
19
+ raise "Build environment not recognised"
20
+ end
21
+ @arch = Dr::config.build_environments[env][:arches][0]
22
+ end
23
+
24
+ @location = "#{br_cache}/#{env.to_s}-#{@arch}.tar.gz"
25
+ @env = env
18
26
 
19
27
  @essential_pkgs = "sudo,vim,ca-certificates,fakeroot,build-essential," +
20
28
  "curl,devscripts,debhelper,git,bc,locales,equivs," +
21
29
  "pkg-config,libfile-fcntllock-perl"
22
30
 
23
- if !File.exists?(@location)
24
- setup base, arch
31
+ unless File.exists?(@location)
32
+ setup @env, @arch
25
33
  end
26
34
  end
27
35
 
28
36
  def open
29
37
  Dir.mktmpdir do |tmp|
30
- log :info, "Preparing #{@base.fg "blue"} #{@arch.fg "orange"} build root"
38
+ log :info, "Preparing #{@env.to_s.fg "blue"} #{@arch.fg "orange"} build root"
31
39
  ShellCmd.new "sudo tar xz -C #{tmp} -f #{@location}", :tag => "tar"
32
40
  begin
33
41
  log :info, "Mounting the /proc file system"
@@ -46,18 +54,16 @@ module Dr
46
54
  end
47
55
 
48
56
  private
49
- def setup(base, arch)
50
- unless Dr.config.distros.include? base
51
- raise "Sorry, OS base #{base.fg "blue"} isn't supported by dr."
57
+ def setup(env, arch)
58
+ unless Dr.config.build_environments.has_key? env
59
+ raise "Sorry, build environment #{env.to_s.fg "blue"} isn't supported by dr."
52
60
  end
53
61
 
54
- unless Dr.config.distros[base][:arches].include? arch
55
- raise "Arch #{arch.fg "blue"} not supported by this base."
62
+ unless Dr.config.build_environments[env][:arches].include? arch
63
+ raise "Arch #{arch.fg "blue"} not supported by this build environment."
56
64
  end
57
65
 
58
- repos = Dr.config.distros[base][:repos]
59
- base_repo = Dr.config.distros[base][:base_repo].to_sym
60
- additional_pkgs = Dr.config.distros[base][:packages].join ","
66
+ repos = Dr.config.build_environments[env][:repos]
61
67
 
62
68
  Dir.mktmpdir do |tmp|
63
69
  broot = "#{tmp}/broot"
@@ -66,30 +72,15 @@ module Dr
66
72
  log :info, "Setting up the buildroot"
67
73
 
68
74
  begin
69
- log :info, "Bootstrapping #{base} (first stage)"
70
-
71
- cmd = "sudo debootstrap --foreign --variant=buildd --no-check-gpg " +
72
- "--include=#{@essential_pkgs},#{additional_pkgs} " +
73
- "--arch=#{arch} wheezy #{broot} #{repos[base_repo][:url]}"
74
- debootsrap = ShellCmd.new cmd, {
75
- :tag => "debootstrap",
76
- :show_out => true
77
- }
75
+ arch_cmd = ShellCmd.new "arch"
76
+ arch = arch_cmd.out.strip
78
77
 
79
- static_qemu = Dir["/usr/bin/qemu-*-static"]
80
- static_qemu.each do |path|
81
- cp = ShellCmd.new "sudo cp #{path} #{broot}/usr/bin", {
82
- :tag => "cp"
83
- }
78
+ if @arch == arch
79
+ setup_native broot
80
+ else
81
+ setup_foreign broot
84
82
  end
85
83
 
86
- log :info, "Bootstrapping Raspian (#{arch} stage)"
87
- cmd = "sudo chroot #{broot} /debootstrap/debootstrap --second-stage"
88
- debootstrap = ShellCmd.new cmd, {
89
- :tag => "debootstrap",
90
- :show_out => true
91
- }
92
-
93
84
  log :info, "Configuring the build root"
94
85
 
95
86
  repo_setup_sequences = repos.map do |name, repo|
@@ -141,5 +132,53 @@ EOF"
141
132
  end
142
133
  end
143
134
  end
135
+
136
+ def setup_foreign(broot)
137
+ repos = Dr.config.build_environments[@env][:repos]
138
+ base_repo = Dr.config.build_environments[@env][:base_repo].to_sym
139
+ additional_pkgs = Dr.config.build_environments[@env][:packages].join ","
140
+ codename = repos[base_repo][:codename]
141
+ url = repos[base_repo][:url]
142
+
143
+ log :info, "Bootstrapping #{@env.to_s} (foreign chroot, first stage)"
144
+ cmd = "sudo debootstrap --foreign --variant=buildd --no-check-gpg " +
145
+ "--include=#{@essential_pkgs},#{additional_pkgs} " +
146
+ "--arch=#{@arch} #{codename} #{broot} #{url}"
147
+ debootsrap = ShellCmd.new cmd, {
148
+ :tag => "debootstrap",
149
+ :show_out => true
150
+ }
151
+
152
+ static_qemu = Dir["/usr/bin/qemu-*-static"]
153
+ static_qemu.each do |path|
154
+ cp = ShellCmd.new "sudo cp #{path} #{broot}/usr/bin", {
155
+ :tag => "cp"
156
+ }
157
+ end
158
+
159
+ log :info, "Bootstrapping Raspian (#{@arch} stage)"
160
+ cmd = "sudo chroot #{broot} /debootstrap/debootstrap --second-stage"
161
+ debootstrap = ShellCmd.new cmd, {
162
+ :tag => "debootstrap",
163
+ :show_out => true
164
+ }
165
+ end
166
+
167
+ def setup_native(broot)
168
+ repos = Dr.config.build_environments[@env][:repos]
169
+ base_repo = Dr.config.build_environments[@env][:base_repo].to_sym
170
+ additional_pkgs = Dr.config.build_environments[@env][:packages].join ","
171
+ codename = repos[base_repo][:codename]
172
+ url = repos[base_repo][:url]
173
+
174
+ log :info, "Bootstrapping #{@env.to_s} (native chroot)"
175
+ cmd = "sudo debootstrap --variant=buildd --no-check-gpg " +
176
+ "--include=#{@essential_pkgs},#{additional_pkgs} " +
177
+ "#{codename} #{broot} #{repos[base_repo][:url]}"
178
+ debootsrap = ShellCmd.new cmd, {
179
+ :tag => "debootstrap",
180
+ :show_out => true
181
+ }
182
+ end
144
183
  end
145
184
  end
@@ -3,13 +3,13 @@
3
3
 
4
4
  require "yaml"
5
5
 
6
- require "dr/distros"
6
+ require "dr/build_environments"
7
7
 
8
8
  module Dr
9
9
  class Config
10
10
  attr_reader :default_repo, :repositories
11
11
 
12
- include Distros
12
+ include BuildEnvironments
13
13
 
14
14
  def initialize(locations)
15
15
  @default_repo = nil
@@ -47,10 +47,10 @@ module Dr
47
47
  end
48
48
  end
49
49
 
50
- if conf_file.has_key? "distros"
51
- conf_file["distros"].each do |name, distro|
52
- distro_sym_keys = distro.inject({}) { |memo,(k,v)| memo[k.to_sym] = v; memo }
53
- add_distro(name, distro_sym_keys)
50
+ if conf_file.has_key? "build_environments"
51
+ conf_file["build_environments"].each do |id, be|
52
+ be_sym_keys = be.inject({}) { |memo,(k,v)| memo[k.to_sym] = v; memo }
53
+ add_build_environment(id, be_sym_keys)
54
54
  end
55
55
  end
56
56
  end
@@ -4,6 +4,7 @@
4
4
  require "dr/package"
5
5
  require "dr/pkgversion"
6
6
  require "dr/shellcmd"
7
+ require "dr/utils"
7
8
 
8
9
  require "yaml"
9
10
  require "octokit"
@@ -70,8 +71,9 @@ module Dr
70
71
  @default_branch = get_current_branch
71
72
  end
72
73
 
73
- def reinitialise_repo
74
- git_addr = get_repo_url
74
+ def reinitialise_repo(git_addr=nil, branch=nil)
75
+ git_addr ||= get_repo_url
76
+ branch ||= @default_branch
75
77
 
76
78
  log :info, "Re-downloading the source repository of " +
77
79
  "#{@name.style "pkg-name"}"
@@ -83,7 +85,7 @@ module Dr
83
85
  src_dir = "#{tmp}/src"
84
86
  FileUtils.mkdir_p src_dir
85
87
 
86
- checkout @default_branch, src_dir
88
+ checkout branch, src_dir
87
89
 
88
90
  unless File.exists? "#{tmp}/src/debian/control"
89
91
  log :err, "The debian packaging files not found in the repository"
@@ -115,6 +117,25 @@ module Dr
115
117
  FileUtils.rm_rf src_dir
116
118
  FileUtils.mv "#{tmp}/git", "#{src_dir}"
117
119
  end
120
+
121
+ @default_branch = branch
122
+ end
123
+
124
+ def get_configuration
125
+ md_file = "#{@repo.location}/packages/#{@name}/metadata"
126
+ if File.exists? md_file
127
+ Utils::symbolise_keys YAML.load_file md_file
128
+ else
129
+ {}
130
+ end
131
+ end
132
+
133
+ def set_configuration(config)
134
+ # TODO: Some validation needed
135
+ md_file = "#{@repo.location}/packages/#{@name}/metadata"
136
+ File.open(md_file, "w") do |f|
137
+ YAML.dump Utils::stringify_symbols(config), f
138
+ end
118
139
  end
119
140
 
120
141
  def build(branch=nil, force=false)
@@ -139,7 +160,13 @@ module Dr
139
160
  Dir.mktmpdir do |src_dir|
140
161
  checkout branch, src_dir
141
162
 
142
- version = PkgVersion.new get_version "#{src_dir}/debian/changelog"
163
+ version_string = get_version "#{src_dir}/debian/changelog"
164
+ unless version_string
165
+ log :err, "Couldn't get the version string from the changelog"
166
+ raise "The changelog format doesn't seem be right"
167
+ end
168
+
169
+ version = PkgVersion.new version_string
143
170
  log :info, "Source version: #{version.source.style "version"}"
144
171
 
145
172
  while build_exists? version
@@ -168,14 +195,28 @@ module Dr
168
195
  repo_arches = @repo.get_architectures
169
196
  pkg_arches = get_architectures("#{src_dir}/debian/control")
170
197
  arches = case
171
- when pkg_arches.include?("any") || pkg_arches.include?("all")
198
+ when pkg_arches.include?("any")
172
199
  repo_arches
200
+ when pkg_arches.include?("all")
201
+ ["all"]
173
202
  else
174
203
  repo_arches & pkg_arches
175
204
  end
176
205
 
206
+ if repo_arches.length == 0
207
+ log :error, "#{@name.style "pkg-name"} cannot be build for any of " +
208
+ "the architectures supported by this repository"
209
+ raise "Unable to build the package for this repository"
210
+ end
211
+
212
+ benv = :default
213
+ src_meta = get_configuration
214
+ if src_meta.has_key? :build_environment
215
+ benv = src_meta[:build_environment].to_sym
216
+ end
217
+
177
218
  arches.each do |arch|
178
- @repo.buildroot(arch).open do |br|
219
+ @repo.buildroot(arch, benv).open do |br|
179
220
  log :info, "Building the #{@name.style "pkg-name"} package " +
180
221
  "version #{version.to_s.style "version"} for #{arch}"
181
222
 
@@ -42,6 +42,14 @@ module Dr
42
42
  FileUtils.rm_rf "#{@repo.location}/packages/#{@name}/builds/#{version}"
43
43
  end
44
44
 
45
+ def get_configuration
46
+ {}
47
+ end
48
+
49
+ def set_configuration(config)
50
+ raise "This package isn't configurable"
51
+ end
52
+
45
53
  def <=>(o)
46
54
  self.name <=> o.name
47
55
  end
@@ -8,6 +8,7 @@ require "dr/shellcmd"
8
8
  require "dr/logger"
9
9
  require "dr/gnupg"
10
10
  require "dr/buildroot"
11
+ require "dr/utils"
11
12
 
12
13
  require "fileutils"
13
14
  require "yaml"
@@ -24,13 +25,6 @@ module Dr
24
25
  @location = File.expand_path loc
25
26
 
26
27
  @packages_dir = "#{@location}/packages"
27
-
28
- meta = "#{@location}/metadata"
29
- begin
30
- @metadata = YAML.load_file(meta)
31
- rescue
32
- @metadata = {}
33
- end
34
28
  end
35
29
 
36
30
  def setup(conf)
@@ -78,13 +72,27 @@ module Dr
78
72
  FileUtils.mkdir_p @packages_dir
79
73
  FileUtils.mkdir_p "#{@location}/buildroots"
80
74
 
81
- @metadata = {"distro" => conf[:distro]}
75
+ metadata = {
76
+ "default_build_environment" => conf[:build_environment].to_s
77
+ }
82
78
  File.open("#{@location}/metadata", "w" ) do |out|
83
- YAML.dump(@metadata)
79
+ out.write metadata.to_yaml
84
80
  end
81
+ end
82
+
83
+ def get_configuration
84
+ meta_file = "#{@location}/metadata"
85
+ if File.exists? meta_file
86
+ Utils::symbolise_keys YAML.load_file(meta_file)
87
+ else
88
+ {}
89
+ end
90
+ end
85
91
 
86
- conf[:arches].each do |arch|
87
- buildroot arch
92
+ def set_configuration(new_metadata)
93
+ # TODO: Some validation needed
94
+ File.open("#{@location}/metadata", "w" ) do |out|
95
+ out.write Utils::stringify_symbols(new_metadata).to_yaml
88
96
  end
89
97
  end
90
98
 
@@ -109,9 +117,13 @@ module Dr
109
117
  pkgs.sort
110
118
  end
111
119
 
112
- def buildroot(arch)
120
+ def buildroot(arch, build_env=:default)
121
+ if build_env == :default
122
+ build_env = get_configuration[:default_build_environment].to_sym
123
+ end
124
+
113
125
  cache_dir = "#{@location}/buildroots/"
114
- BuildRoot.new @metadata["distro"], arch, cache_dir
126
+ BuildRoot.new build_env, arch, cache_dir
115
127
  end
116
128
 
117
129
  def get_package(name)
@@ -371,16 +383,6 @@ module Dr
371
383
  nil
372
384
  end
373
385
 
374
- private
375
- def get_key
376
- File.open "#{@location}/archive/conf/distributions", "r" do |f|
377
- f.each_line do |line|
378
- m = line.match /^SignWith: (.+)/
379
- return m.captures[0] if m
380
- end
381
- end
382
- end
383
-
384
386
  def is_used?(pkg_name, version=nil)
385
387
  versions_by_suite = get_subpackage_versions pkg_name
386
388
  versions_by_suite.inject(false) do |rslt, hash_pair|
@@ -392,5 +394,15 @@ module Dr
392
394
  end
393
395
  end
394
396
  end
397
+
398
+ private
399
+ def get_key
400
+ File.open "#{@location}/archive/conf/distributions", "r" do |f|
401
+ f.each_line do |line|
402
+ m = line.match /^SignWith: (.+)/
403
+ return m.captures[0] if m
404
+ end
405
+ end
406
+ end
395
407
  end
396
408
  end
@@ -0,0 +1,42 @@
1
+ # Copyright (C) 2014 Kano Computing Ltd.
2
+ # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
3
+
4
+ module Dr
5
+ module Utils
6
+ def self.symbolise_keys(hash)
7
+ if hash.is_a? Hash
8
+ hash.inject({}) do |new_hash, (key, value)|
9
+ new_hash[key.to_sym] = symbolise_keys value
10
+ new_hash
11
+ end
12
+ else
13
+ hash
14
+ end
15
+ end
16
+
17
+ def self.stringify_keys(hash)
18
+ return hash unless hash.is_a? Hash
19
+
20
+ hash.inject({}) do |new_hash, (key, value)|
21
+ new_hash[key.to_s] = stringify_keys value
22
+ new_hash
23
+ end
24
+ end
25
+
26
+ def self.stringify_symbols(var)
27
+ case
28
+ when var.is_a?(Hash)
29
+ var.inject({}) do |new_hash, (key, value)|
30
+ new_hash[key.to_s] = stringify_keys value
31
+ new_hash
32
+ end
33
+ when var.is_a?(Array)
34
+ var.map {|e| stringify_symbols e}
35
+ when var.is_a?(Symbol)
36
+ var.to_s
37
+ else
38
+ var
39
+ end
40
+ end
41
+ end
42
+ end
@@ -2,5 +2,5 @@
2
2
  # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
3
3
 
4
4
  module Dr
5
- VERSION = "0.2.5"
5
+ VERSION = "1.0.1"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Radek Pazdera
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-25 00:00:00.000000000 Z
11
+ date: 2015-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -116,10 +116,10 @@ files:
116
116
  - dr.conf-example
117
117
  - dr.spec
118
118
  - lib/dr.rb
119
+ - lib/dr/build_environments.rb
119
120
  - lib/dr/buildroot.rb
120
121
  - lib/dr/config.rb
121
122
  - lib/dr/debpackage.rb
122
- - lib/dr/distros.rb
123
123
  - lib/dr/gitpackage.rb
124
124
  - lib/dr/gnupg.rb
125
125
  - lib/dr/logger.rb
@@ -127,6 +127,7 @@ files:
127
127
  - lib/dr/pkgversion.rb
128
128
  - lib/dr/repo.rb
129
129
  - lib/dr/shellcmd.rb
130
+ - lib/dr/utils.rb
130
131
  - lib/dr/version.rb
131
132
  homepage: http://github.com/KanoComputing/kano-package-system
132
133
  licenses:
@@ -155,3 +156,4 @@ summary: dr stands for debian-repository. It is a packaging tool that helps you
155
156
  distribute and maintain you own disto packages and repositories. It's in a very
156
157
  early stage, NOT READY for production.
157
158
  test_files: []
159
+ has_rdoc: