class Gerrit::Command::Clone

Clone a Gerrit project and set up its remotes to push/pull from Gerrit.

Public Instance Methods

execute() click to toggle source
# File lib/gerrit/command/clone.rb, line 4
def execute
  unless config[:push_remote]
    raise ConfigurationInvalidError,
          'Missing `push_remote` option in your configuration'
  end

  unless config[:remotes]
    raise ConfigurationInvalidError,
          'Missing `remotes` option in your configuration'
  end

  unless config[:remotes][config[:push_remote]]
    raise ConfigurationInvalidError,
          "Missing `#{config[:push_remote]}` remote in your `remotes` configuration"
  end

  project_name = project

  remote_url = config[:remotes][config[:push_remote]]['url'] % {
    user: config[:user],
    host: config[:host],
    port: config[:port],
    project: project_name,
  }

  clone(remote_url, project_name)
end

Private Instance Methods

clone(remote_url, project) click to toggle source
# File lib/gerrit/command/clone.rb, line 34
def clone(remote_url, project)
  p = Pastel.new

  ui.info "Cloning #{p.magenta(project)} from #{p.cyan(remote_url)}..."
  if system("git clone #{remote_url}")
    project_dir = File.join(Dir.pwd, project)
    install_change_id_hook(project_dir)

    ui.success("#{project} successfully cloned into #{project_dir}")
    ui.newline

    setup_remotes(project_dir)
  else
    ui.error "Unable to clone #{project}!"
  end
end
install_change_id_hook(repo_directory) click to toggle source
# File lib/gerrit/command/clone.rb, line 69
def install_change_id_hook(repo_directory)
  Dir.chdir(repo_directory) do
    commit_msg_hook_path = File.join(repo.git_dir, 'hooks', 'commit-msg')

    if File.exist?(commit_msg_hook_path)
      ui.warning('Skipping install of Gerrit Change ID commit-msg hook ' \
                 "as there is already a #{commit_msg_hook_path} file present")
      return
    end

    result = ui.spinner('Downloading Gerrit Change ID commit-msg hook...') do
      spawn(%W[scp -P #{config[:port]}
               #{config[:user]}@#{config[:host]}:hooks/commit-msg
               #{commit_msg_hook_path}])
    end

    if result.success?
      ui.success('Installed Gerrit Change ID commit-msg hook')
    else
      ui.warning('Unable to install Gerrit Change ID commit-msg hook:')
      ui.error(result.stdout + result.stderr)
      ui.warning("You won't be able to push your commits to Gerrit without this hook")
    end
  end
end
project() click to toggle source
# File lib/gerrit/command/clone.rb, line 51
def project
  if arguments[1]
    arguments[1]
  else
    ui.ask('Enter name of the Gerrit project would you like to clone: ')
      .argument(:required)
      .read_string
  end
end
setup_remotes(repo_directory) click to toggle source
# File lib/gerrit/command/clone.rb, line 61
def setup_remotes(repo_directory)
  Dir.chdir(repo_directory) do
    # Remove default remote so we can set up Gerrit remotes
    `git remote rm origin`
    execute_command(%w[setup])
  end
end