dapp 0.35.21 → 0.35.22

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
  SHA256:
3
- metadata.gz: aaa1f4b1b9ecbae4c4cffcbcf0b4c258433308a64e2111f763ef3c24a0ac7bd7
4
- data.tar.gz: 4f9a43099a56de704572f96e3e9d7f839c5db6c1ee79926ee729d36f5ecfa26a
3
+ metadata.gz: 57be5b4eb14655fa5d40d393d3a4dd013eb96cd0d025770c3db2e3d5a4749bce
4
+ data.tar.gz: db9f0fe8f87c03c913da3dd8ca14083fab32face1752b810e88079a4bf22cd21
5
5
  SHA512:
6
- metadata.gz: e4778c9acef18386da9cee0dfe3583978f0c3d72f84827e3111b183d3de94b14fba279d4806c75f1c2630e9a32683fb52be402a0b25cf44fb83c81519678dd59
7
- data.tar.gz: 500416d19ce8e06c7bec777141576f380721c07d9de6f94a7965b8e2bff0755cf05b388c28e94657bce5ad5cb09c056bd627de69f805f63694679b18875ed7ff
6
+ metadata.gz: 575993cdd9d454b58d83295110ab47b130e791ef66905a78a0738429ee99ca131c769fa81a95491ec2926b2367d0499575c2daf341b6549e3754bada3698fb6f
7
+ data.tar.gz: f1ebdd957e12c5a62ab87532a14db8b7bd675a42272dfcaf3fb63d9b93a168ff04206823c8ee240ecee883585c536e6c037ef14e6ca93b4e08db67688bb55547
@@ -29,12 +29,14 @@ module Dapp
29
29
 
30
30
  def commit_list
31
31
  dimg.git_artifacts
32
- .select { |ga| ga.repo.commit_exists?(prev_stage.layer_commit(ga)) && ga.patch_any_changes?(self) }
32
+ .select { |ga| ga.repo.commit_exists?(prev_stage.layer_commit(ga)) && !ga.is_patch_empty(self) }
33
33
  .map(&method(:layer_commit))
34
34
  end
35
35
 
36
36
  def git_artifacts_dev_patch_hashes
37
- dimg.git_artifacts.map(&:dev_patch_hash)
37
+ # FIXME: dev-mode support in GitArtifact
38
+ # dimg.git_artifacts.map(&:dev_patch_hash)
39
+ nil
38
40
  end
39
41
  end # GALatestPatch
40
42
  end # Stage
@@ -28,22 +28,12 @@ module Dapp
28
28
  def generate_git_artifacts(repo, omit_empty: true, **git_artifact_options)
29
29
  [].tap do |artifacts|
30
30
  artifacts << (artifact = ::Dapp::Dimg::GitArtifact.new(repo, self, ignore_signature_auto_calculation: ignore_signature_auto_calculation, **git_artifact_options))
31
- if ENV['DAPP_DISABLE_GIT_SUBMODULES']
32
- artifacts
33
- else
34
- artifacts.concat(generate_git_embedded_artifacts(artifact))
35
- end
31
+ artifacts
36
32
  end.select do |artifact|
37
- !omit_empty || !artifact.empty?
33
+ !omit_empty || !artifact.is_empty
38
34
  end
39
35
  end
40
36
 
41
- def generate_git_embedded_artifacts(artifact)
42
- [].tap do |artifacts|
43
- artifacts.concat(submodules_artifacts = artifact.embedded_artifacts)
44
- artifacts.concat(submodules_artifacts.map(&method(:generate_git_embedded_artifacts)).flatten)
45
- end
46
- end
47
37
  end # GitArtifact
48
38
  end # Mod
49
39
  end # Dimg
@@ -14,7 +14,7 @@ module Dapp
14
14
  # rubocop:disable Metrics/ParameterLists
15
15
  def initialize(repo, dimg, to:, name: nil, branch: nil, tag: nil, commit: nil,
16
16
  cwd: nil, include_paths: nil, exclude_paths: nil, owner: nil, group: nil, as: nil,
17
- stages_dependencies: {}, ignore_signature_auto_calculation: false, disable_go_git: nil)
17
+ stages_dependencies: {}, ignore_signature_auto_calculation: false)
18
18
  @repo = repo
19
19
  @dimg = dimg
20
20
  @name = name
@@ -34,175 +34,31 @@ module Dapp
34
34
  @as = as
35
35
 
36
36
  @stages_dependencies = stages_dependencies
37
- @disable_go_git = disable_go_git unless disable_go_git.nil?
38
- end
39
- # rubocop:enable Metrics/ParameterLists
40
-
41
- def embedded_artifacts
42
- [submodules_artifacts, nested_git_directory_artifacts].flatten
43
- end
44
-
45
- def submodules_artifacts
46
- commit = dev_mode? ? nil : latest_commit
47
- repo.submodules_params(commit,
48
- paths: include_paths_or_cwd,
49
- exclude_paths: exclude_paths(true)).map(&method(:submodule_artifact))
50
- end
51
-
52
- def submodule_artifact(submodule_params)
53
- embedded_artifact(**submodule_params, disable_go_git: true)
54
- rescue Rugged::InvalidError => e
55
- raise Error::Rugged, code: :git_local_incorrect_gitmodules_params, data: { error: e.message }
56
- end
57
-
58
- def nested_git_directory_artifacts
59
- return [] unless dev_mode?
60
- repo
61
- .nested_git_directories_patches(paths: include_paths_or_cwd, exclude_paths: exclude_paths(true), **diff_patches_options)
62
- .map(&method(:nested_git_directory_artifact))
63
- end
64
-
65
- def nested_git_directory_artifact(patch)
66
- params = {}.tap do |p|
67
- p[:path] = patch.delta.new_file[:path]
68
- p[:type] = :local
69
- end
70
- embedded_artifact(params)
71
- end
72
37
 
73
- def embedded_artifact(embedded_params)
74
- embedded_rel_path = embedded_params[:path]
75
- embedded_repo = begin
76
- if embedded_params[:type] == :remote
77
- GitRepo::Remote.get_or_create(repo.dapp, embedded_rel_path, url: embedded_params[:url])
78
- elsif embedded_params[:type] == :local
79
- embedded_path = File.join(repo.workdir_path, embedded_params[:path])
80
- GitRepo::Local.new(repo.dapp, embedded_rel_path, embedded_path)
81
- else
82
- raise
83
- end
84
- end
85
-
86
- self.class.new(embedded_repo, dimg, embedded_artifact_options(embedded_params))
87
- end
88
-
89
- def embedded_artifact_options(embedded_params)
90
- embedded_rel_path = embedded_params[:path]
91
-
92
- {}.tap do |options|
93
- options[:name] = repo.dapp.consistent_uniq_slugify("embedded-#{embedded_rel_path}")
94
- options[:cwd] = begin
95
- subpath = Pathname(cwd).subpath_of(embedded_rel_path)
96
- subpath = '' if subpath == '.'
97
- subpath
98
- end
99
- options[:to] = Pathname(cwd).subpath_of?(embedded_rel_path) ? to : File.join(to, embedded_rel_path)
100
- options[:include_paths] = embedded_inherit_paths(include_paths, embedded_rel_path)
101
- options[:exclude_paths] = embedded_inherit_paths(exclude_paths, embedded_rel_path)
102
- options[:stages_dependencies] = begin
103
- stages_dependencies
104
- .map { |stage, paths| [stage, embedded_inherit_paths(paths, embedded_rel_path)] }
105
- .to_h
106
- end
107
- options[:branch] = embedded_params[:branch]
108
- options[:commit] = embedded_params[:commit]
109
- options[:owner] = owner
110
- options[:group] = group
111
-
112
- options[:ignore_signature_auto_calculation] = ignore_signature_auto_calculation
113
- options[:disable_go_git] = embedded_params[:disable_go_git]
114
- end
115
- end
116
38
 
117
- def embedded_inherit_paths(paths, embedded_rel_path)
118
- paths
119
- .select { |path| check_path?(embedded_rel_path, path) || check_subpath?(embedded_rel_path, path) }
120
- .map { |path| embedded_inherit_path(path, embedded_rel_path) }
121
- .flatten
122
- .compact
39
+ @all_include_paths = base_paths(@include_paths, true)
40
+ @all_exclude_paths = repo.exclude_paths + base_paths(@exclude_paths, true)
123
41
  end
42
+ # rubocop:enable Metrics/ParameterLists
124
43
 
125
- def embedded_inherit_path(path, embedded_rel_path)
126
- path_parts = path.split('/')
127
- test_path = nil
128
- inherited_paths = []
129
-
130
- until path_parts.empty?
131
- current_path_part = path_parts.shift
132
- test_path = [test_path, current_path_part].compact.join('/')
133
-
134
- match = File.fnmatch(test_path, embedded_rel_path, File::FNM_PATHNAME|File::FNM_DOTMATCH)
135
- break unless match || File.fnmatch(File.join(test_path, '**', '*'), embedded_rel_path, File::FNM_PATHNAME|File::FNM_DOTMATCH)
136
-
137
- any = (current_path_part == '**')
138
-
139
- if any
140
- inherited_paths << [current_path_part, path_parts].flatten.join('/')
141
- inherited_paths << path_parts.join('/') unless path_parts.empty?
142
- elsif match && !path_parts.empty?
143
- inherited_paths << path_parts.join('/')
144
- break
145
- elsif path_parts.empty?
146
- inherited_paths << '**'
147
- break
148
- end
149
- end
150
-
151
- inherited_paths
152
- end
153
-
154
- def cwd_type(stage)
155
- if dev_mode?
156
- p = repo.workdir_path.join(cwd)
157
- if p.exist?
158
- if p.directory?
159
- :directory
160
- else
161
- :file
162
- end
163
- end
164
- elsif cwd == ''
165
- :directory
166
- else
167
- cwd_type_by_commit(repo.lookup_commit(stage.layer_commit(self)))
168
- end
169
- end
170
-
171
- def cwd_type_by_commit(commit)
172
- cwd_entry = begin
173
- commit.tree.path(cwd)
174
- rescue Rugged::TreeError
175
- end
176
-
177
- if cwd_entry
178
- if cwd_entry[:type] == :tree
179
- :directory
44
+ def base_paths(paths, with_cwd = false)
45
+ [paths].flatten.compact.map do |path|
46
+ if with_cwd && !cwd.empty?
47
+ File.join(cwd, path)
180
48
  else
181
- :file
49
+ path
182
50
  end
51
+ .chomp('/')
52
+ .reverse.chomp('/')
53
+ .reverse
183
54
  end
184
55
  end
185
56
 
186
- def disable_go_git?
187
- return @disable_go_git unless @disable_go_git.nil?
188
-
189
- @disable_go_git = (dev_mode? || !!ENV["DAPP_DISABLE_GO_GIT"] || begin
190
- commit = dev_mode? ? nil : latest_commit
191
- repo.submodules(
192
- commit,
193
- paths: include_paths_or_cwd,
194
- exclude_paths: exclude_paths(true)
195
- ).any?
196
- end)
197
- end
198
-
199
57
  def apply_archive_command(stage)
200
- return apply_archive_command_old(stage) if disable_go_git?
201
-
202
58
  res = repo.dapp.ruby2go_git_artifact(
203
59
  "GitArtifact" => JSON.dump(get_ruby2go_state_hash),
204
60
  "method" => "ApplyArchiveCommand",
205
- "Stage" => JSON.dump(get_stub_stage_state(stage)),
61
+ "Stage" => JSON.dump(merge_layer_commit_stub_stage_state(stage.get_ruby2go_state_hash, stage)),
206
62
  )
207
63
 
208
64
  raise res["error"] if res["error"]
@@ -213,48 +69,23 @@ module Dapp
213
69
  Array(res["data"]["result"])
214
70
  end
215
71
 
216
- def apply_archive_command_old(stage)
217
- [].tap do |commands|
218
- if archive_any_changes?(stage)
219
- case cwd_type(stage)
220
- when :directory
221
- stage.image.add_service_change_label(repo.dapp.dimgstage_g_a_type_label(paramshash).to_sym => 'directory')
222
-
223
- commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
224
- commands << "#{sudo} #{repo.dapp.tar_bin} -xf #{archive_file(stage)} -C \"#{to}\""
225
- when :file
226
- stage.image.add_service_change_label(repo.dapp.dimgstage_g_a_type_label(paramshash).to_sym => 'file')
227
-
228
- commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
229
- commands << "#{sudo} #{repo.dapp.tar_bin} -xf #{archive_file(stage)} -C \"#{File.dirname(to)}\""
230
- end
231
- end
232
- end
233
- end
234
-
235
- def archive_type(stage)
236
- stage.prev_stage.image.labels[repo.dapp.dimgstage_g_a_type_label(paramshash)].to_s.to_sym
237
- end
72
+ def merge_layer_commit_stub_stage_state(stage_state, stage)
73
+ # Data for StubStage specific for ApplyPatchCommand
74
+ stage_state["LayerCommitMap"] = {
75
+ paramshash => stage.layer_commit(self),
76
+ }
77
+ stage_state["PrevStage"]["LayerCommitMap" ] = {
78
+ paramshash => stage.prev_stage.layer_commit(self),
79
+ }
238
80
 
239
- def get_stub_stage_state(stage)
240
- stage.get_ruby2go_state_hash.tap do |stage_state|
241
- # Data for StubStage specific for ApplyPatchCommand
242
- stage_state["LayerCommitMap"] = {
243
- paramshash => stage.layer_commit(self),
244
- }
245
- stage_state["PrevStage"]["LayerCommitMap" ] = {
246
- paramshash => stage.prev_stage.layer_commit(self),
247
- }
248
- end
81
+ stage_state
249
82
  end
250
83
 
251
84
  def apply_patch_command(stage)
252
- return apply_patch_command_old(stage) if disable_go_git?
253
-
254
85
  res = repo.dapp.ruby2go_git_artifact(
255
86
  "GitArtifact" => JSON.dump(get_ruby2go_state_hash),
256
87
  "method" => "ApplyPatchCommand",
257
- "Stage" => JSON.dump(get_stub_stage_state(stage)),
88
+ "Stage" => JSON.dump(merge_layer_commit_stub_stage_state(stage.get_ruby2go_state_hash, stage)),
258
89
  )
259
90
 
260
91
  raise res["error"] if res["error"]
@@ -265,48 +96,6 @@ module Dapp
265
96
  Array(res["data"]["result"])
266
97
  end
267
98
 
268
- def apply_patch_command_old(stage)
269
- [].tap do |commands|
270
- if dev_mode?
271
- if any_changes?(*dev_patch_stage_commits(stage))
272
- case archive_type(stage)
273
- when :directory
274
- files_to_remove_file_name = file_name('dev_files_to_remove')
275
- File.open(dimg.tmp_path('archives', files_to_remove_file_name), File::RDWR | File::CREAT) do |f|
276
- diff_patches(*dev_patch_stage_commits(stage))
277
- .map {|p| File.join(to, cwd, p.delta.new_file[:path])}
278
- .each(&f.method(:puts))
279
- end
280
-
281
- commands << "#{repo.dapp.rm_bin} -rf $(#{repo.dapp.cat_bin} #{dimg.container_tmp_path('archives', files_to_remove_file_name)})"
282
- commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
283
- commands << "#{sudo} #{repo.dapp.tar_bin} -xf #{archive_file(stage)} -C \"#{to}\""
284
- commands << "#{repo.dapp.find_bin} \"#{to}\" -empty -type d -delete"
285
- when :file
286
- commands << "#{repo.dapp.rm_bin} -rf \"#{to}\""
287
- commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
288
- commands << "#{sudo} #{repo.dapp.tar_bin} -xf #{archive_file(stage)} -C \"#{File.dirname(to)}\""
289
- else
290
- raise
291
- end
292
- end
293
- else
294
- if patch_any_changes?(stage)
295
- case archive_type(stage)
296
- when :directory
297
- commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
298
- commands << "#{sudo} #{repo.dapp.git_bin} apply --whitespace=nowarn --directory=\"#{to}\" --unsafe-paths #{patch_file(stage, *patch_stage_commits(stage))}"
299
- when :file
300
- commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
301
- commands << "#{sudo} #{repo.dapp.git_bin} apply --whitespace=nowarn --directory=\"#{File.dirname(to)}\" --unsafe-paths #{patch_file(stage, *patch_stage_commits(stage))}"
302
- else
303
- raise
304
- end
305
- end
306
- end
307
- end
308
- end
309
-
310
99
  def calculate_stage_dependencies_checksum(stage)
311
100
  res = repo.dapp.ruby2go_git_artifact(
312
101
  "GitArtifact" => JSON.dump(get_ruby2go_state_hash),
@@ -324,46 +113,11 @@ module Dapp
324
113
  end
325
114
 
326
115
  def stage_dependencies_checksum(stage)
327
- return stage_dependencies_checksum_old(stage) if dev_mode?
328
116
  stage_dependencies_key = [stage.name, commit]
329
117
  @stage_dependencies_checksums ||= {}
330
118
  @stage_dependencies_checksums[stage_dependencies_key] ||= calculate_stage_dependencies_checksum(stage)
331
119
  end
332
120
 
333
- def stage_dependencies_checksum_old(stage)
334
- return [] if (stage_dependencies = stages_dependencies[stage.name]).empty?
335
-
336
- paths = base_paths(stage_dependencies, true)
337
- commit = dev_mode? ? nil : latest_commit
338
-
339
- stage_dependencies_key = [stage.name, commit]
340
-
341
- @stage_dependencies_warning ||= {}
342
- @stage_dependencies_checksums ||= {}
343
- @stage_dependencies_checksums[stage_dependencies_key] ||= begin
344
- if dev_mode?
345
- dev_patch_hash(paths: paths)
346
- else
347
- if (entries = repo_entries(commit, paths: paths)).empty? && @stage_dependencies_warning[stage.name].nil?
348
- @stage_dependencies_warning[stage.name] = true
349
- code = cwd_type_by_commit(repo.lookup_commit(commit)) == :file ? :stage_dependencies_file_not_found : :stage_dependencies_not_found
350
- repo.dapp.log_warning(desc: { code: code,
351
- data: { repo: repo.respond_to?(:url) ? repo.url : 'local',
352
- dependencies: stage_dependencies.join(', ') } })
353
- end
354
-
355
- entries
356
- .sort_by {|root, entry| File.join(root, entry[:name])}
357
- .reduce(nil) {|prev_hash, (root, entry)|
358
- content = nil
359
- content = repo.lookup_object(entry[:oid]).content if entry[:type] == :blob
360
-
361
- hexdigest prev_hash, File.join(root, entry[:name]), entry[:filemode].to_s, content
362
- }
363
- end
364
- end
365
- end
366
-
367
121
  def patch_size(from_commit)
368
122
  res = repo.dapp.ruby2go_git_artifact(
369
123
  "GitArtifact" => JSON.dump(get_ruby2go_state_hash),
@@ -378,24 +132,6 @@ module Dapp
378
132
  res["data"]["result"]
379
133
  end
380
134
 
381
- def patch_size_old(from_commit)
382
- to_commit = dev_mode? ? nil : latest_commit
383
- diff_patches(from_commit, to_commit).reduce(0) do |bytes, patch|
384
- bytes += patch.delta.deleted? ? patch.delta.old_file[:size] : patch.delta.new_file[:size]
385
- bytes
386
- end
387
- end
388
-
389
- def dev_patch_hash(**options)
390
- return unless dev_mode?
391
- hexdigest begin
392
- diff_patches(nil, nil, **options).map do |patch|
393
- file = patch.delta.new_file
394
- [file[:path], File.read(File.join(repo.workdir_path, file[:path])), file[:mode]]
395
- end
396
- end
397
- end
398
-
399
135
  def get_ruby2go_state_hash
400
136
  {
401
137
  "Name" => @name.to_s,
@@ -408,10 +144,9 @@ module Dapp
408
144
  "RepoPath" => File.join("/", @cwd.to_s),
409
145
  "Owner" => @owner.to_s,
410
146
  "Group" => @group.to_s,
411
- "IncludePaths" => include_paths(true),
412
- "ExcludePaths" => exclude_paths(true),
147
+ "IncludePaths" => @all_include_paths,
148
+ "ExcludePaths" => @all_exclude_paths,
413
149
  "StagesDependencies" => @stages_dependencies.map {|k, v| [_stages_map[k], Array(v).map(&:to_s)]}.to_h,
414
- "Paramshash" => paramshash.to_s,
415
150
  "PatchesDir" => dimg.tmp_path('patches'),
416
151
  "ContainerPatchesDir" => dimg.container_tmp_path('patches'),
417
152
  "ArchivesDir" => dimg.tmp_path('archives'),
@@ -477,307 +212,76 @@ module Dapp
477
212
  end
478
213
 
479
214
  def paramshash
480
- hexdigest full_name, to, cwd, *include_paths, *exclude_paths, owner, group
481
- end
482
-
483
- def full_name
484
- "#{repo.name}#{name ? "_#{name}" : nil}"
485
- end
486
-
487
- def archive_any_changes?(stage)
488
- repo_entries(stage_commit(stage)).any?
489
- end
490
-
491
- def patch_any_changes?(stage)
492
- any_changes?(*patch_stage_commits(stage))
493
- end
494
-
495
- def empty?
496
- repo_entries(latest_commit).empty?
497
- end
498
-
499
- protected
500
-
501
- def hexdigest(*args)
502
- Digest::SHA256.hexdigest args.compact.map {|arg| arg.to_s.force_encoding("ASCII-8BIT")}.join(":::")
503
- end
504
-
505
- attr_reader :dimg
506
- attr_reader :to
507
- attr_reader :commit
508
- attr_reader :branch
509
- attr_reader :tag
510
- attr_reader :cwd
511
- attr_reader :owner
512
- attr_reader :group
513
- attr_reader :stages_dependencies
514
- attr_reader :ignore_signature_auto_calculation
515
-
516
- def sudo
517
- repo.dapp.sudo_command(owner: owner, group: group)
518
- end
519
-
520
- def credentials
521
- [:owner, :group].map { |attr| "--#{attr}=#{send(attr)}" unless send(attr).nil? }.compact
522
- end
523
-
524
- def archive_file(stage)
525
- commit = stage_commit(stage)
526
- if repo.dapp.options[:use_system_tar]
527
- archive_file_with_system_tar(stage, commit)
528
- else
529
- archive_file_with_tar_writer(stage, commit)
530
- end
531
- dimg.container_tmp_path('archives', archive_file_name(commit))
532
- end
533
-
534
- def archive_file_with_tar_writer(stage, commit)
535
- tar_write(dimg.tmp_path('archives', archive_file_name(commit))) do |tar|
536
- each_archive_entry(stage, commit) do |path, content, mode|
537
- relative_path = path.reverse.chomp('/').reverse
538
- if mode == 0o120000 # symlink
539
- tar.add_symlink relative_path, content, mode
540
- else
541
- tar.add_file relative_path, mode do |tf|
542
- tf.write content
543
- end
544
- end
545
- end
546
- end
547
- rescue Gem::Package::TooLongFileName => e
548
- raise Error::TarWriter, message: e.message
549
- end
550
-
551
- def archive_file_with_system_tar(stage, commit)
552
- dimg.tmp_path('archives', archive_file_name(commit)).tap do |archive_path|
553
- relative_archive_file_path = File.join('archives_files', file_name(commit))
554
- each_archive_entry(stage, commit) do |path, content, mode|
555
- file_path = dimg.tmp_path(relative_archive_file_path, path)
556
-
557
- if mode == 0o120000 # symlink
558
- FileUtils.symlink(content, file_path)
559
- else
560
- IO.write(file_path, content)
561
- FileUtils.chmod(mode, file_path)
562
- end
563
- end
564
-
565
- repo.dapp.shellout!("tar -C #{dimg.tmp_path(relative_archive_file_path)} -cf #{archive_path} .")
566
- end
567
- end
215
+ @paramshash ||= begin
216
+ res = repo.dapp.ruby2go_git_artifact("GitArtifact" => JSON.dump(get_ruby2go_state_hash), "method" => "GetParamshash")
568
217
 
569
- def slice_cwd(stage, path)
570
- return path if cwd.empty?
571
-
572
- case cwd_type(stage)
573
- when :directory
574
- path
575
- .reverse
576
- .chomp(cwd.reverse)
577
- .chomp('/')
578
- .reverse
579
- when :file
580
- File.basename(to)
581
- else
582
- raise
583
- end
584
- end
218
+ raise res["error"] if res["error"]
585
219
 
586
- def archive_file_name(commit)
587
- file_name(commit, ext: 'tar')
588
- end
220
+ self.set_ruby2go_state_hash(JSON.load(res["data"]["GitArtifact"]))
589
221
 
590
- def patch_file(stage, from_commit, to_commit)
591
- File.open(dimg.tmp_path('patches', patch_file_name(from_commit, to_commit)), File::RDWR | File::CREAT) do |f|
592
- diff_patches(from_commit, to_commit).each { |patch| f.write change_patch_new_file_path(stage, patch) }
222
+ res["data"]["result"]
593
223
  end
594
- dimg.container_tmp_path('patches', patch_file_name(from_commit, to_commit))
595
224
  end
596
225
 
597
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
598
- def change_patch_new_file_path(stage, patch)
599
- patch.to_s.lines.tap do |lines|
600
- prepare_native_path = proc do |path_with_cwd|
601
- case archive_type(stage)
602
- when :directory
603
- path_with_cwd.sub(cwd, '')
604
- when :file
605
- File.basename(to)
606
- else
607
- raise
608
- end
609
- end
610
-
611
- modify_patch_line = proc do |line_number, path_char|
612
- action_part, path_part = lines[line_number].strip.split(' ', 2)
613
- if (path_with_cwd = path_part.partition("#{path_char}/").last).start_with?(cwd)
614
- prepare_native_path.call(path_with_cwd).tap do |native_path|
615
- if native_path
616
- expected_path = File.join(path_char, native_path)
617
- lines[line_number] = [action_part, expected_path].join(' ') + "\n"
618
- end
619
- end
620
- end
621
- end
622
-
623
- modify_patch_first_line = proc do
624
- old_file_path = prepare_native_path.call(patch.delta.old_file[:path])
625
- new_file_path = prepare_native_path.call(patch.delta.new_file[:path])
626
- lines[0] = ['diff --git', File.join('a', old_file_path), File.join('b', new_file_path)].join(' ') + "\n"
627
- end
628
-
629
- modify_patch = proc do |*modify_patch_line_args|
630
- native_paths = modify_patch_line_args.map { |args| modify_patch_line.call(*args) }
631
- unless (native_paths = native_paths.compact.uniq).empty?
632
- raise Error::Build, code: :unsupported_patch_format, data: { patch: patch.to_s } unless native_paths.one?
633
- modify_patch_first_line.call
634
- end
635
- end
636
-
637
- case
638
- when patch.delta.deleted? then modify_patch.call([3, 'a'])
639
- when patch.delta.added? then modify_patch.call([4, 'b'])
640
- when patch.delta.modified?
641
- if patch_file_mode_changed?(patch)
642
- if patch.changes.zero?
643
- modify_patch_first_line.call
644
- else
645
- modify_patch.call([4, 'a'], [5, 'b'])
646
- end
647
- else
648
- modify_patch.call([2, 'a'], [3, 'b'])
649
- end
650
- else
651
- raise
652
- end
653
- end.join
654
- end
655
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
656
-
657
- def patch_file_mode_changed?(patch)
658
- patch.delta.old_file[:mode] != patch.delta.new_file[:mode]
659
- end
226
+ def full_name
227
+ @full_name ||= begin
228
+ res = repo.dapp.ruby2go_git_artifact("GitArtifact" => JSON.dump(get_ruby2go_state_hash), "method" => "FullName")
660
229
 
661
- def patch_file_name(from_commit, to_commit)
662
- file_name(from_commit, to_commit, ext: 'patch')
663
- end
230
+ raise res["error"] if res["error"]
664
231
 
665
- def file_name(*args, ext: nil)
666
- "#{[paramshash, args].flatten.compact.join('_')}#{".#{ext}" unless ext.nil? }"
667
- end
232
+ self.set_ruby2go_state_hash(JSON.load(res["data"]["GitArtifact"]))
668
233
 
669
- def repo_entries(commit, paths: include_paths_or_cwd)
670
- (@repo_entries ||= {})[[commit, paths]] ||= begin
671
- repo
672
- .blobs_entries(commit, paths: paths, exclude_paths: exclude_paths(true))
673
- .select { |_, entry| !submodule_mode?(entry[:filemode]) }
234
+ res["data"]["result"]
674
235
  end
675
236
  end
676
237
 
677
- def each_archive_entry(stage, commit)
678
- if dev_mode? && stage.name != :g_a_archive
679
- diff_patches(commit, nil).each do |patch|
680
- file = patch.delta.new_file
681
- host_file_path = File.join(repo.workdir_path, file[:path])
682
- next unless File.exist?(host_file_path)
238
+ def is_patch_empty(stage)
239
+ return @is_patch_empty if !@is_patch_empty.nil?
683
240
 
684
- content = File.read(host_file_path)
685
- yield slice_cwd(stage, file[:path]), content, file[:mode]
686
- end
687
- else
688
- repo_entries(commit).each do |root, entry|
689
- next unless entry[:type] == :blob
241
+ @is_patch_empty = begin
242
+ res = repo.dapp.ruby2go_git_artifact(
243
+ "GitArtifact" => JSON.dump(get_ruby2go_state_hash),
244
+ "method" => "IsPatchEmpty",
245
+ "Stage" => JSON.dump(merge_layer_commit_stub_stage_state({"PrevStage" => {}}, stage)),
246
+ )
690
247
 
691
- entry_file_path = File.join(root, entry[:name])
692
- content = repo.lookup_object(entry[:oid]).content
693
- yield slice_cwd(stage, entry_file_path), content, entry[:filemode]
694
- end
695
- end
696
- end
248
+ raise res["error"] if res["error"]
697
249
 
698
- def diff_patches(from_commit, to_commit, paths: include_paths_or_cwd)
699
- (@diff_patches ||= {})[[from_commit, to_commit, paths]] ||= begin
700
- repo
701
- .patches(from_commit, to_commit, paths: paths, exclude_paths: exclude_paths(true), **diff_patches_options)
702
- .select do |patch|
703
- file_mode = patch.delta.status == :deleted ? patch.delta.old_file[:mode] : patch.delta.new_file[:mode]
704
- !(submodule_mode?(file_mode) || # FIXME: https://github.com/libgit2/rugged/issues/727
705
- nested_git_directory_mode?(file_mode))
706
- end
707
- end
708
- end
250
+ self.set_ruby2go_state_hash(JSON.load(res["data"]["GitArtifact"]))
709
251
 
710
- def diff_patches_options
711
- {}.tap do |opts|
712
- opts[:force_text] = true
713
- if dev_mode?
714
- opts[:include_untracked] = true
715
- opts[:recurse_untracked_dirs] = true
716
- end
252
+ res["data"]["result"]
717
253
  end
718
254
  end
719
255
 
720
- def submodule_mode?(mode) # FIXME
721
- mode == 0o160000
722
- end
256
+ def is_empty
257
+ return @is_empty if !@is_empty.nil?
723
258
 
724
- def nested_git_directory_mode?(mode)
725
- mode == 0o040000
726
- end
259
+ @is_empty = begin
260
+ res = repo.dapp.ruby2go_git_artifact(
261
+ "GitArtifact" => JSON.dump(get_ruby2go_state_hash),
262
+ "method" => "IsEmpty",
263
+ )
727
264
 
728
- def include_paths_or_cwd
729
- case
730
- when !include_paths(true).empty? then include_paths(true)
731
- when !cwd.empty? then [cwd]
732
- else
733
- []
734
- end
735
- end
736
-
737
- def exclude_paths(with_cwd = false)
738
- repo.exclude_paths + base_paths(@exclude_paths, with_cwd)
739
- end
265
+ raise res["error"] if res["error"]
740
266
 
741
- def include_paths(with_cwd = false)
742
- base_paths(@include_paths, with_cwd)
743
- end
267
+ self.set_ruby2go_state_hash(JSON.load(res["data"]["GitArtifact"]))
744
268
 
745
- def base_paths(paths, with_cwd = false)
746
- [paths].flatten.compact.map do |path|
747
- if with_cwd && !cwd.empty?
748
- File.join(cwd, path)
749
- else
750
- path
751
- end
752
- .chomp('/')
753
- .reverse.chomp('/')
754
- .reverse
269
+ res["data"]["result"]
755
270
  end
756
271
  end
757
272
 
758
- def stage_commit(stage)
759
- stage.layer_commit(self)
760
- end
761
-
762
- def patch_stage_commits(stage)
763
- [stage.prev_stage.layer_commit(self), stage.layer_commit(self)]
764
- end
765
-
766
- def dev_patch_stage_commits(stage)
767
- [stage.prev_stage.layer_commit(self), nil]
768
- end
769
-
770
- def any_changes?(from_commit, to_commit)
771
- diff_patches(from_commit, to_commit).any?
772
- end
773
-
774
- def dev_mode?
775
- local? && dimg.dev_mode?
776
- end
273
+ protected
777
274
 
778
- def local?
779
- repo.is_a? GitRepo::Local
780
- end
275
+ attr_reader :dimg
276
+ attr_reader :to
277
+ attr_reader :commit
278
+ attr_reader :branch
279
+ attr_reader :tag
280
+ attr_reader :cwd
281
+ attr_reader :owner
282
+ attr_reader :group
283
+ attr_reader :stages_dependencies
284
+ attr_reader :ignore_signature_auto_calculation
781
285
  end
782
286
  end
783
287
  end
data/lib/dapp/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = "0.35.21"
2
+ VERSION = "0.35.22"
3
3
  BUILD_CACHE_VERSION = 31
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.35.21
4
+ version: 0.35.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-16 00:00:00.000000000 Z
11
+ date: 2018-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout