diff --git a/Library/Contributions/examples/brew-pull.rb b/Library/Contributions/examples/brew-pull.rb new file mode 100755 index 0000000000..cb5603050b --- /dev/null +++ b/Library/Contributions/examples/brew-pull.rb @@ -0,0 +1,49 @@ +# Gets a patch from a GitHub commit or pull request and applies it to Homebrew. +# Optionally, installs it too. + +require 'utils.rb' + +if ARGV.empty? + puts 'This command requires at least one URL argument' + exit 1 +end + +if ARGV.include? '--install' + ARGV.delete '--install' + install = true +end + +HOMEBREW_REPOSITORY.cd do + ARGV.each do|arg| + # This regex should work, if it's too precise, feel free to fix it. + if !arg.match 'https:\/\/github.com\/\w+\/homebrew\/(pull\/\d+|commit\/\w{40})' + ohai 'Ignoring URL:', "Not a GitHub pull request or commit: #{arg}" + next + end + + # GitHub provides commits'/pull-requests' raw patches using this URL. + url = arg + '.patch' + + # The cache directory seems like a good place to put patches. + patchpath = (HOMEBREW_CACHE+File.basename(url)) + curl url, '-o', patchpath + + # Makes sense to squash whitespace errors, we don't want them. + ohai 'Applying patch' + safe_system 'git', 'am', '--signoff', '--whitespace=fix', patchpath + + ohai 'Patch changed:' + safe_system 'git', 'diff', 'HEAD~1', '--stat' + + if install + status, filename = `git diff HEAD~1 --name-status`.split() + # Don't try and do anything to removed files. + if status == 'A' or status == 'M' + formula = File.basename(filename, '.rb') + ohai "Installing #{formula}" + # Not sure if this is the best way to install? + safe_system 'brew', 'install', '--force', formula + end + end + end +end \ No newline at end of file