Blame view

script/boxen 2.17 KB
e4ab3c55f   John Barnette   Stub auto-updatin...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  #!/usr/bin/ruby
  # Run Boxen.
  
  require "pathname"
  
  if ENV["USER"] == "root"
    abort "Run this as a normal user, I'll sudo if I need to."
  end
  
  # Make sure only one boxen process runs at a time.
  
  myself = File.new __FILE__
  
  unless myself.flock File::LOCK_EX | File::LOCK_NB
    abort "You're already running a boxen process! Know a patience."
  end
  
  # Yeah yeah, I like to be explicit.
  
  at_exit { myself.flock File::LOCK_UN }
  
  # Put us where we belong, in the root dir of our boxen repo.
  
  Dir.chdir Pathname.new(__FILE__).realpath + "../.."
  
  # Auto-update code. This is done as early as possible so that changes
  # to boxen support code or dependencies can be grabbed.
  
  unless ENV["BOXEN_NO_PULL"] || ARGV.include?("--no-pull")
0b590ebc4   Will Farrington   Refactor git hand...
30
31
32
33
    quietly = "> /dev/null 2>&1"
  
    if system("which git > /dev/null") && File.directory?(".git") \
      && fetch = system("git fetch -q origin")
e4ab3c55f   John Barnette   Stub auto-updatin...
34
      clean  = `git status --porcelain`.empty?
3b06d2616   Will Farrington   better error mess...
35
36
      current_branch = `git symbolic-ref HEAD`.chomp
      master = current_branch == "refs/heads/master"
e4ab3c55f   John Barnette   Stub auto-updatin...
37

0b590ebc4   Will Farrington   Refactor git hand...
38
39
40
41
      upstream_changes = `git rev-list --count master..origin/master`.chomp != '0'
      fast_forwardable = `git rev-list --count origin/master..master`.chomp == '0'
  
      short_branch = current_branch.split('/')[2..-1].join('/')
3b06d2616   Will Farrington   better error mess...
42
43
44
  
      if !master
        warn "Boxen on a non-master branch '#{short_branch}', won't auto-update!"
0b590ebc4   Will Farrington   Refactor git hand...
45
46
      elsif !fast_forwardable
        warn "Boxen's master branch is out of sync, won't auto-update!"
3b06d2616   Will Farrington   better error mess...
47
48
      elsif !clean
        warn "Boxen has a dirty tree, won't auto-update!"
0b590ebc4   Will Farrington   Refactor git hand...
49
50
      elsif !upstream_changes
        warn "Boxen is up-to-date."
3b06d2616   Will Farrington   better error mess...
51
      end
fdb27960f   Will Farrington   Update template w...
52

0b590ebc4   Will Farrington   Refactor git hand...
53
      if clean && master && fast_forwardable && upstream_changes
e4ab3c55f   John Barnette   Stub auto-updatin...
54
        reset   = "(git reset --hard origin/master #{quietly})"
0b590ebc4   Will Farrington   Refactor git hand...
55
        reclean = "(git clean -qdf)"
e4ab3c55f   John Barnette   Stub auto-updatin...
56

0b590ebc4   Will Farrington   Refactor git hand...
57
        unless system "#{reset} && #{reclean}"
3b06d2616   Will Farrington   better error mess...
58
          warn "Auto-update of Boxen FAILED, continuing."
e4ab3c55f   John Barnette   Stub auto-updatin...
59
60
61
62
63
64
65
66
67
        end
      end
    end
  end
  
  # Make sure our local dependencies are up to date.
  
  strap = %w(script/bootstrap --deployment --local --without development:test)
  abort "Can't bootstrap, dependencies are outdated." unless system *strap
9554e58b4   John Barnette   Spike config/basic
68
69
70
71
  
  # Set up our local configuration, deps, and load path.
  
  load "config/basic.rb"
bacf7fd78   John Barnette   Boxen.run -> Boxe...
72
  require "boxen/cli"
cea2b22c9   John Barnette   Call Boxen.run
73
  # Okay, let's run this thing.
bacf7fd78   John Barnette   Boxen.run -> Boxe...
74
  exit Boxen::CLI.run ARGV