class DTK::Client::LoadSource

Attributes

info_processor[R]
target_repo_dir[R]

Public Class Methods

delete_diffs(target_repo_dir, version = nil) click to toggle source
# File lib/client/load_source.rb, line 74
def self.delete_diffs(target_repo_dir, version = nil)
  current_branch = git_repo_operation.current_branch(:path => target_repo_dir).data(:branch)
  repo           = git_repo_operation.create_empty_git_repo?(:repo_dir => target_repo_dir, :branch => current_branch).data(:repo)

  if delete_files = repo.diff_name_status(current_branch, "remotes/dtkn-component-info/#{dtkn_version_ref(version)}", { :diff_filter => 'D' })
    unless delete_files.empty?
      to_delete = delete_files.keys.select { |key| !key.include?('dtk.model.yaml') && !key.include?('module_refs.yaml') }
      to_delete.each { |file| Operation::ClientModuleDir.rm_f("#{target_repo_dir}/#{file}") }
    end
  end
end
fetch_and_cache_info(transform_helper, remote_repo_url, parent, force, use_theirs = false) click to toggle source
# File lib/client/load_source.rb, line 86
def self.fetch_and_cache_info(transform_helper, remote_repo_url, parent, force, use_theirs = false)
  new(transform_helper, info_type, remote_repo_url, parent, force, use_theirs).fetch_and_cache_info
end
fetch_from_remote(remote_module_info, parent, opts = {}) click to toggle source
# File lib/client/load_source.rb, line 90
def self.fetch_from_remote(remote_module_info, parent, opts = {})
  target_repo_dir  = parent.target_repo_dir

  # if remotes added do not add them again
  branches = Operation::ClientModuleDir::GitRepo.all_branches(:path => target_repo_dir).data(:branches)
  remote_branches = branches.select { |branch| branch.full.include?('dtkn') || branch.full.include?('dtkn-component-info') }

  return unless remote_branches.empty?

  transform_helper = ServiceAndComponentInfo::TransformFrom.new(target_repo_dir, parent.module_ref, parent.version)

  if service_info = remote_module_info.data(:service_info)
    srv_info = ServiceInfo.new(transform_helper, ServiceInfo.info_type, service_info['remote_repo_url'], parent, opts[:force])
    srv_info.fetch_info
  end

  if component_info = remote_module_info.data(:component_info)
    cmp_info = ComponentInfo.new(transform_helper, ComponentInfo.info_type, component_info['remote_repo_url'], parent, opts[:force])
    cmp_info.fetch_info
  end

  nil
end
fetch_transform_and_merge(remote_module_info, parent, opts = {}) click to toggle source

opts can have keys

:stage_and_commit_steps - used to stage and commit every step for pull-dtkn
# File lib/client/load_source.rb, line 36
def self.fetch_transform_and_merge(remote_module_info, parent, opts = {})
  target_repo_dir      = parent.target_repo_dir
  transform_helper     = ServiceAndComponentInfo::TransformFrom.new(target_repo_dir, parent.module_ref, parent.version)
  info_types_processed = []
  force                = opts[:force]
  use_theirs           = opts[:use_theirs]

  if service_info = remote_module_info.data(:service_info)
    ServiceInfo.fetch_and_cache_info(transform_helper, service_info['remote_repo_url'], parent, force, use_theirs)
    info_types_processed << ServiceInfo.info_type
    stage_and_commit(target_repo_dir, commit_msg(info_types_processed)) if opts[:stage_and_commit_steps]
  end

  if component_info = remote_module_info.data(:component_info)
    begin
      updated = ComponentInfo.fetch_and_cache_info(transform_helper, component_info['remote_repo_url'], parent, force, use_theirs)
      info_types_processed << ComponentInfo.info_type

      if parent.is_a?(Operation::Module::PullDtkn) && updated
        stage_and_commit(target_repo_dir, commit_msg([ComponentInfo.info_type]))
        delete_diffs(target_repo_dir, remote_module_info.data(:version))
      end
    rescue Error::MissingDslFile => e
      # this is special case where in some stage git can recognize that dtk.model.yaml is renamed to dtk.module.yaml
      # which then will not be introduced on merge and we get error described in the ticket https://reactor8.atlassian.net/browse/DTK-2925
      raise e unless use_theirs
      stage_and_commit(target_repo_dir, commit_msg(info_types_processed))
    end
  end

  unless info_types_processed.empty?
    transform_helper.output_path_text_pairs.each_pair do |path, text_content|
      Operation::ClientModuleDir.create_file_with_content("#{target_repo_dir}/#{path}", text_content)
    end
    stage_and_commit(target_repo_dir, commit_msg(info_types_processed))
  end
end
new(transform_helper, info_type, remote_repo_url, parent, force, use_theirs = nil) click to toggle source
# File lib/client/load_source.rb, line 23
def initialize(transform_helper, info_type, remote_repo_url, parent, force, use_theirs = nil)
  @info_processor   = transform_helper.info_processor(info_type)
  @info_type        = info_type
  @remote_repo_url  = remote_repo_url
  @target_repo_dir  = parent.target_repo_dir
  @version          = parent.version
  @force            = force
  @use_theirs       = use_theirs
end

Private Class Methods

commit_msg(info_types_processed) click to toggle source
# File lib/client/load_source.rb, line 191
def self.commit_msg(info_types_processed)
  msg = "Added "
  count = 0
  types = info_types_processed #info
  if types.include?(ServiceInfo.info_type)
    msg << 'service '
    count +=1
  end
  if types.include?(ComponentInfo.info_type)
    msg << 'and ' if count > 0
    msg << 'component'
    count +=1
  end
  msg << 'info'
  msg
end
dtkn_version_ref(version = nil) click to toggle source
# File lib/client/load_source.rb, line 118
def self.dtkn_version_ref(version = nil)
  if version.nil?
    'master'
  elsif version == 'master'
    'master'
  else
    "v#{version}"
  end
end
git_repo_operation() click to toggle source
# File lib/client/load_source.rb, line 208
def self.git_repo_operation
  Operation::ClientModuleDir::GitRepo
end
stage_and_commit(target_repo_dir, commit_msg = nil) click to toggle source
# File lib/client/load_source.rb, line 182
def self.stage_and_commit(target_repo_dir, commit_msg = nil)
  git_repo_args = {
    :repo_dir          => target_repo_dir,
    :commit_msg        => commit_msg,
    :local_branch_type => :dtkn
  }
  git_repo_operation.stage_and_commit(git_repo_args)
end
write_output_path_text_pairs(transform_helper, target_repo_dir, info_types_processed) click to toggle source
# File lib/client/load_source.rb, line 128
def self.write_output_path_text_pairs(transform_helper, target_repo_dir, info_types_processed)
end

Private Instance Methods

common_git_repo_args() click to toggle source
# File lib/client/load_source.rb, line 131
def common_git_repo_args
   {
    :info_type => @info_type,
    :repo_dir  => @target_repo_dir
  }
end
fetch_remote() click to toggle source
# File lib/client/load_source.rb, line 142
def fetch_remote
  git_repo_args = common_git_repo_args.merge(:add_remote => @remote_repo_url)
  git_repo_operation.fetch_dtkn_remote(git_repo_args)
end
git_repo_operation() click to toggle source
# File lib/client/load_source.rb, line 212
def git_repo_operation
  self.class.git_repo_operation
end
git_repo_remote_branch() click to toggle source
# File lib/client/load_source.rb, line 138
def git_repo_remote_branch
  (@version && !@version.eql?('master')) ? "v#{@version}" : 'master'
end
local_ahead?() click to toggle source
# File lib/client/load_source.rb, line 177
def local_ahead?
  git_repo_args = common_git_repo_args.merge(:remote_branch => git_repo_remote_branch, :no_commit => true)
  git_repo_operation.local_ahead?(git_repo_args)
end
merge_from_remote() click to toggle source
# File lib/client/load_source.rb, line 147
def merge_from_remote
  merged = true
  git_repo_args = common_git_repo_args.merge(:remote_branch => git_repo_remote_branch, :no_commit => true, :use_theirs => @use_theirs)

  if local_ahead?.data('local_ahead')
    if @force
      git_repo_operation.reset_hard(git_repo_args)
    else
      merged = false
    end
  else
    reset_if_merge_conflict(git_repo_operation, git_repo_args)
  end

  merged
end
reset_if_merge_conflict(git_repo_operation, git_repo_args) click to toggle source
# File lib/client/load_source.rb, line 164
def reset_if_merge_conflict(git_repo_operation, git_repo_args)
  begin
    git_repo_operation.merge_from_dtkn_remote(git_repo_args)
  rescue => e
    unless @force
      current_branch = Operation::ClientModuleDir::GitRepo.current_branch(:path => @target_repo_dir).data(:branch)
      git_repo_operation.reset_hard(git_repo_args.merge(:branch => current_branch))
      raise Error::Usage, "Unable to do fast-forward merge! You can use '--force' option but all local changes will be lost!"
    end
    git_repo_operation.reset_hard(git_repo_args)
  end
end