2015-08-09 14:49:19 +03:00
|
|
|
require "formula"
|
2017-05-22 03:23:50 +02:00
|
|
|
require "lock_file"
|
2015-08-09 14:49:19 +03:00
|
|
|
require "keg"
|
|
|
|
require "tab"
|
|
|
|
|
|
|
|
class Migrator
|
2015-08-14 14:50:26 +01:00
|
|
|
class MigrationNeededError < RuntimeError
|
|
|
|
def initialize(formula)
|
2017-10-15 02:28:32 +02:00
|
|
|
super <<~EOS
|
2015-08-14 14:50:26 +01:00
|
|
|
#{formula.oldname} was renamed to #{formula.name} and needs to be migrated.
|
|
|
|
Please run `brew migrate #{formula.oldname}`
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-08-09 14:49:19 +03:00
|
|
|
class MigratorNoOldnameError < RuntimeError
|
|
|
|
def initialize(formula)
|
|
|
|
super "#{formula.name} doesn't replace any formula."
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class MigratorNoOldpathError < RuntimeError
|
|
|
|
def initialize(formula)
|
|
|
|
super "#{HOMEBREW_CELLAR/formula.oldname} doesn't exist."
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class MigratorDifferentTapsError < RuntimeError
|
|
|
|
def initialize(formula, tap)
|
2016-03-08 21:53:29 +08:00
|
|
|
msg = if tap.core_tap?
|
2015-08-17 21:49:37 +03:00
|
|
|
"Please try to use #{formula.oldname} to refer the formula.\n"
|
|
|
|
elsif tap
|
2015-12-06 22:50:21 +08:00
|
|
|
"Please try to use fully-qualified #{tap}/#{formula.oldname} to refer the formula.\n"
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
2015-08-17 21:49:37 +03:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
super <<~EOS
|
|
|
|
#{formula.name} from #{formula.tap} is given, but old name #{formula.oldname} was installed from #{tap ? tap : "path or url"}.
|
|
|
|
#{msg}To force migrate use `brew migrate --force #{formula.oldname}`.
|
2015-08-17 21:49:37 +03:00
|
|
|
EOS
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
# instance of new name formula
|
2015-08-09 14:49:19 +03:00
|
|
|
attr_reader :formula
|
2015-09-01 18:14:10 +03:00
|
|
|
|
|
|
|
# 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
|
2015-08-09 14:49:19 +03:00
|
|
|
attr_reader :old_pin_link_record
|
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
# new name of the formula
|
|
|
|
attr_reader :newname
|
|
|
|
|
|
|
|
# path to newname cellar according to new name
|
|
|
|
attr_reader :new_cellar
|
|
|
|
|
2017-03-31 10:36:26 +01:00
|
|
|
# true if new cellar existed at initialization time
|
|
|
|
attr_reader :new_cellar_existed
|
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
# 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
|
2015-08-14 20:36:19 +03:00
|
|
|
|
2017-03-29 11:19:25 +01:00
|
|
|
def self.needs_migration?(formula)
|
|
|
|
oldname = formula.oldname
|
|
|
|
return false unless oldname
|
|
|
|
oldname_rack = HOMEBREW_CELLAR/oldname
|
|
|
|
return false if oldname_rack.symlink?
|
|
|
|
return false unless oldname_rack.directory?
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.migrate_if_needed(formula)
|
|
|
|
return unless Migrator.needs_migration?(formula)
|
|
|
|
begin
|
2017-03-31 10:28:45 +01:00
|
|
|
migrator = Migrator.new(formula)
|
2017-03-29 11:19:25 +01:00
|
|
|
migrator.migrate
|
2017-10-07 00:31:28 +02:00
|
|
|
rescue => e
|
2017-03-29 11:19:25 +01:00
|
|
|
onoe e
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(formula, force: ARGV.force?)
|
2015-08-09 14:49:19 +03:00
|
|
|
@oldname = formula.oldname
|
|
|
|
@newname = formula.name
|
2016-09-17 15:17:27 +01:00
|
|
|
raise MigratorNoOldnameError, formula unless oldname
|
2015-08-09 14:49:19 +03:00
|
|
|
|
|
|
|
@formula = formula
|
2015-09-01 18:14:10 +03:00
|
|
|
@old_cellar = HOMEBREW_CELLAR/formula.oldname
|
2016-09-17 15:17:27 +01:00
|
|
|
raise MigratorNoOldpathError, formula unless old_cellar.exist?
|
2015-08-09 14:49:19 +03:00
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
@old_tabs = old_cellar.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
|
2015-08-09 14:49:19 +03:00
|
|
|
@old_tap = old_tabs.first.tap
|
2015-08-17 21:49:37 +03:00
|
|
|
|
2017-03-31 10:28:45 +01:00
|
|
|
if !force && !from_same_tap_user?
|
2015-08-17 21:49:37 +03:00
|
|
|
raise MigratorDifferentTapsError.new(formula, old_tap)
|
|
|
|
end
|
2015-08-09 14:49:19 +03:00
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
@new_cellar = HOMEBREW_CELLAR/formula.name
|
2017-03-31 10:36:26 +01:00
|
|
|
@new_cellar_existed = @new_cellar.exist?
|
2015-08-09 14:49:19 +03:00
|
|
|
|
2016-09-24 17:59:14 +02:00
|
|
|
if @old_linked_keg = linked_old_linked_keg
|
2015-09-01 18:14:10 +03:00
|
|
|
@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)}"
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
2016-09-15 18:28:42 +01:00
|
|
|
@old_pin_record = HOMEBREW_PINNED_KEGS/oldname
|
|
|
|
@new_pin_record = HOMEBREW_PINNED_KEGS/newname
|
2015-08-09 14:49:19 +03:00
|
|
|
@pinned = old_pin_record.symlink?
|
|
|
|
@old_pin_link_record = old_pin_record.readlink if @pinned
|
|
|
|
end
|
|
|
|
|
|
|
|
# Fix INSTALL_RECEIPTS for tap-migrated formula.
|
|
|
|
def fix_tabs
|
|
|
|
old_tabs.each do |tab|
|
2015-12-06 22:50:21 +08:00
|
|
|
tab.tap = formula.tap
|
2015-08-09 14:49:19 +03:00
|
|
|
tab.write
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-03-31 10:28:45 +01:00
|
|
|
def from_same_tap_user?
|
|
|
|
formula_tap_user = formula.tap.user if formula.tap
|
|
|
|
old_tap_user = nil
|
|
|
|
|
2017-03-30 19:18:40 +01:00
|
|
|
new_tap = if old_tap
|
2017-03-31 10:28:45 +01:00
|
|
|
old_tap_user, = old_tap.user
|
2017-03-30 19:18:40 +01:00
|
|
|
if migrate_tap = old_tap.tap_migrations[formula.oldname]
|
2017-03-31 10:28:45 +01:00
|
|
|
new_tap_user, new_tap_repo = migrate_tap.split("/")
|
2017-03-30 19:18:40 +01:00
|
|
|
"#{new_tap_user}/#{new_tap_repo}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-03-31 10:28:45 +01:00
|
|
|
if formula_tap_user == old_tap_user
|
2015-08-09 14:49:19 +03:00
|
|
|
true
|
|
|
|
# Homebrew didn't use to update tabs while performing tap-migrations,
|
2016-02-26 15:33:27 +08:00
|
|
|
# so there can be INSTALL_RECEIPT's containing wrong information about tap,
|
|
|
|
# so we check if there is an entry about oldname migrated to tap and if
|
2015-08-09 14:49:19 +03:00
|
|
|
# newname's tap is the same as tap to which oldname migrated, then we
|
|
|
|
# can perform migrations and the taps for oldname and newname are the same.
|
2017-03-30 19:18:40 +01:00
|
|
|
elsif formula.tap && old_tap && formula.tap == new_tap
|
2015-08-09 14:49:19 +03:00
|
|
|
fix_tabs
|
|
|
|
true
|
2015-12-06 22:50:21 +08:00
|
|
|
else
|
2015-08-09 14:49:19 +03:00
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-24 17:59:14 +02:00
|
|
|
def linked_old_linked_keg
|
2017-03-30 19:09:06 +01:00
|
|
|
keg_dirs = []
|
|
|
|
keg_dirs += new_cellar.subdirs if new_cellar.exist?
|
|
|
|
keg_dirs += old_cellar.subdirs
|
|
|
|
kegs = keg_dirs.map { |d| Keg.new(d) }
|
2015-08-09 14:49:19 +03:00
|
|
|
kegs.detect(&:linked?) || kegs.detect(&:optlinked?)
|
|
|
|
end
|
|
|
|
|
|
|
|
def pinned?
|
|
|
|
@pinned
|
|
|
|
end
|
|
|
|
|
|
|
|
def migrate
|
2017-03-29 11:21:31 +01:00
|
|
|
oh1 "Migrating #{Formatter.identifier(oldname)} to #{Formatter.identifier(newname)}"
|
|
|
|
lock
|
|
|
|
unlink_oldname
|
|
|
|
unlink_newname if new_cellar.exist?
|
|
|
|
repin
|
|
|
|
move_to_new_directory
|
|
|
|
link_oldname_cellar
|
|
|
|
link_oldname_opt
|
|
|
|
link_newname unless old_linked_keg.nil?
|
|
|
|
update_tabs
|
2018-03-02 21:23:04 +00:00
|
|
|
return unless formula.outdated?
|
|
|
|
opoo <<~EOS
|
|
|
|
#{Formatter.identifier(newname)} is outdated! Please run as soon as possible:
|
|
|
|
brew upgrade #{newname}
|
|
|
|
EOS
|
2017-03-29 11:21:31 +01:00
|
|
|
rescue Interrupt
|
|
|
|
ignore_interrupts { backup_oldname }
|
2017-10-07 00:31:28 +02:00
|
|
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
2017-03-29 11:21:31 +01:00
|
|
|
onoe "Error occurred while migrating."
|
|
|
|
puts e
|
|
|
|
puts e.backtrace if ARGV.debug?
|
|
|
|
puts "Backing up..."
|
|
|
|
ignore_interrupts { backup_oldname }
|
|
|
|
ensure
|
|
|
|
unlock
|
|
|
|
end
|
|
|
|
|
|
|
|
# move everything from Cellar/oldname to Cellar/newname
|
|
|
|
def move_to_new_directory
|
|
|
|
return unless old_cellar.exist?
|
|
|
|
|
|
|
|
if new_cellar.exist?
|
2017-03-17 09:21:41 -07:00
|
|
|
conflicted = false
|
|
|
|
old_cellar.each_child do |c|
|
2017-03-29 11:21:31 +01:00
|
|
|
next unless (new_cellar/c.basename).exist?
|
|
|
|
begin
|
|
|
|
FileUtils.rm_rf c
|
|
|
|
rescue Errno::EACCES
|
2017-03-17 09:21:41 -07:00
|
|
|
conflicted = true
|
|
|
|
onoe "#{new_cellar/c.basename} already exists."
|
|
|
|
end
|
|
|
|
end
|
2017-03-29 11:21:31 +01:00
|
|
|
|
2017-03-17 09:21:41 -07:00
|
|
|
if conflicted
|
2017-03-31 10:28:45 +01:00
|
|
|
odie "Remove #{new_cellar} manually and run brew migrate #{oldname}."
|
2017-03-17 09:21:41 -07:00
|
|
|
end
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
2017-03-29 11:21:53 +01:00
|
|
|
oh1 "Moving #{Formatter.identifier(oldname)} children"
|
2017-03-17 09:21:41 -07:00
|
|
|
if new_cellar.exist?
|
|
|
|
FileUtils.mv(old_cellar.children, new_cellar)
|
|
|
|
else
|
|
|
|
FileUtils.mv(old_cellar, new_cellar)
|
|
|
|
end
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
def repin
|
2016-09-23 22:02:23 +02:00
|
|
|
return unless pinned?
|
|
|
|
# old_pin_record is a relative symlink and when we try to to read it
|
|
|
|
# from <dir> we actually try to find file
|
|
|
|
# <dir>/../<...>/../Cellar/name/version.
|
|
|
|
# To repin formula we need to update the link thus that it points to
|
|
|
|
# the right directory.
|
|
|
|
# NOTE: old_pin_record.realpath.sub(oldname, newname) is unacceptable
|
|
|
|
# here, because it resolves every symlink for old_pin_record and then
|
|
|
|
# substitutes oldname with newname. It breaks things like
|
|
|
|
# Pathname#make_relative_symlink, where Pathname#relative_path_from
|
|
|
|
# is used to find relative path from source to destination parent and
|
|
|
|
# it assumes no symlinks.
|
2017-06-01 16:06:51 +02:00
|
|
|
src_oldname = (old_pin_record.dirname/old_pin_link_record).expand_path
|
2016-09-23 22:02:23 +02:00
|
|
|
new_pin_record.make_relative_symlink(src_oldname.sub(oldname, newname))
|
|
|
|
old_pin_record.delete
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
def unlink_oldname
|
2016-08-30 21:38:13 +02:00
|
|
|
oh1 "Unlinking #{Formatter.identifier(oldname)}"
|
2015-09-01 18:14:10 +03:00
|
|
|
old_cellar.subdirs.each do |d|
|
2015-08-09 14:49:19 +03:00
|
|
|
keg = Keg.new(d)
|
|
|
|
keg.unlink
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-03-17 09:21:41 -07:00
|
|
|
def unlink_newname
|
|
|
|
oh1 "Unlinking #{Formatter.identifier(newname)}"
|
|
|
|
new_cellar.subdirs.each do |d|
|
|
|
|
keg = Keg.new(d)
|
|
|
|
keg.unlink
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-08-09 14:49:19 +03:00
|
|
|
def link_newname
|
2016-08-30 21:38:13 +02:00
|
|
|
oh1 "Linking #{Formatter.identifier(newname)}"
|
2015-09-01 18:14:10 +03:00
|
|
|
new_keg = Keg.new(new_linked_keg_record)
|
2015-08-09 14:49:19 +03:00
|
|
|
|
2015-08-12 16:21:13 +03:00
|
|
|
# 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
|
2015-08-09 14:49:19 +03:00
|
|
|
begin
|
2015-09-01 18:14:10 +03:00
|
|
|
new_keg.optlink
|
2015-08-09 14:49:19 +03:00
|
|
|
rescue Keg::LinkError => e
|
|
|
|
onoe "Failed to create #{formula.opt_prefix}"
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
new_keg.remove_linked_keg_record if new_keg.linked?
|
2015-08-09 14:49:19 +03:00
|
|
|
|
|
|
|
begin
|
2018-03-02 17:21:17 +00:00
|
|
|
mode = OpenStruct.new(overwrite: true)
|
|
|
|
new_keg.link(mode)
|
2015-08-09 14:49:19 +03:00
|
|
|
rescue Keg::ConflictError => e
|
|
|
|
onoe "Error while executing `brew link` step on #{newname}"
|
|
|
|
puts e
|
|
|
|
puts
|
|
|
|
puts "Possible conflicting files are:"
|
2016-09-17 15:32:44 +01:00
|
|
|
mode = OpenStruct.new(dry_run: true, overwrite: true)
|
2015-09-01 18:14:10 +03:00
|
|
|
new_keg.link(mode)
|
2015-08-09 14:49:19 +03:00
|
|
|
raise
|
|
|
|
rescue Keg::LinkError => e
|
|
|
|
onoe "Error while linking"
|
|
|
|
puts e
|
|
|
|
puts
|
|
|
|
puts "You can try again using:"
|
|
|
|
puts " brew link #{formula.name}"
|
2017-10-07 00:31:28 +02:00
|
|
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
2015-08-09 14:49:19 +03:00
|
|
|
onoe "An unexpected error occurred during linking"
|
|
|
|
puts e
|
2015-08-15 20:37:24 +08:00
|
|
|
puts e.backtrace if ARGV.debug?
|
2015-09-01 18:14:10 +03:00
|
|
|
ignore_interrupts { new_keg.unlink }
|
2015-08-15 20:37:24 +08:00
|
|
|
raise
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Link keg to opt if it was linked before migrating.
|
|
|
|
def link_oldname_opt
|
2016-09-23 22:02:23 +02:00
|
|
|
return unless old_opt_record
|
|
|
|
old_opt_record.delete if old_opt_record.symlink?
|
|
|
|
old_opt_record.make_relative_symlink(new_linked_keg_record)
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
# After migtaion every INSTALL_RECEIPT.json has wrong path to the formula
|
|
|
|
# so we must update INSTALL_RECEIPTs
|
|
|
|
def update_tabs
|
2015-09-01 18:14:10 +03:00
|
|
|
new_tabs = new_cellar.subdirs.map { |d| Tab.for_keg(Keg.new(d)) }
|
2015-08-09 14:49:19 +03:00
|
|
|
new_tabs.each do |tab|
|
|
|
|
tab.source["path"] = formula.path.to_s if tab.source["path"]
|
|
|
|
tab.write
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Remove opt/oldname link if it belongs to newname.
|
|
|
|
def unlink_oldname_opt
|
|
|
|
return unless old_opt_record
|
2015-08-12 16:21:13 +03:00
|
|
|
if old_opt_record.symlink? && old_opt_record.exist? \
|
2015-09-01 18:14:10 +03:00
|
|
|
&& new_linked_keg_record.exist? \
|
|
|
|
&& new_linked_keg_record.realpath == old_opt_record.realpath
|
2015-08-09 14:49:19 +03:00
|
|
|
old_opt_record.unlink
|
|
|
|
old_opt_record.parent.rmdir_if_possible
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
# Remove old_cellar if it exists
|
2015-08-09 14:49:19 +03:00
|
|
|
def link_oldname_cellar
|
2015-09-01 18:14:10 +03:00
|
|
|
old_cellar.delete if old_cellar.symlink? || old_cellar.exist?
|
|
|
|
old_cellar.make_relative_symlink(formula.rack)
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
# Remove Cellar/oldname link if it belongs to newname.
|
|
|
|
def unlink_oldname_cellar
|
2015-09-01 18:14:10 +03:00
|
|
|
if (old_cellar.symlink? && !old_cellar.exist?) || (old_cellar.symlink? \
|
|
|
|
&& formula.rack.exist? && formula.rack.realpath == old_cellar.realpath)
|
|
|
|
old_cellar.unlink
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-11-03 02:51:22 +00:00
|
|
|
# Backup everything if errors occurred while migrating.
|
2015-08-09 14:49:19 +03:00
|
|
|
def backup_oldname
|
|
|
|
unlink_oldname_opt
|
|
|
|
unlink_oldname_cellar
|
|
|
|
backup_oldname_cellar
|
|
|
|
backup_old_tabs
|
|
|
|
|
|
|
|
if pinned? && !old_pin_record.symlink?
|
2017-06-01 16:06:51 +02:00
|
|
|
src_oldname = (old_pin_record.dirname/old_pin_link_record).expand_path
|
2015-08-09 14:49:19 +03:00
|
|
|
old_pin_record.make_relative_symlink(src_oldname)
|
|
|
|
new_pin_record.delete
|
|
|
|
end
|
|
|
|
|
2015-09-01 18:14:10 +03:00
|
|
|
if new_cellar.exist?
|
|
|
|
new_cellar.subdirs.each do |d|
|
2015-08-09 14:49:19 +03:00
|
|
|
newname_keg = Keg.new(d)
|
|
|
|
newname_keg.unlink
|
2017-03-31 10:36:26 +01:00
|
|
|
newname_keg.uninstall if new_cellar_existed
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-23 22:02:23 +02:00
|
|
|
return if 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
|
|
|
|
old_linked_keg.link
|
|
|
|
rescue Keg::LinkError
|
|
|
|
old_linked_keg.unlink
|
|
|
|
raise
|
|
|
|
rescue Keg::AlreadyLinkedError
|
|
|
|
old_linked_keg.unlink
|
|
|
|
retry
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
2016-09-23 22:02:23 +02:00
|
|
|
else
|
|
|
|
old_linked_keg.optlink
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def backup_oldname_cellar
|
2016-09-23 11:01:40 +02:00
|
|
|
FileUtils.mv(new_cellar, old_cellar) unless old_cellar.exist?
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
def backup_old_tabs
|
|
|
|
old_tabs.each(&:write)
|
|
|
|
end
|
2015-08-17 22:49:57 +08:00
|
|
|
|
|
|
|
def lock
|
|
|
|
@newname_lock = FormulaLock.new newname
|
|
|
|
@oldname_lock = FormulaLock.new oldname
|
|
|
|
@newname_lock.lock
|
|
|
|
@oldname_lock.lock
|
|
|
|
end
|
|
|
|
|
|
|
|
def unlock
|
|
|
|
@newname_lock.unlock
|
|
|
|
@oldname_lock.unlock
|
|
|
|
end
|
2015-08-09 14:49:19 +03:00
|
|
|
end
|