dtk-client 0.10.5 → 0.10.6

Sign up to get free protection for your applications and to get access to all the features.
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