Spec-Zone.ru › Homebrew

Класс: Migrator Закрытый

Наследует:
Object
  • Object
  • Migrator
показать все
Расширен модулем:
Utils::Output::Mixin
Включает:
Context, Utils::Output::Mixin
Определён в:
migrator.rb

Обзор

Этот класс является частью закрытого API. Этот класс можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого класса, поскольку он может быть удалён или изменён без предупреждения.

Вспомогательный класс для переименования формулы.

Определено в пространстве имён

Классы: MigrationNeededError, MigratorDifferentTapsError, MigratorNoOldpathError

Краткое описание атрибутов экземпляра свернуть

  • #formula ⇒ Formula только для чтения закрытый

    Экземпляр переименованной формулы.

  • #new_cellar ⇒ Pathname только для чтения закрытый

    Путь к Cellar нового имени, соответствующий новому имени.

  • #new_cellar_existed ⇒ Boolean только для чтения закрытый

    Истина, если новый Cellar существовал на момент инициализации.

  • #new_linked_keg_record ⇒ Pathname? только для чтения закрытый

    Путь к keg нового имени, который будет связан, если old_linked_keg не равен nil.

  • #new_pin_record ⇒ Pathname только для чтения закрытый

    Путь к pin нового имени.

  • #newname ⇒ String только для чтения закрытый

    Новое имя формулы.

  • #old_cellar ⇒ Pathname только для чтения закрытый

    Путь к Cellar старого имени.

  • #old_full_linked_kegs ⇒ Array<Keg> только для чтения закрытый

    Связанные keg старого имени, которые были полностью подключены.

  • #old_linked_kegs ⇒ Array<Keg> только для чтения закрытый

    Связанные keg старого имени.

  • #old_opt_records ⇒ Array<Pathname> только для чтения закрытый

    Путь к opt старого имени.

  • #old_pin_link_record ⇒ Pathname? только для чтения закрытый

    Разрешённый путь к pin старого имени.

  • #old_pin_record ⇒ Pathname только для чтения закрытый

    Путь к pin старого имени.

  • #old_tabs ⇒ Array<Tab> только для чтения закрытый

    Табы из keg старого имени.

  • #old_tap ⇒ Tap? только для чтения закрытый

    Tap старого имени.

  • #oldname ⇒ String только для чтения закрытый

    Старое имя формулы.

Краткое описание методов класса свернуть

  • .migrate_if_needed(formula, force:, dry_run: false) ⇒ void закрытый
  • .needs_migration?(formula) ⇒ Boolean закрытый
  • .oldnames_needing_migration(formula) ⇒ Array<String> закрытый

Краткое описание методов экземпляра свернуть

  • #backup_old_tabs ⇒ void закрытый
  • #backup_oldname ⇒ void закрытый

    Создать резервную копию всего на случай ошибок при миграции.

  • #backup_oldname_cellar ⇒ void закрытый
  • #fix_tabs ⇒ void закрытый

    Исправить INSTALL_RECEIPTs для формулы, перенесённой в другой tap.

  • #from_same_tap_user? ⇒ Boolean закрытый
  • #initialize(formula, oldname, force: false) ⇒ void конструктор закрытый
  • #link_newname ⇒ Integer? закрытый
  • #link_oldname_cellar ⇒ void закрытый

    Удалить Cellar/oldname, если он существует.

  • #link_oldname_opt ⇒ void закрытый

    Связать keg с opt, если до миграции он был связан.

  • #linked_old_linked_kegs ⇒ Array<Keg> закрытый
  • #lock ⇒ void закрытый
  • #merge_directory(directory) ⇒ void закрытый
  • #migrate ⇒ void закрытый
  • #move_to_new_directory ⇒ void закрытый

    Переместить всё из Cellar/oldname в Cellar/newname.

  • #pinned? ⇒ Boolean закрытый
  • #remove_conflicts(directory) ⇒ Boolean закрытый
  • #repin ⇒ void закрытый
  • #unlink_newname ⇒ void закрытый
  • #unlink_oldname ⇒ void закрытый
  • #unlink_oldname_cellar ⇒ void закрытый

    Удалить ссылку Cellar/oldname, если она принадлежит newname.

  • #unlink_oldname_opt ⇒ void закрытый

    Удалить ссылку opt/oldname, если она принадлежит newname.

  • #unlock ⇒ void закрытый
  • #update_tabs ⇒ void закрытый

    После миграции у каждого INSTALL_RECEIPT.json указан неправильный путь к формуле, поэтому необходимо обновить INSTALL_RECEIPTs.

Методы, включённые из Utils::Output::Mixin

issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, opoo_without_github_actions_annotation, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_uninstalled, pretty_upgradable, pretty_warning

Методы, включённые из Context

current, current=, #debug?, #quiet?, #verbose?, #with_context

Подробное описание конструкторов

#initialize(formula, oldname, force: false) ⇒ void

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. Сторонним разработчикам следует по возможности избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)
  • oldname (String)
  • force (Boolean) (по умолчанию: false)

Вызывает исключения:

  • (MigratorNoOldpathError)


149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'migrator.rb', line 149

def initialize(formula, oldname, force: false)
  @oldname = oldname
  @newname = T.let(formula.name, String)

  @formula = formula
  @old_cellar = T.let(HOMEBREW_CELLAR/oldname, Pathname)
  raise MigratorNoOldpathError, oldname unless old_cellar.exist?

  @old_tabs = T.let(old_cellar.subdirs.map { |d| Keg.new(d).tab }, T::Array[Tab])
  first_tab = old_tabs.first
  @old_tap = T.let(first_tab&.tap, T.nilable(Tap))

  raise MigratorDifferentTapsError.new(formula, oldname, old_tap) if !force && !from_same_tap_user?

  @new_cellar = T.let(HOMEBREW_CELLAR/formula.name, Pathname)
  @new_cellar_existed = T.let(@new_cellar.exist?, T::Boolean)

  @old_linked_kegs = T.let(linked_old_linked_kegs, T::Array[Keg])
  @old_full_linked_kegs = T.let([], T::Array[Keg])
  @old_opt_records = T.let([], T::Array[Pathname])
  old_linked_kegs.each do |old_linked_keg|
    @old_full_linked_kegs << old_linked_keg if old_linked_keg.linked?
    @old_opt_records << old_linked_keg.opt_record if old_linked_keg.optlinked?
  end
  @new_linked_keg_record = T.let(nil, T.nilable(Pathname))
  unless old_linked_kegs.empty?
    @new_linked_keg_record = HOMEBREW_CELLAR/"#{newname}/#{File.basename(old_linked_kegs.first.to_s)}"
  end

  @old_pin_record = T.let(HOMEBREW_PINNED_KEGS/oldname, Pathname)
  @new_pin_record = T.let(HOMEBREW_PINNED_KEGS/newname, Pathname)
  @pinned = T.let(old_pin_record.symlink?, T::Boolean)
  @old_pin_link_record = T.let(old_pin_record.symlink? ? old_pin_record.readlink : nil, T.nilable(Pathname))
end

Подробное описание атрибутов экземпляра

#formula ⇒ Formula (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Экземпляр переименованной формулы.

Возвращает:

  • (Formula)


55
56
57
# File 'migrator.rb', line 55

def formula
  @formula
end

#new_cellar ⇒ Pathname (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Путь к Cellar для newname, соответствующий новому имени.

Возвращает:

  • (Pathname)


99
100
101
# File 'migrator.rb', line 99

def new_cellar
  @new_cellar
end

#new_cellar_existed ⇒ Boolean (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

True, если новый Cellar существовал на момент инициализации.

Возвращает:

  • (Boolean)


103
104
105
# File 'migrator.rb', line 103

def new_cellar_existed
  @new_cellar_existed
end

#new_linked_keg_record ⇒ Pathname? (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Путь к keg для newname, который будет связан, если old_linked_keg не равен nil.

Возвращает:

  • (Pathname, nil)


111
112
113
# File 'migrator.rb', line 111

def new_linked_keg_record
  @new_linked_keg_record
end

#new_pin_record ⇒ Pathname (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Путь к закреплению newname.

Возвращает:

  • (Pathname)


107
108
109
# File 'migrator.rb', line 107

def new_pin_record
  @new_pin_record
end

#newname ⇒ String (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Новое имя формулы.

Возвращает:

  • (String)


95
96
97
# File 'migrator.rb', line 95

def newname
  @newname
end

#old_cellar ⇒ Pathname (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Путь к Cellar для oldname.

Возвращает:

  • (Pathname)


63
64
65
# File 'migrator.rb', line 63

def old_cellar
  @old_cellar
end

#old_full_linked_kegs ⇒ Array<Keg> (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Связанные keg для oldname, которые были связаны полностью.

Возвращает:

  • (Array<Keg>)


79
80
81
# File 'migrator.rb', line 79

def old_full_linked_kegs
  @old_full_linked_kegs
end

#old_linked_kegs ⇒ Array<Keg> (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Связанные keg для oldname.

Возвращает:

  • (Array<Keg>)


75
76
77
# File 'migrator.rb', line 75

def old_linked_kegs
  @old_linked_kegs
end

#old_opt_records ⇒ Array<Pathname> (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Путь к opt для oldname.

Возвращает:

  • (Array<Pathname>)


71
72
73
# File 'migrator.rb', line 71

def old_opt_records
  @old_opt_records
end

#old_pin_link_record ⇒ Pathname? (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Разрешённый путь к закреплению oldname.

Возвращает:

  • (Pathname, nil)


91
92
93
# File 'migrator.rb', line 91

def old_pin_link_record
  @old_pin_link_record
end

#old_pin_record ⇒ Pathname (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Путь к закреплению oldname.

Возвращает:

  • (Pathname)


67
68
69
# File 'migrator.rb', line 67

def old_pin_record
  @old_pin_record
end

#old_tabs ⇒ Array<Tab> (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Табуляции из keg для oldname.

Возвращает:

  • (Array<Tab>)


83
84
85
# File 'migrator.rb', line 83

def old_tabs
  @old_tabs
end

#old_tap ⇒ Tap? (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Tap старого имени.

Возвращает:

  • (Tap, nil)


87
88
89
# File 'migrator.rb', line 87

def old_tap
  @old_tap
end

#oldname ⇒ String (только для чтения)

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Старое имя формулы.

Возвращает:

  • (String)


59
60
61
# File 'migrator.rb', line 59

def oldname
  @oldname
end

Подробное описание методов класса

.migrate_if_needed(formula, force:, dry_run: false) ⇒ void

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод не возвращает значения.

Параметры:

  • formula (Formula)
  • force (Boolean)
  • dry_run (Boolean) (по умолчанию: false)


130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'migrator.rb', line 130

def self.migrate_if_needed(formula, force:, dry_run: false)
  oldnames = Migrator.oldnames_needing_migration(formula)

  begin
    oldnames.each do |oldname|
      if dry_run
        oh1 "Would migrate formula #{Formatter.identifier(oldname)} to #{Formatter.identifier(formula.name)}"
        next
      end

      migrator = Migrator.new(formula, oldname, force:)
      migrator.migrate
    end
  rescue => e
    onoe e
  end
end

.needs_migration?(formula) ⇒ Boolean

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)

Возвращает:

  • (Boolean)


125
126
127
# File 'migrator.rb', line 125

def self.needs_migration?(formula)
  !oldnames_needing_migration(formula).empty?
end

.oldnames_needing_migration(formula) ⇒ Array<String>

Этот метод является частью закрытого API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • formula (Formula)

Возвращает:

  • (Array<String>)


114
115
116
117
118
119
120
121
122
# File 'migrator.rb', line 114

def self.oldnames_needing_migration(formula)
  formula.oldnames.select do |oldname|
    oldname_rack = HOMEBREW_CELLAR/oldname
    next false if oldname_rack.symlink?
    next false unless oldname_rack.directory?

    true
  end
end

Подробное описание методов экземпляра

#backup_old_tabs ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



520
521
522
# File 'migrator.rb', line 520

def backup_old_tabs
  old_tabs.each(&:write)
end

#backup_oldname ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Создаёт резервную копию всего в случае ошибок при миграции.



475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
# File 'migrator.rb', line 475

def backup_oldname
  unlink_oldname_opt
  unlink_oldname_cellar
  backup_oldname_cellar
  backup_old_tabs

  if pinned? && !old_pin_record.symlink? && (old_pin_link = old_pin_link_record)
    src_oldname = (old_pin_record.dirname/old_pin_link).expand_path
    old_pin_record.make_relative_symlink(src_oldname)
    new_pin_record.delete
  end

  if new_cellar.exist?
    new_cellar.subdirs.each do |d|
      newname_keg = Keg.new(d)
      newname_keg.unlink(verbose: verbose?)
      newname_keg.uninstall unless new_cellar_existed
    end
  end

  return if old_linked_kegs.empty?

  # 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
  old_full_linked_kegs.each do |old_linked_keg|
    old_linked_keg.link(verbose: verbose?)
  rescue Keg::LinkError
    old_linked_keg.unlink(verbose: verbose?)
    raise
  rescue Keg::AlreadyLinkedError
    old_linked_keg.unlink(verbose: verbose?)
    retry
  end
  (old_linked_kegs - old_full_linked_kegs).each do |old_linked_keg|
    old_linked_keg.optlink(verbose: verbose?)
  end
end

#backup_oldname_cellar ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



515
516
517
# File 'migrator.rb', line 515

def backup_oldname_cellar
  FileUtils.mv(new_cellar, old_cellar) unless old_cellar.exist?
end

#fix_tabs ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Исправляет INSTALL_RECEIPTs для формулы, перенесённой в tap.



186
187
188
189
190
191
# File 'migrator.rb', line 186

def fix_tabs
  old_tabs.each do |tab|
    tab.tap = formula.tap
    tab.write
  end
end

#from_same_tap_user? ⇒ Boolean

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'migrator.rb', line 194

def from_same_tap_user?
  formula_tap_user = formula.tap&.user
  old_tap_user = nil

  new_tap = if (old_tap = self.old_tap)
    old_tap_user, = old_tap.user
    if (migrate_tap = old_tap.tap_migrations[oldname])
      Utils.tap_from_full_name(migrate_tap) || (migrate_tap if migrate_tap.include?("/"))
    end
  end

  if formula_tap_user == old_tap_user
    true
  # Homebrew didn't use to update tabs while performing tap-migrations,
  # 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
  # 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.
  elsif formula.tap && old_tap && formula.tap == new_tap
    fix_tabs
    true
  else
    false
  end
end

#link_newname ⇒ Integer?

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Integer, nil)


368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
# File 'migrator.rb', line 368

def link_newname
  new_linked_keg_record = self.new_linked_keg_record
  return unless new_linked_keg_record

  oh1 "Relinking #{Formatter.identifier(newname)}"
  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_full_linked_kegs.empty?
    begin
      new_keg.optlink(verbose: verbose?)
    rescue Keg::LinkError => e
      onoe "Failed to create #{formula.opt_prefix}"
      raise
    end
    return
  end

  new_keg.remove_linked_keg_record if new_keg.linked?

  begin
    new_keg.link(overwrite: true, verbose: verbose?)
  rescue Keg::ConflictError => e
    onoe "The `brew link` step did not complete successfully."
    puts e
    puts
    puts "Possible conflicting files are:"
    new_keg.link(dry_run: true, overwrite: true, verbose: verbose?)
    raise
  rescue Keg::LinkError => e
    onoe "The `brew link` step did not complete successfully."
    puts e
    puts
    puts "You can try again using:"
    puts "  brew link #{formula.name}"
  # Any exception means the `brew link` step did not complete.
  rescue Exception => e # rubocop:disable Lint/RescueException
    onoe "An unexpected error occurred during linking"
    puts e
    if debug?
      require "utils/backtrace"
      puts Utils::Backtrace.clean(e)
    end
    ignore_interrupts { new_keg.unlink(verbose: verbose?) }
    raise
  end
end

#link_oldname_cellar ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Удаляет Cellar/oldname, если он существует.



459
460
461
462
# File 'migrator.rb', line 459

def link_oldname_cellar
  old_cellar.delete if old_cellar.symlink? || old_cellar.exist?
  old_cellar.make_relative_symlink(formula.rack)
end

#link_oldname_opt ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Связывает keg с opt, если он был связан до миграции.



420
421
422
423
424
425
426
427
428
# File 'migrator.rb', line 420

def link_oldname_opt
  new_linked_keg_record = self.new_linked_keg_record
  return unless new_linked_keg_record

  old_opt_records.each do |old_opt_record|
    old_opt_record.delete if old_opt_record.symlink?
    old_opt_record.make_relative_symlink(new_linked_keg_record)
  end
end

#linked_old_linked_kegs ⇒ Array<Keg>

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Array<Keg>)


221
222
223
224
225
226
227
# File 'migrator.rb', line 221

def linked_old_linked_kegs
  keg_dirs = []
  keg_dirs += new_cellar.subdirs if new_cellar.exist?
  keg_dirs += old_cellar.subdirs
  kegs = keg_dirs.map { |d| Keg.new(d) }
  kegs.select { |keg| keg.linked? || keg.optlinked? }
end

#lock ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



525
526
527
528
529
530
531
532
# File 'migrator.rb', line 525

def lock
  newname_lock = FormulaLock.new(newname)
  oldname_lock = FormulaLock.new(oldname)
  newname_lock.lock
  oldname_lock.lock
  @newname_lock = T.let(newname_lock, T.nilable(FormulaLock))
  @oldname_lock = T.let(oldname_lock, T.nilable(FormulaLock))
end

#merge_directory(directory) ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Параметры:

  • directory (Pathname)


294
295
296
297
298
299
300
301
302
303
304
305
# File 'migrator.rb', line 294

def merge_directory(directory)
  directory.each_child do |c|
    new_path = new_cellar/c.relative_path_from(old_cellar)

    if c.directory? && !c.symlink? && new_path.exist?
      merge_directory(c)
      c.unlink
    else
      FileUtils.mv(c, new_path)
    end
  end
end

#migrate ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'migrator.rb', line 235

def migrate
  oh1 "Migrating formula #{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_kegs.empty?
  update_tabs
  return unless formula.outdated?

  opoo <<~EOS
#{Formatter.identifier(newname)} is outdated!
    To avoid broken installations, as soon as possible please run:
      brew upgrade
    Or, if you're OK with a less reliable fix:
      brew upgrade #{newname}  EOS
rescue Interrupt
  ignore_interrupts { backup_oldname }
# Any exception means the migration did not complete.
rescue Exception => e # rubocop:disable Lint/RescueException
  onoe "The migration did not complete successfully."
  puts e
  if debug?
    require "utils/backtrace"
    puts Utils::Backtrace.clean(e)
  end
  puts "Backing up..."
  ignore_interrupts { backup_oldname }
ensure
  unlock
end

#move_to_new_directory ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Перемещает всё из Cellar/oldname в Cellar/newname.



309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
# File 'migrator.rb', line 309

def move_to_new_directory
  return unless old_cellar.exist?

  if new_cellar.exist?
    conflicted = remove_conflicts(old_cellar)
    odie "Remove #{new_cellar} and #{old_cellar} manually and run `brew reinstall #{newname}`." if conflicted
  end

  oh1 "Moving #{Formatter.identifier(oldname)} versions to #{new_cellar}"
  if new_cellar.exist?
    merge_directory(old_cellar)
  else
    FileUtils.mv(old_cellar, new_cellar)
  end
end

#pinned? ⇒ Boolean

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Boolean)


230
231
232
# File 'migrator.rb', line 230

def pinned?
  @pinned
end

#remove_conflicts(directory) ⇒ Boolean

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Параметры:

  • directory (T.untyped)

Возвращает:

  • (Boolean)


272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'migrator.rb', line 272

def remove_conflicts(directory)
  conflicted = T.let(false, T::Boolean)

  directory.each_child do |c|
    if c.directory? && !c.symlink?
      conflicted ||= remove_conflicts(c)
    else
      next unless (new_cellar/c.relative_path_from(old_cellar)).exist?

      begin
        FileUtils.rm_rf c
      rescue Errno::EACCES
        conflicted = true
        onoe "#{new_cellar/c.basename} already exists."
      end
    end
  end

  conflicted
end

#repin ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# File 'migrator.rb', line 326

def repin
  return unless pinned?

  old_pin_link_record = self.old_pin_link_record
  return unless old_pin_link_record

  # `old_pin_record` is a relative symlink and when we try 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 the relative path from source to destination parent
  # and it assumes no symlinks.
  src_oldname = (old_pin_record.dirname/old_pin_link_record).expand_path
  new_pin_record.make_relative_symlink(src_oldname.sub(oldname, newname))
  old_pin_record.delete
end

#unlink_newname ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



359
360
361
362
363
364
365
# File 'migrator.rb', line 359

def unlink_newname
  oh1 "Temporarily unlinking #{Formatter.identifier(newname)}"
  new_cellar.subdirs.each do |d|
    keg = Keg.new(d)
    keg.unlink(verbose: verbose?)
  end
end

#unlink_oldname ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



350
351
352
353
354
355
356
# File 'migrator.rb', line 350

def unlink_oldname
  oh1 "Unlinking #{Formatter.identifier(oldname)}"
  old_cellar.subdirs.each do |d|
    keg = Keg.new(d)
    keg.unlink(verbose: verbose?)
  end
end

#unlink_oldname_cellar ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Удаляет ссылку Cellar/oldname, если она указывает на newname.



466
467
468
469
470
471
# File 'migrator.rb', line 466

def unlink_oldname_cellar
  if (old_cellar.symlink? && !old_cellar.exist?) ||
     (old_cellar.symlink? && formula.rack.exist? && formula.rack.realpath == old_cellar.realpath)
    old_cellar.unlink
  end
end

#unlink_oldname_opt ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Удаляет ссылку opt/oldname, если она указывает на newname.



443
444
445
446
447
448
449
450
451
452
453
454
455
# File 'migrator.rb', line 443

def unlink_oldname_opt
  new_linked_keg_record = self.new_linked_keg_record
  return unless new_linked_keg_record&.exist?

  old_opt_records.each do |old_opt_record|
    next unless old_opt_record.symlink?
    next unless old_opt_record.exist?
    next if new_linked_keg_record.realpath != old_opt_record.realpath

    old_opt_record.unlink
    old_opt_record.parent.rmdir_if_possible
  end
end

#unlock ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



535
536
537
538
# File 'migrator.rb', line 535

def unlock
  @newname_lock&.unlock
  @oldname_lock&.unlock
end

#update_tabs ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, поскольку он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

После миграции у каждого INSTALL_RECEIPT.json указан неверный путь к формуле, поэтому необходимо обновить INSTALL_RECEIPTs.



433
434
435
436
437
438
439
# File 'migrator.rb', line 433

def update_tabs
  new_tabs = new_cellar.subdirs.map { |d| Keg.new(d).tab }
  new_tabs.each do |tab|
    tab.source["path"] = formula.path.to_s if tab.source["path"]
    tab.write
  end
end

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/Migrator.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API