update-report: migrate /usr/local repository.
Migrate a HOMEBREW_REPOSITORY and HOMEBREW_PREFIX of `/usr/local` so that the HOMEBREW_REPOSITORY is now in `/usr/local/Homebrew`. This gives us more flexibility on changing the repository layout in future and avoids putting junk in `/usr/local` when not necessary (e.g. our `README.md`).
This commit is contained in:
parent
59b7f16bfd
commit
0a09ae30f8
@ -98,6 +98,9 @@ module Homebrew
|
|||||||
Tap.each(&:link_manpages)
|
Tap.each(&:link_manpages)
|
||||||
|
|
||||||
Homebrew.failed = true if ENV["HOMEBREW_UPDATE_FAILED"]
|
Homebrew.failed = true if ENV["HOMEBREW_UPDATE_FAILED"]
|
||||||
|
|
||||||
|
# This should always be the last thing to run
|
||||||
|
migrate_legacy_repository_if_necessary
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
@ -169,16 +172,125 @@ module Homebrew
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_completions_and_docs
|
def migrate_legacy_repository_if_necessary
|
||||||
return if HOMEBREW_PREFIX.to_s == HOMEBREW_REPOSITORY.to_s
|
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"
|
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)
|
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)
|
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)
|
HOMEBREW_PREFIX/"share/zsh/site-functions", command)
|
||||||
link_path_manpages(HOMEBREW_REPOSITORY/"share", command)
|
link_path_manpages(repository/"share", command)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user