mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

These definitions are scattered throughout the codebase which makes it hard to refactor them later (my goal is to move them outside of HOMEBREW_LIBRARY). Unify their definitions for clearer code and easier movement later.
265 lines
7.5 KiB
Ruby
265 lines
7.5 KiB
Ruby
require "testing_env"
|
|
require "migrator"
|
|
require "testball"
|
|
require "tab"
|
|
require "keg"
|
|
|
|
class Formula
|
|
attr_writer :oldname
|
|
end
|
|
|
|
class MigratorErrorsTests < Homebrew::TestCase
|
|
def setup
|
|
@new_f = Testball.new("newname")
|
|
@new_f.oldname = "oldname"
|
|
@old_f = Testball.new("oldname")
|
|
end
|
|
|
|
def test_no_oldname
|
|
assert_raises(Migrator::MigratorNoOldnameError) { Migrator.new(@old_f) }
|
|
end
|
|
|
|
def test_no_oldpath
|
|
assert_raises(Migrator::MigratorNoOldpathError) { Migrator.new(@new_f) }
|
|
end
|
|
|
|
def test_different_taps
|
|
keg = HOMEBREW_CELLAR/"oldname/0.1"
|
|
keg.mkpath
|
|
tab = Tab.empty
|
|
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
|
tab.source["tap"] = "homebrew/core"
|
|
tab.write
|
|
assert_raises(Migrator::MigratorDifferentTapsError) { Migrator.new(@new_f) }
|
|
ensure
|
|
keg.parent.rmtree
|
|
end
|
|
end
|
|
|
|
class MigratorTests < Homebrew::TestCase
|
|
include FileUtils
|
|
|
|
def setup
|
|
@new_f = Testball.new("newname")
|
|
@new_f.oldname = "oldname"
|
|
|
|
@old_f = Testball.new("oldname")
|
|
|
|
@old_keg_record = HOMEBREW_CELLAR/"oldname/0.1"
|
|
@old_keg_record.join("bin").mkpath
|
|
@new_keg_record = HOMEBREW_CELLAR/"newname/0.1"
|
|
|
|
%w[inside bindir].each { |file| touch @old_keg_record.join("bin", file) }
|
|
|
|
@old_tab = Tab.empty
|
|
@old_tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
|
@old_tab.source["path"] = "/oldname"
|
|
@old_tab.write
|
|
|
|
@keg = Keg.new(@old_keg_record)
|
|
@keg.link
|
|
@keg.optlink
|
|
|
|
@old_pin = HOMEBREW_PINNED_KEGS/"oldname"
|
|
@old_pin.make_relative_symlink @old_keg_record
|
|
|
|
@migrator = Migrator.new(@new_f)
|
|
|
|
mkpath HOMEBREW_PREFIX/"bin"
|
|
end
|
|
|
|
def teardown
|
|
@old_pin.unlink if @old_pin.symlink?
|
|
|
|
if @old_keg_record.parent.symlink?
|
|
@old_keg_record.parent.unlink
|
|
elsif @old_keg_record.directory?
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
end
|
|
|
|
if @new_keg_record.directory?
|
|
new_keg = Keg.new(@new_keg_record)
|
|
new_keg.unlink
|
|
new_keg.uninstall
|
|
end
|
|
|
|
@old_keg_record.parent.rmtree if @old_keg_record.parent.directory?
|
|
@new_keg_record.parent.rmtree if @new_keg_record.parent.directory?
|
|
|
|
rmtree HOMEBREW_PREFIX/"bin"
|
|
rmtree HOMEBREW_PREFIX/"opt" if (HOMEBREW_PREFIX/"opt").directory?
|
|
# What to do with pin?
|
|
@new_f.unpin
|
|
|
|
HOMEBREW_LOCK_DIR.children.each(&:unlink)
|
|
end
|
|
|
|
def test_move_cellar
|
|
@keg.unlink
|
|
shutup { @migrator.move_to_new_directory }
|
|
assert_predicate @new_keg_record, :directory?
|
|
assert_predicate @new_keg_record/"bin", :directory?
|
|
assert_predicate @new_keg_record/"bin/inside", :file?
|
|
assert_predicate @new_keg_record/"bin/bindir", :file?
|
|
refute_predicate @old_keg_record, :directory?
|
|
end
|
|
|
|
def test_backup_cellar
|
|
@old_keg_record.parent.rmtree
|
|
@new_keg_record.join("bin").mkpath
|
|
|
|
@migrator.backup_oldname_cellar
|
|
|
|
assert_predicate @old_keg_record, :directory?
|
|
assert_predicate @old_keg_record/"bin", :directory?
|
|
end
|
|
|
|
def test_repin
|
|
@new_keg_record.join("bin").mkpath
|
|
expected_relative = @new_keg_record.relative_path_from HOMEBREW_PINNED_KEGS
|
|
|
|
@migrator.repin
|
|
|
|
assert_predicate @migrator.new_pin_record, :symlink?
|
|
assert_equal expected_relative, @migrator.new_pin_record.readlink
|
|
refute_predicate @migrator.old_pin_record, :exist?
|
|
end
|
|
|
|
def test_unlink_oldname
|
|
assert_equal 1, HOMEBREW_LINKED_KEGS.children.size
|
|
assert_equal 1, (HOMEBREW_PREFIX/"opt").children.size
|
|
|
|
shutup { @migrator.unlink_oldname }
|
|
|
|
refute_predicate HOMEBREW_LINKED_KEGS, :exist?
|
|
refute_predicate HOMEBREW_LIBRARY/"bin", :exist?
|
|
end
|
|
|
|
def test_link_newname
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
@new_keg_record.join("bin").mkpath
|
|
%w[inside bindir].each { |file| touch @new_keg_record.join("bin", file) }
|
|
|
|
shutup { @migrator.link_newname }
|
|
|
|
assert_equal 1, HOMEBREW_LINKED_KEGS.children.size
|
|
assert_equal 1, (HOMEBREW_PREFIX/"opt").children.size
|
|
end
|
|
|
|
def test_link_oldname_opt
|
|
@new_keg_record.mkpath
|
|
@migrator.link_oldname_opt
|
|
assert_equal @new_keg_record.realpath, (HOMEBREW_PREFIX/"opt/oldname").realpath
|
|
end
|
|
|
|
def test_link_oldname_cellar
|
|
@new_keg_record.join("bin").mkpath
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
@migrator.link_oldname_cellar
|
|
assert_equal @new_keg_record.parent.realpath, (HOMEBREW_CELLAR/"oldname").realpath
|
|
end
|
|
|
|
def test_update_tabs
|
|
@new_keg_record.join("bin").mkpath
|
|
tab = Tab.empty
|
|
tab.tabfile = HOMEBREW_CELLAR/"newname/0.1/INSTALL_RECEIPT.json"
|
|
tab.source["path"] = "/path/that/must/be/changed/by/update_tabs"
|
|
tab.write
|
|
@migrator.update_tabs
|
|
assert_equal @new_f.path.to_s, Tab.for_keg(@new_keg_record).source["path"]
|
|
end
|
|
|
|
def test_migrate
|
|
tab = Tab.empty
|
|
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
|
tab.source["path"] = @old_f.path.to_s
|
|
tab.write
|
|
|
|
shutup { @migrator.migrate }
|
|
|
|
assert_predicate @new_keg_record, :exist?
|
|
assert_predicate @old_keg_record.parent, :symlink?
|
|
refute_predicate HOMEBREW_LINKED_KEGS/"oldname", :exist?
|
|
assert_equal @new_keg_record.realpath, (HOMEBREW_LINKED_KEGS/"newname").realpath
|
|
assert_equal @new_keg_record.realpath, @old_keg_record.realpath
|
|
assert_equal @new_keg_record.realpath, (HOMEBREW_PREFIX/"opt/oldname").realpath
|
|
assert_equal @new_keg_record.parent.realpath, (HOMEBREW_CELLAR/"oldname").realpath
|
|
assert_equal @new_keg_record.realpath, (HOMEBREW_PINNED_KEGS/"newname").realpath
|
|
assert_equal @new_f.path.to_s, Tab.for_keg(@new_keg_record).source["path"]
|
|
end
|
|
|
|
def test_unlinik_oldname_opt
|
|
@new_keg_record.mkpath
|
|
old_opt_record = HOMEBREW_PREFIX/"opt/oldname"
|
|
old_opt_record.unlink if old_opt_record.symlink?
|
|
old_opt_record.make_relative_symlink(@new_keg_record)
|
|
@migrator.unlink_oldname_opt
|
|
refute_predicate old_opt_record, :symlink?
|
|
end
|
|
|
|
def test_unlink_oldname_cellar
|
|
@new_keg_record.mkpath
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
@old_keg_record.parent.make_relative_symlink(@new_keg_record.parent)
|
|
@migrator.unlink_oldname_cellar
|
|
refute_predicate @old_keg_record.parent, :symlink?
|
|
end
|
|
|
|
def test_backup_oldname_cellar
|
|
@new_keg_record.join("bin").mkpath
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
@migrator.backup_oldname_cellar
|
|
refute_predicate @old_keg_record.subdirs, :empty?
|
|
end
|
|
|
|
def test_backup_old_tabs
|
|
tab = Tab.empty
|
|
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
|
tab.source["path"] = "/should/be/the/same"
|
|
tab.write
|
|
migrator = Migrator.new(@new_f)
|
|
tab.tabfile.delete
|
|
migrator.backup_old_tabs
|
|
assert_equal "/should/be/the/same", Tab.for_keg(@old_keg_record).source["path"]
|
|
end
|
|
|
|
# Backup tests are divided into three groups: when oldname Cellar is deleted
|
|
# and when it still exists and when it's a symlink
|
|
|
|
def check_after_backup
|
|
assert_predicate @old_keg_record.parent, :directory?
|
|
refute_predicate @old_keg_record.parent.subdirs, :empty?
|
|
assert_predicate HOMEBREW_LINKED_KEGS/"oldname", :exist?
|
|
assert_predicate HOMEBREW_PREFIX/"opt/oldname", :exist?
|
|
assert_predicate HOMEBREW_PINNED_KEGS/"oldname", :symlink?
|
|
assert_predicate @keg, :linked?
|
|
end
|
|
|
|
def test_backup_cellar_exist
|
|
@migrator.backup_oldname
|
|
check_after_backup
|
|
end
|
|
|
|
def test_backup_cellar_removed
|
|
@new_keg_record.join("bin").mkpath
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
@migrator.backup_oldname
|
|
check_after_backup
|
|
end
|
|
|
|
def test_backup_cellar_linked
|
|
@new_keg_record.join("bin").mkpath
|
|
@keg.unlink
|
|
@keg.uninstall
|
|
@old_keg_record.parent.make_relative_symlink(@new_keg_record.parent)
|
|
@migrator.backup_oldname
|
|
check_after_backup
|
|
end
|
|
end
|