aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Contributions/cmd/brew-bundle.rb
blob: ec1898e0901ce07b1ec524712fc8dc4e7be3fa44 (plain)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# brew-bundle.rb

def usage
  puts <<-EOS.undent
  Usage: brew bundle [path]

  Looks for a Brewfile and runs each line as a brew command.

  brew bundle              # Looks for "./Brewfile"
  brew bundle path/to/dir  # Looks for "path/to/dir/Brewfile"
  brew bundle path/to/file # Looks for "path/to/file"

  For example, given a Brewfile with the following content:
    install formula

  Running `brew bundle` will run the command `brew install formula`.

  NOTE: Not all brew commands will work consistently in a Brewfile.
  Some commands will raise errors which will stop execution of the Brewfile.

  Example that outputs an error:
    tap my/tap  # fails when my/tap has already been tapped

  In this case use the full formula path in the Brewfile instead:
    install my/tap/formula  # succeeds even when my/tap has already been tapped
  EOS
  exit
end

usage if ARGV.include?('--help') || ARGV.include?('-h')

path = 'Brewfile'
error = ' in current directory'

if ARGV.first
  if File.directory? ARGV.first
    path = "#{ARGV.first}/#{path}"
    error = " in '#{ARGV.first}'"
  else
    path = ARGV.first
    error = " at '#{ARGV.first}'"
  end
end

raise "Cannot find Brewfile#{error}" unless File.exist? path

File.readlines(path).each_with_index do |line, index|
  command = line.chomp
  next if command.empty?
  next if command.chars.first == '#'

  brew_cmd = "brew #{command}"
  odie "Command failed: L#{index+1}:#{brew_cmd}" unless system brew_cmd
end