dotar/Rakefile

397 lines
12 KiB
Ruby

# frozen_string_literal: true
require "rake"
require "fileutils"
require "English"
def macos?
RUBY_PLATFORM.downcase.include?("darwin")
end
def linux?
RUBY_PLATFORM.downcase.include?("linux")
end
# this has all the runcoms from this directory.
task :link_files do
if want_to_install?("git configs (color, aliases)")
install_files(Dir.glob("git/*"))
end
if want_to_install?("irb/pry configs (more colorful)")
install_files(Dir.glob("irb/*"))
end
if want_to_install?("rubygems config (faster/no docs)")
install_files(Dir.glob("ruby/*"))
end
if want_to_install?("ctags config (better js/ruby support)")
install_files(Dir.glob("ctags/*"))
end
install_files(Dir.glob("tmux/*")) if want_to_install?("tmux config")
if want_to_install?("vimification of command line tools")
install_files(Dir.glob("vimify/*"))
end
run %(
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
)
end
desc "Hook our dotfiles into system-standard positions."
task install: %i[submodule_init submodules] do
puts
puts "======================================================"
puts "Welcome to YADR Installation."
puts "======================================================"
puts
install_homebrew if macos?
install_rvm_binstubs
Rake::Task["link_files"].execute
Rake::Task["install_tools"].execute
Rake::Task["install_prezto"].execute
Rake::Task["install_spacevim"].execute
install_fonts
install_term_theme if macos?
run_bundle_config
success_msg("installed")
end
task :install_prezto do
install_prezto if want_to_install?("zsh enhancements & prezto")
end
desc "install spacevim and related config files"
task :install_spacevim do
run 'curl -sLf https://spacevim.org/install.sh | sed "s;github.com/SpaceVim;xiemala.com/ruilisi;" | bash'
install_files(Dir.glob("SpaceVim*"))
end
desc "Update spacevim"
task :update_spacevim do
run %(
cd ~/.SpaceVim
git remote set-url origin https://xiemala.com/ruilisi/SpaceVim.git
git pull --rebase
)
end
desc "Install tools which are necessary for developers"
task :install_tools do
if macos?
run %(
brew install proxychains-ng
)
else
run %(
apt install proxychains
)
end
end
desc "Prepare necessary components for spacevim/typescript"
task :prepare_spacevim_typescript do
run %(
pip install neovim
npm install -g neovim typescript
)
end
task :update do
Rake::Task["vundle_migration"].execute if needs_migration_to_vundle?
Rake::Task["install"].execute
# TODO: for now, we do the same as install. But it would be nice
# not to clobber zsh files
end
task :sync do
vundle_path = File.join("vim", "bundle", "vundle")
unless File.exist?(vundle_path)
run %(
cd $HOME/.yadr
git clone https://github.com/gmarik/vundle.git #{vundle_path}
)
end
end
task :submodule_init do
run %( git submodule update --init --recursive ) unless ENV["SKIP_SUBMODULES"]
end
desc "Init and update submodules."
task :submodules do
unless ENV["SKIP_SUBMODULES"]
puts "======================================================"
puts "Downloading YADR submodules...please wait"
puts "======================================================"
run %(
cd $HOME/.yadr
git submodule update --recursive
git clean -df
)
puts
end
end
task default: "install"
private
def run(cmd)
puts "[Running] #{cmd}"
`#{cmd}` unless ENV["DEBUG"]
end
def number_of_cores
cores = if macos?
run %( sysctl -n hw.ncpu )
else
run %( nproc )
end
puts
cores.to_i
end
def run_bundle_config
return unless system("which bundle")
bundler_jobs = number_of_cores - 1
puts "======================================================"
puts "Configuring Bundlers for parallel gem installation"
puts "======================================================"
run %( bundle config --global jobs #{bundler_jobs} )
puts
end
def install_rvm_binstubs
puts "======================================================"
puts "Installing RVM Bundler support. Never have to type"
puts "bundle exec again! Please use bundle --binstubs and RVM"
puts "will automatically use those bins after cd'ing into dir."
puts "======================================================"
run %( chmod +x $rvm_path/hooks/after_cd_bundler )
puts
end
def install_homebrew
run %(which brew)
unless $CHILD_STATUS.success?
puts "======================================================"
puts "Installing Homebrew, the OSX package manager...If it's"
puts "already installed, this will do nothing."
puts "======================================================"
run %{ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"}
end
puts
puts
puts "======================================================"
puts "Updating Homebrew."
puts "======================================================"
run %(brew update)
puts
puts
puts "======================================================"
puts "Installing Homebrew packages...There may be some warnings."
puts "======================================================"
run %(brew install zsh ctags git hub tmux reattach-to-user-namespace ripgrep ghi)
run %(brew install macvim --with-override-system-vim --with-lua --with-luajit)
puts
puts
end
def install_fonts
puts "======================================================"
puts "Installing patched fonts for Powerline/Lightline."
puts "======================================================"
run %( cp -f $HOME/.yadr/fonts/* $HOME/Library/Fonts ) if macos?
if linux?
run %( mkdir -p ~/.fonts && cp ~/.yadr/fonts/* ~/.fonts && fc-cache -vf ~/.fonts )
end
puts
end
def install_term_theme
puts "======================================================"
puts "Installing iTerm2 solarized theme."
puts "======================================================"
run %( /usr/libexec/PlistBuddy -c "Add :'Custom Color Presets':'Solarized Light' dict" ~/Library/Preferences/com.googlecode.iterm2.plist )
run %( /usr/libexec/PlistBuddy -c "Merge 'iTerm2/Solarized Light.itermcolors' :'Custom Color Presets':'Solarized Light'" ~/Library/Preferences/com.googlecode.iterm2.plist )
run %( /usr/libexec/PlistBuddy -c "Add :'Custom Color Presets':'Solarized Dark' dict" ~/Library/Preferences/com.googlecode.iterm2.plist )
run %( /usr/libexec/PlistBuddy -c "Merge 'iTerm2/Solarized Dark.itermcolors' :'Custom Color Presets':'Solarized Dark'" ~/Library/Preferences/com.googlecode.iterm2.plist )
# If iTerm2 is not installed or has never run, we can't autoinstall the profile since the plist is not there
unless File.exist?(File.join(ENV["HOME"], "/Library/Preferences/com.googlecode.iterm2.plist"))
puts "======================================================"
puts "To make sure your profile is using the solarized theme"
puts "Please check your settings under:"
puts "Preferences> Profiles> [your profile]> Colors> Load Preset.."
puts "======================================================"
return
end
# Ask the user which theme he wants to install
message = "Which theme would you like to apply to your iTerm2 profile?"
color_scheme = ask message, iTerm_available_themes
return if color_scheme == "None"
color_scheme_file = File.join("iTerm2", "#{color_scheme}.itermcolors")
# Ask the user on which profile he wants to install the theme
profiles = iTerm_profile_list
message = "I've found #{profiles.size} #{profiles.size > 1 ? "profiles" : "profile"} on your iTerm2 configuration, which one would you like to apply the Solarized theme to?"
profiles << "All"
selected = ask message, profiles
if selected == "All"
(profiles.size - 1).times { |idx| apply_theme_to_iterm_profile_idx idx, color_scheme_file }
else
apply_theme_to_iterm_profile_idx profiles.index(selected), color_scheme_file
end
end
def iTerm_available_themes
Dir["iTerm2/*.itermcolors"].map { |value| File.basename(value, ".itermcolors") } << "None"
end
def iTerm_profile_list
profiles = []
begin
profiles << `/usr/libexec/PlistBuddy -c "Print :'New Bookmarks':#{profiles.size}:Name" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null`
end while $CHILD_STATUS.exitstatus == 0
profiles.pop
profiles
end
def ask(message, values)
puts message
while true
values.each_with_index { |val, idx| puts " #{idx + 1}. #{val}" }
selection = STDIN.gets.chomp
if (begin
Float(selection).nil?
rescue StandardError
true
end) || selection.to_i < 0 || selection.to_i > values.size + 1
puts "ERROR: Invalid selection.\n\n"
else
break
end
end
selection = selection.to_i - 1
values[selection]
end
def install_prezto
puts
puts "Installing Prezto (ZSH Enhancements)..."
run %( ln -nfs "$HOME/.yadr/zsh/prezto" "${ZDOTDIR:-$HOME}/.zprezto" )
# The prezto runcoms are only going to be installed if zprezto has never been installed
install_files(Dir.glob("zsh/prezto/runcoms/z*"), :symlink)
puts
puts "Overriding prezto ~/.zpreztorc with YADR's zpreztorc to enable additional modules..."
install_files(Dir.glob("zsh/prezto-override/z*"), :symlink)
puts
puts "Creating directories for your customizations"
run %( mkdir -p $HOME/.zsh.before )
run %( mkdir -p $HOME/.zsh.after )
run %( mkdir -p $HOME/.zsh.prompts )
if (ENV["SHELL"]).to_s.include? "zsh"
puts "Zsh is already configured as your shell of choice. Restart your session to load the new settings"
else
puts "Setting zsh as your default shell"
if File.exist?("/usr/local/bin/zsh")
if File.readlines("/private/etc/shells").grep("/usr/local/bin/zsh").empty?
puts "Adding zsh to standard shell list"
run %( echo "/usr/local/bin/zsh" | sudo tee -a /private/etc/shells )
end
run %( chsh -s /usr/local/bin/zsh )
else
run %( chsh -s /bin/zsh )
end
end
end
def want_to_install?(section)
if ENV["ASK"] == "true"
puts "Would you like to install configuration files for: #{section}? [y]es, [n]o"
STDIN.gets.chomp == "y"
else
true
end
end
def install_files(files, method = :symlink)
files.each do |f|
file = f.split("/").last
source = "#{ENV["PWD"]}/#{f}"
target = "#{ENV["HOME"]}/.#{file}"
puts "======================#{file}=============================="
puts "Source: #{source}"
puts "Target: #{target}"
if File.exist?(target) && (!File.symlink?(target) || (File.symlink?(target) && File.readlink(target) != source))
puts "[Overwriting] #{target}...leaving original at #{target}.backup..."
run %( mv "$HOME/.#{file}" "$HOME/.#{file}.backup" )
end
if method == :symlink
run %( ln -nfs "#{source}" "#{target}" )
else
run %( cp -f "#{source}" "#{target}" )
end
# Temporary solution until we find a way to allow customization
# This modifies zshrc to load all of yadr's zsh extensions.
# Eventually yadr's zsh extensions should be ported to prezto modules.
source_config_code = "for config_file ($HOME/.yadr/zsh/*.zsh) source $config_file"
if file == "zshrc"
File.open(target, "a+") do |zshrc|
if zshrc.readlines.grep(/#{Regexp.escape(source_config_code)}/).empty?
zshrc.puts(source_config_code)
end
end
end
puts "=========================================================="
puts
end
end
def needs_migration_to_vundle?
File.exist? File.join("vim", "bundle", "tpope-vim-pathogen")
end
def apply_theme_to_iterm_profile_idx(index, color_scheme_path)
values = []
16.times { |i| values << "Ansi #{i} Color" }
values << ["Background Color", "Bold Color", "Cursor Color", "Cursor Text Color", "Foreground Color", "Selected Text Color", "Selection Color"]
values.flatten.each { |entry| run %( /usr/libexec/PlistBuddy -c "Delete :'New Bookmarks':#{index}:'#{entry}'" ~/Library/Preferences/com.googlecode.iterm2.plist ) }
run %( /usr/libexec/PlistBuddy -c "Merge '#{color_scheme_path}' :'New Bookmarks':#{index}" ~/Library/Preferences/com.googlecode.iterm2.plist )
run %( defaults read com.googlecode.iterm2 )
end
def success_msg(action)
puts ""
puts " _ _ _ "
puts " | | | | | | "
puts " | |___| |_____ __| | ____ "
puts " |_____ (____ |/ _ |/ ___) "
puts " _____| / ___ ( (_| | | "
puts " (_______\_____|\____|_| "
puts ""
puts "YADR has been #{action}. Please restart your terminal and vim."
end