dapp 0.23.10 → 0.24.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: 949df785aff321e34eb685421d3c7c0b396bc62b
4
- data.tar.gz: 85336f30a665901ee3c716a9d53512112e58426e
3
+ metadata.gz: 0a3eb814504194a1734b9bab5b11a53763eef1b7
4
+ data.tar.gz: 66666ebe9a2afbb29b34345e8183dbdd855ff787
5
5
  SHA512:
6
- metadata.gz: bcb935ad210325c03aa642906adbd970beef82a2e30c3e0d3ccf14e7a60e0b219fe98e141fa28204421b26fafe270dd16ba207073d60fdff5f4cf6fe1a30b437
7
- data.tar.gz: 7f199a77a71b6096989ad44431c1e1e900f7155d1a3840f0fc39eb781b3a2e8cc3e0300c12878efb2df04a42b284b8150daabfdebb28c739a7e49370928dcedf
6
+ metadata.gz: 0ab24da89ae14385765f1d8424fad856113fbd54ab978f1bc71d7a67b281d9def44e333e3955042bb29f85b469043bb54eea90f0154ced45e4177a74c7001e44
7
+ data.tar.gz: e3cd721f5989eca155057cb56a16ff396ad7b11ce5b28896fb16e812cf2cbda8cf9108ff98b9920dfedd3f62691c9d64fa91836adab72290634311f6392c4c14
data/bin/dapp CHANGED
@@ -28,10 +28,6 @@ begin
28
28
  $stderr.puts "\033[1m\033[90mStacktrace dumped to #{filename}\033[0m"
29
29
  end
30
30
 
31
- if Dapp::CLI.dapp_object
32
- Dapp::CLI.dapp_object.sentry_exception(e)
33
- end
34
-
35
31
  raise
36
32
  end
37
33
  rescue Dapp::Error::Shellout => e
@@ -80,7 +80,7 @@ en:
80
80
  stage_artifact_double_associate: "Can't use `%{stage}` stage for artifact; already used in `%{conflict_stage}` stage!"
81
81
  stage_artifact_not_supported_associated_stage: "Bad artifact stage `%{stage}`!"
82
82
  git_artifact_remote_branch_with_commit: "Remote git repo: use `commit` or `branch` directive!"
83
- artifact_conflict: "Conflict between artifacts!\n\n%{dappfile_context}"
83
+ artifact_conflict: "Conflict between artifacts paths!"
84
84
  scratch_unsupported_directive: "Scratch dimg has unsupported directive `%{directive}`!"
85
85
  scratch_artifact_required: "Scratch dimg without artifacts!"
86
86
  scratch_artifact_associated: "Scratch artifact can't be associated: not expected `before`/`after` attribute!"
@@ -120,7 +120,9 @@ en:
120
120
  commit_not_found_in_remote_git_repository: "Remote git repo `%{url}`: commit `%{commit}` not found!\nIf commit has been rebased: run command `dapp dimg stages cleanup local --improper-git-commit`!"
121
121
  branch_not_exist_in_remote_git_repository: "Remote git repo `%{url}`: branch `%{branch}` not exist!"
122
122
  rugged_protocol_not_supported: "Rugged has been compiled without support for `%{protocol}`.\nGit repositories will not be reachable via `%{protocol}` (`%{url}`).\nRugged.features should include `%{protocol}`."
123
- submodule_not_supported: "Git submodules not supported! (`%{path}`)"
123
+ incorrect_gitmodules_file: "Local git repo with invalid `.gitmodules` file: `%{error}`."
124
+ git_repository_without_remote_url: "Git repo `%{name}`: remote url cannot be detected!\nYou should check `remote origin url` in `%{path}` repository."
125
+ git_repository_not_found: "Git repository `%{path}` not found!\nYou should check `remote origin url` in `%{parent_git_path}` repository."
124
126
  lock:
125
127
  timeout: "Could not obtain lock for `%{name}` within %{timeout} seconds!"
126
128
  app:
@@ -26,8 +26,6 @@ require 'zlib'
26
26
  require 'slugify'
27
27
  require 'base64'
28
28
  require 'io/console'
29
- require 'sentry-raven'
30
- require 'toml-rb'
31
29
 
32
30
  require 'dapp/version'
33
31
  require 'dapp/core_ext/hash'
@@ -38,7 +36,6 @@ require 'dapp/helper/sha256'
38
36
  require 'dapp/helper/net_status'
39
37
  require 'dapp/helper/tar'
40
38
  require 'dapp/helper/yaml'
41
- require 'dapp/helper/url'
42
39
  require 'dapp/prctl'
43
40
  require 'dapp/error/mod/user'
44
41
  require 'dapp/error/base'
@@ -59,7 +56,6 @@ require 'dapp/config/directive/base'
59
56
  require 'dapp/config/config'
60
57
  require 'dapp/dapp/lock'
61
58
  require 'dapp/dapp/ssh_agent'
62
- require 'dapp/dapp/sentry'
63
59
  require 'dapp/dapp/git_artifact'
64
60
  require 'dapp/dapp/dappfile'
65
61
  require 'dapp/dapp/chef'
@@ -38,10 +38,6 @@ BANNER
38
38
  show_options: true,
39
39
  exit: 0
40
40
 
41
- class << self
42
- attr_accessor :dapp_object
43
- end
44
-
45
41
  def initialize(*args)
46
42
  super(*args)
47
43
 
@@ -58,8 +58,6 @@ module Dapp
58
58
 
59
59
  def run_dapp_command(run_method, options: {}, log_running_time: true, try_host_docker_login: false)
60
60
  dapp = ::Dapp::Dapp.new(options: options)
61
- ::Dapp::CLI.dapp_object = dapp
62
- dapp.sentry_message("Manual usage: `#{options[:dapp_command]}` command") unless ENV['CI']
63
61
 
64
62
  log_dapp_running_time(dapp, ignore: !log_running_time) do
65
63
  begin
@@ -76,10 +74,6 @@ module Dapp
76
74
  end
77
75
  end
78
76
 
79
- def run_method
80
- class_to_lowercase
81
- end
82
-
83
77
  def log_dapp_running_time(dapp, ignore: false)
84
78
  return yield if ignore
85
79
 
@@ -101,7 +95,7 @@ module Dapp
101
95
  self.class.print_error_with_help_and_die! self, "cannot use alias options --run-dir, --build-dir, --deploy-dir at the same time"
102
96
  end
103
97
 
104
- config.merge(build_dir: dirs.compact.first, dapp_command: run_method, **kwargs)
98
+ config.merge(build_dir: dirs.compact.first, **kwargs)
105
99
  end
106
100
  end
107
101
  end
@@ -17,13 +17,10 @@ module Dapp
17
17
  include Logging::Paint
18
18
 
19
19
  include SshAgent
20
- include Sentry
21
-
22
20
  include Helper::Sha256
23
- extend Helper::Trivia
21
+ extend Helper::Trivia
24
22
  include Helper::Trivia
25
23
  include Helper::Tar
26
- include Helper::Url
27
24
 
28
25
  include Deps::Toolchain
29
26
  include Deps::Gitartifact
@@ -44,29 +41,19 @@ module Dapp
44
41
  self.class.options
45
42
  end
46
43
 
47
- def settings
48
- @settings ||= begin
49
- settings_path = File.join(self.class.home_dir, "settings.toml")
50
-
51
- if File.exists? settings_path
52
- TomlRB.load_file(settings_path)
53
- else
54
- {}
55
- end
56
- end
57
- end
58
-
59
44
  def name
60
45
  @name ||= begin
61
46
  n = begin
62
47
  if (name = options[:name])
63
48
  name
64
- elsif git_url
65
- repo_name = git_url.split('/').last
66
- repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
67
- repo_name
68
- elsif git_path
69
- File.basename(File.dirname(git_path)).to_s
49
+ elsif git_own_repo_exist?
50
+ if git_url
51
+ repo_name = git_url.split('/').last
52
+ repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
53
+ repo_name
54
+ else
55
+ File.basename(File.dirname(git_own_repo.path)).to_s
56
+ end
70
57
  else
71
58
  path.basename.to_s
72
59
  end
@@ -76,20 +63,19 @@ module Dapp
76
63
  end
77
64
 
78
65
  def git_url
79
- return unless git_config
80
- (git_config['remote "origin"'] || {})['url']
66
+ return unless git_own_repo_exist?
67
+ git_own_repo.remote_origin_url
68
+ rescue Dimg::Error::Rugged => e
69
+ return if e.net_status[:code] == :git_repository_without_remote_url
70
+ raise
81
71
  end
82
72
 
83
- def git_config
84
- @git_config ||= begin
85
- IniFile.load(File.join(git_path, 'config')) if git_path
86
- end
73
+ def git_own_repo_exist?
74
+ git_own_repo.exist?
87
75
  end
88
76
 
89
- def git_path
90
- defined?(@git_path) ? @git_path : begin
91
- @git_path = search_file_upward('.git')
92
- end
77
+ def git_own_repo
78
+ @git_own_repo ||= Dimg::GitRepo::Own.new(self)
93
79
  end
94
80
 
95
81
  def path(*path)
@@ -101,8 +87,8 @@ module Dapp
101
87
  self.class.tmp_base_dir
102
88
  end
103
89
 
104
- def build_dir
105
- @build_dir ||= begin
90
+ def build_path(*path)
91
+ @build_path ||= begin
106
92
  if option_build_dir
107
93
  Pathname.new(option_build_dir)
108
94
  else
@@ -110,15 +96,12 @@ module Dapp
110
96
  Pathname.new(dir)
111
97
  end.expand_path.tap(&:mkpath)
112
98
  end
113
- end
114
-
115
- def build_path(*path)
116
- make_path(build_dir, *path)
99
+ make_path(@build_path, *path)
117
100
  end
118
101
 
119
102
  def local_git_artifact_exclude_paths(&blk)
120
103
  super do |exclude_paths|
121
- build_path_relpath = Pathname.new(build_path).subpath_of(File.dirname(git_path))
104
+ build_path_relpath = Pathname.new(build_path).subpath_of(File.dirname(git_own_repo.path))
122
105
  exclude_paths << build_path_relpath.to_s if build_path_relpath
123
106
 
124
107
  yield exclude_paths if block_given?
@@ -1,22 +1,12 @@
1
1
  module Dapp
2
2
  class Dapp
3
3
  module OptionTags
4
- def git_local_repo
5
- @git_repo ||= ::Dapp::Dimg::GitRepo::Own.new(self)
6
- end
7
-
8
4
  def tagging_schemes
9
5
  %w(git_tag git_branch git_commit custom ci)
10
6
  end
11
7
 
12
8
  def tags_by_scheme
13
9
  @tags_by_scheme_name ||= begin
14
- if simple_tags[:custom].any?
15
- if settings.fetch("sentry", {}).fetch("detect-push-tag-usage", false)
16
- sentry_message("--tag or --tag-slug usage detected", extra: {"slug_tags" => simple_tags})
17
- end
18
- end
19
-
20
10
  [simple_tags, branch_tags, commit_tags, build_tags, ci_tags].reduce({}) do |some_tags_by_scheme, tags_by_scheme|
21
11
  tags_by_scheme.in_depth_merge(some_tags_by_scheme)
22
12
  end.tap do |tags_by_scheme|
@@ -38,13 +28,13 @@ module Dapp
38
28
 
39
29
  def branch_tags
40
30
  return {} unless options[:tag_branch]
41
- raise Error::Dapp, code: :git_branch_without_name if (branch = git_local_repo.branch) == 'HEAD'
31
+ raise Error::Dapp, code: :git_branch_without_name if (branch = git_own_repo.branch) == 'HEAD'
42
32
  { git_branch: [branch] }
43
33
  end
44
34
 
45
35
  def commit_tags
46
36
  return {} unless options[:tag_commit]
47
- { git_commit: [git_local_repo.latest_commit] }
37
+ { git_commit: [git_own_repo.latest_commit] }
48
38
  end
49
39
 
50
40
  def build_tags
@@ -32,7 +32,7 @@ module Dapp
32
32
  def safe_cp(from, to, owner, group, include_paths = [], exclude_paths = [])
33
33
  ''.tap do |cmd|
34
34
  cmd << dimg.dapp.rsync_bin
35
- cmd << ' --archive --links --inplace'
35
+ cmd << ' --archive --links'
36
36
  cmd << " --chown=#{owner}:#{group}" if owner or group
37
37
 
38
38
  if include_paths.any?
@@ -87,7 +87,7 @@ module Dapp
87
87
  "#{builder.dimg.dapp.mkdir_bin} -p ~/.ssh",
88
88
  'echo "Host *" >> ~/.ssh/config',
89
89
  'echo " StrictHostKeyChecking no" >> ~/.ssh/config',
90
- *local_paths.map {|path| "#{builder.dimg.dapp.rsync_bin} --inplace --archive --relative #{path} /tmp/local_cookbooks"},
90
+ *local_paths.map {|path| "#{builder.dimg.dapp.rsync_bin} --archive --relative #{path} /tmp/local_cookbooks"},
91
91
  "cd /tmp/local_cookbooks/#{path}",
92
92
  "cp #{tmp_berksfile_path} Berksfile",
93
93
  "cp #{tmp_metadata_path} metadata.rb",
@@ -9,6 +9,10 @@ module Dapp::Dimg::CLI
9
9
  self.class.parse_options(self, argv)
10
10
  run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments))
11
11
  end
12
+
13
+ def run_method
14
+ class_to_lowercase
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -5,6 +5,13 @@ module Dapp
5
5
  class ArtifactDimg < Dimg
6
6
  def validate_scratch!
7
7
  end
8
+
9
+ def validate_artifacts_artifacts!
10
+ end
11
+
12
+ def validated_artifacts
13
+ _git_artifact._local + _git_artifact._remote
14
+ end
8
15
  end
9
16
  end
10
17
  end
@@ -136,7 +136,6 @@ module Dapp
136
136
 
137
137
  def artifacts_after_parsing!
138
138
  _artifacts_auto_excluding!
139
- _artifact.map(&:_config).each(&:artifacts_after_parsing!)
140
139
  end
141
140
 
142
141
  protected
@@ -4,8 +4,6 @@ module Dapp
4
4
  module Directive
5
5
  class Dimg < Base
6
6
  module Validation
7
- include Helper::Trivia
8
-
9
7
  def validate!
10
8
  directives_validate!
11
9
  validate_scratch!
@@ -73,39 +71,12 @@ module Dapp
73
71
  verifiable_artifact = artifacts.shift
74
72
  artifacts.select { |a| a[:to] == verifiable_artifact[:to] }.each do |artifact|
75
73
  next if verifiable_artifact[:index] == artifact[:index]
76
- begin
77
- validate_artifact!(verifiable_artifact, artifact)
78
- validate_artifact!(artifact, verifiable_artifact)
79
- rescue ::Dapp::Error::Config => e
80
- conflict_between_artifacts!(artifact, verifiable_artifact) if e.net_status[:code] == :artifact_conflict
81
- raise
82
- end
74
+ validate_artifact!(verifiable_artifact, artifact)
75
+ validate_artifact!(artifact, verifiable_artifact)
83
76
  end
84
77
  end
85
78
  end
86
79
 
87
- def conflict_between_artifacts!(*formatted_artifacts)
88
- artifacts = formatted_artifacts.flatten.map { |formatted_artifact| formatted_artifact[:related_artifact] }
89
- dappfile_context = artifacts.map do |artifact|
90
- artifact_directive = []
91
- artifact_directive << begin
92
- if artifact.is_a? Artifact::Export
93
- "artifact.export('#{artifact._cwd}') do"
94
- else
95
- "git#{"('#{artifact._url}')" if artifact.respond_to?(:_url)}.add('#{artifact._cwd}') do"
96
- end
97
- end
98
- [:include_paths, :exclude_paths].each do |directive|
99
- next if (paths = artifact.send("_#{directive}")).empty?
100
- artifact_directive << " #{directive} '#{paths.join("', '")}'"
101
- end
102
- artifact_directive << " to '#{artifact._to}'"
103
- artifact_directive << 'end'
104
- artifact_directive.join("\n")
105
- end.join("\n\n")
106
- raise ::Dapp::Error::Config, code: :artifact_conflict, data: { dappfile_context: dappfile_context }
107
- end
108
-
109
80
  def validate_artifact_format(artifacts)
110
81
  artifacts.map do |a|
111
82
  path_format = proc { |path| File.expand_path(File.join('/', path, '/'))[1..-1] }
@@ -133,20 +104,26 @@ module Dapp
133
104
  index: artifacts.index(a),
134
105
  to: to,
135
106
  include_paths: include_paths,
136
- exclude_paths: exclude_paths,
137
- related_artifact: a
107
+ exclude_paths: exclude_paths
138
108
  }
139
109
  end
140
110
  end
141
111
 
142
112
  def validate_artifact!(verifiable_artifact, artifact)
143
- cases = []
144
- cases << verifiable_artifact[:include_paths].any? do |verifiable_path|
145
- !ignore_path?(verifiable_path, paths: artifact[:include_paths], exclude_paths: artifact[:exclude_paths])
146
- end
147
- cases << (verifiable_artifact[:include_paths].empty? && artifact[:include_paths].empty?)
113
+ verifiable_artifact[:include_paths].each do |verifiable_path|
114
+ potential_conflicts = artifact[:include_paths].select { |path| path.start_with?(verifiable_path) }
115
+ validate_artifact_path!(verifiable_artifact, potential_conflicts)
116
+ end.empty? && verifiable_artifact[:exclude_paths].empty? && raise(::Dapp::Error::Config, code: :artifact_conflict)
117
+ validate_artifact_path!(verifiable_artifact, artifact[:include_paths]) if verifiable_artifact[:include_paths].empty?
118
+ end
148
119
 
149
- raise ::Dapp::Error::Config, code: :artifact_conflict if cases.any?
120
+ def validate_artifact_path!(verifiable_artifact, potential_conflicts)
121
+ potential_conflicts.all? do |path|
122
+ loop do
123
+ break if verifiable_artifact[:exclude_paths].include?(path) || ((path = File.dirname(path)) == '.')
124
+ end
125
+ verifiable_artifact[:exclude_paths].include?(path)
126
+ end.tap { |res| res || raise(::Dapp::Error::Config, code: :artifact_conflict) }
150
127
  end
151
128
 
152
129
  def _associated_artifacts
@@ -3,23 +3,24 @@ module Dapp
3
3
  module Config
4
4
  module Directive
5
5
  class GitArtifactRemote < GitArtifactLocal
6
- include ::Dapp::Helper::Url
7
-
8
6
  attr_reader :_url, :_name, :_branch, :_commit
9
7
 
10
8
  def initialize(url, **kwargs, &blk)
11
9
  @_url = url
12
- @_name = git_url_to_name(url)
10
+
11
+ url_without_scheme = url.split("://", 2).last
12
+ url_without_creds = url_without_scheme.split(":", 2).last
13
+ @_name = url_without_creds.gsub(%r{.*?([^\/ ]+\/[^\/ ]+)\.git}, '\\1')
13
14
 
14
15
  super(**kwargs, &blk)
15
16
  end
16
17
 
17
18
  def branch(value)
18
- sub_directive_eval { @_branch = value.to_s }
19
+ sub_directive_eval { @_branch = value }
19
20
  end
20
21
 
21
22
  def commit(value)
22
- sub_directive_eval { @_commit = value.to_s }
23
+ sub_directive_eval { @_commit = value }
23
24
  end
24
25
 
25
26
  def _export
@@ -37,15 +38,15 @@ module Dapp
37
38
  attr_accessor :_url, :_name, :_branch, :_commit
38
39
 
39
40
  def _artifact_options
40
- super.merge(name: _name, branch: _branch, commit: _commit)
41
+ super.merge(name: _name, branch: _branch.to_s, commit: _commit.to_s)
41
42
  end
42
43
 
43
44
  def branch(value)
44
- sub_directive_eval { @_branch = value.to_s }
45
+ sub_directive_eval { @_branch = value }
45
46
  end
46
47
 
47
48
  def commit(value)
48
- sub_directive_eval { @_commit = value.to_s }
49
+ sub_directive_eval { @_commit = value }
49
50
  end
50
51
 
51
52
  def validate!
@@ -11,8 +11,10 @@ module Dapp
11
11
  log_step_with_indent(repo) do
12
12
  registry = dimg_registry(repo)
13
13
 
14
- cleanup_repo_by_nonexistent_git_primitive(registry, actual_detailed_dimgs_images_by_scheme(registry))
15
- cleanup_repo_by_policies(registry, actual_detailed_dimgs_images_by_scheme(registry))
14
+ if git_own_repo_exist?
15
+ cleanup_repo_by_nonexistent_git_primitive(registry, actual_detailed_dimgs_images_by_scheme(registry))
16
+ cleanup_repo_by_policies(registry, actual_detailed_dimgs_images_by_scheme(registry))
17
+ end
16
18
 
17
19
  begin
18
20
  repo_dimgs = repo_dimgs_images(registry)
@@ -46,7 +48,7 @@ module Dapp
46
48
  case scheme
47
49
  when 'git_tag' then consistent_git_tags.include?(detailed_dimg_image[:tag])
48
50
  when 'git_branch' then consistent_git_remote_branches.include?(detailed_dimg_image[:tag])
49
- when 'git_commit' then git_local_repo.commit_exists?(detailed_dimg_image[:tag])
51
+ when 'git_commit' then git_own_repo.commit_exists?(detailed_dimg_image[:tag])
50
52
  else
51
53
  raise
52
54
  end
@@ -60,7 +62,7 @@ module Dapp
60
62
  end
61
63
 
62
64
  def consistent_git_remote_branches
63
- @consistent_git_remote_branches ||= git_local_repo.remote_branches.map(&method(:consistent_uniq_slugify))
65
+ @consistent_git_remote_branches ||= git_own_repo.remote_branches.map(&method(:consistent_uniq_slugify))
64
66
  end
65
67
 
66
68
  def cleanup_repo_by_nonexistent_git_base(repo_dimgs_images_by_scheme, dapp_tag_scheme)
@@ -80,15 +82,15 @@ module Dapp
80
82
  if scheme == 'git_tag'
81
83
  !consistent_git_tags.include?(dimg[:tag])
82
84
  elsif scheme == 'git_commit'
83
- !git_local_repo.commit_exists?(dimg[:tag])
85
+ !git_own_repo.commit_exists?(dimg[:tag])
84
86
  end
85
87
  end
86
88
 
87
89
  dimg[:created_at] = begin
88
90
  if scheme == 'git_tag'
89
- git_local_repo.tag_at(git_tag_by_consistent_git_tag(dimg[:tag]))
91
+ git_own_repo.tag_at(git_tag_by_consistent_git_tag(dimg[:tag]))
90
92
  elsif scheme == 'git_commit'
91
- git_local_repo.commit_at(dimg[:tag])
93
+ git_own_repo.commit_at(dimg[:tag])
92
94
  end
93
95
  end
94
96
  dimg
@@ -120,7 +122,7 @@ module Dapp
120
122
  end
121
123
 
122
124
  def git_tag_by_consistent_tag_name
123
- @git_consistent_tags ||= git_local_repo.tags.map { |t| [consistent_uniq_slugify(t), t] }.to_h
125
+ @git_consistent_tags ||= git_own_repo.tags.map { |t| [consistent_uniq_slugify(t), t] }.to_h
124
126
  end
125
127
 
126
128
  def deployed_docker_images
@@ -7,24 +7,36 @@ module Dapp
7
7
  end
8
8
 
9
9
  def local_git_artifacts
10
- @local_git_artifact_list ||= begin
10
+ @local_git_artifact_list ||= [].tap do |artifacts|
11
11
  repo = GitRepo::Own.new(self)
12
12
  Array(config._git_artifact._local).map do |ga_config|
13
- ::Dapp::Dimg::GitArtifact.new(repo, **ga_config._artifact_options)
13
+ artifacts.concat(generate_git_artifacts(repo, **ga_config._artifact_options))
14
14
  end
15
15
  end
16
16
  end
17
17
 
18
18
  def remote_git_artifacts
19
- @remote_git_artifact_list ||= begin
20
- repos = {}
21
- Array(config._git_artifact._remote).map do |ga_config|
22
- repo_key = [ga_config._url, ga_config._branch]
23
- repos[repo_key] ||= GitRepo::Remote.new(self, ga_config._name, url: ga_config._url).tap { |repo| repo.fetch!(ga_config._branch) }
24
- ::Dapp::Dimg::GitArtifact.new(repos[repo_key], **ga_config._artifact_options)
19
+ @remote_git_artifact_list ||= [].tap do |artifacts|
20
+ Array(config._git_artifact._remote).each do |ga_config|
21
+ repo = GitRepo::Remote.get_or_init(self, ga_config._name, url: ga_config._url, branch: ga_config._branch)
22
+ artifacts.concat(generate_git_artifacts(repo, **ga_config._artifact_options))
25
23
  end
26
24
  end
27
25
  end
26
+
27
+ def generate_git_artifacts(repo, **git_artifact_options)
28
+ [].tap do |artifacts|
29
+ artifacts << (artifact = ::Dapp::Dimg::GitArtifact.new(repo, **git_artifact_options))
30
+ artifacts.concat(generate_git_submodules_artifacts(artifact))
31
+ end
32
+ end
33
+
34
+ def generate_git_submodules_artifacts(artifact)
35
+ [].tap do |artifacts|
36
+ artifacts.concat(submodules_artifacts = artifact.submodules_artifacts)
37
+ artifacts.concat(submodules_artifacts.map(&method(:generate_git_submodules_artifacts)).flatten)
38
+ end
39
+ end
28
40
  end # GitArtifact
29
41
  end # Mod
30
42
  end # Dimg
@@ -3,6 +3,7 @@ module Dapp
3
3
  # Git repo artifact
4
4
  class GitArtifact
5
5
  include Helper::Tar
6
+ include Helper::Trivia
6
7
 
7
8
  attr_reader :repo
8
9
  attr_reader :name
@@ -32,6 +33,93 @@ module Dapp
32
33
  end
33
34
  # rubocop:enable Metrics/ParameterLists
34
35
 
36
+ def submodules_artifacts
37
+ commit = dev_mode? ? nil : latest_commit
38
+ repo.submodules_params(commit,
39
+ paths: include_paths_or_cwd,
40
+ exclude_paths: exclude_paths(true)).map(&method(:submodule_artifact))
41
+ end
42
+
43
+ def submodule_artifact(submodule_params)
44
+ submodule_rel_path = submodule_params[:path]
45
+ submodule_repo = begin
46
+ GitRepo::Remote.get_or_init(repo.dimg, submodule_rel_path,
47
+ url: submodule_url(submodule_params[:url]),
48
+ branch: submodule_params[:branch])
49
+ rescue Rugged::InvalidError => e
50
+ raise Error::Rugged, code: :incorrect_gitmodules_file, data: { error: e.message }
51
+ end
52
+
53
+ self.class.new(submodule_repo, submodule_artifact_options(submodule_params))
54
+ end
55
+
56
+ def submodule_url(url)
57
+ if url.start_with?('../')
58
+ case repo.remote_origin_url_protocol
59
+ when :http, :https, :git
60
+ uri = URI.parse(repo.remote_origin_url)
61
+ uri.path = File.expand_path(File.join(uri.path, url))
62
+ uri.to_s
63
+ when :ssh
64
+ host_with_user, group_and_project = repo.remote_origin_url.split(':', 2)
65
+ group_and_project = File.expand_path(File.join('/', group_and_project, url))[1..-1]
66
+ [host_with_user, group_and_project].join(':')
67
+ else
68
+ raise
69
+ end
70
+ else
71
+ url
72
+ end
73
+ end
74
+
75
+ def submodule_artifact_options(submodule_params)
76
+ submodule_rel_path = submodule_params[:path]
77
+
78
+ {}.tap do |options|
79
+ options[:name] = repo.dapp.consistent_uniq_slugify("submodule-#{submodule_rel_path}")
80
+ options[:cwd] = submodule_inherit_path(cwd, submodule_rel_path).last
81
+ options[:to] = File.join(to, submodule_rel_path)
82
+ options[:include_paths] = submodule_inherit_paths(include_paths, submodule_rel_path)
83
+ options[:exclude_paths] = submodule_inherit_paths(exclude_paths, submodule_rel_path)
84
+ options[:stages_dependencies] = begin
85
+ stages_dependencies
86
+ .map { |stage, paths| [stage, submodule_inherit_paths(paths, submodule_rel_path)] }
87
+ .to_h
88
+ end
89
+ options[:branch] = submodule_params[:branch]
90
+ options[:owner] = owner
91
+ options[:group] = group
92
+ end
93
+ end
94
+
95
+ def submodule_inherit_paths(paths, submodule_rel_path)
96
+ paths
97
+ .select { |path| check_path?(submodule_rel_path, path) || check_subpath?(submodule_rel_path, path) }
98
+ .map { |path| submodule_inherit_path(path, submodule_rel_path) }
99
+ .flatten
100
+ .compact
101
+ end
102
+
103
+ def submodule_inherit_path(path, submodule_rel_path)
104
+ path_parts = path.split('/')
105
+ test_path = nil
106
+ inherited_paths = []
107
+ until path_parts.empty?
108
+ last_part_path = path_parts.shift
109
+ test_path = [test_path, last_part_path].compact.join('/')
110
+
111
+ non_match = !File.fnmatch(test_path, submodule_rel_path, File::FNM_PATHNAME)
112
+ part_for_all = (last_part_path == '**')
113
+
114
+ if non_match || part_for_all
115
+ inherited_paths << [last_part_path, path_parts].flatten.join('/')
116
+ break unless part_for_all
117
+ end
118
+ end
119
+
120
+ inherited_paths
121
+ end
122
+
35
123
  def cwd_type(stage)
36
124
  if dev_mode?
37
125
  p = repo.workdir_path.join(cwd)
@@ -164,7 +252,6 @@ module Dapp
164
252
  hexdigest begin
165
253
  diff_patches(nil, nil, **options).map do |patch|
166
254
  file = patch.delta.new_file
167
- raise_if_submodule!(file[:path], file[:mode])
168
255
  [file[:path], File.read(File.join(repo.workdir_path, file[:path])), file[:mode]]
169
256
  end
170
257
  end
@@ -225,7 +312,7 @@ module Dapp
225
312
  def archive_file_with_tar_writer(stage, commit)
226
313
  tar_write(repo.dimg.tmp_path('archives', archive_file_name(commit))) do |tar|
227
314
  each_archive_entry(stage, commit) do |path, content, mode|
228
- if mode == 40960 # symlink
315
+ if mode == 0o120000 # symlink
229
316
  tar.add_symlink path, content, mode
230
317
  else
231
318
  tar.add_file path, mode do |tf|
@@ -244,7 +331,7 @@ module Dapp
244
331
  each_archive_entry(stage, commit) do |path, content, mode|
245
332
  file_path = repo.dimg.tmp_path(relative_archive_file_path, path)
246
333
 
247
- if mode == 40960 # symlink
334
+ if mode == 0o120000 # symlink
248
335
  FileUtils.symlink(content, file_path)
249
336
  else
250
337
  IO.write(file_path, content)
@@ -279,20 +366,11 @@ module Dapp
279
366
 
280
367
  def patch_file(stage, from_commit, to_commit)
281
368
  File.open(repo.dimg.tmp_path('patches', patch_file_name(from_commit, to_commit)), File::RDWR | File::CREAT) do |f|
282
- diff_patches(from_commit, to_commit).each do |patch|
283
- file = patch.delta.new_file
284
- raise_if_submodule!(file[:path], file[:mode])
285
- f.write change_patch_new_file_path(stage, patch)
286
- end
369
+ diff_patches(from_commit, to_commit).each { |patch| f.write change_patch_new_file_path(stage, patch) }
287
370
  end
288
371
  repo.dimg.container_tmp_path('patches', patch_file_name(from_commit, to_commit))
289
372
  end
290
373
 
291
- def raise_if_submodule!(relative_file_path, mode) # FIXME
292
- return unless mode == 57344
293
- raise Error::Rugged, code: :submodule_not_supported, data: { path: repo.path.dirname.join(relative_file_path) }
294
- end
295
-
296
374
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
297
375
  def change_patch_new_file_path(stage, patch)
298
376
  patch.to_s.lines.tap do |lines|
@@ -356,7 +434,9 @@ module Dapp
356
434
 
357
435
  def repo_entries(commit, paths: include_paths_or_cwd)
358
436
  (@repo_entries ||= {})[[commit, paths]] ||= begin
359
- repo.entries(commit, paths: paths, exclude_paths: exclude_paths(true))
437
+ repo
438
+ .entries(commit, paths: paths, exclude_paths: exclude_paths(true))
439
+ .select { |_, entry| !submodule_mode?(entry[:filemode]) }
360
440
  end
361
441
  end
362
442
 
@@ -365,9 +445,7 @@ module Dapp
365
445
  diff_patches(commit, nil).each do |patch|
366
446
  file = patch.delta.new_file
367
447
  host_file_path = File.join(repo.workdir_path, file[:path])
368
-
369
448
  next unless File.exist?(host_file_path)
370
- raise_if_submodule!(file[:path], file[:mode])
371
449
 
372
450
  content = File.read(host_file_path)
373
451
  yield slice_cwd(stage, file[:path]), content, file[:mode]
@@ -377,9 +455,6 @@ module Dapp
377
455
  next unless entry[:type] == :blob
378
456
 
379
457
  entry_file_path = File.join(root, entry[:name])
380
-
381
- raise_if_submodule!(entry_file_path, entry[:filemode])
382
-
383
458
  content = repo.lookup_object(entry[:oid]).content
384
459
  yield slice_cwd(stage, entry_file_path), content, entry[:filemode]
385
460
  end
@@ -395,10 +470,16 @@ module Dapp
395
470
  opts[:recurse_untracked_dirs] = true
396
471
  end
397
472
  end
398
- repo.patches(from_commit, to_commit, paths: paths, exclude_paths: exclude_paths(true), **options)
473
+ repo
474
+ .patches(from_commit, to_commit, paths: paths, exclude_paths: exclude_paths(true), **options)
475
+ .select { |patch| !submodule_mode?(patch.delta.new_file[:mode]) } # FIXME: https://github.com/libgit2/rugged/issues/727
399
476
  end
400
477
  end
401
478
 
479
+ def submodule_mode?(mode) # FIXME
480
+ mode == 0o160000
481
+ end
482
+
402
483
  def include_paths_or_cwd
403
484
  case
404
485
  when !include_paths(true).empty? then include_paths(true)
@@ -36,6 +36,56 @@ module Dapp
36
36
  []
37
37
  end
38
38
 
39
+ def remote_origin_url
40
+ @remote_origin_url ||= begin
41
+ ro_url = url
42
+ while url_protocol(ro_url) == :noname
43
+ begin
44
+ parent_git = Rugged::Repository.discover(ro_url)
45
+ rescue Rugged::OSError
46
+ parent_git_path = parent_git ? parent_git.path : path
47
+ raise Error::Rugged, code: :git_repository_not_found, data: { path: ro_url, parent_git_path: parent_git_path }
48
+ end
49
+
50
+ ro_url = begin
51
+ git_url(parent_git)
52
+ rescue Error::Rugged => e
53
+ break if e.net_status[:code] == :git_repository_without_remote_url # local repository
54
+ raise
55
+ end
56
+ end
57
+
58
+ ro_url
59
+ end
60
+ end
61
+
62
+ def remote_origin_url_protocol
63
+ url_protocol(remote_origin_url)
64
+ end
65
+
66
+ def submodules_params(commit, paths: [], exclude_paths: [])
67
+ raise "Workdir not supported for #{self.class}" if commit.nil?
68
+
69
+ entry = begin
70
+ lookup_commit(commit).tree.path('.gitmodules')
71
+ rescue Rugged::TreeError
72
+ return []
73
+ end
74
+
75
+ submodules_params_base(lookup_object(entry[:oid]).content, paths: paths, exclude_paths: exclude_paths)
76
+ end
77
+
78
+ def submodules_params_base(gitsubmodule_content, paths: [], exclude_paths: [])
79
+ IniFile.new.parse(gitsubmodule_content)
80
+ .to_h
81
+ .select { |_, params| !ignore_directory?(params['path'], paths: paths, exclude_paths: exclude_paths) }
82
+ .map do |_, params|
83
+ params = params.symbolize_keys
84
+ params[:branch] = params[:branch].to_s if params.key?(:branch)
85
+ params
86
+ end
87
+ end
88
+
39
89
  # FIXME: Убрать логику исключения путей exclude_paths из данного класса,
40
90
  # FIXME: т.к. большинство методов не поддерживают инвариант
41
91
  # FIXME "всегда выдавать данные с исключенными путями".
@@ -48,7 +98,13 @@ module Dapp
48
98
 
49
99
  def patches(from, to, paths: [], exclude_paths: [], **kwargs)
50
100
  diff(from, to, **kwargs).patches.select do |patch|
51
- !ignore_path?(patch.delta.new_file[:path], paths: paths, exclude_paths: exclude_paths)
101
+ delta_new_file = patch.delta.new_file
102
+ args = [delta_new_file[:path], paths: paths, exclude_paths: exclude_paths]
103
+ if delta_new_file[:mode] == 0o040000 # nested git repository in dev mode
104
+ !ignore_directory?(*args)
105
+ else
106
+ !ignore_path?(*args)
107
+ end
52
108
  end
53
109
  end
54
110
 
@@ -127,6 +183,13 @@ module Dapp
127
183
  git.lookup(commit)
128
184
  end
129
185
 
186
+ def exist?
187
+ git
188
+ true
189
+ rescue Rugged::OSError
190
+ false
191
+ end
192
+
130
193
  protected
131
194
 
132
195
  attr_reader :manager
@@ -134,6 +197,57 @@ module Dapp
134
197
  def git(**kwargs)
135
198
  @git ||= Rugged::Repository.new(path.to_s, **kwargs)
136
199
  end
200
+
201
+ def url
202
+ @url ||= git_config_remote_origin_url(git)
203
+ end
204
+
205
+ def git_url(git_repo)
206
+ git_config_remote_origin_url(git_repo)
207
+ end
208
+
209
+ def git_config_remote_origin_url(git_repo)
210
+ git_repo.config.to_hash['remote.origin.url'].tap do |url|
211
+ raise Error::Rugged, code: :git_repository_without_remote_url, data: { name: self.class, path: git_repo.path } if url.nil?
212
+ end
213
+ end
214
+
215
+ def url_protocol(url)
216
+ if (scheme = URI.parse(url).scheme).nil?
217
+ :noname
218
+ else
219
+ scheme.to_sym
220
+ end
221
+ rescue URI::InvalidURIError
222
+ :ssh
223
+ rescue Error::Rugged => e
224
+ return :none if e.net_status[:code] == :git_repository_without_remote_url
225
+ raise
226
+ end
227
+
228
+ private
229
+
230
+ def ignore_directory?(path, paths: [], exclude_paths: [])
231
+ ignore_path_base(path, exclude_paths: exclude_paths) do
232
+ paths.empty? || paths.any? { |p| check_path?(path, p) || check_subpath?(path, p) }
233
+ end
234
+ end
235
+
236
+ def ignore_path?(path, paths: [], exclude_paths: [])
237
+ ignore_path_base(path, exclude_paths: exclude_paths) do
238
+ paths.empty? ||
239
+ paths.any? do |p|
240
+ File.fnmatch?(p, path, File::FNM_PATHNAME) ||
241
+ File.fnmatch?(File.join(p, '**', '*'), path, File::FNM_PATHNAME)
242
+ end
243
+ end
244
+ end
245
+
246
+ def ignore_path_base(path, exclude_paths: [])
247
+ is_exclude_path = exclude_paths.any? { |p| check_path?(path, p) }
248
+ is_include_path = yield
249
+ is_exclude_path || !is_include_path
250
+ end
137
251
  end
138
252
  end
139
253
  end
@@ -23,6 +23,13 @@ module Dapp
23
23
  # NOTICE: Параметры {from: nil, to: nil} можно указать только для Own repo.
24
24
  # NOTICE: Для Remote repo такой вызов не имеет смысла и это ошибка пользователя класса Remote.
25
25
 
26
+ def submodules_params(commit, paths: [], exclude_paths: [])
27
+ return super unless commit.nil?
28
+ return [] unless File.file?((gitmodules_file_path = File.join(workdir_path, '.gitmodules')))
29
+
30
+ submodules_params_base(File.read(gitmodules_file_path), paths: paths, exclude_paths: exclude_paths)
31
+ end
32
+
26
33
  def diff(from, to, **kwargs)
27
34
  if from.nil? and to.nil?
28
35
  mid_commit = latest_commit
@@ -45,6 +52,13 @@ module Dapp
45
52
  rescue Rugged::OdbError, TypeError => _e
46
53
  raise Error::Rugged, code: :commit_not_found_in_local_git_repository, data: { commit: commit }
47
54
  end
55
+
56
+ def exist?
57
+ super
58
+ rescue Error::Rugged => e
59
+ return false if e.net_status[:code] == :local_git_repository_does_not_exist
60
+ raise
61
+ end
48
62
  end
49
63
  end
50
64
  end
@@ -4,6 +4,11 @@ module Dapp
4
4
  class Remote < Base
5
5
  CACHE_VERSION = 1
6
6
 
7
+ def self.get_or_init(dimg, name, url:, branch:)
8
+ key = [url, branch]
9
+ (@repos ||= {})[key] ||= new(dimg, name, url: url).tap { |repo| repo.fetch!(branch) }
10
+ end
11
+
7
12
  attr_reader :url
8
13
 
9
14
  def initialize(dimg, name, url:)
@@ -14,8 +19,8 @@ module Dapp
14
19
  _with_lock do
15
20
  dapp.log_secondary_process(dapp.t(code: 'process.git_artifact_clone', data: { url: url }), short: true) do
16
21
  begin
17
- if [:https, :ssh].include?(protocol) && !Rugged.features.include?(protocol)
18
- raise Error::Rugged, code: :rugged_protocol_not_supported, data: { url: url, protocol: protocol }
22
+ if [:https, :ssh].include?(remote_origin_url_protocol) && !Rugged.features.include?(remote_origin_url_protocol)
23
+ raise Error::Rugged, code: :rugged_protocol_not_supported, data: { url: url, url_protocol: remote_origin_url_protocol }
19
24
  end
20
25
 
21
26
  Rugged::Repository.clone_at(url, path.to_s, bare: true, credentials: _rugged_credentials)
@@ -32,7 +37,7 @@ module Dapp
32
37
 
33
38
  def _rugged_credentials
34
39
  @_rugged_credentials ||= begin
35
- if protocol == :ssh
40
+ if remote_origin_url_protocol == :ssh
36
41
  host_with_user = url.split(':', 2).first
37
42
  username = host_with_user.split('@', 2).reverse.last
38
43
  Rugged::Credentials::SshKeyFromAgent.new(username: username)
@@ -59,7 +64,11 @@ module Dapp
59
64
  end
60
65
 
61
66
  dapp.log_secondary_process(dapp.t(code: 'process.git_artifact_fetch', data: { url: url }), short: true) do
62
- git.fetch('origin', [branch], credentials: _rugged_credentials)
67
+ begin
68
+ git.fetch('origin', [branch], credentials: _rugged_credentials)
69
+ rescue Rugged::SshError => e
70
+ raise Error::Rugged, code: :rugged_remote_error, data: { url: url, message: e.message.strip }
71
+ end
63
72
  raise Error::Rugged, code: :branch_not_exist_in_remote_git_repository, data: { branch: branch, url: url } unless branch_exist?(branch)
64
73
  end
65
74
  end unless dimg.ignore_git_fetch || dapp.dry_run?
@@ -90,18 +99,6 @@ module Dapp
90
99
  def branch_format(name)
91
100
  "origin/#{name.reverse.chomp('origin/'.reverse).reverse}"
92
101
  end
93
-
94
- def protocol
95
- @protocol ||= begin
96
- if (scheme = URI.parse(url).scheme).nil?
97
- :noname
98
- else
99
- scheme.to_sym
100
- end
101
- rescue URI::InvalidURIError
102
- :ssh
103
- end
104
- end
105
102
  end
106
103
  end
107
104
  end
@@ -28,28 +28,12 @@ module Dapp
28
28
  Pathname.new(File.join(base.to_s, *path.compact.map(&:to_s)))
29
29
  end
30
30
 
31
- def ignore_path?(path, paths: [], exclude_paths: [])
32
- ignore_path_base(path, exclude_paths: exclude_paths) do
33
- paths.empty? ||
34
- paths.any? do |p|
35
- File.fnmatch?(p, path, File::FNM_PATHNAME|File::FNM_DOTMATCH) ||
36
- File.fnmatch?(File.join(p, '**', '*'), path, File::FNM_PATHNAME|File::FNM_DOTMATCH)
37
- end
38
- end
39
- end
40
-
41
- def ignore_path_base(path, exclude_paths: [])
42
- is_exclude_path = exclude_paths.any? { |p| check_path?(path, p) }
43
- is_include_path = yield
44
- is_exclude_path || !is_include_path
45
- end
46
-
47
31
  def check_path?(path, format)
48
- path_checker(path) { |checking_path| File.fnmatch(format, checking_path, File::FNM_PATHNAME|File::FNM_DOTMATCH) }
32
+ path_checker(path) { |checking_path| File.fnmatch(format, checking_path, File::FNM_PATHNAME) }
49
33
  end
50
34
 
51
35
  def check_subpath?(path, format)
52
- path_checker(format) { |checking_path| File.fnmatch(checking_path, path, File::FNM_PATHNAME|File::FNM_DOTMATCH) }
36
+ path_checker(format) { |checking_path| File.fnmatch(checking_path, path, File::FNM_PATHNAME) }
53
37
  end
54
38
 
55
39
  def path_checker(path)
@@ -116,7 +116,6 @@ module Dapp
116
116
  # Поэтому перехватываем и просто отображаем произошедшую
117
117
  # ошибку для информации пользователю без завершения работы dapp.
118
118
  $stderr.puts(::Dapp::Dapp.paint_string(::Dapp::Helper::NetStatus.message(e), :warning))
119
- sentry_exception(e, extra: {"job-spec" => job.spec})
120
119
  end
121
120
 
122
121
  end # Thread
@@ -13,8 +13,8 @@ module Dapp
13
13
  template_relative_path_pattern = Pathname(File.expand_path(template_path_pattern)).subpath_of(path('.helm'))
14
14
  template_relative_path_pattern ||= template_path_pattern
15
15
 
16
- File.fnmatch?(template_relative_path_pattern, template_path_without_chart_name, File::FNM_PATHNAME|File::FNM_DOTMATCH) ||
17
- File.fnmatch?(template_relative_path_pattern, template_path, File::FNM_PATHNAME|File::FNM_DOTMATCH)
16
+ File.fnmatch?(template_relative_path_pattern, template_path_without_chart_name, File::FNM_PATHNAME) ||
17
+ File.fnmatch?(template_relative_path_pattern, template_path, File::FNM_PATHNAME)
18
18
  end
19
19
  end
20
20
  else
@@ -36,10 +36,10 @@ module Dapp
36
36
  elsif ENV["CI_COMMIT_REF_NAME"]
37
37
  ci_info["branch"] = ci_info["ref"] = ENV["CI_COMMIT_REF_NAME"]
38
38
  ci_info["is_branch"] = true
39
- elsif dapp.git_path and dapp.git_local_repo.branch != "HEAD"
39
+ elsif dapp.git_own_repo_exist? and dapp.git_local_repo.branch != "HEAD"
40
40
  ci_info["branch"] = ci_info["ref"] = dapp.git_local_repo.branch
41
41
  ci_info["is_branch"] = true
42
- elsif dapp.git_path
42
+ elsif dapp.git_own_repo_exist?
43
43
  git = dapp.git_local_repo.send(:git)
44
44
 
45
45
  tagref = git.references.find do |r|
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = "0.23.10"
3
- BUILD_CACHE_VERSION = 26.1
2
+ VERSION = "0.24.0"
3
+ BUILD_CACHE_VERSION = 26
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.23.10
4
+ version: 0.24.0
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-03-16 00:00:00.000000000 Z
11
+ date: 2018-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -186,34 +186,6 @@ dependencies:
186
186
  - - ">="
187
187
  - !ruby/object:Gem::Version
188
188
  version: 1.0.6
189
- - !ruby/object:Gem::Dependency
190
- name: sentry-raven
191
- requirement: !ruby/object:Gem::Requirement
192
- requirements:
193
- - - "~>"
194
- - !ruby/object:Gem::Version
195
- version: 2.7.2
196
- type: :runtime
197
- prerelease: false
198
- version_requirements: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - "~>"
201
- - !ruby/object:Gem::Version
202
- version: 2.7.2
203
- - !ruby/object:Gem::Dependency
204
- name: toml-rb
205
- requirement: !ruby/object:Gem::Requirement
206
- requirements:
207
- - - "~>"
208
- - !ruby/object:Gem::Version
209
- version: 1.1.1
210
- type: :runtime
211
- prerelease: false
212
- version_requirements: !ruby/object:Gem::Requirement
213
- requirements:
214
- - - "~>"
215
- - !ruby/object:Gem::Version
216
- version: 1.1.1
217
189
  - !ruby/object:Gem::Dependency
218
190
  name: bundler
219
191
  requirement: !ruby/object:Gem::Requirement
@@ -476,7 +448,6 @@ files:
476
448
  - lib/dapp/dapp/logging/paint.rb
477
449
  - lib/dapp/dapp/logging/process.rb
478
450
  - lib/dapp/dapp/option_tags.rb
479
- - lib/dapp/dapp/sentry.rb
480
451
  - lib/dapp/dapp/shellout/base.rb
481
452
  - lib/dapp/dapp/shellout/streaming.rb
482
453
  - lib/dapp/dapp/slug.rb
@@ -676,7 +647,6 @@ files:
676
647
  - lib/dapp/helper/sha256.rb
677
648
  - lib/dapp/helper/tar.rb
678
649
  - lib/dapp/helper/trivia.rb
679
- - lib/dapp/helper/url.rb
680
650
  - lib/dapp/helper/yaml.rb
681
651
  - lib/dapp/kube.rb
682
652
  - lib/dapp/kube/cli/cli.rb
@@ -1,112 +0,0 @@
1
- module Dapp
2
- class Dapp
3
- module Sentry
4
- def sentry_message(msg, **kwargs)
5
- return if not ensure_sentry_configured
6
- kwargs[:level] ||= "info"
7
- Raven.capture_message(msg, _make_sentry_params(**kwargs))
8
- end
9
-
10
- def sentry_exception(exception, **kwargs)
11
- return if not ensure_sentry_configured
12
- (kwargs[:tags] ||= {})['error-code'] = begin
13
- net_status = exception.net_status
14
- [net_status[:context], net_status[:code]].compact.join('_')
15
- end
16
- Raven.capture_exception(exception, _make_sentry_params(**kwargs))
17
- end
18
-
19
- def ensure_sentry_configured
20
- return false unless sentry_settings = settings["sentry"]
21
-
22
- unless @sentry_settings_configured
23
- Raven.configure do |config|
24
- logger = ::Logger.new(STDOUT)
25
- logger.level = ::Logger::WARN
26
-
27
- config.logger = logger
28
- config.dsn = sentry_settings["dsn"]
29
- end
30
-
31
- @sentry_settings_configured = true
32
- end
33
-
34
- return true
35
- end
36
-
37
- def _make_sentry_params(level: nil, tags: {}, extra: {}, user: {})
38
- {
39
- level: level,
40
- tags: _sentry_tags_context.merge(tags),
41
- extra: _sentry_extra_context.merge(extra),
42
- user: _sentry_user_context.merge(user),
43
- }
44
- end
45
-
46
- def _sentry_extra_context
47
- @_sentry_extra_context ||= {
48
- "pwd" => Dir.pwd,
49
- "dapp-dir" => self.work_dir,
50
- "options" => self.options,
51
- "env-options" => {
52
- "DAPP_FORCE_SAVE_CACHE" => ENV["DAPP_FORCE_SAVE_CACHE"],
53
- "DAPP_BIN_DAPPFILE_YML" => ENV["DAPP_BIN_DAPPFILE_YML"],
54
- "ANSIBLE_ARGS" => ENV["ANSIBLE_ARGS"],
55
- "DAPP_CHEF_DEBUG" => ENV["DAPP_CHEF_DEBUG"],
56
- },
57
- }.tap {|extra|
58
- extra["ci-env"] = {"CI" => ENV["CI"]}
59
- ENV.select {|k, v| k.start_with?("CI_")}.each do |k, v|
60
- extra["ci-env"][k] = v
61
- end
62
- }
63
- end
64
-
65
- def _sentry_tags_context
66
- name = options[:name] ||
67
- @_sentry_tags_context ||= {
68
- "dapp-short-version" => ::Dapp::VERSION.split(".")[0..1].join("."),
69
- "dapp-version" => ::Dapp::VERSION,
70
- "dapp-build-cache-version" => ::Dapp::BUILD_CACHE_VERSION,
71
- "dapp-command" => self.options[:dapp_command],
72
- }.tap {|tags|
73
- git_config_path = File.join(Dir.pwd, ".git/config")
74
-
75
- tags["dapp-name"] = options[:name]
76
-
77
- if File.exists? git_config_path
78
- cfg = IniFile.load(File.join(Dir.pwd, ".git/config"))
79
- remote_origin_cfg = cfg['remote "origin"']
80
- remote_origin_url = remote_origin_cfg["url"]
81
- if remote_origin_url
82
- tags["dapp-name"] ||= begin
83
- repo_name = remote_origin_url.split('/').last
84
- repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
85
- repo_name
86
- end
87
-
88
- tags["git-host"] = self.get_host_from_git_url(remote_origin_url)
89
-
90
- git_name = self.git_url_to_name(remote_origin_url)
91
-
92
- tags["git-group"] = git_name.partition("/")[0]
93
- tags["git-name"] = git_name
94
- end
95
- end
96
-
97
- tags["dapp-name"] ||= File.basename(Dir.pwd)
98
-
99
- begin
100
- ver = self.class.host_docker_minor_version
101
- tags["docker-minor-version"] = ver.to_s
102
- rescue ::Exception
103
- end
104
- }
105
- end
106
-
107
- def _sentry_user_context
108
- @_sentry_user_context ||= {}
109
- end
110
- end # Sentry
111
- end # Dapp
112
- end # Dapp
@@ -1,23 +0,0 @@
1
- module Dapp
2
- module Helper
3
- module Url
4
- def git_url_to_name(url)
5
- url_without_scheme = url.split("://", 2).last
6
- # This may be broken, because "@" should delimit creds, not a ":"
7
- url_without_creds = url_without_scheme.split(":", 2).last
8
- url_without_creds.gsub(%r{.*?([^\/ ]+\/[^\/ ]+)\.git}, '\\1')
9
- end
10
-
11
- def get_host_from_git_url(url)
12
- url_without_scheme = url.split("://", 2).last
13
- url_without_creds = url_without_scheme.split("@", 2).last
14
-
15
- # Split out part after ":" in this kind of url: github.com:flant/dapp.git
16
- url_part = url_without_creds.split(":", 2).first
17
-
18
- # Split out part after first "/": github.com/flant/dapp.git
19
- url_part.split("/", 2).first
20
- end
21
- end # Url
22
- end # Helper
23
- end # Dapp