Merge pull request #963 from MikeMcQuaid/migrate-repository
update-report: migrate /usr/local repository.
This commit is contained in:
commit
e20467971e
@ -98,6 +98,9 @@ module Homebrew
|
||||
Tap.each(&:link_manpages)
|
||||
|
||||
Homebrew.failed = true if ENV["HOMEBREW_UPDATE_FAILED"]
|
||||
|
||||
# This should always be the last thing to run
|
||||
migrate_legacy_repository_if_necessary
|
||||
end
|
||||
|
||||
private
|
||||
@ -169,16 +172,125 @@ module Homebrew
|
||||
end
|
||||
end
|
||||
|
||||
def link_completions_and_docs
|
||||
return if HOMEBREW_PREFIX.to_s == HOMEBREW_REPOSITORY.to_s
|
||||
def migrate_legacy_repository_if_necessary
|
||||
return unless HOMEBREW_PREFIX.to_s == "/usr/local"
|
||||
return unless HOMEBREW_REPOSITORY.to_s == "/usr/local"
|
||||
return unless ARGV.homebrew_developer?
|
||||
|
||||
ohai "Migrating HOMEBREW_REPOSITORY (please wait)..."
|
||||
|
||||
unless HOMEBREW_PREFIX.writable_real?
|
||||
ofail <<-EOS.undent
|
||||
#{HOMEBREW_PREFIX} is not writable.
|
||||
|
||||
You should change the ownership and permissions of #{HOMEBREW_PREFIX}
|
||||
temporarily back to your user account so we can complete the Homebrew
|
||||
repository migration:
|
||||
sudo chown -R $(whoami) #{HOMEBREW_PREFIX}
|
||||
EOS
|
||||
return
|
||||
end
|
||||
|
||||
Keg::ALL_TOP_LEVEL_DIRECTORIES.each do |dir|
|
||||
FileUtils.mkdir_p "#{HOMEBREW_PREFIX}/#{dir}"
|
||||
end
|
||||
|
||||
new_homebrew_repository = Pathname.new "/usr/local/Homebrew"
|
||||
if new_homebrew_repository.exist?
|
||||
ofail <<-EOS.undent
|
||||
#{new_homebrew_repository} already exists.
|
||||
Please remove it manually or uninstall and reinstall Homebrew into a new
|
||||
location as the migration cannot be done automatically.
|
||||
EOS
|
||||
return
|
||||
end
|
||||
new_homebrew_repository.mkpath
|
||||
|
||||
repo_files = HOMEBREW_REPOSITORY.cd do
|
||||
Utils.popen_read("git ls-files").lines.map(&:chomp)
|
||||
end
|
||||
|
||||
unless Utils.popen_read("git status --untracked-files=all --porcelain").empty?
|
||||
HOMEBREW_REPOSITORY.cd do
|
||||
safe_system "git", "-c", "user.email=brew-update@localhost",
|
||||
"-c", "user.name=brew update",
|
||||
"stash", "save", "--include-untracked"
|
||||
end
|
||||
stashed = true
|
||||
end
|
||||
|
||||
FileUtils.cp_r "#{HOMEBREW_REPOSITORY}/.git", "#{new_homebrew_repository}/.git"
|
||||
new_homebrew_repository.cd do
|
||||
safe_system "git", "checkout", "--force", "."
|
||||
safe_system "git", "stash", "pop" if stashed
|
||||
end
|
||||
|
||||
if (HOMEBREW_REPOSITORY/"Library/Locks").exist?
|
||||
FileUtils.cp_r "#{HOMEBREW_REPOSITORY}/Library/Locks", "#{new_homebrew_repository}/Library/Locks"
|
||||
end
|
||||
|
||||
if (HOMEBREW_REPOSITORY/"Library/Taps").exist?
|
||||
FileUtils.cp_r "#{HOMEBREW_REPOSITORY}/Library/Taps", "#{new_homebrew_repository}/Library/Taps"
|
||||
end
|
||||
|
||||
unremovable_paths = []
|
||||
extra_remove_paths = [".git", "Library/Locks", "Library/Taps",
|
||||
"Library/Homebrew/test"]
|
||||
(repo_files + extra_remove_paths).each do |file|
|
||||
path = Pathname.new "#{HOMEBREW_REPOSITORY}/#{file}"
|
||||
begin
|
||||
FileUtils.rm_rf path
|
||||
rescue Errno::EACCES
|
||||
unremovable_paths << path
|
||||
end
|
||||
quiet_system "rmdir", "-p", path.parent if path.parent.exist?
|
||||
end
|
||||
|
||||
unless unremovable_paths.empty?
|
||||
ofail <<-EOS.undent
|
||||
Could not remove old HOMEBREW_REPOSITORY paths!
|
||||
Please do this manually with:
|
||||
sudo rm -rf #{unremovable_paths.join " "}
|
||||
EOS
|
||||
end
|
||||
|
||||
src = Pathname.new("#{new_homebrew_repository}/bin/brew")
|
||||
dst = Pathname.new("#{HOMEBREW_PREFIX}/bin/brew")
|
||||
begin
|
||||
FileUtils.ln_s(src.relative_path_from(dst.parent), dst)
|
||||
rescue Errno::EACCES
|
||||
ofail <<-EOS.undent
|
||||
Could not create symlink at #{dst}!
|
||||
Please do this manually with:
|
||||
sudo ln -sf #{src} #{dst}
|
||||
sudo chown $(whoami) #{dst}
|
||||
EOS
|
||||
end
|
||||
|
||||
link_completions_and_docs(new_homebrew_repository)
|
||||
|
||||
ohai "Migrated HOMEBREW_REPOSITORY to #{new_homebrew_repository}!"
|
||||
puts "You may now chown #{HOMEBREW_PREFIX} back to root:wheel."
|
||||
rescue => e
|
||||
ofail <<-EOS.undent
|
||||
#{e}
|
||||
#{Tty.white}Failed to migrate HOMEBREW_REPOSITORY to #{new_homebrew_repository}!
|
||||
Please comment with your (new) error in issue:
|
||||
#{Tty.em}https://github.com/Homebrew/brew/issues/987#{Tty.reset}
|
||||
EOS
|
||||
$stderr.puts e.backtrace
|
||||
end
|
||||
|
||||
def link_completions_and_docs(repository = HOMEBREW_REPOSITORY)
|
||||
return if HOMEBREW_PREFIX.to_s == repository.to_s
|
||||
command = "brew update"
|
||||
link_src_dst_dirs(HOMEBREW_REPOSITORY/"etc/bash_completion.d",
|
||||
link_src_dst_dirs(repository/"etc/bash_completion.d",
|
||||
HOMEBREW_PREFIX/"etc/bash_completion.d", command)
|
||||
link_src_dst_dirs(HOMEBREW_REPOSITORY/"share/doc/homebrew",
|
||||
link_src_dst_dirs(repository/"share/doc/homebrew",
|
||||
HOMEBREW_PREFIX/"share/doc/homebrew", command, link_dir: true)
|
||||
link_src_dst_dirs(HOMEBREW_REPOSITORY/"share/zsh/site-functions",
|
||||
link_src_dst_dirs(repository/"share/zsh/site-functions",
|
||||
HOMEBREW_PREFIX/"share/zsh/site-functions", command)
|
||||
link_path_manpages(HOMEBREW_REPOSITORY/"share", command)
|
||||
link_path_manpages(repository/"share", command)
|
||||
end
|
||||
end
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user