Commit 766f9c4894dc8e1861ba7b7f61d4d9fcde4799ba

Authored by Will Farrington

Merge pull request #88 from indirect/faster_boxen

speed up all invocations of boxen

Showing 1 changed file Inline Diff

#!/usr/bin/ruby 1 1 #!/usr/bin/ruby
# Run Boxen. 2 2 # Run Boxen.
3 3
require "pathname" 4 4 require "pathname"
5 5
if ENV["USER"] == "root" 6 6 if ENV["USER"] == "root"
abort "Run this as a normal user, I'll sudo if I need to." 7 7 abort "Run this as a normal user, I'll sudo if I need to."
end 8 8 end
9 9
# Make sure only one boxen process runs at a time. 10 10 # Make sure only one boxen process runs at a time.
11 11
myself = File.new __FILE__ 12 12 myself = File.new __FILE__
13 13
unless myself.flock File::LOCK_EX | File::LOCK_NB 14 14 unless myself.flock File::LOCK_EX | File::LOCK_NB
abort "You're already running a boxen process! Know a patience." 15 15 abort "You're already running a boxen process! Know a patience."
end 16 16 end
17 17
# Yeah yeah, I like to be explicit. 18 18 # Yeah yeah, I like to be explicit.
19 19
at_exit { myself.flock File::LOCK_UN } 20 20 at_exit { myself.flock File::LOCK_UN }
21 21
# Put us where we belong, in the root dir of our boxen repo. 22 22 # Put us where we belong, in the root dir of our boxen repo.
23 23
Dir.chdir Pathname.new(__FILE__).realpath + "../.." 24 24 Dir.chdir Pathname.new(__FILE__).realpath + "../.."
25 25
# Auto-update code. This is done as early as possible so that changes 26 26 # Auto-update code. This is done as early as possible so that changes
# to boxen support code or dependencies can be grabbed. 27 27 # to boxen support code or dependencies can be grabbed.
28 28
unless ENV["BOXEN_NO_PULL"] || ARGV.include?("--no-pull") 29 29 unless ENV["BOXEN_NO_PULL"] || ARGV.include?("--no-pull")
quietly = "> /dev/null 2>&1" 30 30 quietly = "> /dev/null 2>&1"
31 31
if system("which git > /dev/null") && File.directory?(".git") \ 32 32 if system("which git > /dev/null") && File.directory?(".git") \
&& fetch = system("git fetch -q origin") 33 33 && fetch = system("git fetch -q origin")
34 34
clean = `git status --porcelain`.empty? 35 35 clean = `git status --porcelain`.empty?
current_branch = `git symbolic-ref HEAD`.chomp 36 36 current_branch = `git symbolic-ref HEAD`.chomp
master = current_branch == "refs/heads/master" 37 37 master = current_branch == "refs/heads/master"
38 38
upstream_changes = `git rev-list --count master..origin/master`.chomp != '0' 39 39 upstream_changes = `git rev-list --count master..origin/master`.chomp != '0'
fast_forwardable = `git rev-list --count origin/master..master`.chomp == '0' 40 40 fast_forwardable = `git rev-list --count origin/master..master`.chomp == '0'
41 41
short_branch = current_branch.split('/')[2..-1].join('/') 42 42 short_branch = current_branch.split('/')[2..-1].join('/')
43 43
if !master 44 44 if !master
warn "Boxen on a non-master branch '#{short_branch}', won't auto-update!" 45 45 warn "Boxen on a non-master branch '#{short_branch}', won't auto-update!"
elsif !fast_forwardable 46 46 elsif !fast_forwardable
warn "Boxen's master branch is out of sync, won't auto-update!" 47 47 warn "Boxen's master branch is out of sync, won't auto-update!"
elsif !clean 48 48 elsif !clean
warn "Boxen has a dirty tree, won't auto-update!" 49 49 warn "Boxen has a dirty tree, won't auto-update!"
elsif !upstream_changes 50 50 elsif !upstream_changes
warn "Boxen is up-to-date." 51 51 warn "Boxen is up-to-date."
end 52 52 end
53 53
if clean && master && fast_forwardable && upstream_changes 54 54 if clean && master && fast_forwardable && upstream_changes