aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/migrator.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/migrator.rb')
-rw-r--r--Library/Homebrew/migrator.rb129
1 files changed, 79 insertions, 50 deletions
diff --git a/Library/Homebrew/migrator.rb b/Library/Homebrew/migrator.rb
index 2b1d437f8..1ef554a39 100644
--- a/Library/Homebrew/migrator.rb
+++ b/Library/Homebrew/migrator.rb
@@ -44,14 +44,47 @@ class Migrator
end
end
+ # instance of new name formula
attr_reader :formula
- attr_reader :oldname, :oldpath, :old_pin_record, :old_opt_record
- attr_reader :old_linked_keg_record, :oldkeg, :old_tabs, :old_tap
- attr_reader :newname, :newpath, :new_pin_record
+
+ # old name of the formula
+ attr_reader :oldname
+
+ # path to oldname's cellar
+ attr_reader :old_cellar
+
+ # path to oldname pin
+ attr_reader :old_pin_record
+
+ # path to oldname opt
+ attr_reader :old_opt_record
+
+ # oldname linked keg
+ attr_reader :old_linked_keg
+
+ # path to oldname's linked keg
+ attr_reader :old_linked_keg_record
+
+ # tabs from oldname kegs
+ attr_reader :old_tabs
+
+ # tap of the old name
+ attr_reader :old_tap
+
+ # resolved path to oldname pin
attr_reader :old_pin_link_record
- # Path to new linked keg
- attr_reader :new_keg
+ # new name of the formula
+ attr_reader :newname
+
+ # path to newname cellar according to new name
+ attr_reader :new_cellar
+
+ # path to newname pin
+ attr_reader :new_pin_record
+
+ # path to newname keg that will be linked if old_linked_keg isn't nil
+ attr_reader :new_linked_keg_record
def initialize(formula)
@oldname = formula.oldname
@@ -59,22 +92,22 @@ class Migrator
raise MigratorNoOldnameError.new(formula) unless oldname
@formula = formula
- @oldpath = HOMEBREW_CELLAR/formula.oldname
- raise MigratorNoOldpathError.new(formula) unless oldpath.exist?
+ @old_cellar = HOMEBREW_CELLAR/formula.oldname
+ raise MigratorNoOldpathError.new(formula) unless old_cellar.exist?
- @old_tabs = oldpath.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
+ @old_tabs = old_cellar.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
@old_tap = old_tabs.first.tap
if !ARGV.force? && !from_same_taps?
raise MigratorDifferentTapsError.new(formula, old_tap)
end
- @newpath = HOMEBREW_CELLAR/formula.name
+ @new_cellar = HOMEBREW_CELLAR/formula.name
- if @oldkeg = get_linked_oldkeg
- @old_linked_keg_record = oldkeg.linked_keg_record if oldkeg.linked?
- @old_opt_record = oldkeg.opt_record if oldkeg.optlinked?
- @new_keg = HOMEBREW_CELLAR/"#{newname}/#{File.basename(oldkeg)}"
+ if @old_linked_keg = get_linked_old_linked_keg
+ @old_linked_keg_record = old_linked_keg.linked_keg_record if old_linked_keg.linked?
+ @old_opt_record = old_linked_keg.opt_record if old_linked_keg.optlinked?
+ @new_linked_keg_record = HOMEBREW_CELLAR/"#{newname}/#{File.basename(old_linked_keg)}"
end
@old_pin_record = HOMEBREW_LIBRARY/"PinnedKegs"/oldname
@@ -109,8 +142,8 @@ class Migrator
end
end
- def get_linked_oldkeg
- kegs = oldpath.subdirs.map { |d| Keg.new(d) }
+ def get_linked_old_linked_keg
+ kegs = old_cellar.subdirs.map { |d| Keg.new(d) }
kegs.detect(&:linked?) || kegs.detect(&:optlinked?)
end
@@ -118,13 +151,9 @@ class Migrator
@pinned
end
- def oldkeg_linked?
- !!oldkeg
- end
-
def migrate
- if newpath.exist?
- onoe "#{newpath} already exists; remove it manually and run brew migrate #{oldname}."
+ if new_cellar.exist?
+ onoe "#{new_cellar} already exists; remove it manually and run brew migrate #{oldname}."
return
end
@@ -134,7 +163,7 @@ class Migrator
unlink_oldname
move_to_new_directory
repin
- link_newname if oldkeg_linked?
+ link_newname unless old_linked_keg.nil?
link_oldname_opt
link_oldname_cellar
update_tabs
@@ -153,8 +182,8 @@ class Migrator
# move everything from Cellar/oldname to Cellar/newname
def move_to_new_directory
- puts "Moving to: #{newpath}"
- FileUtils.mv(oldpath, newpath)
+ puts "Moving to: #{new_cellar}"
+ FileUtils.mv(old_cellar, new_cellar)
end
def repin
@@ -178,7 +207,7 @@ class Migrator
def unlink_oldname
oh1 "Unlinking #{Tty.green}#{oldname}#{Tty.reset}"
- oldpath.subdirs.each do |d|
+ old_cellar.subdirs.each do |d|
keg = Keg.new(d)
keg.unlink
end
@@ -186,14 +215,14 @@ class Migrator
def link_newname
oh1 "Linking #{Tty.green}#{newname}#{Tty.reset}"
- keg = Keg.new(new_keg)
+ new_keg = Keg.new(new_linked_keg_record)
# If old_keg wasn't linked then we just optlink a keg.
# If old keg wasn't optlinked and linked, we don't call this method at all.
# If formula is keg-only we also optlink it.
if formula.keg_only? || !old_linked_keg_record
begin
- keg.optlink
+ new_keg.optlink
rescue Keg::LinkError => e
onoe "Failed to create #{formula.opt_prefix}"
raise
@@ -201,17 +230,17 @@ class Migrator
return
end
- keg.remove_linked_keg_record if keg.linked?
+ new_keg.remove_linked_keg_record if new_keg.linked?
begin
- keg.link
+ new_keg.link
rescue Keg::ConflictError => e
onoe "Error while executing `brew link` step on #{newname}"
puts e
puts
puts "Possible conflicting files are:"
mode = OpenStruct.new(:dry_run => true, :overwrite => true)
- keg.link(mode)
+ new_keg.link(mode)
raise
rescue Keg::LinkError => e
onoe "Error while linking"
@@ -223,7 +252,7 @@ class Migrator
onoe "An unexpected error occurred during linking"
puts e
puts e.backtrace if ARGV.debug?
- ignore_interrupts { keg.unlink }
+ ignore_interrupts { new_keg.unlink }
raise
end
end
@@ -232,14 +261,14 @@ class Migrator
def link_oldname_opt
if old_opt_record
old_opt_record.delete if old_opt_record.symlink?
- old_opt_record.make_relative_symlink(new_keg)
+ old_opt_record.make_relative_symlink(new_linked_keg_record)
end
end
# After migtaion every INSTALL_RECEIPT.json has wrong path to the formula
# so we must update INSTALL_RECEIPTs
def update_tabs
- new_tabs = newpath.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
+ new_tabs = new_cellar.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
new_tabs.each do |tab|
tab.source["path"] = formula.path.to_s if tab.source["path"]
tab.write
@@ -250,24 +279,24 @@ class Migrator
def unlink_oldname_opt
return unless old_opt_record
if old_opt_record.symlink? && old_opt_record.exist? \
- && new_keg.exist? \
- && new_keg.realpath == old_opt_record.realpath
+ && new_linked_keg_record.exist? \
+ && new_linked_keg_record.realpath == old_opt_record.realpath
old_opt_record.unlink
old_opt_record.parent.rmdir_if_possible
end
end
- # Remove oldpath if it exists
+ # Remove old_cellar if it exists
def link_oldname_cellar
- oldpath.delete if oldpath.symlink? || oldpath.exist?
- oldpath.make_relative_symlink(formula.rack)
+ old_cellar.delete if old_cellar.symlink? || old_cellar.exist?
+ old_cellar.make_relative_symlink(formula.rack)
end
# Remove Cellar/oldname link if it belongs to newname.
def unlink_oldname_cellar
- if (oldpath.symlink? && !oldpath.exist?) || (oldpath.symlink? \
- && formula.rack.exist? && formula.rack.realpath == oldpath.realpath)
- oldpath.unlink
+ if (old_cellar.symlink? && !old_cellar.exist?) || (old_cellar.symlink? \
+ && formula.rack.exist? && formula.rack.realpath == old_cellar.realpath)
+ old_cellar.unlink
end
end
@@ -284,37 +313,37 @@ class Migrator
new_pin_record.delete
end
- if newpath.exist?
- newpath.subdirs.each do |d|
+ if new_cellar.exist?
+ new_cellar.subdirs.each do |d|
newname_keg = Keg.new(d)
newname_keg.unlink
newname_keg.uninstall
end
end
- if oldkeg_linked?
+ unless old_linked_keg.nil?
# The keg used to be linked and when we backup everything we restore
# Cellar/oldname, the target also gets restored, so we are able to
# create a keg using its old path
if old_linked_keg_record
begin
- oldkeg.link
+ old_linked_keg.link
rescue Keg::LinkError
- oldkeg.unlink
+ old_linked_keg.unlink
raise
rescue Keg::AlreadyLinkedError
- oldkeg.unlink
+ old_linked_keg.unlink
retry
end
else
- oldkeg.optlink
+ old_linked_keg.optlink
end
end
end
def backup_oldname_cellar
- unless oldpath.exist?
- FileUtils.mv(newpath, oldpath)
+ unless old_cellar.exist?
+ FileUtils.mv(new_cellar, old_cellar)
end
end