akabei 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39a3493902116cd70169c7a1382cb5dad14706fa
4
- data.tar.gz: 53206e6bee4946e2630bdf6595ca962c072507c6
3
+ metadata.gz: 714ce0c1f0f26800d43745ab916973a83d66f13b
4
+ data.tar.gz: 663049f39fedbb24acc729035a6809c615a66fce
5
5
  SHA512:
6
- metadata.gz: 48ea7905fcac6b97925dd8d24deb305b615456a715c6dcd33925341a1f91aeecd540afc080138b8b9ff3ceb4a93aae430e6908359d721531a92bf108c2c123b2
7
- data.tar.gz: 4058f0fb57b93b7df183de54bae4ef241fc483b47473d4b054b5443505236e13437f6fef92316dd9d67ae8ec0c823a53de18397d387a8dde1df2b662a9a94f71
6
+ metadata.gz: 68684dbf90c74d3582fc1277a5a046350e98f9c27ab2c9a7caf7f8542fae553d953965996a58f0a5f68078b6d6d4cb5a6f281983536ece9c48555790d628870d
7
+ data.tar.gz: d4e2bf3a2d56cb0410942aaa10324c24e27e3aec3dc27e83632ad819bc36da35e674cb1e417dc0ed972f36dd14d94dc61acdbc9a78d8a8b037f2c7e473967f6b
@@ -1,3 +1,8 @@
1
+ # 0.3.0 (2014-01-23)
2
+ - Add `akabei omakase remove` command
3
+ - Add `akabei version` command
4
+ - Check package_dir before executing any commands
5
+
1
6
  # 0.2.1 (2014-01-19)
2
7
  - Fix Repository#add to remove old entry with same pkgname
3
8
 
@@ -21,9 +21,9 @@ module Akabei
21
21
  ArchiveUtils.extract_all(@path, tree)
22
22
  end
23
23
  pkgname = detect_pkgname(srcpkg)
24
- FileUtils.rm_rf(root.join(pkgname).to_s)
24
+ FileUtils.rm_rf(root.join(pkgname))
25
25
  ArchiveUtils.extract_all(srcpkg, root)
26
- FileUtils.rm_f(@path.to_s)
26
+ FileUtils.rm_f(@path)
27
27
  ArchiveUtils.archive_all(tree, @path, Archive::COMPRESSION_GZIP, Archive::FORMAT_TAR)
28
28
  end
29
29
  end
@@ -1,6 +1,11 @@
1
+ require 'akabei/error'
2
+
1
3
  module Akabei
2
4
  module BuildHelper
3
5
  def build_in_chroot(builder, chroot, repo_db, repo_files, abs, package_dir)
6
+ unless package_dir.directory?
7
+ raise Error.new("#{package_dir} isn't a directory")
8
+ end
4
9
  chroot.with_chroot do
5
10
  packages = builder.build_package(package_dir, chroot)
6
11
  packages.each do |package|
@@ -1,6 +1,7 @@
1
1
  require 'akabei/attr_path'
2
2
  require 'akabei/error'
3
3
  require 'akabei/package'
4
+ require 'akabei/system'
4
5
  require 'fileutils'
5
6
  require 'tmpdir'
6
7
 
@@ -27,7 +28,7 @@ module Akabei
27
28
  PKGDEST: tmp_pkgdest.realpath,
28
29
  LOGDEST: logdest.realpath,
29
30
  }
30
- chroot_tree.makechrootpkg(dir.to_s, env)
31
+ chroot_tree.makechrootpkg(dir, env)
31
32
  gather_packages(tmp_pkgdest)
32
33
  end
33
34
  end
@@ -43,7 +44,7 @@ module Akabei
43
44
  end
44
45
 
45
46
  def copy_and_sign_package(package_path, dest)
46
- FileUtils.cp(package_path.to_s, dest.to_s)
47
+ FileUtils.cp(package_path, dest)
47
48
  if signer
48
49
  signer.detach_sign(dest)
49
50
  end
@@ -92,13 +93,11 @@ module Akabei
92
93
 
93
94
  def makepkg_source(dir, srcdest, srcpkgdest, builddir)
94
95
  env = {
95
- 'SRCDEST' => srcdest.realpath.to_s,
96
- 'SRCPKGDEST' => srcpkgdest.realpath.to_s,
97
- 'BUILDDIR' => builddir.realpath.to_s,
96
+ SRCDEST: srcdest.realpath,
97
+ SRCPKGDEST: srcpkgdest.realpath,
98
+ BUILDDIR: builddir.realpath,
98
99
  }
99
- unless system(env, 'makepkg', '--source', chdir: dir)
100
- raise Error.new("makepkg --source failed: #{dir}")
101
- end
100
+ System.system(%w[makepkg --source], chdir: dir, env: env)
102
101
  end
103
102
 
104
103
  def find_source_package(srcpkgdest)
@@ -1,18 +1,11 @@
1
1
  require 'akabei/attr_path'
2
2
  require 'akabei/error'
3
+ require 'akabei/system'
3
4
  require 'pathname'
4
5
  require 'tmpdir'
5
6
 
6
7
  module Akabei
7
8
  class ChrootTree
8
- class CommandFailed < Error
9
- attr_reader :args
10
- def initialize(args)
11
- super("command failed: #{args.join(' ')}")
12
- @args = args
13
- end
14
- end
15
-
16
9
  attr_reader :root, :arch
17
10
  extend AttrPath
18
11
  attr_path_accessor :makepkg_config, :pacman_config
@@ -26,57 +19,33 @@ module Akabei
26
19
 
27
20
  def with_chroot(&block)
28
21
  if @root
29
- mkarchroot(*BASE_PACKAGES)
22
+ mkarchroot(BASE_PACKAGES)
30
23
  block.call
31
24
  else
32
25
  @root = Pathname.new(Dir.mktmpdir)
33
26
  begin
34
- mkarchroot(*BASE_PACKAGES)
27
+ mkarchroot(BASE_PACKAGES)
35
28
  block.call
36
29
  ensure
37
- execute('rm', '-rf', @root.to_s)
30
+ System.sudo(['rm', '-rf', @root], {})
38
31
  @root = nil
39
32
  end
40
33
  end
41
34
  end
42
35
 
43
36
  def makechrootpkg(dir, env)
44
- execute('makechrootpkg', '-cur', @root.to_s, chdir: dir, env: env)
37
+ System.sudo(['makechrootpkg', '-cur', @root], chdir: dir, env: env, arch: @arch)
45
38
  end
46
39
 
47
- def mkarchroot(*args)
40
+ def mkarchroot(args)
48
41
  cmd = ['mkarchroot']
49
42
  [['-M', makepkg_config], ['-C', pacman_config]].each do |flag, path|
50
43
  if path
51
- cmd << flag << path.to_s
44
+ cmd << flag << path
52
45
  end
53
46
  end
54
- cmd << @root.join('root').to_s
55
- execute(*(cmd + args))
56
- end
57
-
58
- def arch_nspawn(*args)
59
- execute('arch-nspawn', @root.join('root').to_s, *args)
60
- end
61
-
62
- def execute(*args)
63
- if args.last.is_a?(Hash)
64
- opts = args.last
65
- if opts.has_key?(:env)
66
- opts = opts.dup
67
- env = opts.delete(:env)
68
- env.each do |k, v|
69
- args.unshift("#{k}=#{v}")
70
- end
71
- args.unshift('env')
72
- args[-1] = opts
73
- end
74
- end
75
-
76
- puts "Execute: #{args.join(' ')}"
77
- unless system('sudo', 'setarch', @arch, *args)
78
- raise CommandFailed.new(args)
79
- end
47
+ cmd << @root.join('root')
48
+ System.sudo(cmd + args, arch: @arch)
80
49
  end
81
50
  end
82
51
  end
@@ -6,6 +6,7 @@ require 'akabei/omakase/cli'
6
6
  require 'akabei/package'
7
7
  require 'akabei/repository'
8
8
  require 'akabei/signer'
9
+ require 'akabei/version'
9
10
  require 'pathname'
10
11
  require 'thor'
11
12
  require 'tmpdir'
@@ -43,6 +44,8 @@ module Akabei
43
44
  end
44
45
  extend CommonOptions
45
46
 
47
+ package_name 'akabei'
48
+
46
49
  include BuildHelper
47
50
  desc 'build DIR', 'Build package in chroot environment'
48
51
  option :chroot_dir,
@@ -97,7 +100,7 @@ module Akabei
97
100
 
98
101
  abs = Abs.new(repo_path.join("#{repo_name}.abs.tar.gz"), repo_name)
99
102
 
100
- build_in_chroot(builder, chroot, repo_db, repo_files, abs, package_dir)
103
+ build_in_chroot(builder, chroot, repo_db, repo_files, abs, Pathname.new(package_dir))
101
104
  repo_db.save(db_path)
102
105
  repo_files.save(files_path)
103
106
  end
@@ -156,6 +159,18 @@ module Akabei
156
159
  repo.save(db_path)
157
160
  end
158
161
 
159
- Akabei::CLI.register(Akabei::Omakase::CLI, 'omakase', 'omakase <command>', 'Omakase mode')
162
+ desc 'version', 'Show version'
163
+ option :numeric,
164
+ desc: 'Display version number only',
165
+ type: :boolean
166
+ def version
167
+ if options[:numeric]
168
+ puts VERSION
169
+ else
170
+ puts "akabei #{VERSION} on #{RUBY_DESCRIPTION}"
171
+ end
172
+ end
173
+
174
+ Akabei::CLI.register(Akabei::Omakase::CLI, 'omakase', 'omakase <command>', 'Omakase mode. See `akabei omakase help`.')
160
175
  end
161
176
  end
@@ -20,7 +20,7 @@ module Akabei
20
20
  super(task, nil, true)
21
21
  end
22
22
 
23
- desc 'init NAME', "Generate omakase template for NAME repository"
23
+ desc 'init NAME', 'Generate omakase template for NAME repository'
24
24
  option :repo_key,
25
25
  desc: 'GPG key to sign repository database',
26
26
  banner: 'GPGKEY',
@@ -67,7 +67,7 @@ module Akabei
67
67
  say('Edit etc/makepkg.*.conf and set PACKAGER first!', :green)
68
68
  end
69
69
 
70
- desc 'build PACKAGE_NAME', "build PACKAGE_NAME"
70
+ desc 'build PACKAGE_NAME', 'Build PACKAGE_NAME'
71
71
  def build(package_name)
72
72
  builder = Builder.new(
73
73
  signer: config.package_signer,
@@ -75,7 +75,6 @@ module Akabei
75
75
  logdest: config.logdest,
76
76
  )
77
77
  repo_signer = config.repo_signer
78
-
79
78
  s3 = S3.new(config['s3'], shell)
80
79
 
81
80
  config.builds.each do |arch, config_file|
@@ -102,6 +101,29 @@ module Akabei
102
101
  end
103
102
  end
104
103
 
104
+ desc 'remove PACKAGE_NAME', 'Remove PACKAGE_NAME'
105
+ def remove(package_name)
106
+ repo_signer = config.repo_signer
107
+ s3 = S3.new(config['s3'], shell)
108
+
109
+ config.builds.each do |arch, config_file|
110
+ db_path = config.db_path(arch)
111
+ files_path = config.files_path(arch)
112
+ abs = Abs.new(config.abs_path(arch), config.name)
113
+
114
+ s3.before!(config, arch)
115
+ repo_db = Repository.load(db_path, signer: repo_signer)
116
+ repo_files = Repository.load(files_path, include_files: true)
117
+
118
+ remove_it(repo_db, package_name)
119
+ remove_it(repo_files, package_name)
120
+ abs.remove(package_name)
121
+ repo_db.save(db_path)
122
+ repo_files.save(files_path)
123
+ s3.after!(config, arch, [])
124
+ end
125
+ end
126
+
105
127
  private
106
128
 
107
129
  def config
@@ -111,6 +133,15 @@ module Akabei
111
133
  c
112
134
  end
113
135
  end
136
+
137
+ def remove_it(repo, package_name)
138
+ entry = repo.remove(package_name)
139
+ if entry
140
+ say("#{entry.db_name} is removed")
141
+ else
142
+ say("WARNING: #{package_name} doesn't exist", :yellow)
143
+ end
144
+ end
114
145
  end
115
146
  end
116
147
  end
@@ -0,0 +1,51 @@
1
+ require 'akabei/error'
2
+
3
+ module Akabei
4
+ module System
5
+ class CommandFailed < Error
6
+ attr_reader :env, :args, :opts
7
+ def initialize(env, args, opts)
8
+ super("command failed: #{args.join(' ')}")
9
+ @env = env
10
+ @args = args
11
+ @opts = opts
12
+ end
13
+ end
14
+
15
+ module_function
16
+
17
+ def sudo(args, opts)
18
+ if opts.has_key?(:env)
19
+ opts = opts.dup
20
+ args = args.dup
21
+ env = opts.delete(:env)
22
+ env.each do |k, v|
23
+ args.unshift("#{k}=#{v}")
24
+ end
25
+ args.unshift('env')
26
+ end
27
+
28
+ puts "SUDO: #{args.join(' ')}"
29
+ system(%w[sudo] + args, opts)
30
+ end
31
+
32
+ def system(args, opts)
33
+ opts = opts.dup
34
+ env = {}
35
+ opts.delete(:env).tap do |e|
36
+ break unless e
37
+ e.each do |k, v|
38
+ env[k.to_s] = v.to_s
39
+ end
40
+ end
41
+ opts.delete(:arch).tap do |a|
42
+ break unless a
43
+ args = args.dup
44
+ args.unshift('setarch', a)
45
+ end
46
+ unless Kernel.system(env, *args.map(&:to_s), opts)
47
+ raise CommandFailed.new(env, args, opts)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module Akabei
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -18,7 +18,7 @@ describe Akabei::Builder do
18
18
  let(:chroot) { double('ChrootTree') }
19
19
 
20
20
  before do
21
- expect(chroot).to receive(:makechrootpkg).once.with(package_dir.to_s, anything) { |dir, env|
21
+ expect(chroot).to receive(:makechrootpkg).once.with(package_dir, anything) { |dir, env|
22
22
  expect(env[:SRCDEST]).to be_directory
23
23
  expect(env[:PKGDEST]).to be_directory
24
24
  expect(env[:LOGDEST]).to be_directory
@@ -94,16 +94,17 @@ describe Akabei::Builder do
94
94
 
95
95
  describe '#with_source_package' do
96
96
  before do
97
- expect(builder).to receive(:system).once.with(any_args) { |env, makepkg, source, opts|
98
- srcdest = Pathname.new(env['SRCDEST'])
99
- srcpkgdest = Pathname.new(env['SRCPKGDEST'])
100
- builddir = Pathname.new(env['BUILDDIR'])
97
+ expect(Akabei::System).to receive(:system) { |args, opts|
98
+ env = opts[:env]
99
+ srcdest = Pathname.new(env[:SRCDEST])
100
+ srcpkgdest = Pathname.new(env[:SRCPKGDEST])
101
+ builddir = Pathname.new(env[:BUILDDIR])
101
102
  expect(srcdest).to be_directory
102
103
  expect(srcpkgdest).to be_directory
103
104
  expect(builddir).to be_directory
104
105
 
105
- expect(makepkg).to eq('makepkg')
106
- expect(source).to eq('--source')
106
+ expect(args[0]).to eq('makepkg')
107
+ expect(args[1]).to eq('--source')
107
108
  expect(opts[:chdir]).to eq(package_dir)
108
109
 
109
110
  # Simulate `makepkg --source`
@@ -10,7 +10,6 @@ describe Akabei::ChrootTree do
10
10
  let(:action) { double('some action') }
11
11
 
12
12
  before do
13
- allow(chroot).to receive(:execute) { nil }
14
13
  expect(action).to receive(:call).once
15
14
  end
16
15
 
@@ -20,6 +19,7 @@ describe Akabei::ChrootTree do
20
19
  it 'creates a temporary chroot' do
21
20
  expect(chroot).to receive(:mkarchroot).once
22
21
  expect(Dir).to receive(:mktmpdir).once.and_call_original
22
+ expect(Akabei::System).to receive(:sudo).with(['rm', '-rf', anything], anything)
23
23
 
24
24
  chroot.with_chroot { action.call }
25
25
  end
@@ -28,9 +28,9 @@ describe Akabei::ChrootTree do
28
28
  context 'with root' do
29
29
  it 'uses given root' do
30
30
  expect(Dir).to_not receive(:mktmpdir)
31
- expect(chroot).to receive(:execute).once.with(any_args) { |*args|
31
+ expect(Akabei::System).to receive(:sudo) { |args, opts|
32
32
  expect(args[0]).to eq('mkarchroot')
33
- expect(args[1]).to eq(chroot_root.join('root').to_s)
33
+ expect(args[1]).to eq(chroot_root.join('root'))
34
34
  }
35
35
 
36
36
  chroot.with_chroot { action.call }
@@ -38,9 +38,9 @@ describe Akabei::ChrootTree do
38
38
  end
39
39
 
40
40
  it 'respects makepkg_config' do
41
- path = '/path/to/makepkg.conf'
41
+ path = Pathname.new('/path/to/makepkg.conf')
42
42
  chroot.makepkg_config = path
43
- expect(chroot).to receive(:execute).once.with(any_args) { |*args|
43
+ expect(Akabei::System).to receive(:sudo) { |args, opts|
44
44
  expect(args[0]).to eq('mkarchroot')
45
45
  expect(args.each_cons(2)).to include(['-M', path])
46
46
  }
@@ -49,9 +49,9 @@ describe Akabei::ChrootTree do
49
49
  end
50
50
 
51
51
  it 'respects pacman_config' do
52
- path = '/path/to/pacman.conf'
52
+ path = Pathname.new('/path/to/pacman.conf')
53
53
  chroot.pacman_config = path
54
- expect(chroot).to receive(:execute).once.with(any_args) { |*args|
54
+ expect(Akabei::System).to receive(:sudo) { |args, opts|
55
55
  expect(args[0]).to eq('mkarchroot')
56
56
  expect(args.each_cons(2)).to include(['-C', path])
57
57
  }
@@ -59,50 +59,4 @@ describe Akabei::ChrootTree do
59
59
  chroot.with_chroot { action.call }
60
60
  end
61
61
  end
62
-
63
- describe '#execute' do
64
- let(:command) { %w[rm -rf /] }
65
- let(:opts) { { chdir: '/' } }
66
-
67
- it 'calls sudo and setarch' do
68
- expect(chroot).to receive(:system).once.with(any_args) { |*args|
69
- expect(args).to eq(%W[sudo setarch #{arch}] + command + [opts])
70
- }
71
-
72
- stdout = capture_stdout do
73
- chroot.execute(*command + [opts])
74
- end
75
- expect(stdout).to include('rm -rf /')
76
- end
77
-
78
- context 'with :env keyword' do
79
- let(:key) { :FOO }
80
- let(:value) { 'BAR' }
81
-
82
- it 'calls sudo, setarch and env' do
83
- expect(chroot).to receive(:system).once.with(any_args) { |*args|
84
- expected_opts = opts.dup
85
- expected_opts.delete(:env)
86
- expect(args).to eq(%W[sudo setarch #{arch} env #{key}=#{value}] + command + [expected_opts])
87
- }.and_return(true)
88
-
89
- opts.merge!(env: { key => value })
90
- stdout = capture_stdout do
91
- chroot.execute(*command, opts)
92
- end
93
- expect(stdout).to include('rm -rf /')
94
- expect(opts).to have_key(:env)
95
- end
96
-
97
- context 'with command failure' do
98
- before do
99
- allow(chroot).to receive(:system).and_return(false)
100
- end
101
-
102
- it 'raises an error' do
103
- expect { capture_stdout { chroot.execute(command + [opts]) } }.to raise_error(Akabei::ChrootTree::CommandFailed)
104
- end
105
- end
106
- end
107
- end
108
62
  end
@@ -10,29 +10,13 @@ describe Akabei::CLI do
10
10
  describe '#build' do
11
11
  let(:repo_dir) { test_dest('repo').tap(&:mkpath) }
12
12
  let(:base_opts) { { arch: 'x86_64', repo_dir: repo_dir.to_s, repo_name: 'test' } }
13
- let(:package) { double('built package') }
14
- let(:entry) { Akabei::PackageEntry.new }
15
- let(:chroot_expectations) { lambda { |chroot| } }
16
13
 
17
14
  before do
18
15
  tar('xf', test_input('nkf.tar.gz').to_s, '-C', package_dir.parent.to_s)
19
- # Disable warning
20
- entry.add('files', 'usr/bin/nkf')
21
-
22
- allow(package).to receive(:name).and_return('nkf')
23
- allow(package).to receive(:to_entry).and_return(entry)
24
-
25
- allow_any_instance_of(Akabei::ChrootTree).to receive(:with_chroot) { |chroot, &block|
26
- chroot_expectations.call(chroot)
27
- block.call
28
- }
29
- allow_any_instance_of(Akabei::Builder).to receive(:build_package) { |builder, dir, chroot|
30
- expect(builder).to receive(:with_source_package).with(package_dir.to_s).and_yield(srcpkg_path)
31
- [package]
32
- }
33
16
  end
34
17
 
35
18
  it 'calls Builder#build_package in chroot and create repository database' do
19
+ setup_command_expectations('x86_64', package_dir)
36
20
  cli.invoke(:build, [package_dir.to_s], base_opts)
37
21
  expect(repo_dir.join('test.db')).to be_file
38
22
  expect(repo_dir.join('test.files')).to be_file
@@ -48,6 +32,7 @@ describe Akabei::CLI do
48
32
  }
49
33
 
50
34
  it 'calls ChrootTree#with_chroot with makepkg_config' do
35
+ setup_command_expectations('x86_64', package_dir)
51
36
  cli.invoke(:build, [package_dir.to_s], base_opts.merge(makepkg_config: makepkg_path.to_s))
52
37
  end
53
38
  end
@@ -61,9 +46,19 @@ describe Akabei::CLI do
61
46
  }
62
47
 
63
48
  it 'calls ChrootTree#with_chroot with pacman_config' do
49
+ setup_command_expectations('x86_64', package_dir)
64
50
  cli.invoke(:build, [package_dir.to_s], base_opts.merge(pacman_config: pacman_path.to_s))
65
51
  end
66
52
  end
53
+
54
+ context "when package_dir isn't a directory" do
55
+ let(:package_dir) { test_dest('does-not-exist') }
56
+
57
+ it 'fails early' do
58
+ expect(Akabei::System).to_not receive(:system)
59
+ expect { cli.invoke(:build, [package_dir.to_s], base_opts) }.to raise_error(Akabei::Error, /isn't a directory/)
60
+ end
61
+ end
67
62
  end
68
63
 
69
64
  describe '#abs_add' do
@@ -137,4 +132,19 @@ describe Akabei::CLI do
137
132
  expect(tar('tf', files_path.to_s)).to_not include('htop-vi-1.0.2-4/files')
138
133
  end
139
134
  end
135
+
136
+ describe '#version' do
137
+ it 'displays version' do
138
+ stdout = capture_stdout { cli.invoke(:version) }
139
+ expect(stdout).to include('akabei')
140
+ expect(stdout).to include(Akabei::VERSION)
141
+ end
142
+
143
+ context 'with --numeric' do
144
+ it 'displays version number only' do
145
+ stdout = capture_stdout { cli.invoke(:version, [], numeric: true) }
146
+ expect(stdout.strip).to eq(Akabei::VERSION)
147
+ end
148
+ end
149
+ end
140
150
  end
@@ -1,5 +1,7 @@
1
1
  require 'spec_helper'
2
+ require 'akabei/abs'
2
3
  require 'akabei/cli'
4
+ require 'akabei/repository'
3
5
 
4
6
  class TestShell < Thor::Shell::Basic
5
7
  attr_reader :stdout
@@ -71,35 +73,17 @@ describe Akabei::Omakase::CLI do
71
73
 
72
74
  describe '#build' do
73
75
  let(:config) { Akabei::Omakase::Config.load }
74
- let(:packages) { { 'i686' => double('built package (i686)'), 'x86_64' => double('built package (x86_64)') } }
75
- let(:entry) { Akabei::PackageEntry.new }
76
76
  let(:init_opts) { {} }
77
77
 
78
78
  before do
79
79
  cli.invoke(:init, ['test'], init_opts)
80
80
  tar('xf', test_input('nkf.tar.gz').to_s, '-C', config.pkgbuild.to_s)
81
-
82
- packages.each do |arch, package|
83
- allow(package).to receive(:name).and_return('nkf')
84
- allow(package).to receive(:to_entry).and_return(entry)
85
- allow(package).to receive(:path).and_return(Pathname.new("test/os/#{arch}/nkf-2.1.3-1-#{arch}.pkg.tar.xz"))
86
- end
87
- entry.add('files', 'usr/bin/nkf')
88
-
89
- allow_any_instance_of(Akabei::ChrootTree).to receive(:with_chroot) { |chroot, &block|
90
- expect(chroot.makepkg_config.to_s).to eq("etc/makepkg.#{chroot.arch}.conf")
91
- expect(chroot.pacman_config.to_s).to eq("etc/pacman.#{chroot.arch}.conf")
92
- block.call
93
- }
94
- expect(config['builds'].size).to eq(2)
95
-
96
- allow_any_instance_of(Akabei::Builder).to receive(:build_package) { |builder, dir, chroot|
97
- expect(builder).to receive(:with_source_package).with(config.package_dir('nkf')).and_yield(test_input('nkf.tar.gz'))
98
- [packages[chroot.arch]]
99
- }
100
81
  end
101
82
 
102
83
  it 'builds a package and add it to repository' do
84
+ %w[i686 x86_64].each do |arch|
85
+ setup_command_expectations(arch, config.package_dir('nkf'))
86
+ end
103
87
  cli.invoke(:build, ['nkf'])
104
88
  end
105
89
 
@@ -128,6 +112,9 @@ describe Akabei::Omakase::CLI do
128
112
  end
129
113
 
130
114
  it 'uploads built packages and update repositories' do
115
+ %w[i686 x86_64].each do |arch|
116
+ setup_command_expectations(arch, config.package_dir('nkf'))
117
+ end
131
118
  expect(buckets).to receive(:[]).with(bucket_name).and_return(bucket)
132
119
  allow(bucket).to receive(:objects).and_return(objects)
133
120
 
@@ -150,5 +137,40 @@ describe Akabei::Omakase::CLI do
150
137
  cli.invoke(:build, ['nkf'])
151
138
  end
152
139
  end
140
+
141
+ context 'when PACKAGE_NAME is wrong' do
142
+ it 'fails early' do
143
+ expect(Akabei::System).to_not receive(:system)
144
+ expect { cli.invoke(:build, ['wrong']) }.to raise_error(Akabei::Error)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '#remove' do
150
+ let(:config) { Akabei::Omakase::Config.load }
151
+
152
+ it 'removes package' do
153
+ cli.invoke(:init, ['test'])
154
+ %w[i686 x86_64].each do |arch|
155
+ config.repo_path(arch).mkpath
156
+ FileUtils.cp(test_input('test.db'), config.db_path(arch))
157
+ FileUtils.cp(test_input('test.files'), config.files_path(arch))
158
+ FileUtils.cp(test_input('abs.tar.gz'), config.abs_path(arch))
159
+ end
160
+
161
+ %w[i686 x86_64].each do |arch|
162
+ expect(tar('tf', config.db_path(arch).to_s)).to include('htop-vi-1.0.2-4/desc')
163
+ expect(tar('tf', config.files_path(arch).to_s)).to include('htop-vi-1.0.2-4/files')
164
+ expect(tar('tf', config.abs_path(arch).to_s)).to include('test/htop-vi/PKGBUILD')
165
+ end
166
+
167
+ cli.invoke(:remove, ['htop-vi'])
168
+
169
+ %w[i686 x86_64].each do |arch|
170
+ expect(tar('tf', config.db_path(arch).to_s)).to_not include('htop-vi-1.0.2-4/desc')
171
+ expect(tar('tf', config.files_path(arch).to_s)).to_not include('htop-vi-1.0.2-4/files')
172
+ expect(tar('tf', config.abs_path(arch).to_s)).to_not include('test/htop-vi/PKGBUILD')
173
+ end
174
+ end
153
175
  end
154
176
  end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+ require 'akabei/system'
3
+
4
+ describe Akabei::System do
5
+ let(:command) { %w[rm -rf /] }
6
+ let(:options) { { chdir: '/' } }
7
+
8
+ describe '.sudo' do
9
+ it 'executes sudo' do
10
+ expect(Akabei::System).to receive(:system) { |args, opts|
11
+ expect(args).to eq(%w[sudo] + command)
12
+ expect(opts).to eq(options)
13
+ }
14
+
15
+ stdout = capture_stdout do
16
+ described_class.sudo(command, options)
17
+ end
18
+ expect(stdout).to include('rm -rf /')
19
+ end
20
+
21
+ context 'with :env keyword' do
22
+ let(:key) { :FOO }
23
+ let(:value) { 'BAR' }
24
+
25
+ it 'executes sudo and env' do
26
+ expect(Akabei::System).to receive(:system) { |args, opts|
27
+ expect(args).to eq(%W[sudo env #{key}=#{value}] + command)
28
+ expect(opts).to_not have_key(:env)
29
+ }
30
+
31
+ options.merge!(env: { key => value })
32
+ stdout = capture_stdout do
33
+ described_class.sudo(command, options)
34
+ end
35
+ expect(stdout).to include('rm -rf /')
36
+ expect(options).to have_key(:env)
37
+ end
38
+
39
+ context 'with command failure' do
40
+ before do
41
+ allow(Kernel).to receive(:system).and_return(false)
42
+ end
43
+
44
+ it 'raises an error' do
45
+ expect { capture_stdout { described_class.sudo(command, options) } }.to raise_error(Akabei::System::CommandFailed)
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '.system' do
52
+ context 'with :arch keyword' do
53
+ let(:arch) { 'armv7h' }
54
+
55
+ it 'executes sudo and setarch' do
56
+ expect(Kernel).to receive(:system) { |*args|
57
+ args = args.dup
58
+ env = args.shift
59
+ opts = args.pop
60
+ expect(args).to eq(%W[setarch #{arch}] + command)
61
+ expect(opts).to_not have_key(:arch)
62
+ true
63
+ }
64
+
65
+ options.merge!(arch: arch)
66
+ described_class.system(command, options)
67
+ expect(options).to have_key(:arch)
68
+ end
69
+
70
+ context 'with command failure' do
71
+ before do
72
+ allow(Kernel).to receive(:system).and_return(false)
73
+ end
74
+
75
+ it 'raises an error' do
76
+ expect { described_class.system(command, options) }.to raise_error(Akabei::System::CommandFailed)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -75,12 +75,48 @@ module TarHelpers
75
75
  end
76
76
  end
77
77
 
78
+ module ArrayStartingWith
79
+ class Matcher
80
+ def initialize(expected)
81
+ @expected = expected
82
+ end
83
+
84
+ def description
85
+ "array_starting_with(#{@expected.join(',')})"
86
+ end
87
+
88
+ def ==(actual)
89
+ actual[0 ... @expected.length] == @expected
90
+ end
91
+ end
92
+
93
+ def array_starting_with(expected)
94
+ Matcher.new(expected)
95
+ end
96
+ end
97
+
78
98
  module IntegrationSpecHelper
79
99
  def akabei(*cmd)
80
100
  system(File.expand_path('../../bin/akabei', __FILE__), *cmd)
81
101
  end
82
102
  end
83
103
 
104
+ module BuildSpecHelper
105
+ def setup_command_expectations(arch, package_dir)
106
+ expect(Akabei::System).to receive(:sudo).with(array_starting_with(['mkarchroot']), hash_including(arch: arch))
107
+ expect(Akabei::System).to receive(:sudo).with(['rm', '-rf', anything], {})
108
+
109
+ expect(Akabei::System).to receive(:sudo).with(['makechrootpkg', '-cur', anything], hash_including(arch: arch, chdir: package_dir)) { |args, opts|
110
+ FileUtils.cp(test_input('nkf-2.1.3-1-x86_64.pkg.tar.xz'), opts[:env][:PKGDEST].join("nkf-2.1.3-1-#{arch}.pkg.tar.xz"))
111
+ }
112
+ expect(Akabei::System).to receive(:system).with(['makepkg', '--source'], hash_including(chdir: package_dir)) { |args, opts|
113
+ # Simulate `makepkg --source`
114
+ FileUtils.cp(test_input('nkf.tar.gz'), opts[:env][:SRCPKGDEST])
115
+ Pathname.new(opts[:chdir]).join('nkf.tar.gz').make_symlink(opts[:env][:SRCPKGDEST])
116
+ }
117
+ end
118
+ end
119
+
84
120
  RSpec.configure do |config|
85
121
  config.filter_run :focus
86
122
  if ENV['AKABEI_ARCH_SPEC']
@@ -107,4 +143,6 @@ RSpec.configure do |config|
107
143
  config.include OutputHelpers
108
144
  config.include TarHelpers
109
145
  config.include IntegrationSpecHelper
146
+ config.include ArrayStartingWith
147
+ config.include BuildSpecHelper
110
148
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: akabei
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-19 00:00:00.000000000 Z
11
+ date: 2014-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gpgme
@@ -190,6 +190,7 @@ files:
190
190
  - lib/akabei/package_info.rb
191
191
  - lib/akabei/repository.rb
192
192
  - lib/akabei/signer.rb
193
+ - lib/akabei/system.rb
193
194
  - lib/akabei/thor_handler.rb
194
195
  - lib/akabei/version.rb
195
196
  - spec/akabei/abs_spec.rb
@@ -203,6 +204,7 @@ files:
203
204
  - spec/akabei/package_spec.rb
204
205
  - spec/akabei/repository_spec.rb
205
206
  - spec/akabei/signer_spec.rb
207
+ - spec/akabei/system_spec.rb
206
208
  - spec/data/input/abs.tar.gz
207
209
  - spec/data/input/htop-vi.tar.gz
208
210
  - spec/data/input/makepkg.x86_64.conf
@@ -251,6 +253,7 @@ test_files:
251
253
  - spec/akabei/package_spec.rb
252
254
  - spec/akabei/repository_spec.rb
253
255
  - spec/akabei/signer_spec.rb
256
+ - spec/akabei/system_spec.rb
254
257
  - spec/data/input/abs.tar.gz
255
258
  - spec/data/input/htop-vi.tar.gz
256
259
  - spec/data/input/makepkg.x86_64.conf