Commit 0b590ebc491ffe74d90bc4b32eb7932bd1fe009a

Authored by Will Farrington
1 parent 0ab88d8b30

Refactor git handling

Showing 1 changed file with 16 additions and 10 deletions 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")
if system("which git > /dev/null") && File.directory?(".git") 30 30 quietly = "> /dev/null 2>&1"
31
32 if system("which git > /dev/null") && File.directory?(".git") \
33 && fetch = system("git fetch -q origin")
34
clean = `git status --porcelain`.empty? 31 35 clean = `git status --porcelain`.empty?
current_branch = `git symbolic-ref HEAD`.chomp 32 36 current_branch = `git symbolic-ref HEAD`.chomp
master = current_branch == "refs/heads/master" 33 37 master = current_branch == "refs/heads/master"
no_new_commits = system('git diff --exit-code --quiet origin/master master') 34
35 38
short_branch = current_branch.split('/').last 36 39 upstream_changes = `git rev-list --count master..origin/master`.chomp != '0'
40 fast_forwardable = `git rev-list --count origin/master..master`.chomp == '0'
37 41
42 short_branch = current_branch.split('/')[2..-1].join('/')
43
if !master 38 44 if !master
warn "Boxen on a non-master branch '#{short_branch}', won't auto-update!" 39 45 warn "Boxen on a non-master branch '#{short_branch}', won't auto-update!"
elsif !no_new_commits 40 46 elsif !fast_forwardable
warn "Boxen has unpushed commits on master, won't auto-update!" 41 47 warn "Boxen's master branch is out of sync, won't auto-update!"
elsif !clean 42 48 elsif !clean
warn "Boxen has a dirty tree, won't auto-update!" 43 49 warn "Boxen has a dirty tree, won't auto-update!"
50 elsif !upstream_changes
51 warn "Boxen is up-to-date."
end 44 52 end
45 53
if clean && master && no_new_commits 46 54 if clean && master && fast_forwardable && upstream_changes
quietly = "> /dev/null 2>&1" 47
fetch = "(git fetch origin #{quietly})" 48
reset = "(git reset --hard origin/master #{quietly})" 49 55 reset = "(git reset --hard origin/master #{quietly})"
reclean = "(git clean -df #{quietly})" 50 56 reclean = "(git clean -qdf)"
51 57
unless system "#{fetch} && #{reset} && #{reclean}" 52 58 unless system "#{reset} && #{reclean}"
warn "Auto-update of Boxen FAILED, continuing." 53 59 warn "Auto-update of Boxen FAILED, continuing."
end 54 60 end
end 55 61 end
end 56 62 end
end 57 63 end