dapp 0.21.5 → 0.21.6

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
  SHA256:
3
- metadata.gz: 3506c0e4ae752fd7925c65913df56c068a1118471fc8cdcb5b9bdf4006170412
4
- data.tar.gz: ffd8f79655ce7025781fbf9d6edca70692351a1ef5f190899b9228ca43d8ff34
3
+ metadata.gz: 4e7d9a0dc7f56238457f89d9892f39a6f3e420d11fc67f575413248c44e105fa
4
+ data.tar.gz: a78133ee132bbef279c05cdcaf313dd09decd9e20eeb93325034cfd95979b69f
5
5
  SHA512:
6
- metadata.gz: d9b92fd573d5d3a9aa7db24df92af823aeea1e4145f395d8ea893bf0b1d0f0dc8f3fb5df2855b8290d5ded79fbf196e7497bbb90c0a79ad5c2795c75a4cd939e
7
- data.tar.gz: f52f8bc0ae1d12bf1b524a13df92ea38666a26458b1aa43d631ed961477e31c78dbfa3527578830cfa61e46228b194fd8f9c20deb73a03e042a22904c17135db
6
+ metadata.gz: 26138b6f38fe585774aa434b42379473d08b08663a9242d894201236ef1a5738f6ef0dfda78f62c61431b7794e54f1a16af7a325b322b7d565bcd3a381d8728d
7
+ data.tar.gz: bc959e938bee49762ef4711c3af7e6cc4205b1ccf520dd6f214c48670a0f6a01aec4da5572cdb97c6d770071daed7ee7ec2842f34c86fb61caec712afcc45948
@@ -21,6 +21,7 @@ en:
21
21
  command:
22
22
  command_unexpected_dimgs_number: "Command can process only one dimg!\nAmbiguous dimg pattern: `%{dimgs_names}`!"
23
23
  mrproper_required_option: "Expected command option `--improper-dev-mode-cache`, `--improper-cache-version-stages` or `--all`!"
24
+ cleanup_repo_required_option: "Expected command option `--improper-nonexistent-git-tag-branch-commit`!"
24
25
  stages_cleanup_required_option: "Expected command option `--improper-cache-version`, `--improper-git-commit` or `--improper-repo-cache`!"
25
26
  repo_name_incorrect: "Incorrect repo name `%{name}` given!"
26
27
  image_name_incorrect: "Incorrect image name `%{name}` given!"
@@ -207,6 +207,8 @@ require 'dapp/dimg/cli/command/dimg/stages/cleanup_repo'
207
207
  require 'dapp/dimg/cli/command/dimg/stages/push'
208
208
  require 'dapp/dimg/cli/command/dimg/stages/pull'
209
209
  require 'dapp/dimg/cli/command/dimg/run'
210
+ require 'dapp/dimg/cli/command/dimg/cleanup_repo'
211
+ require 'dapp/dimg/cli/command/dimg/flush_repo'
210
212
  require 'dapp/dimg/cli/command/dimg/cleanup'
211
213
  require 'dapp/dimg/cli/command/dimg/bp'
212
214
  require 'dapp/dimg/cli/command/dimg/mrproper'
@@ -235,6 +237,8 @@ require 'dapp/dimg/config/config'
235
237
  require 'dapp/dimg/dapp/command/common'
236
238
  require 'dapp/dimg/dapp/command/build'
237
239
  require 'dapp/dimg/dapp/command/bp'
240
+ require 'dapp/dimg/dapp/command/cleanup_repo'
241
+ require 'dapp/dimg/dapp/command/flush_repo'
238
242
  require 'dapp/dimg/dapp/command/cleanup'
239
243
  require 'dapp/dimg/dapp/command/mrproper'
240
244
  require 'dapp/dimg/dapp/command/stage_image'
@@ -5,32 +5,37 @@ module Dapp
5
5
  @git_repo ||= ::Dapp::Dimg::GitRepo::Own.new(self)
6
6
  end
7
7
 
8
- def option_tags
9
- @tags ||= begin
10
- tags = simple_tags + branch_tags + commit_tags + build_tags + ci_tags
11
- tags << :latest if tags.empty?
12
- tags
8
+ def tags_by_scheme
9
+ @tags_by_scheme_name ||= begin
10
+ [simple_tags, branch_tags, commit_tags, build_tags, ci_tags].reduce({}) do |some_tags_by_scheme, tags_by_scheme|
11
+ tags_by_scheme.in_depth_merge(some_tags_by_scheme)
12
+ end.tap do |tags_by_scheme|
13
+ tags_by_scheme[:custom] = [:latest] if tags_by_scheme.values.flatten.empty?
14
+ end
13
15
  end
14
16
  end
15
17
 
18
+ def option_tags
19
+ tags_by_scheme.values.flatten
20
+ end
21
+
16
22
  def simple_tags
17
- options[:tag]
23
+ { custom: options[:tag] }
18
24
  end
19
25
 
20
26
  def branch_tags
21
- return [] unless options[:tag_branch]
27
+ return {} unless options[:tag_branch]
22
28
  raise Error::Dapp, code: :git_branch_without_name if (branch = git_local_repo.branch) == 'HEAD'
23
- [branch]
29
+ { git_branch: [branch] }
24
30
  end
25
31
 
26
32
  def commit_tags
27
- return [] unless options[:tag_commit]
28
- commit = git_local_repo.latest_commit
29
- [commit]
33
+ return {} unless options[:tag_commit]
34
+ { git_commit: [git_local_repo.latest_commit] }
30
35
  end
31
36
 
32
37
  def build_tags
33
- return [] unless options[:tag_build_id]
38
+ return {} unless options[:tag_build_id]
34
39
 
35
40
  if ENV['GITLAB_CI']
36
41
  build_id = ENV['CI_BUILD_ID']
@@ -40,23 +45,25 @@ module Dapp
40
45
  raise Error::Dapp, code: :ci_environment_required
41
46
  end
42
47
 
43
- [build_id]
48
+ { ci: [build_id] }
44
49
  end
45
50
 
46
51
  def ci_tags
47
- return [] unless options[:tag_ci]
52
+ return {} unless options[:tag_ci]
48
53
 
49
- if ENV['GITLAB_CI']
50
- branch = ENV['CI_BUILD_REF_NAME']
51
- tag = ENV['CI_BUILD_TAG']
52
- elsif ENV['TRAVIS']
53
- branch = ENV['TRAVIS_BRANCH']
54
- tag = ENV['TRAVIS_TAG']
55
- else
56
- raise Error::Dapp, code: :ci_environment_required
57
- end
54
+ {}.tap do |tags_by_scheme|
55
+ if ENV['GITLAB_CI']
56
+ tags_by_scheme[:git_branch] = [ENV['CI_BUILD_REF_NAME']]
57
+ tags_by_scheme[:git_tag] = [ENV['CI_BUILD_TAG']]
58
+ elsif ENV['TRAVIS']
59
+ tags_by_scheme[:git_branch] = [ENV['TRAVIS_BRANCH']]
60
+ tags_by_scheme[:git_tag] = [ENV['TRAVIS_TAG']]
61
+ else
62
+ raise Error::Dapp, code: :ci_environment_required
63
+ end
58
64
 
59
- [branch, tag].compact
65
+ tags_by_scheme.delete_if { |_, tags| tags.first.nil? }
66
+ end
60
67
  end
61
68
  end # Tags
62
69
  end # Dapp
@@ -81,9 +81,6 @@ module Dapp
81
81
  def prepare_image
82
82
  return if dimg.dapp.dry_run?
83
83
 
84
- image.add_volumes_from dimg.dapp.toolchain_container
85
- image.add_volumes_from dimg.dapp.base_container
86
-
87
84
  image_add_mounts
88
85
 
89
86
  image.add_service_change_label dapp: dimg.stage_dapp_label
@@ -1,7 +1,7 @@
1
1
  module Dapp::Dimg::CLI
2
2
  module Command
3
3
  class Dimg < ::Dapp::CLI
4
- SUBCOMMANDS = ['build', 'push', 'spush', 'list', 'run', 'stages', 'cleanup', 'bp', 'mrproper', 'stage image', 'tag', 'build-context'].freeze
4
+ SUBCOMMANDS = ['build', 'push', 'spush', 'list', 'run', 'stages', 'cleanup', 'bp', 'mrproper', 'stage image', 'tag', 'build-context', 'cleanup repo', 'flush repo'].freeze
5
5
 
6
6
  banner <<BANNER.freeze
7
7
  Usage: dapp dimg [options] subcommand [subcommand options]
@@ -15,7 +15,9 @@ Available subcommands: (for details, dapp dimg SUB-COMMAND --help)
15
15
  dapp dimg tag [options] [DIMG] TAG
16
16
  dapp dimg list [options] [DIMG ...]
17
17
  dapp dimg run [options] [DIMG] [DOCKER ARGS]
18
- dapp dimg cleanup [options] [DIMG ...]
18
+ dapp dimg cleanup repo [options] [DIMG ...] REPO
19
+ dapp dimg flush repo [options] [DIMG ...] REPO
20
+ dapp dimg cleanup [options]
19
21
  dapp dimg mrproper [options]
20
22
  dapp dimg stage image [options] [DIMG]
21
23
  dapp dimg stages
@@ -0,0 +1,30 @@
1
+ module Dapp::Dimg::CLI
2
+ module Command
3
+ class Dimg < ::Dapp::CLI
4
+ class CleanupRepo < Base
5
+ banner <<BANNER.freeze
6
+ Usage:
7
+
8
+ dapp dimg cleanup repo [options] [DIMG ...] REPO
9
+
10
+ Options:
11
+ BANNER
12
+
13
+ option :lock_timeout,
14
+ long: '--lock-timeout TIMEOUT',
15
+ description: 'Redefine resource locking timeout (in seconds)',
16
+ proc: ->(v) { v.to_i }
17
+
18
+ option :with_stages,
19
+ long: '--with-stages',
20
+ boolean: true
21
+
22
+ def run(argv = ARGV)
23
+ self.class.parse_options(self, argv)
24
+ repo = self.class.required_argument(self, 'repo')
25
+ run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repo))
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ module Dapp::Dimg::CLI
2
+ module Command
3
+ class Dimg < ::Dapp::CLI
4
+ class FlushRepo < Base
5
+ banner <<BANNER.freeze
6
+ Usage:
7
+
8
+ dapp dimg flush repo [options] [DIMG ...] REPO
9
+
10
+ Options:
11
+ BANNER
12
+
13
+ option :lock_timeout,
14
+ long: '--lock-timeout TIMEOUT',
15
+ description: 'Redefine resource locking timeout (in seconds)',
16
+ proc: ->(v) { v.to_i }
17
+
18
+ option :with_stages,
19
+ long: '--with-stages',
20
+ boolean: true
21
+
22
+ def run(argv = ARGV)
23
+ self.class.parse_options(self, argv)
24
+ repo = self.class.required_argument(self, 'repo')
25
+ run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repo))
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,71 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Dapp
4
+ module Command
5
+ module CleanupRepo
6
+ def cleanup_repo
7
+ lock_repo(repo = option_repo) do
8
+ registry = registry(repo)
9
+
10
+ repo_detailed_dimgs_images(registry).select do |image|
11
+ case image[:labels]['dapp-tag-scheme']
12
+ when 'git_tag', 'git_branch', 'git_commit' then true
13
+ else false
14
+ end && !deployed_docker_images.include?([image[:dimg], image[:tag]].join(':'))
15
+ end.tap do |dimgs_images|
16
+ cleanup_repo_by_nonexistent_git_tag(registry, dimgs_images)
17
+ cleanup_repo_by_nonexistent_git_branch(registry, dimgs_images)
18
+ cleanup_repo_by_nonexistent_git_commit(registry, dimgs_images)
19
+ end
20
+
21
+ begin
22
+ registry.reset_cache
23
+ repo_dimgs = repo_dimgs_images(registry)
24
+ repo_dimgstages = repo_dimgstages_images(registry)
25
+ repo_dimgstages_cleanup(registry, repo_dimgs, repo_dimgstages)
26
+ end if with_stages?
27
+ end
28
+ end
29
+
30
+ def cleanup_repo_by_nonexistent_git_tag(registry, dimgs_images)
31
+ cleanup_repo_by_nonexistent_git_base(dimgs_images, 'git_tag') do |dimg_image|
32
+ delete_repo_image(registry, dimg_image) unless git_local_repo.tags.include?(dimg_image[:tag])
33
+ end
34
+ end
35
+
36
+ def cleanup_repo_by_nonexistent_git_branch(registry, dimgs_images)
37
+ cleanup_repo_by_nonexistent_git_base(dimgs_images, 'git_branch') do |dimg_image|
38
+ delete_repo_image(registry, dimg_image) unless git_local_repo.remote_branches.include?(dimg_image[:tag])
39
+ end
40
+ end
41
+
42
+ def cleanup_repo_by_nonexistent_git_commit(registry, dimgs_images)
43
+ cleanup_repo_by_nonexistent_git_base(dimgs_images, 'git_commit') do |dimg_image|
44
+ delete_repo_image(registry, dimg_image) unless git_local_repo.commit_exists?(dimg_image[:tag])
45
+ end
46
+ end
47
+
48
+ def cleanup_repo_by_nonexistent_git_base(dimgs_images, dapp_tag_scheme)
49
+ log_step_with_indent(:"nonexistent #{dapp_tag_scheme.split('_').join(' ')}") do
50
+ dimgs_images
51
+ .select { |dimg_image| dimg_image[:labels]['dapp-tag-scheme'] == dapp_tag_scheme }
52
+ .each { |dimg_image| yield dimg_image }
53
+ end
54
+ end
55
+
56
+ def repo_detailed_dimgs_images(registry)
57
+ repo_dimgs_images(registry).each do |dimg|
58
+ image_history = registry.image_history(dimg[:tag], dimg[:dimg])
59
+ dimg[:parent] = image_history['container_config']['Image']
60
+ dimg[:labels] = image_history['config']['Labels']
61
+ end
62
+ end
63
+
64
+ def deployed_docker_images
65
+ []
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end # Dimg
71
+ end # Dapp
@@ -173,6 +173,10 @@ module Dapp
173
173
  options[:repo]
174
174
  end
175
175
  end
176
+
177
+ def with_stages?
178
+ !!options[:with_stages]
179
+ end
176
180
  end
177
181
  end
178
182
  end
@@ -0,0 +1,19 @@
1
+ module Dapp
2
+ module Dimg
3
+ module Dapp
4
+ module Command
5
+ module FlushRepo
6
+ def flush_repo
7
+ lock_repo(repo = option_repo) do
8
+ log_step_with_indent(option_repo) do
9
+ registry = registry(repo)
10
+ repo_dimgs_images(registry).each { |repo_image| delete_repo_image(registry, repo_image) }
11
+ stages_flush_repo if with_stages?
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end # Dimg
19
+ end # Dapp
@@ -21,13 +21,6 @@ module Dapp
21
21
  #printer = RubyProf::MultiPrinter.new(result)
22
22
  #printer.print(path: '/tmp/testdapp.push.profile', profile: 'profile')
23
23
  end
24
-
25
-
26
- protected
27
-
28
- def with_stages?
29
- !!options[:with_stages]
30
- end
31
24
  end
32
25
  end
33
26
  end
@@ -38,7 +38,7 @@ module Dapp
38
38
  end
39
39
 
40
40
  def stages_cleanup_by_repo
41
- registry = registry(option_repo)
41
+ registry = registry(option_repo)
42
42
  repo_dimgs = repo_dimgs_images(registry)
43
43
 
44
44
  lock("#{name}.images") do
@@ -8,8 +8,8 @@ module Dapp
8
8
  lock_repo(repo = option_repo) do
9
9
  raise Error::Command, code: :stages_cleanup_required_option unless stages_cleanup_option?
10
10
 
11
- registry = registry(repo)
12
- repo_dimgs = repo_dimgs_images(registry)
11
+ registry = registry(repo)
12
+ repo_dimgs = repo_dimgs_images(registry)
13
13
  repo_dimgstages = repo_dimgstages_images(registry)
14
14
 
15
15
  repo_dimgstages.delete_if { |dimgstage| repo_dimgs.any? { |dimg| dimgstage[:id] == dimg[:id] } } # ignoring stages with dimgs ids (v2)
@@ -12,7 +12,7 @@ module Dapp
12
12
  end
13
13
 
14
14
  def repo_dimgs_images(registry)
15
- @repo_dimgs_images ||= [].tap do |dimgs_images|
15
+ [].tap do |dimgs_images|
16
16
  with_registry_wrapper do
17
17
  {}.tap do |dimgs_tags|
18
18
  dimgs_tags[nil] = registry.nameless_dimg_tags
@@ -7,11 +7,8 @@ module Dapp
7
7
  def stages_flush_repo
8
8
  lock_repo(option_repo) do
9
9
  log_step_with_indent(option_repo) do
10
- registry = registry(option_repo)
11
- repo_dimgs = repo_dimgs_images(registry)
12
- repo_dimgstages = repo_dimgstages_images(registry)
13
-
14
- repo_dimgs.concat(repo_dimgstages).each { |repo_image| delete_repo_image(registry, repo_image) }
10
+ registry = registry(option_repo)
11
+ repo_dimgstages_images(registry).each { |repo_image| delete_repo_image(registry, repo_image) }
15
12
  end
16
13
  end
17
14
  end
@@ -19,6 +19,8 @@ module Dapp
19
19
  include Command::Stages::Push
20
20
  include Command::Stages::Pull
21
21
  include Command::Stages::Common
22
+ include Command::CleanupRepo
23
+ include Command::FlushRepo
22
24
  include Command::Cleanup
23
25
  include Command::Mrproper
24
26
  include Command::StageImage
@@ -61,9 +61,13 @@ module Dapp
61
61
 
62
62
  def export!(repo, format:)
63
63
  dapp.lock("#{dapp.name}.images", readonly: true) do
64
- dapp.option_tags.each do |tag|
65
- image_name = format(format, repo: repo, dimg_name: config._name, tag: tag)
66
- export_base!(last_stage.image, image_name)
64
+ dapp.tags_by_scheme.each do |tag_scheme_name, tags|
65
+ tags.each do |tag|
66
+ image_name = format(format, repo: repo, dimg_name: config._name, tag: tag)
67
+ export_base!(image_name) do
68
+ last_stage.image.export_dimg!(image_name, sheme_name: tag_scheme_name)
69
+ end
70
+ end
67
71
  end
68
72
  end
69
73
  end
@@ -72,12 +76,14 @@ module Dapp
72
76
  dapp.lock("#{dapp.name}.images", readonly: true) do
73
77
  export_images.each do |image|
74
78
  image_name = format(format, repo: repo, signature: image.name.split(':').last)
75
- export_base!(image, image_name)
79
+ export_base!(image_name) do
80
+ image.export!(image_name)
81
+ end
76
82
  end
77
83
  end
78
84
  end
79
85
 
80
- def export_base!(image, image_name)
86
+ def export_base!(image_name)
81
87
  if dapp.dry_run?
82
88
  dapp.log_state(image_name, state: dapp.t(code: 'state.push'), styles: { status: :success })
83
89
  else
@@ -85,7 +91,7 @@ module Dapp
85
91
  ::Dapp::Dimg::Image::Docker.reset_image_inspect(image_name)
86
92
 
87
93
  dapp.log_process(image_name, process: dapp.t(code: 'status.process.pushing')) do
88
- image.export!(image_name)
94
+ yield
89
95
  end
90
96
  end
91
97
  end
@@ -4,12 +4,12 @@ module Dapp
4
4
  class Base
5
5
  module Authorization
6
6
  def authorization_options(url)
7
- @authorization_options ||= begin
7
+ (@authorization_options ||= {})[@repo_suffix] ||= begin
8
8
  case authenticate_header = raw_request(url).headers['Www-Authenticate']
9
- when /Bearer/ then { headers: { Authorization: "Bearer #{authorization_token(authenticate_header)}" } }
10
- when /Basic/ then { headers: { Authorization: "Basic #{authorization_auth}" } }
11
- when nil then {}
12
- else raise Error::Registry, code: :authenticate_type_not_supported, data: { registry: api_url }
9
+ when /Bearer/ then { headers: { Authorization: "Bearer #{authorization_token(authenticate_header)}" } }
10
+ when /Basic/ then { headers: { Authorization: "Basic #{authorization_auth}" } }
11
+ when nil then {}
12
+ else raise Error::Registry, code: :authenticate_type_not_supported, data: { registry: api_url }
13
13
  end
14
14
  end
15
15
  end
@@ -43,6 +43,11 @@ module Dapp
43
43
  end
44
44
  end
45
45
 
46
+ def reset_cache
47
+ @tags = nil
48
+ @image_history = nil
49
+ end
50
+
46
51
  protected
47
52
 
48
53
  def with_repo_suffix(extra_repo_suffix)
@@ -84,6 +84,17 @@ module Dapp
84
84
  raise Error::Rugged, code: :git_repository_reference_error, data: { name: name, message: e.message.downcase }
85
85
  end
86
86
 
87
+ def tags
88
+ git.tags.map { |t| t.name }
89
+ end
90
+
91
+ def remote_branches
92
+ git.branches
93
+ .map { |b| b.name }
94
+ .select { |b| b.start_with?('origin/') }
95
+ .map { |b| b.reverse.chomp('origin/'.reverse).reverse }
96
+ end
97
+
87
98
  def commit_at(commit)
88
99
  lookup_commit(commit).time.to_i
89
100
  end
@@ -22,16 +22,31 @@ module Dapp
22
22
  end
23
23
 
24
24
  def build!
25
+ add_build_service_volumes
25
26
  run!
26
27
  @built_id = commit!
27
28
  ensure
28
29
  dapp.shellout("#{dapp.host_docker} rm #{container_name}")
29
30
  end
30
31
 
32
+ def add_build_service_volumes
33
+ add_volumes_from dapp.toolchain_container
34
+ add_volumes_from dapp.base_container
35
+ end
36
+
31
37
  def built?
32
38
  !built_id.nil?
33
39
  end
34
40
 
41
+ def export_dimg!(name, sheme_name:)
42
+ self.class.new(name: name, dapp: dapp, from: self).tap do |image|
43
+ image.add_service_change_label(:'dapp-tag-scheme' => sheme_name)
44
+ image.add_service_change_label(:'dapp-dimg' => true)
45
+ image.build!
46
+ image.export!(name)
47
+ end
48
+ end
49
+
35
50
  def export!(name)
36
51
  tag!(name).tap do |image|
37
52
  image.push!
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = '0.21.5'.freeze
2
+ VERSION = '0.21.6'.freeze
3
3
  BUILD_CACHE_VERSION = 24
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.5
4
+ version: 0.21.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
@@ -534,6 +534,8 @@ files:
534
534
  - lib/dapp/dimg/cli/command/dimg/build_context/export.rb
535
535
  - lib/dapp/dimg/cli/command/dimg/build_context/import.rb
536
536
  - lib/dapp/dimg/cli/command/dimg/cleanup.rb
537
+ - lib/dapp/dimg/cli/command/dimg/cleanup_repo.rb
538
+ - lib/dapp/dimg/cli/command/dimg/flush_repo.rb
537
539
  - lib/dapp/dimg/cli/command/dimg/list.rb
538
540
  - lib/dapp/dimg/cli/command/dimg/mrproper.rb
539
541
  - lib/dapp/dimg/cli/command/dimg/push.rb
@@ -575,7 +577,9 @@ files:
575
577
  - lib/dapp/dimg/dapp/command/build_context/export.rb
576
578
  - lib/dapp/dimg/dapp/command/build_context/import.rb
577
579
  - lib/dapp/dimg/dapp/command/cleanup.rb
580
+ - lib/dapp/dimg/dapp/command/cleanup_repo.rb
578
581
  - lib/dapp/dimg/dapp/command/common.rb
582
+ - lib/dapp/dimg/dapp/command/flush_repo.rb
579
583
  - lib/dapp/dimg/dapp/command/list.rb
580
584
  - lib/dapp/dimg/dapp/command/mrproper.rb
581
585
  - lib/dapp/dimg/dapp/command/push.rb