dtk-client 0.10.5 → 0.10.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.
Files changed (41) hide show
  1. checksums.yaml +13 -5
  2. data/.gitignore +1 -0
  3. data/bin/dtk-puppet +38 -0
  4. data/lib/cli/command/module/delete_from_remote.rb +3 -4
  5. data/lib/cli/command/module/pull_dtkn.rb +3 -1
  6. data/lib/cli/command/module/uninstall.rb +2 -2
  7. data/lib/cli/command/service/uninstall.rb +3 -3
  8. data/lib/cli/command/token.rb +1 -1
  9. data/lib/cli/version.rb +1 -1
  10. data/lib/client/error/subclasses.rb +7 -0
  11. data/lib/client/git_repo/adapter/git_gem.rb +38 -5
  12. data/lib/client/git_repo.rb +8 -3
  13. data/lib/client/load_source/component_info.rb +1 -4
  14. data/lib/client/load_source/service_info.rb +5 -7
  15. data/lib/client/load_source.rb +62 -10
  16. data/lib/client/module_ref.rb +2 -0
  17. data/lib/client/operation/client_module_dir/git_repo/internal/dtkn.rb +6 -1
  18. data/lib/client/operation/client_module_dir/git_repo/internal.rb +8 -2
  19. data/lib/client/operation/client_module_dir/git_repo.rb +13 -4
  20. data/lib/client/operation/module/delete_from_remote.rb +2 -2
  21. data/lib/client/operation/module/install/common_module.rb +1 -1
  22. data/lib/client/operation/module/list.rb +1 -1
  23. data/lib/client/operation/module/publish.rb +1 -0
  24. data/lib/client/operation/module/pull_dtkn.rb +4 -3
  25. data/lib/client/operation/module/push_dtkn/convert_source.rb +18 -5
  26. data/lib/client/operation/module/push_dtkn.rb +1 -1
  27. data/lib/client/operation/module/stage.rb +1 -1
  28. data/lib/client/operation/module/uninstall.rb +53 -29
  29. data/lib/client/operation/service/converge.rb +1 -1
  30. data/lib/client/operation/service/delete.rb +13 -2
  31. data/lib/client/operation/service/exec.rb +2 -2
  32. data/lib/client/operation/service/uninstall.rb +11 -8
  33. data/lib/client/render/view/table/processor.rb +7 -0
  34. data/lib/client/render.rb +1 -0
  35. data/lib/client/response/render_helper.rb +5 -2
  36. data/lib/client/service_and_component_info/transform_from/info/component.rb +1 -1
  37. data/lib/client/util/os_util.rb +25 -0
  38. data/lib/dtk_puppet/parse_structure.rb +180 -0
  39. data/lib/dtk_puppet/parser.rb +92 -0
  40. data/lib/dtk_puppet.rb +24 -0
  41. metadata +16 -11
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 770b6fa7ab8687c5275c4acce3eaa5cae52a330c
4
- data.tar.gz: 745309e408b3d4fa06175f4cdb82d665afd22c7b
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OGU5NTUzYWM4NzlhOTJiNWFmN2NhNjQwNjE1N2FkN2YwMzc4ZThkYQ==
5
+ data.tar.gz: !binary |-
6
+ YjZkZDk4ODA4ZTliNDkyZjdiYjMwMWFiMGRmOWFlYzFjYzJhNzVjNA==
5
7
  SHA512:
6
- metadata.gz: 5d614db5a69af9d464e21ec16f4c78209e2061c3dbd97c2b4890928c87b457aa5d2822860c3ae3c27c97b29889b729ea96199ac34b2390878989450f121f4881
7
- data.tar.gz: 8be6f20053599b04e50d144b7de3b8a58a6f5cb9e5c0cd6de8fcdea60d39c86cf5045d8da5e6c529e0024ce177edbd34ab686472d55b719c35ff7b1d2da9c7a3
8
+ metadata.gz: !binary |-
9
+ OTRhOWY0NTkwZTFlNTRlZWVhNDRmNGRjZTc3NmVlMzIzNjU5N2UzZDI1M2I1
10
+ ZGRjZTQ4MDMxOGFkOGNkNGUyYzBlZDdhOWQzOWJiNmYzNDEzNmE0YjZkNDNk
11
+ ZTVkYTZkMjdlZTVkMmI3YTk4MGY5YmU0Y2EzY2IxY2QyZDVjN2Q=
12
+ data.tar.gz: !binary |-
13
+ ZDVlYTQxM2Y0M2YwOGE1NjgwMWYzZTY4ZTBjOGEzNGMyYTA1OTE4NTlhZmVj
14
+ ZmVhMmE0M2I4NjA3ZGVlNWUzN2NiZjVhNzk0ZTY5ODVmOGVhZWRhZTgwMjgy
15
+ N2VlOWNhY2IyNWJjNjE0OGVlMTlmYjk0YWQ0NzY2MDc3MTdmMWE=
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ sftp-config*.json
5
5
  .tags
6
6
  .tags1
7
7
  Gemfile.lock
8
+ .vscode
data/bin/dtk-puppet ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Copyright (C) 2010-2016 dtk contributors
4
+ #
5
+ # This file is part of the dtk project.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ module DTK
20
+ require_relative '../lib/dtk_client'
21
+ module GlobalForDSL
22
+ Error = ::DTK::Client::Error
23
+ ErrorUsage = ::DTK::Client::Error::Usage
24
+ end
25
+ #dtk_dsl must be loaded after GlobalForDSL set
26
+ require 'dtk_dsl'
27
+
28
+ Client::Error.top_level_trap_error do
29
+ begin
30
+ require 'puppet'
31
+ rescue LoadError => e
32
+ fail DTK::Client::Error::Usage.new("Puppet gem is not installed on your system. Please install it and try again.")
33
+ end
34
+ # lib/dtk_cli must be loaded after lib/client and lib/dsl
35
+ require_relative '../lib/dtk_puppet'
36
+ Puppet::Parser.parse(ARGV)
37
+ end
38
+ end
@@ -23,14 +23,13 @@ module DTK::Client
23
23
  command_body c, 'delete-from-remote', 'Delete module from the DTK remote catalog (DTKN)' do |sc|
24
24
  sc.flag Token.version
25
25
  sc.switch Token.skip_prompt
26
- sc.switch Token.force
27
-
26
+
28
27
  sc.action do |_global_options, options, args|
29
28
  module_ref = module_ref_object_from_options_or_context?(:module_ref => args[0], :version => options[:version])
30
29
  operation_args = {
31
30
  :module_ref => module_ref,
32
- :skip_prompt => options[:skip_prompt],
33
- :force => options[:force]
31
+ :skip_prompt => options[:skip_prompt]
32
+ # :force => options[:f]
34
33
  }
35
34
  Operation::Module.delete_from_remote(operation_args)
36
35
  end
@@ -22,6 +22,7 @@ module DTK::Client
22
22
  command_body c, 'pull-dtkn', 'Pull content from repo manager to client module directory and push to server' do |sc|
23
23
  sc.flag Token.directory_path, :desc => 'Absolute or relative path to module directory containing content to update; not need if in the module directory'
24
24
  sc.switch Token.skip_prompt
25
+ sc.switch Token.force
25
26
  sc.action do |_global_options, options, _args|
26
27
  module_ref = module_ref_object_from_options_or_context(options)
27
28
  operation_args = {
@@ -29,7 +30,8 @@ module DTK::Client
29
30
  :base_dsl_file_obj => @base_dsl_file_obj,
30
31
  :has_directory_param => !options["d"].nil?,
31
32
  :directory_path => options[:directory_path],
32
- :skip_prompt => options[:skip_prompt]
33
+ :skip_prompt => options[:skip_prompt],
34
+ :force => options[:f]
33
35
  }
34
36
  Operation::Module.pull_dtkn(operation_args)
35
37
  Operation::Module.push(operation_args.merge(:method => "pulled"))
@@ -32,7 +32,7 @@ module DTK::Client
32
32
  if options[:uninstall_name].nil?
33
33
  module_ref =
34
34
  if module_name = args[0]
35
- module_ref_object_from_options_or_context?({:module_ref => module_name, :version => (version || 'master')}, module_refs_opts)
35
+ module_ref_object_from_options_or_context?({:module_ref => module_name, :version => (version)}, module_refs_opts)
36
36
  else
37
37
  module_ref_object_from_options_or_context(options, module_refs_opts)
38
38
  end
@@ -42,7 +42,7 @@ module DTK::Client
42
42
 
43
43
  raise Error::Usage, "You can use version only with 'namespace/name' provided" if version && module_name.nil?
44
44
 
45
- Operation::Module.uninstall(:module_ref => module_ref, :skip_prompt => options[:skip_prompt], :name => options[:uninstall_name], :version => version)
45
+ Operation::Module.uninstall(:module_ref => module_ref, :skip_prompt => options[:skip_prompt], :name => options[:uninstall_name] || module_name, :version => version)
46
46
  end
47
47
  end
48
48
  end
@@ -36,14 +36,14 @@ module DTK::Client; module CLI
36
36
  if purge && (!directory_path || (directory_path == @base_dsl_file_obj.parent_dir?))
37
37
  raise Error::Usage, "If use option '#{option_ref(:purge)}' then need to call from outside directory and use option '#{option_ref(:directory_path)}'"
38
38
  end
39
-
39
+
40
40
  if name.nil?
41
41
  service_instance = service_instance_in_options_or_context(options, :ignore_parsing_errors => true)
42
- else
42
+ else
43
43
  service_instance = name
44
44
  end
45
45
 
46
- args = {
46
+ args = {
47
47
  :service_instance => service_instance,
48
48
  :skip_prompt => options[:skip_prompt],
49
49
  :directory_path => directory_path,
@@ -54,7 +54,7 @@ module DTK::Client
54
54
  # Switch constructor args order: key, desc, opts={}
55
55
  :all => Switch.new(:all, 'All'),
56
56
  :delete => Switch.new(:delete, 'Delete'),
57
- :force => Switch.new(:f, 'Force'),
57
+ :force => Switch.new([:f, :force], 'Force'),
58
58
  :purge => Switch.new(:purge, 'Purge'),
59
59
  :push => Switch.new(:push, 'Push changes'),
60
60
  :skip_prompt => Switch.new(:y, 'Skip prompt'),
data/lib/cli/version.rb CHANGED
@@ -18,7 +18,7 @@
18
18
  module DTK
19
19
  module Client
20
20
  module CLI
21
- VERSION="0.10.5"
21
+ VERSION="0.10.6"
22
22
  end
23
23
  end
24
24
  end
@@ -101,5 +101,12 @@ module DTK::Client
101
101
  super("No method#{method_ref} for concrete class #{klass}")
102
102
  end
103
103
  end
104
+
105
+ class MissingDslFile < self
106
+ def initialize(error_msg, _opts = {})
107
+ msg_to_pass_to_super = "[ERROR] #{error_msg}"
108
+ super(msg_to_pass_to_super, :backtrace => NO_BACKTRACE)
109
+ end
110
+ end
104
111
  end
105
112
  end
@@ -38,12 +38,17 @@ module DTK::Client
38
38
  def rev_list(sha)
39
39
  self.lib.rev_list(sha)
40
40
  end
41
+
42
+ def name_status(branch1 = nil, branch2 = nil, opts = {})
43
+ self.lib.name_status(branch1, branch2, opts)
44
+ end
41
45
  end
42
46
 
43
47
  class ::Git::Lib
44
48
  def merge(branch, message = nil, opts = {})
45
49
  arr_opts = []
46
50
  arr_opts << '--allow-unrelated-histories' if opts[:allow_unrelated_histories]
51
+ arr_opts << '-Xtheirs' if opts[:use_theirs]
47
52
  arr_opts << '-m' << message if message
48
53
  arr_opts += [branch]
49
54
  command('merge', arr_opts)
@@ -53,6 +58,29 @@ module DTK::Client
53
58
  arr_opts = [sha]
54
59
  command('rev-list', arr_opts)
55
60
  end
61
+
62
+ def name_status(branch1 = nil, branch2 = nil, opts = {})
63
+ arr_opts = []
64
+ arr_opts << '--name-status'
65
+ arr_opts << "--diff-filter=#{opts[:diff_filter]}" if opts[:diff_filter]
66
+ arr_opts << branch1 if branch1
67
+ arr_opts << branch2 if branch2
68
+
69
+ command_lines('diff', arr_opts).inject({}) do |memo, line|
70
+ status, path = line.split("\t")
71
+ memo[path] = status
72
+ memo
73
+ end
74
+ end
75
+
76
+ def command_lines(cmd, opts = [], chdir = true, redirect = '')
77
+ cmd_op = command(cmd, opts, chdir)
78
+ op = cmd_op.encode("UTF-8", "binary", {
79
+ :invalid => :replace,
80
+ :undef => :replace
81
+ })
82
+ op.split("\n")
83
+ end
56
84
  end
57
85
 
58
86
  # opts can have keys
@@ -108,8 +136,8 @@ module DTK::Client
108
136
  @git_repo.push(remote, branch_for_push, opts)
109
137
  end
110
138
 
111
- def merge(branch_to_merge_from)
112
- @git_repo.merge(branch_to_merge_from, 'merge', :allow_unrelated_histories => allow_unrelated_histories?)
139
+ def merge(branch_to_merge_from, opts = {})
140
+ @git_repo.merge(branch_to_merge_from, 'merge', :allow_unrelated_histories => allow_unrelated_histories?, :use_theirs => opts[:use_theirs])
113
141
  end
114
142
 
115
143
  def status
@@ -225,6 +253,10 @@ module DTK::Client
225
253
  @git_repo.diff
226
254
  end
227
255
 
256
+ def diff_name_status(branch_or_sha_1, branch_or_sha_2, opts = {})
257
+ @git_repo.name_status(branch_or_sha_1, branch_or_sha_2, opts)
258
+ end
259
+
228
260
  def changed?
229
261
  (!(changed().empty? && untracked().empty? && deleted().empty?))
230
262
  end
@@ -233,7 +265,7 @@ module DTK::Client
233
265
  # :with_diffs (Boolean)
234
266
  def print_status(opts = {})
235
267
  if opts[:with_diffs]
236
- print_status_with_diffs
268
+ print_status_with_diffs(opts)
237
269
  else
238
270
  print_status_simple
239
271
  end
@@ -256,9 +288,10 @@ module DTK::Client
256
288
  puts ""
257
289
  end
258
290
 
259
- def print_status_with_diffs
291
+ def print_status_with_diffs(opts)
292
+ command = opts[:command]
260
293
  changes = [changed(), untracked(), deleted()]
261
- puts "\nThere are changes that are not pushed to the server that will not be staged:\n".colorize(:green) unless changes[0].empty?
294
+ puts "\nThe command '#{command}' will not be triggered, there are changes not pushed to the server:\n".colorize(:green) unless changes[0].empty?
262
295
  diff = @git_repo.diff.stats[:files]
263
296
  file_changed = changes[0].size
264
297
  deletions = 0
@@ -63,7 +63,8 @@ module DTK::Client
63
63
  def self.modified_with_diff?(dir, opts = {})
64
64
  repo_dir = {
65
65
  :path => dir,
66
- :branch => Git.open(dir).branches.local
66
+ :branch => Git.open(dir).branches.local,
67
+ :command => opts[:command]
67
68
  }
68
69
 
69
70
  message = DTK::Client::Operation::ClientModuleDir::GitRepo.modified_with_diff(repo_dir)
@@ -95,6 +96,10 @@ module DTK::Client
95
96
  @git_adapter.diff
96
97
  end
97
98
 
99
+ def diff_name_status(branch_or_sha_1 = nil, branch_or_sha_2 = nil, opts = {})
100
+ @git_adapter.diff_name_status(branch_or_sha_1, branch_or_sha_2, opts)
101
+ end
102
+
98
103
  def fetch(remote = 'origin')
99
104
  @git_adapter.fetch(remote)
100
105
  end
@@ -107,8 +112,8 @@ module DTK::Client
107
112
  @git_adapter.is_there_remote?(remote_name)
108
113
  end
109
114
 
110
- def merge(branch_to_merge_from)
111
- @git_adapter.merge(branch_to_merge_from)
115
+ def merge(branch_to_merge_from, opts = {})
116
+ @git_adapter.merge(branch_to_merge_from, opts)
112
117
  end
113
118
 
114
119
  # opts can have keys:
@@ -20,10 +20,7 @@ module DTK::Client
20
20
  class ComponentInfo < self
21
21
  def fetch_and_cache_info
22
22
  fetch_remote
23
- unless local_ahead?.data('local_ahead')
24
- merge_from_remote
25
- transform_from_component_info
26
- end
23
+ transform_from_component_info if merge_from_remote
27
24
  end
28
25
 
29
26
  def fetch_info
@@ -20,10 +20,7 @@ module DTK::Client
20
20
  class ServiceInfo < self
21
21
  def fetch_and_cache_info
22
22
  fetch_remote
23
- unless local_ahead?.data('local_ahead')
24
- merge_from_remote
25
- transform_from_service_info
26
- end
23
+ transform_from_service_info if merge_from_remote
27
24
  end
28
25
 
29
26
  def fetch_info
@@ -39,9 +36,10 @@ module DTK::Client
39
36
  def transform_from_service_info
40
37
  info_processor.read_inputs_and_compute_outputs!
41
38
 
42
- # delete old files
43
- # Assumed that this is done before ComponentInfo.transform_from_service_info
44
- Operation::ClientModuleDir.delete_directory_content(target_repo_dir)
39
+ # delete only service instance files, since we need component module files for merge
40
+ info_processor.input_file_paths.map { |path| Operation::ClientModuleDir.rm_f(path) }
41
+ Operation::ClientModuleDir.rm_f("#{target_repo_dir}/assemblies")
42
+ # Operation::ClientModuleDir.delete_directory_content(target_repo_dir)
45
43
  end
46
44
 
47
45
  end
@@ -20,12 +20,14 @@ module DTK::Client
20
20
  require_relative('load_source/service_info')
21
21
  require_relative('load_source/component_info')
22
22
 
23
- def initialize(transform_helper, info_type, remote_repo_url, parent)
23
+ def initialize(transform_helper, info_type, remote_repo_url, parent, force, use_theirs = nil)
24
24
  @info_processor = transform_helper.info_processor(info_type)
25
25
  @info_type = info_type
26
26
  @remote_repo_url = remote_repo_url
27
27
  @target_repo_dir = parent.target_repo_dir
28
28
  @version = parent.version
29
+ @force = force
30
+ @use_theirs = use_theirs
29
31
  end
30
32
  private :initialize
31
33
 
@@ -35,16 +37,30 @@ module DTK::Client
35
37
  target_repo_dir = parent.target_repo_dir
36
38
  transform_helper = ServiceAndComponentInfo::TransformFrom.new(target_repo_dir, parent.module_ref, parent.version)
37
39
  info_types_processed = []
40
+ force = opts[:force]
41
+ use_theirs = opts[:use_theirs]
38
42
 
39
43
  if service_info = remote_module_info.data(:service_info)
40
- ServiceInfo.fetch_and_cache_info(transform_helper, service_info['remote_repo_url'], parent)
44
+ ServiceInfo.fetch_and_cache_info(transform_helper, service_info['remote_repo_url'], parent, force, use_theirs)
41
45
  info_types_processed << ServiceInfo.info_type
42
46
  stage_and_commit(target_repo_dir, commit_msg(info_types_processed)) if opts[:stage_and_commit_steps]
43
47
  end
44
48
 
45
49
  if component_info = remote_module_info.data(:component_info)
46
- ComponentInfo.fetch_and_cache_info(transform_helper, component_info['remote_repo_url'], parent)
47
- info_types_processed << ComponentInfo.info_type
50
+ begin
51
+ ComponentInfo.fetch_and_cache_info(transform_helper, component_info['remote_repo_url'], parent, force, use_theirs)
52
+ info_types_processed << ComponentInfo.info_type
53
+
54
+ if parent.is_a?(Operation::Module::PullDtkn)
55
+ stage_and_commit(target_repo_dir, commit_msg([ComponentInfo.info_type]))
56
+ delete_diffs(target_repo_dir)
57
+ end
58
+ rescue Error::MissingDslFile => e
59
+ # this is special case where in some stage git can recognize that dtk.model.yaml is renamed to dtk.module.yaml
60
+ # which then will not be introduced on merge and we get error described in the ticket https://reactor8.atlassian.net/browse/DTK-2925
61
+ raise e unless use_theirs
62
+ stage_and_commit(target_repo_dir, commit_msg(info_types_processed))
63
+ end
48
64
  end
49
65
 
50
66
  unless info_types_processed.empty?
@@ -55,8 +71,19 @@ module DTK::Client
55
71
  end
56
72
  end
57
73
 
58
- def self.fetch_and_cache_info(transform_helper, remote_repo_url, parent)
59
- new(transform_helper, info_type, remote_repo_url, parent).fetch_and_cache_info
74
+ def self.delete_diffs(target_repo_dir)
75
+ current_branch = git_repo_operation.current_branch(:path => target_repo_dir).data(:branch)
76
+ repo = git_repo_operation.create_empty_git_repo?(:repo_dir => target_repo_dir, :branch => current_branch).data(:repo)
77
+ if delete_files = repo.diff_name_status(current_branch, "remotes/dtkn-component-info/master", { :diff_filter => 'D' })
78
+ unless delete_files.empty?
79
+ to_delete = delete_files.keys.select { |key| !key.include?('dtk.model.yaml') && !key.include?('module_refs.yaml') }
80
+ to_delete.each { |file| Operation::ClientModuleDir.rm_f("#{target_repo_dir}/#{file}") }
81
+ end
82
+ end
83
+ end
84
+
85
+ def self.fetch_and_cache_info(transform_helper, remote_repo_url, parent, force, use_theirs = false)
86
+ new(transform_helper, info_type, remote_repo_url, parent, force, use_theirs).fetch_and_cache_info
60
87
  end
61
88
 
62
89
  def self.fetch_from_remote(remote_module_info, parent, opts = {})
@@ -71,12 +98,12 @@ module DTK::Client
71
98
  transform_helper = ServiceAndComponentInfo::TransformFrom.new(target_repo_dir, parent.module_ref, parent.version)
72
99
 
73
100
  if service_info = remote_module_info.data(:service_info)
74
- srv_info = ServiceInfo.new(transform_helper, ServiceInfo.info_type, service_info['remote_repo_url'], parent)
101
+ srv_info = ServiceInfo.new(transform_helper, ServiceInfo.info_type, service_info['remote_repo_url'], parent, opts[:force])
75
102
  srv_info.fetch_info
76
103
  end
77
104
 
78
105
  if component_info = remote_module_info.data(:component_info)
79
- cmp_info = ComponentInfo.new(transform_helper, ComponentInfo.info_type, component_info['remote_repo_url'], parent)
106
+ cmp_info = ComponentInfo.new(transform_helper, ComponentInfo.info_type, component_info['remote_repo_url'], parent, opts[:force])
80
107
  cmp_info.fetch_info
81
108
  end
82
109
 
@@ -107,8 +134,33 @@ module DTK::Client
107
134
  end
108
135
 
109
136
  def merge_from_remote
110
- git_repo_args = common_git_repo_args.merge(:remote_branch => git_repo_remote_branch, :no_commit => true)
111
- git_repo_operation.merge_from_dtkn_remote(git_repo_args)
137
+ merged = true
138
+ git_repo_args = common_git_repo_args.merge(:remote_branch => git_repo_remote_branch, :no_commit => true, :use_theirs => @use_theirs)
139
+
140
+ if local_ahead?.data('local_ahead')
141
+ if @force
142
+ git_repo_operation.reset_hard(git_repo_args)
143
+ else
144
+ merged = false
145
+ end
146
+ else
147
+ reset_if_merge_conflict(git_repo_operation, git_repo_args)
148
+ end
149
+
150
+ merged
151
+ end
152
+
153
+ def reset_if_merge_conflict(git_repo_operation, git_repo_args)
154
+ begin
155
+ git_repo_operation.merge_from_dtkn_remote(git_repo_args)
156
+ rescue => e
157
+ unless @force
158
+ current_branch = Operation::ClientModuleDir::GitRepo.current_branch(:path => @target_repo_dir).data(:branch)
159
+ git_repo_operation.reset_hard(git_repo_args.merge(:branch => current_branch))
160
+ raise Error::Usage, "Unable to do fast-forward merge! You can use '--force' option but all local changes will be lost!"
161
+ end
162
+ git_repo_operation.reset_hard(git_repo_args)
163
+ end
112
164
  end
113
165
 
114
166
  def local_ahead?
@@ -44,6 +44,8 @@ module DTK::Client
44
44
 
45
45
  def self.pretty_print(module_name, namespace, version = nil)
46
46
  # TODO: update ::DTK::Common::PrettyPrintForm to insert 'master' when version is nil
47
+ version = version.join(', ') if version.is_a?(Array)
48
+
47
49
  ::DTK::Common::PrettyPrintForm.module_ref(module_name, :namespace => namespace, :version => version || 'master')
48
50
  end
49
51
  def pretty_print
@@ -48,7 +48,7 @@ module DTK::Client
48
48
  # :no_commit
49
49
  def merge_from_remote(remote_branch, opts = {})
50
50
  merge_from_ref = "#{remote_name}/#{remote_branch}"
51
- Internal.merge(@repo, merge_from_ref, :no_commit => opts[:no_commit])
51
+ Internal.merge(@repo, merge_from_ref, :no_commit => opts[:no_commit], :use_theirs => opts[:use_theirs])
52
52
  end
53
53
 
54
54
  def local_ahead?(remote_branch, opts = {})
@@ -56,6 +56,11 @@ module DTK::Client
56
56
  Internal.local_ahead?(@repo, merge_from_ref, :no_commit => opts[:no_commit])
57
57
  end
58
58
 
59
+ def reset_hard(remote_branch, opts = {})
60
+ merge_from_ref = opts[:branch] || "#{remote_name}/#{remote_branch}"
61
+ Internal.reset_hard(@repo, merge_from_ref)
62
+ end
63
+
59
64
  private
60
65
 
61
66
  # TODO: These constants used in Internal; Deprecate GIT_REMOTE amd LOCAL_BRANCH for remote_name and local_branch
@@ -55,7 +55,7 @@ module DTK::Client
55
55
  # :no_commit
56
56
  def self.merge(repo, merge_from_ref, opts = {})
57
57
  base_sha = repo.head_commit_sha
58
- repo.merge(merge_from_ref)
58
+ repo.merge(merge_from_ref, :use_theirs => opts[:use_theirs])
59
59
  # the git gem does not take no_commit as merge argument; so doing it with soft reset
60
60
  repo.reset_soft(base_sha) if opts[:no_commit]
61
61
  repo.head_commit_sha
@@ -144,11 +144,12 @@ module DTK::Client
144
144
  repo_url = args.required(:path)
145
145
  branch = args.required(:branch)
146
146
  repo = git_repo.new(repo_url, :branch => branch)
147
+ command = args.required(:command)
147
148
 
148
149
  original_path = Dir.pwd
149
150
  Dir.chdir(args[:path])
150
151
  changed = repo.changed?
151
- repo.print_status(:with_diffs => opts[:with_diffs]) if changed
152
+ repo.print_status(:with_diffs => opts[:with_diffs], :command => command) if changed
152
153
  Dir.chdir(original_path)
153
154
  changed
154
155
  end
@@ -286,6 +287,11 @@ module DTK::Client
286
287
  ::DTK::Client::GitRepo
287
288
  end
288
289
 
290
+ def self.reset_hard(repo, merge_from_ref)
291
+ repo.reset_hard(merge_from_ref)
292
+ repo.head_commit_sha
293
+ end
294
+
289
295
  private
290
296
 
291
297
  def self.branch_from_local_branch_type(local_branch_type)
@@ -106,11 +106,12 @@ module DTK::Client
106
106
 
107
107
  def self.merge_from_dtkn_remote(args)
108
108
  wrap_operation(args) do |args|
109
- remote_branch = args.required(:remote_branch)
110
- no_commit = args[:no_commit]
111
- repo_with_remote = repo_with_dtkn_remote(args)
109
+ remote_branch = args.required(:remote_branch)
110
+ no_commit = args[:no_commit]
111
+ repo_with_remote = repo_with_dtkn_remote(args)
112
+ use_theirs = args[:use_theirs]
112
113
 
113
- response_data_hash(:head_sha => repo_with_remote.merge_from_remote(remote_branch, :no_commit => no_commit))
114
+ response_data_hash(:head_sha => repo_with_remote.merge_from_remote(remote_branch, :no_commit => no_commit, :use_theirs => use_theirs))
114
115
  end
115
116
  end
116
117
 
@@ -217,6 +218,14 @@ module DTK::Client
217
218
  end
218
219
  end
219
220
 
221
+ def self.reset_hard(args)
222
+ wrap_operation(args) do |args|
223
+ remote_branch = args.required(:remote_branch)
224
+ repo_with_remote = repo_with_dtkn_remote(args)
225
+ branch = args[:branch]
226
+ response_data_hash(:head_sha => repo_with_remote.reset_hard(remote_branch, :branch => branch))
227
+ end
228
+ end
220
229
 
221
230
  private
222
231
 
@@ -37,8 +37,8 @@ module DTK::Client
37
37
  query_string_hash = QueryStringHash.new(
38
38
  :module_name => module_ref.module_name,
39
39
  :namespace => module_ref.namespace,
40
- :rsa_pub_key => SSHUtil.rsa_pub_key_content,
41
- :force? => opts[:force]
40
+ :rsa_pub_key => SSHUtil.rsa_pub_key_content
41
+ # :force? => opts[:force]
42
42
  )
43
43
 
44
44
  unless version = module_ref.version
@@ -38,7 +38,7 @@ module DTK::Client
38
38
  repo_dir = file_obj.parent_dir # repo dir is directory that directly holds the base file object file_obj
39
39
  git_response = ClientModuleDir::GitRepo.fetch_merge_and_push(:repo_dir => repo_dir, :repo_url => repo_url, :branch => branch)
40
40
  commit_sha = git_response.data(:head_sha)
41
- rest_post("#{BaseRoute}/update_from_repo", common_post_body.merge(:commit_sha => commit_sha))
41
+ rest_post("#{BaseRoute}/update_from_repo", common_post_body.merge(:commit_sha => commit_sha, :initial_update => true))
42
42
  end
43
43
  end
44
44
  end
@@ -28,7 +28,7 @@ module DTK::Client
28
28
  ]
29
29
  )
30
30
  rest_get("#{BaseRoute}/list", query_string_hash)
31
- end.set_render_as_table!
31
+ end.set_render_as_table!(nil, '* denotes that dsl has not been parsed and validated')
32
32
  end
33
33
  end
34
34
  end
@@ -69,6 +69,7 @@ module DTK::Client
69
69
  # this part will fetch remote branches from repo manager after publish from server is finished
70
70
  LoadSource.fetch_from_remote(remote_module_info, self)
71
71
 
72
+ OsUtil.print_info("'#{module_ref.pretty_print}' has been published successfully.")
72
73
  nil
73
74
  end
74
75
  end
@@ -39,6 +39,7 @@ module DTK::Client
39
39
  directory_path = args[:directory_path]
40
40
  has_directory_param = args[:has_directory_param]
41
41
  skip_prompt = args[:skip_prompt]
42
+ force = args[:force]
42
43
 
43
44
  if has_directory_param
44
45
  file_obj = base_dsl_file_obj.raise_error_if_no_content_flag(:module_ref)
@@ -46,7 +47,7 @@ module DTK::Client
46
47
  file_obj = base_dsl_file_obj.raise_error_if_no_content
47
48
  end
48
49
 
49
- new('dtkn', module_ref, directory_path, version, file_obj).pull_dtkn(:skip_prompt => skip_prompt)
50
+ new('dtkn', module_ref, directory_path, version, file_obj).pull_dtkn(:skip_prompt => skip_prompt, :force => force)
50
51
  end
51
52
  end
52
53
 
@@ -61,7 +62,7 @@ module DTK::Client
61
62
  end
62
63
 
63
64
  error_msg = "To allow pull-dtkn to go through, invoke 'dtk push' to push the changes to server before invoking pull-dtkn again"
64
- GitRepo.modified_with_diff?(@target_repo_dir, { :error_msg => error_msg })
65
+ GitRepo.modified_with_diff?(@target_repo_dir, { :error_msg => error_msg, :command => 'pull-dtkn' })
65
66
 
66
67
  query_string_hash = QueryStringHash.new(
67
68
  :module_name => @module_ref.module_name,
@@ -87,7 +88,7 @@ module DTK::Client
87
88
  end
88
89
 
89
90
  @print_helper.print_continuation_pulling_base_module
90
- LoadSource.fetch_transform_and_merge(remote_module_info, self, :stage_and_commit_steps => true)
91
+ LoadSource.fetch_transform_and_merge(remote_module_info, self, :stage_and_commit_steps => true, :force => opts[:force], :use_theirs => true)
91
92
 
92
93
  nil
93
94
  end