Skip to content
Snippets Groups Projects
Commit 11d47e83 authored by ilovezfs's avatar ilovezfs
Browse files

boneyard-formula-pr: add new command.


Add a new developer command (i.e., requires `HOMEBREW_DEVELOPER` set in
your environment) to "boneyard" a formula, by creating one pull request
removing the formula from its current tap and updating (or creating)
tap_migrations.json, and another pull request importing the formula into
homebrew/boneyard with any bottle block removed.

Closes #53.

Signed-off-by: default avatarilovezfs <ilovezfs@icloud.com>
parent fe894678
No related branches found
No related tags found
No related merge requests found
# Creates a pull request to boneyard a formula.
#
# Usage: brew boneyard-formula-pr [options...] <formula-name>
#
# Options:
# --dry-run: Print what would be done rather than doing it.
require "formula"
require "utils/json"
require "fileutils"
begin
require "json"
rescue LoadError
puts "Homebrew does not provide Ruby dependencies; install with:"
puts " gem install json"
odie "Dependency json is not installed."
end
module Homebrew
def boneyard_formula_pr
formula = ARGV.formulae.first
odie "No formula found!" unless formula
formula_relpath = formula.path.relative_path_from(formula.tap.path)
formula_file = "#{formula.name}.rb"
bottle_block = File.read(formula.path).include? " bottle do"
boneyard_tap = Tap.fetch("homebrew", "boneyard")
tap_migrations_path = formula.tap.path/"tap_migrations.json"
if ARGV.dry_run?
puts "brew update"
puts "brew tap #{boneyard_tap.name}"
puts "cd #{formula.tap.path}"
cd formula.tap.path
puts "cp #{formula_relpath} #{boneyard_tap.path}"
puts "git rm #{formula_relpath}"
unless File.exist? tap_migrations_path
puts "Creating tap_migrations.json for #{formula.tap.name}"
puts "git add #{tap_migrations_path}"
end
puts "Loading tap_migrations.json"
puts "Adding #{formula.name} to tap_migrations.json"
else
safe_system HOMEBREW_BREW_FILE, "update"
safe_system HOMEBREW_BREW_FILE, "tap", boneyard_tap.name
cd formula.tap.path
cp formula_relpath, boneyard_tap.formula_dir
safe_system "git", "rm", formula_relpath
unless File.exist? tap_migrations_path
tap_migrations_path.write <<-EOS.undent
{
}
EOS
safe_system "git", "add", tap_migrations_path
end
tap_migrations = Utils::JSON.load(File.read(tap_migrations_path))
tap_migrations[formula.name] = boneyard_tap.name
tap_migrations = tap_migrations.sort.inject({}) { |a, e| a.merge!(e[0] => e[1]) }
tap_migrations_path.atomic_write(JSON.pretty_generate(tap_migrations) + "\n")
end
unless Formula["hub"].any_version_installed?
if ARGV.dry_run?
puts "brew install hub"
else
safe_system HOMEBREW_BREW_FILE, "install", "hub"
end
end
branch = "#{formula.name}-boneyard"
if ARGV.dry_run?
puts "cd #{formula.tap.path}"
puts "git checkout -b #{branch} origin/master"
puts "git commit --no-edit --verbose --message=\"#{formula.name}: migrate to boneyard\" -- #{formula_relpath} #{tap_migrations_path.basename}"
puts "hub fork --no-remote"
puts "hub fork"
puts "hub fork (to read $HUB_REMOTE)"
puts "git push $HUB_REMOTE #{branch}:#{branch}"
puts "hub pull-request -m $'#{formula.name}: migrate to boneyard\\n\\nCreated with `brew boneyard-formula-pr`.'"
else
cd formula.tap.path
safe_system "git", "checkout", "-b", branch, "origin/master"
safe_system "git", "commit", "--no-edit", "--verbose",
"--message=#{formula.name}: migrate to boneyard",
"--", formula_relpath, tap_migrations_path.basename
safe_system "hub", "fork", "--no-remote"
quiet_system "hub", "fork"
remote = Utils.popen_read("hub fork 2>&1")[/fatal: remote (.+) already exists./, 1]
odie "cannot get remote from 'hub'!" unless remote
safe_system "git", "push", remote, "#{branch}:#{branch}"
pr_message = <<-EOS.undent
#{formula.name}: migrate to boneyard
Created with `brew boneyard-formula-pr`.
EOS
pr_url = Utils.popen_read("hub", "pull-request", "-m", pr_message).chomp
end
if ARGV.dry_run?
puts "cd #{boneyard_tap.path}"
puts "git checkout -b #{branch} origin/master"
if bottle_block
puts "Removing bottle block"
else
puts "No bottle block to remove"
end
puts "git add #{formula_file}"
puts "git commit --no-edit --verbose --message=\"#{formula.name}: migrate from #{formula.tap.repo}\" -- #{formula_file}"
puts "hub fork --no-remote"
puts "hub fork"
puts "hub fork (to read $HUB_REMOTE)"
puts "git push $HUB_REMOTE #{branch}:#{branch}"
puts "hub pull-request --browse -m $'#{formula.name}: migrate from #{formula.tap.repo}\\n\\nGoes together with $PR_URL\\n\\nCreated with `brew boneyard-formula-pr`.'"
else
cd boneyard_tap.formula_dir
safe_system "git", "checkout", "-b", branch, "origin/master"
if bottle_block
Utils::Inreplace.inreplace formula_file, / bottle do.+?end\n\n/m, ""
end
safe_system "git", "add", formula_file
safe_system "git", "commit", "--no-edit", "--verbose",
"--message=#{formula.name}: migrate from #{formula.tap.repo}",
"--", formula_file
safe_system "hub", "fork", "--no-remote"
quiet_system "hub", "fork"
remote = Utils.popen_read("hub fork 2>&1")[/fatal: remote (.+) already exists./, 1]
odie "cannot get remote from 'hub'!" unless remote
safe_system "git", "push", remote, "#{branch}:#{branch}"
safe_system "hub", "pull-request", "--browse", "-m", <<-EOS.undent
#{formula.name}: migrate from #{formula.tap.repo}
Goes together with #{pr_url}.
Created with `brew boneyard-formula-pr`.
EOS
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment