module GitRepoUpgrader

GitRepoUpgrader

Checkout a git repository to a temporary directory and extract specific files from there into your project

Example:

options = {
    repo: {
        uri: 'https://github.com/username/project.git',
        branch: 'develop',
    },
    files_to_copy: {
        'dist/app.bundle.js' => 'web/js/lib/project/app.bundle.js',
        'dist/app.bundle.css' => 'web/js/lib/project/app.bundle.css',
        # copy a whole directory recursively
        'dist/img' => 'web/js/lib/project/img',
    }
}
GitRepoUpgrader.upgrade options

Constants

GIT_REPO_NAME_REGEX
PROJECT_DIR
TMP_DIR_PREFIX
VERSION

Public Class Methods

upgrade(options) click to toggle source

@param [Hash] options

# File lib/git_repo_upgrader.rb, line 39
def self.upgrade(options)
  puts '*****************************'.yellow
  puts '** Git Repo Upgrader'.yellow
  puts '*****************************'.yellow
  repo_dir, tmp_dir = _checkout_git_repo options[:repo][:uri], options[:repo][:branch]
  _copy_files_from_checkout repo_dir, options[:files_to_copy]
  _cleanup_checkout tmp_dir
  repo_name = options[:repo][:uri].match(GIT_REPO_NAME_REGEX)[1]
  _commit_files options[:files_to_copy], repo_name
  puts
  puts "Everything done, be happy! :-) ".magenta
end

Private Class Methods

_checkout_git_repo(source, branch) click to toggle source

@param [String] github source path @param [String] branch @return [String] path to repo dir

# File lib/git_repo_upgrader.rb, line 57
def self._checkout_git_repo(source, branch)
  print ' - creating tmp dir ... '
  Dir.chdir Dir.tmpdir
  tmp_dirname = TMP_DIR_PREFIX + Time.now.to_i.to_s
  Dir.mkdir(tmp_dirname)
  print tmp_dirname + ' ... '
  Dir.chdir tmp_dirname
  puts 'done'.green
  begin
    puts ' - checkoutA repository ' + source + " (#{branch}) ... "
    git_command = "git clone --single-branch --branch #{branch} #{source}"
    puts '   ' + git_command.blue
    git_result = system(git_command)
    raise "invalid username or password" unless git_result
  rescue RuntimeError => e
    puts e.to_s.red
    retry
  end
  puts '   done'.green
  puts
  repo_dir = Dir['*'].first
  [File.expand_path(repo_dir), tmp_dirname]
end
_cleanup_checkout(tmp_dir) click to toggle source
# File lib/git_repo_upgrader.rb, line 97
def self._cleanup_checkout(tmp_dir)
  print ' - remove tmp dir ... '
  Dir.chdir Dir.tmpdir
  FileUtils.rm_rf tmp_dir
  puts 'done'.green
end
_commit_files(files, repo_name) click to toggle source
# File lib/git_repo_upgrader.rb, line 104
def self._commit_files(files, repo_name)
  puts
  default_input = 'y'
  yes_no = nil
  loop do
    print "Commit the copied files above? (y/n) [#{default_input}]:".yellow
    yes_no = STDIN.gets.chomp
    yes_no = default_input if yes_no == ''
    if yes_no == '' || !(['y', 'n'].include? yes_no)
      puts "Invalid option '#{yes_no}'".red
    else
      break
    end
  end
  if yes_no == 'y'
    Dir.chdir PROJECT_DIR
    # add
    git_commit_command1 = %Q(git add "#{files.values.join('" "')}")
    puts "   #{git_commit_command1}".blue
    git_result1 = `#{git_commit_command1}`
    # commit
    git_commit_command2 = %Q(git commit "#{files.values.join('" "')}" -m "upgrade #{repo_name}")
    puts "   #{git_commit_command2}".blue
    git_result2 = `#{git_commit_command2}`
    if git_result2.include? 'no changes added to commit'
      puts
      puts "   You already had the latest version, nothing to commit!".red
    else
      puts git_result2.green
    end
  end
end
_copy_files_from_checkout(repo_dir, files_to_copy) click to toggle source
# File lib/git_repo_upgrader.rb, line 82
def self._copy_files_from_checkout(repo_dir, files_to_copy)
  Dir.chdir repo_dir
  puts ' - copy repo files ... '
  files_to_copy.each do |source, dest|
    puts "   #{source} -> " + " #{dest}".green
    final_dest = PROJECT_DIR + '/' + dest
    # remove last folder from path, because FileUtils.cp_r creates the last folder in dest implicitly
    final_dest = final_dest[0...-1] if final_dest.end_with? '/' # cut / at the end if available
    if (File.basename(source) == File.basename(dest))
      final_dest = Pathname(final_dest).dirname.to_s # cut last folder if identical names are used to avoid duplicates
    end
    FileUtils.cp_r(repo_dir + '/' + source, final_dest)
  end
end