packo 0.0.1.alpha.1 → 0.0.1.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/bin/packo +13 -2
  2. data/lib/packo.rb +16 -52
  3. data/lib/packo/cli.rb +9 -3
  4. data/lib/packo/cli/base.rb +65 -66
  5. data/lib/packo/cli/build.rb +124 -128
  6. data/lib/packo/cli/files.rb +7 -7
  7. data/lib/packo/cli/repository.rb +40 -26
  8. data/lib/packo/do.rb +106 -73
  9. data/lib/packo/environment.rb +2 -2
  10. data/lib/packo/extensions.rb +20 -6
  11. data/lib/packo/host.rb +10 -0
  12. data/lib/packo/models.rb +8 -2
  13. data/lib/packo/models/repository.rb +17 -14
  14. data/lib/packo/package.rb +9 -3
  15. data/lib/packo/profile.rb +2 -2
  16. data/lib/packo/rbuild.rb +0 -2
  17. data/lib/packo/rbuild/behaviors/default.rb +3 -2
  18. data/lib/packo/rbuild/{modules/misc/fetching.rb → behaviors/python.rb} +8 -3
  19. data/lib/packo/rbuild/modules.rb +2 -3
  20. data/lib/packo/rbuild/modules/building.rb +5 -2
  21. data/lib/packo/rbuild/modules/building/autotools.rb +11 -11
  22. data/lib/packo/rbuild/modules/building/rake.rb +71 -7
  23. data/lib/packo/rbuild/modules/building/scons.rb +128 -0
  24. data/lib/packo/rbuild/modules/{misc/fetcher.rb → fetcher.rb} +5 -5
  25. data/lib/packo/rbuild/modules/fetching.rb +29 -0
  26. data/lib/packo/rbuild/modules/{misc/fetching → fetching}/git.rb +15 -9
  27. data/lib/packo/rbuild/modules/{misc/fetching → fetching}/github.rb +1 -1
  28. data/lib/packo/rbuild/modules/{misc/fetching → fetching}/gnu.rb +1 -1
  29. data/lib/packo/rbuild/modules/{misc/fetching → fetching}/mercurial.rb +11 -7
  30. data/lib/packo/rbuild/modules/{misc/fetching → fetching}/sourceforge.rb +1 -1
  31. data/lib/packo/rbuild/modules/{misc/fetching → fetching}/subversion.rb +23 -5
  32. data/lib/packo/rbuild/modules/misc.rb +0 -8
  33. data/lib/packo/rbuild/modules/packager.rb +63 -0
  34. data/lib/packo/rbuild/modules/packaging.rb +2 -0
  35. data/lib/packo/rbuild/modules/packaging/pko.rb +24 -44
  36. data/lib/packo/rbuild/modules/{misc/unpacker.rb → unpacker.rb} +2 -2
  37. data/lib/packo/rbuild/modules/{misc/unpacking.rb → unpacking.rb} +6 -4
  38. data/lib/packo/rbuild/modules/{misc/unpacking → unpacking}/lzma.rb +1 -1
  39. data/lib/packo/rbuild/modules/{misc/unpacking → unpacking}/tar.rb +1 -1
  40. data/lib/packo/rbuild/modules/{misc/unpacking → unpacking}/xz.rb +1 -1
  41. data/lib/packo/rbuild/modules/{misc/unpacking → unpacking}/zip.rb +1 -1
  42. data/lib/packo/rbuild/package.rb +17 -8
  43. data/lib/packo/repository.rb +1 -1
  44. data/lib/packo/repository/virtual.rb +16 -0
  45. data/lib/packo/utils.rb +106 -0
  46. data/lib/packo/version.rb +1 -1
  47. metadata +39 -25
  48. data/lib/packo/rbuild/modules/misc/fetching/wget.rb +0 -57
data/bin/packo CHANGED
@@ -19,6 +19,8 @@
19
19
  # along with packo. If not, see <http://www.gnu.org/licenses/>.
20
20
  #++
21
21
 
22
+ require 'shellwords'
23
+
22
24
  commands = Dir.glob('/usr/bin/packo-*').map {|path|
23
25
  File.basename(path).sub('packo-', '')
24
26
  }
@@ -49,12 +51,21 @@ if commands.member?(ARGV.first)
49
51
  warn "sandbox isn't installed" if !sandbox
50
52
  warn "fakeroot isn't installed" if !fakeroot
51
53
 
52
- exit system(*([((!trusted.include?(command.to_sym)) ? 'sandbox' : nil), 'fakeroot', "packo-#{command}"] + ARGV).compact)
54
+ through = []
55
+
56
+ if !trusted.include?(command.to_sym)
57
+ through << 'sandbox'
58
+ end
59
+
60
+ through << 'fakeroot' << "packo-#{command}"
61
+
62
+ exit Kernel.system(*(through + ARGV.map {|arg|
63
+ arg.shellescape
64
+ }))
53
65
  end
54
66
 
55
67
  require 'rubygems' unless defined?(Gem)
56
68
 
57
- require 'packo'
58
69
  require 'packo/cli/base'
59
70
 
60
71
  class Application < Packo::CLI::Base
@@ -17,44 +17,10 @@
17
17
  # along with packo. If not, see <http://www.gnu.org/licenses/>.
18
18
  #++
19
19
 
20
- require 'ostruct'
20
+ require 'packo/utils'
21
+ require 'packo/extensions'
21
22
 
22
23
  module Packo
23
- def self.sh (*cmd, &block)
24
- options = (Hash === cmd.last) ? cmd.pop : {}
25
-
26
- if !block_given?
27
- show_command = cmd.join(' ')
28
- show_command = show_command[0, 42] + '...' unless $trace
29
-
30
- block = lambda {|ok, status|
31
- ok or fail "Command failed with status (#{status.exitstatus}): [#{show_command}] in {#{Dir.pwd}}"
32
- }
33
- end
34
-
35
- if options[:silent]
36
- options[:out] = '/dev/null'
37
- options[:err] = '/dev/null'
38
- else
39
- print "#{cmd.first} "
40
- cmd[1 .. cmd.length].each {|cmd|
41
- if cmd.match(/[ \$'`]/)
42
- print %Q{"#{cmd}" }
43
- else
44
- print "#{cmd} "
45
- end
46
- }
47
- print "\n"
48
- end
49
-
50
- options.delete :silent
51
-
52
- result = Kernel.system(options[:env] || {}, *cmd, options)
53
- status = $?
54
-
55
- block.call(result, status)
56
- end
57
-
58
24
  def self.debug (argument, options={})
59
25
  if !Packo.const_defined?(:System) || (!System.env[:DEBUG] && !options[:force])
60
26
  return
@@ -82,27 +48,26 @@ module Packo
82
48
  output << options[:separator]
83
49
  end
84
50
 
85
- puts output
86
- end
87
-
88
- def self.load (path, options={})
89
- if !File.readable? path
90
- raise LoadError.new("no such file to load -- #{path}")
91
- end
92
-
93
- eval("#{options[:before]}#{File.read(path, encoding: 'utf-8').split(/^__END__$/).first}#{options[:after]}", options[:binding] || binding, path, 1)
51
+ $stderr.puts output
94
52
  end
95
53
 
96
54
  def self.loadPackage (path, package=nil)
97
55
  options = {
98
- before: 'module ::Packo::RBuild;',
99
- after: ';end'
56
+ before: %{
57
+ module ::Packo::RBuild
58
+ include ::Packo::RBuild::Modules
59
+ include ::Packo::RBuild::Behaviors
60
+ },
61
+
62
+ after: %{
63
+ end
64
+ }
100
65
  }
101
66
 
102
67
  files = {}
103
68
 
104
69
  if package
105
- if File.exists?("#{path}/digest.xml") && (digest = Nokogiri::XML.parse(File.read("#{path}/digest.xml")))
70
+ if File.exists?("#{path}/digest.xml") && (digest = Nokogiri::XML.parse(File.read("#{path}/digest.xml", encoding: 'utf-8')))
106
71
  features = digest.xpath("//build[@version = '#{package.version}'][@slot = '#{package.slot}']/features").first
107
72
 
108
73
  if features
@@ -137,7 +102,7 @@ module Packo
137
102
  begin
138
103
  Packo.load "#{path}/#{package.name}.rbuild", options
139
104
 
140
- if (pkg = RBuild::Package.last) && (tmp = File.read("#{path}/#{package.name}.rbuild").split(/^__END__$/)).length > 1
105
+ if (pkg = RBuild::Package.last) && (tmp = File.read("#{path}/#{package.name}.rbuild", encoding: 'utf-8').split(/^__END__$/)).length > 1
141
106
  pkg.filesystem.parse(tmp.last.lstrip)
142
107
  end
143
108
  rescue Exception => e
@@ -149,7 +114,7 @@ module Packo
149
114
  if RBuild::Package.last.name == package.name && RBuild::Package.last.version == package.version
150
115
  RBuild::Package.last.filesystem.merge!(pkg.filesystem)
151
116
 
152
- if (tmp = File.read("#{path}/#{package.name}-#{package.version}.rbuild").split(/^__END__$/)).length > 1
117
+ if (tmp = File.read("#{path}/#{package.name}-#{package.version}.rbuild", encoding: 'utf-8').split(/^__END__$/)).length > 1
153
118
  RBuild::Package.last.filesystem.parse(tmp.last.lstrip)
154
119
  end
155
120
 
@@ -165,7 +130,7 @@ module Packo
165
130
  begin
166
131
  Packo.load path, options
167
132
 
168
- if (pkg = RBuild::Package.last) && (tmp = File.read(path).split(/^__END__$/)).length > 1
133
+ if (pkg = RBuild::Package.last) && (tmp = File.read(path, encoding: 'utf-8').split(/^__END__$/)).length > 1
169
134
  pkg.filesystem.parse(tmp.last.lstrip)
170
135
  end
171
136
  rescue Exception => e
@@ -178,7 +143,6 @@ module Packo
178
143
  end
179
144
 
180
145
  require 'packo/version'
181
- require 'packo/extensions'
182
146
  require 'packo/system'
183
147
  require 'packo/do'
184
148
  require 'packo/cli'
@@ -52,15 +52,21 @@ module Packo
52
52
 
53
53
  module CLI
54
54
  def self.info (text)
55
- puts "#{'*'.green.bold} #{text}"
55
+ text.strip.lines.each {|line|
56
+ puts "#{'*'.green.bold} #{line.strip}"
57
+ }
56
58
  end
57
59
 
58
60
  def self.warn (text)
59
- puts "#{'*'.yellow.bold} #{text}"
61
+ text.strip.lines.each {|line|
62
+ puts "#{'*'.yellow.bold} #{line.strip}"
63
+ }
60
64
  end
61
65
 
62
66
  def self.fatal (text)
63
- puts "#{'*'.red} #{text}"
67
+ text.strip.lines.each {|line|
68
+ puts "#{'*'.red} #{line.strip}"
69
+ }
64
70
  end
65
71
  end
66
72
 
@@ -37,7 +37,7 @@ class Base < Thor
37
37
  method_option :ignore, type: :boolean, default: false, aliases: '-x', desc: 'Ignore the installation and do not add the package to the database'
38
38
  method_option :nodeps, type: :boolean, default: false, aliases: '-N', desc: 'Ignore blockers and dependencies'
39
39
  method_option :depsonly, type: :boolean, default: false, aliases: '-D', desc: 'Install only dependencies'
40
- method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific repository'
40
+ method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific repository'
41
41
  def install (*names)
42
42
  type = names.last.is_a?(Symbol) ? names.pop : :both
43
43
 
@@ -142,7 +142,7 @@ class Base < Thor
142
142
 
143
143
  name = "#{env[:TMP]}/#{name}"
144
144
 
145
- if (digest = _digest(package, env)) && (result = Do.digest(name)) != digest
145
+ if (digest = _digest(package, env)) && (result = Packo.digest(name)) != digest
146
146
  CLI.fatal "Digest mismatch (got #{result} expected #{digest}), install this package from source, the mirror could be compromised"
147
147
  exit 13
148
148
  end
@@ -266,64 +266,56 @@ class Base < Thor
266
266
  old = path
267
267
 
268
268
  begin
269
- Find.find("#{path}/dist") {|file|
270
- next unless file[length, file.length]
271
-
272
- type = nil
273
- path = (options[:destination] + file[length, file.length]).cleanpath.to_s
274
- fake = path[options[:destination].cleanpath.to_s.length, path.length] || ''
275
- meta = nil
276
-
277
- if !options[:force] && File.exists?(path) && !File.directory?(path)
278
- if (tmp = _exists?(fake))
279
- CLI.fatal "#{path} belongs to #{tmp}, use --force to overwrite"
269
+ Packo.contents(Find.find("#{path}/dist")) {|file|
270
+ if !file[length, file.length]
271
+ { next: true }
272
+ else
273
+ { path: Path.clean(options[:destination] + file[length, file.length]) }
274
+ end
275
+ }.each {|file|
276
+ if !options[:force] && File.exists?(file.path) && !File.directory?(file.path)
277
+ if (tmp = _exists?(file.path))
278
+ CLI.fatal "#{file.path} belongs to #{tmp}, use --force to overwrite"
280
279
  else
281
- CLI.fatal "#{path} doesn't belong to any package, use --force to overwrite"
280
+ CLI.fatal "#{file.path} doesn't belong to any package, use --force to overwrite"
282
281
  end
283
282
 
284
283
  raise RuntimeError.new 'File collision'
285
284
  end
286
285
 
287
- if File.directory?(file)
288
- type = :dir
286
+ case file.type
287
+ when :dir
288
+ begin
289
+ FileUtils.mkpath(file.path)
290
+ puts "--- #{file.path if file.path != '/'}/"
291
+ rescue
292
+ puts "--- #{file.path if file.path != '/'}/".red
293
+ end
289
294
 
290
- begin
291
- FileUtils.mkpath(path)
292
- puts "--- #{path if path != '/'}/"
293
- rescue
294
- puts "--- #{path if path != '/'}/".red
295
- end
296
- elsif File.symlink?(file)
297
- type = :sym
298
- meta = File.readlink(file)
299
-
300
- begin
301
- FileUtils.ln_sf meta, path
302
- puts ">>> #{path} -> #{meta}".cyan.bold
303
- rescue
304
- puts ">>> #{path} -> #{meta}".red
305
- end
306
- elsif File.file?(file)
307
- type = :obj
308
- meta = Do.digest(file)
309
-
310
- begin
311
- FileUtils.cp file, path, preserve: true
312
- puts ">>> #{path}".bold
313
- rescue
314
- puts ">>> #{path}".red
315
- end
316
- else
317
- next
295
+ when :sym
296
+ begin
297
+ FileUtils.ln_sf file.meta, file.path
298
+ puts ">>> #{file.path} -> #{file.meta}".cyan.bold
299
+ rescue
300
+ puts ">>> #{file.path} -> #{file.meta}".red
301
+ end
302
+
303
+ when :obj
304
+ begin
305
+ FileUtils.cp file.source, file.path, preserve: true
306
+ puts ">>> #{file.path}".bold
307
+ rescue
308
+ puts ">>> #{file.path}".red
309
+ end
318
310
  end
319
311
 
320
312
  content = pkg.contents.first_or_create(
321
- type: type,
322
- path: fake
313
+ type: file.type,
314
+ path: file.path
323
315
  )
324
316
 
325
317
  content.update(
326
- meta: meta
318
+ meta: file.meta
327
319
  )
328
320
  }
329
321
 
@@ -337,7 +329,7 @@ class Base < Thor
337
329
 
338
330
  case content.type
339
331
  when :obj
340
- if File.exists?(path) && (options[:force] || content.meta == Do.digest(path))
332
+ if File.exists?(path) && (options[:force] || content.meta == Packo.digest(path))
341
333
  puts "<<< #{path}".bold
342
334
  FileUtils.rm_f(path) rescue nil
343
335
  else
@@ -371,7 +363,7 @@ class Base < Thor
371
363
  if options[:ignore]
372
364
  t.rollback
373
365
  else
374
- pkg.update(destination: options[:destination].cleanpath)
366
+ pkg.update(destination: Path.clean(options[:destination]))
375
367
  end
376
368
  }
377
369
  }
@@ -386,17 +378,22 @@ class Base < Thor
386
378
 
387
379
  if packages.empty?
388
380
  CLI.fatal "No installed packages match #{name}"
381
+
389
382
  exit 20
390
383
  end
391
384
 
392
385
  packages.each {|installed|
386
+ if installed.repository && installed.repository.type == :virtual
387
+ repository.uninstall(installed) or next
388
+ end
389
+
393
390
  Models.transaction {
394
391
  installed.model.contents.each {|content| content.check!
395
392
  path = "#{installed.model.destination}/#{content.path}".gsub(%r{/*/}, '/')
396
393
 
397
394
  case content.type
398
395
  when :obj
399
- if File.exists?(path) && (options[:force] || content.meta == Do.digest(path))
396
+ if File.exists?(path) && (options[:force] || content.meta == Packo.digest(path))
400
397
  puts "<<< #{path}".bold
401
398
  FileUtils.rm_f(path) rescue nil
402
399
  else
@@ -430,8 +427,8 @@ class Base < Thor
430
427
 
431
428
  desc 'search [EXPRESSION] [OPTIONS]', 'Search through installed packages'
432
429
  map '--search' => :search, '-Ss' => :search
433
- method_option :type, type: :string, aliases: '-t', desc: 'The repository type (binary, source, virtual)'
434
- method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific repository'
430
+ method_option :type, type: :string, aliases: '-t', desc: 'The repository type (binary, source, virtual)'
431
+ method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific repository'
435
432
  method_option :full, type: :boolean, default: false, aliases: '-F', desc: 'Include the repository that owns the package, features and flavor'
436
433
  def search (expression='')
437
434
  Models.search_installed(expression, options[:repository], options[:type]).group_by {|package|
@@ -447,7 +444,9 @@ class Base < Thor
447
444
  print "#{"#{packages.first.tags}/" unless packages.first.tags.empty?}#{packages.first.name.bold}"
448
445
 
449
446
  print ' ('
450
- print packages.map {|package|
447
+ print packages.sort {|a, b|
448
+ a.version <=> b.version
449
+ }.map {|package|
451
450
  "#{package.version.to_s.red}" + (package.slot ? "%#{package.slot.to_s.blue.bold}" : '')
452
451
  }.join(', ')
453
452
  print ')'
@@ -461,7 +460,9 @@ class Base < Thor
461
460
  else
462
461
  print "#{packages.first.tags}/#{packages.first.name.bold} ("
463
462
 
464
- print packages.map {|package|
463
+ print packages.sort {|a, b|
464
+ a.version <=> b.version
465
+ }.map {|package|
465
466
  "#{package.version.to_s.red}" + (package.slot ? "%#{package.slot.to_s.blue.bold}" : '')
466
467
  }.join(', ')
467
468
 
@@ -503,21 +504,19 @@ class Base < Thor
503
504
  end
504
505
 
505
506
  def _build (package, env)
506
- Do.cd {
507
- FileUtils.rm_rf "#{System.env[:TMP]}/.__packo_build", secure: true rescue nil
508
- FileUtils.mkpath "#{System.env[:TMP]}/.__packo_build" rescue nil
507
+ FileUtils.rm_rf "#{System.env[:TMP]}/.__packo_build", secure: true rescue nil
508
+ FileUtils.mkpath "#{System.env[:TMP]}/.__packo_build" rescue nil
509
509
 
510
- require 'packo/cli/build'
510
+ require 'packo/cli/build'
511
511
 
512
- begin
513
- System.env.sandbox(env) {
514
- Packo::CLI::Build.start(['package', package.to_s(:whole), "--output=#{System.env[:TMP]}/.__packo_build", "--repository=#{package.repository}"])
515
- }
516
- rescue
517
- end
512
+ begin
513
+ System.env.sandbox(env) {
514
+ Packo::CLI::Build.start(['package', package.to_s(:whole), "--output=#{System.env[:TMP]}/.__packo_build", "--repository=#{package.repository}"])
515
+ }
516
+ rescue
517
+ end
518
518
 
519
- Dir.glob("#{System.env[:TMP]}/.__packo_build/#{package.name}-#{package.version}*.pko").first
520
- }
519
+ Dir.glob("#{System.env[:TMP]}/.__packo_build/#{package.name}-#{package.version}*.pko").first
521
520
  end
522
521
 
523
522
  def _manifest (package, env)
@@ -18,9 +18,6 @@
18
18
  # along with packo. If not, see <http://www.gnu.org/licenses/>.
19
19
  #++
20
20
 
21
- require 'nokogiri'
22
- require 'digest/sha1'
23
-
24
21
  require 'packo'
25
22
  require 'packo/rbuild'
26
23
 
@@ -35,131 +32,8 @@ class Build < Thor
35
32
  method_option :output, type: :string, default: System.env[:TMP], aliases: '-o', desc: 'The directory where to save packages'
36
33
  method_option :wipe, type: :boolean, default: false, aliases: '-w', desc: 'Wipes the package directory before building it'
37
34
  method_option :ask, type: :boolean, default: false, aliases: '-a', desc: 'Prompt the user if he want to continue building or not'
38
- method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific source repository'
39
- method_option :execute, type: :string, aliases: '-x', desc: 'Create a package from an executed command instead of from an RBuild'
40
- method_option :bump, type: :boolean, default: true, aliases: '-b', desc: 'Bump revision when creating a package from command if package is installed'
41
- method_option :inspect, type: :boolean, default: false, aliases: '-i', desc: 'Inspect the list of files that will be included in the package in EDITOR'
35
+ method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific source repository'
42
36
  def package (*packages)
43
- if command = options[:execute]
44
- if System.env[:SANDBOX_ACTIVE] || System.env[:FAKED_MODE]
45
- CLI.warn "`packo build -x` may not work properly, try with `packo-build -x` if it fails.\n\n"
46
- end
47
-
48
- package = Package.parse(packages.first)
49
-
50
- unless package.name && package.version
51
- CLI.fatal 'You have to pass a valid package name and version, like package-0.2'
52
- exit 1
53
- end
54
-
55
- package = RBuild::Package.define(package.name, package.version) {
56
- tags *package.tags
57
-
58
- description "Built in: `#{Dir.pwd}` with `#{command}`"
59
- maintainer ENV['USER']
60
- }
61
-
62
- package.avoid RBuild::Behaviors::Default
63
-
64
- package.clean!
65
- package.create!
66
-
67
- tmp = Tempfile.new('packo')
68
- dir = "#{System.env[:TMP]}/#{Process.pid}"
69
-
70
- tmp.write %{
71
- #! /bin/sh
72
-
73
- cd "#{Dir.pwd}"
74
-
75
- #{command}
76
-
77
- exit $?
78
- }
79
-
80
- tmp.chmod 0700
81
- tmp.close
82
-
83
- Packo.sh 'installwatch', "--logfile=#{package.tempdir}/newfiles.log", "--exclude=#{Dir.pwd}",
84
- "--root=#{package.workdir}", '--transl=yes', '--backup=no', tmp.path
85
-
86
- inspect = options[:inspect]
87
-
88
- package.before :pack, priority: -42 do
89
- files = File.new("#{tempdir}/newfiles", 'w')
90
-
91
- files.print File.new("#{tempdir}/newfiles.log", 'r').lines.map {|line| line.strip!
92
- whole, type = line.match(/^.*?\t(.*?)\t/).to_a
93
-
94
- case type
95
- when 'chmod', 'open'
96
- whole, file = line.match(/.*?\t.*?\t(.*?)(\t|$)/).to_a
97
-
98
- next if file.match(%r[^(/dev|#{Regexp.escape(Dir.pwd)}|/tmp)(/|$)])
99
-
100
- file
101
-
102
- when 'symlink'
103
- whole, to, file = line.match(/.*?\t.*?\t(.*?)\t(.*?)(\t|$)/).to_a
104
-
105
- "#{file} -> #{to}"
106
- end
107
- }.compact.uniq.sort.join("\n")
108
-
109
- files.close
110
-
111
- if inspect
112
- Packo.sh System.env[:EDITOR] || 'vi', files.path
113
- end
114
-
115
- links = []
116
-
117
- File.new("#{tempdir}/newfiles", 'r').lines.each {|line|
118
- whole, file, link = line.match(/^(.*?)(?: -> (.*?))?$/).to_a
119
-
120
- FileUtils.mkpath "#{distdir}/#{File.dirname(file)}"
121
-
122
- if link
123
- links << [link, file]
124
- else
125
- FileUtils.cp "#{workdir}/TRANSL/#{file}", "#{distdir}/#{file}"
126
- end
127
- }
128
-
129
- links.each {|(link, file)|
130
- FileUtils.ln_sf link, "#{distdir}/#{file}" rescue nil
131
- }
132
- end
133
-
134
- package.before :pack! do
135
- if inspect
136
- Packo.sh System.env[:EDITOR] || 'vi', "#{directory}/manifest.xml"
137
- end
138
- end
139
-
140
- if options[:bump]
141
- require 'packo/models'
142
-
143
- if !Models.search_installed(package.to_s).empty?
144
- package.revision = Models.search_installed(package.to_s).first.revision + 1
145
- end
146
- end
147
-
148
- begin
149
- package.build {|stage|
150
- CLI.info "Executing #{stage.name}"
151
- }
152
-
153
- CLI.info "Succesfully built #{package}"
154
- rescue Exception => e
155
- CLI.fatal "Failed to build #{package}"
156
- CLI.fatal e.message
157
- Packo.debug e
158
- end
159
-
160
- exit 0
161
- end
162
-
163
37
  Environment.new {|env|
164
38
  if !env[:ARCH] || !env[:KERNEL] || !env[:LIBC] || !env[:COMPILER]
165
39
  CLI.fatal 'You have to set ARCH, KERNEL, LIBC and COMPILER to build packages.'
@@ -259,6 +133,128 @@ class Build < Thor
259
133
  }
260
134
  end
261
135
 
136
+
137
+ desc 'command PACKAGE COMMAND', 'Build package from an executed command'
138
+ method_option :bump, type: :boolean, default: true, aliases: '-b', desc: 'Bump revision when creating a package from command if package is installed'
139
+ method_option :inspect, type: :boolean, default: false, aliases: '-i', desc: 'Inspect the list of files that will be included in the package in EDITOR'
140
+ def command (package, command)
141
+ if Packo.protected?
142
+ CLI.warn "`packo build -x` may not work properly, try with `packo-build -x` if it fails.\n\n"
143
+ end
144
+
145
+ package = Package.parse(package)
146
+
147
+ unless package.name && package.version
148
+ CLI.fatal 'You have to pass a valid package name and version, like package-0.2'
149
+ exit 1
150
+ end
151
+
152
+ package = RBuild::Package.define(package.name, package.version) {
153
+ tags *package.tags
154
+
155
+ description "Built in: `#{Dir.pwd}` with `#{command}`"
156
+ maintainer ENV['USER']
157
+ }
158
+
159
+ package.avoid RBuild::Behaviors::Default
160
+
161
+ package.clean!
162
+ package.create!
163
+
164
+ tmp = Tempfile.new('packo')
165
+ dir = "#{System.env[:TMP]}/#{Process.pid}"
166
+
167
+ tmp.write %{
168
+ #! /bin/sh
169
+
170
+ cd "#{Dir.pwd}"
171
+
172
+ #{command}
173
+
174
+ exit $?
175
+ }
176
+
177
+ tmp.chmod 0700
178
+ tmp.close
179
+
180
+ Packo.sh 'installwatch', "--logfile=#{package.tempdir}/newfiles.log", "--exclude=#{Dir.pwd}",
181
+ "--root=#{package.workdir}", '--transl=yes', '--backup=no', tmp.path
182
+
183
+ inspect = options[:inspect]
184
+
185
+ package.before :pack, priority: -42 do
186
+ files = File.new("#{tempdir}/newfiles", 'w')
187
+
188
+ files.print File.new("#{tempdir}/newfiles.log", 'r').lines.map {|line| line.strip!
189
+ whole, type = line.match(/^.*?\t(.*?)\t/).to_a
190
+
191
+ case type
192
+ when 'chmod', 'open'
193
+ whole, file = line.match(/.*?\t.*?\t(.*?)(\t|$)/).to_a
194
+
195
+ next if file.match(%r[^(/dev|#{Regexp.escape(Dir.pwd)}|/tmp)(/|$)])
196
+
197
+ file
198
+
199
+ when 'symlink'
200
+ whole, to, file = line.match(/.*?\t.*?\t(.*?)\t(.*?)(\t|$)/).to_a
201
+
202
+ "#{file} -> #{to}"
203
+ end
204
+ }.compact.uniq.sort.join("\n")
205
+
206
+ files.close
207
+
208
+ if inspect
209
+ Packo.sh System.env[:EDITOR] || 'vi', files.path
210
+ end
211
+
212
+ links = []
213
+
214
+ File.new("#{tempdir}/newfiles", 'r').lines.each {|line|
215
+ whole, file, link = line.match(/^(.*?)(?: -> (.*?))?$/).to_a
216
+
217
+ FileUtils.mkpath "#{distdir}/#{File.dirname(file)}"
218
+
219
+ if link
220
+ links << [link, file]
221
+ else
222
+ FileUtils.cp "#{workdir}/TRANSL/#{file}", "#{distdir}/#{file}"
223
+ end
224
+ }
225
+
226
+ links.each {|(link, file)|
227
+ FileUtils.ln_sf link, "#{distdir}/#{file}" rescue nil
228
+ }
229
+ end
230
+
231
+ package.before :pack! do
232
+ if inspect
233
+ Packo.sh System.env[:EDITOR] || 'vi', "#{directory}/manifest.xml"
234
+ end
235
+ end
236
+
237
+ if options[:bump]
238
+ require 'packo/models'
239
+
240
+ if !Models.search_installed(package.to_s).empty?
241
+ package.revision = Models.search_installed(package.to_s).first.revision + 1
242
+ end
243
+ end
244
+
245
+ begin
246
+ package.build {|stage|
247
+ CLI.info "Executing #{stage.name}"
248
+ }
249
+
250
+ CLI.info "Succesfully built #{package}"
251
+ rescue Exception => e
252
+ CLI.fatal "Failed to build #{package}"
253
+ CLI.fatal e.message
254
+ Packo.debug e
255
+ end
256
+ end
257
+
262
258
  desc 'clean PACKAGE... [OPTIONS]', 'Clean packages'
263
259
  method_option :repository, type: :string, aliases: '-r', desc: 'Set a specific source repository'
264
260
  def clean (*packages)
@@ -348,7 +344,7 @@ class Build < Thor
348
344
  package.distfiles.to_a.each {|(name, file)|
349
345
  file ||= name
350
346
 
351
- xml.file({ name: File.basename(file.path), url: file.url }, Do.digest(file.path))
347
+ xml.file({ name: File.basename(file.path), url: file.url }, Packo.digest(file.path))
352
348
  } if package.distfiles
353
349
  }
354
350
  }