Skip to content

Instantly share code, notes, and snippets.

@bps
Created March 19, 2010 23:05
Show Gist options
  • Save bps/338298 to your computer and use it in GitHub Desktop.
Save bps/338298 to your computer and use it in GitHub Desktop.
Rakefile to deploy dotfiles
require 'rake'
require 'digest'
begin
require 'grit'
rescue
end
$home = ENV['HOME']
raise "#{$home} is not a directory" if not File.directory? $home
task :default => :install_all
desc "Copy dotfiles into home directory w/correct permissions."
task :install_all do
begin
repo = Grit::Repo.new('.')
branch = repo.head.name
rescue
end
puts "Installing dotfiles #{branch.nil? ? "" : "from " + branch + " "}into #{$home} ..."
files = %w{
bash_profile
bashrc
gemrc
gitconfig
gitignore
gvimrc
inputrc
lbdbrc
logrotate
screenrc
ssh
vim
vimrc
}
files.each { |f| install f }
end
def install(filename)
if File.directory?(filename)
dest_filename = dest(filename)
if not File.directory? dest_filename
mkdir_p dest_filename, :verbose => false
end
dir_mode = File.lstat(dest_filename).mode
if dir_mode != 0755
chmod 0755, dest_filename, :verbose => false
end
Dir[File.join(filename, '*')].each {|f| install f }
else
dest_filename = dest(filename)
if File.exists? dest_filename
if same_version? filename
return
end
if not File.writable? dest_filename
# Temporarily make it writable
file_mode = File.lstat(dest_filename).mode
chmod file_mode | 0200, dest_filename, :verbose => false
end
end
copy_f filename
end
end
def dest(filename)
File.join($home, '.' + filename)
end
def same_version?(filename)
sha = Digest::SHA1.new
file_sha = sha.file(filename)
sha = Digest::SHA1.new
dest_file_sha = sha.file(dest(filename))
file_sha == dest_file_sha ? true : false
end
def copy_f(filename)
dest_filename = dest(filename)
puts "Copying #{filename} to #{dest_filename} ..."
cp filename, dest_filename, :verbose => false
chmod 0444, dest_filename, :verbose => false
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment