Class: Cask::Migrator Private

Inherits:
Object show all
Defined in:
cask/migrator.rb

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(old_cask, new_cask) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Raises:



12
13
14
15
16
17
# File 'cask/migrator.rb', line 12

def initialize(old_cask, new_cask)
  raise CaskNotInstalledError, new_cask unless new_cask.installed?

  @old_cask = old_cask
  @new_cask = new_cask
end

Instance Attribute Details

#new_caskObject (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



9
10
11
# File 'cask/migrator.rb', line 9

def new_cask
  @new_cask
end

#old_caskObject (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



9
10
11
# File 'cask/migrator.rb', line 9

def old_cask
  @old_cask
end

Class Method Details

.migrate_if_needed(new_cask, dry_run: false) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:

  • new_cask (Cask)
  • dry_run (Boolean) (defaults to: false)


20
21
22
23
24
25
26
27
28
29
30
31
# File 'cask/migrator.rb', line 20

def self.migrate_if_needed(new_cask, dry_run: false)
  old_tokens = new_cask.old_tokens
  return if old_tokens.empty?

  return unless (installed_caskfile = new_cask.installed_caskfile)

  old_cask = CaskLoader.load(installed_caskfile)
  return if new_cask.token == old_cask.token

  migrator = new(old_cask, new_cask)
  migrator.migrate(dry_run:)
end

.replace_caskfile_token(path, old_token, new_token) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:



72
73
74
75
76
77
78
79
80
81
# File 'cask/migrator.rb', line 72

def self.replace_caskfile_token(path, old_token, new_token)
  case path.extname
  when ".rb"
    ::Utils::Inreplace.inreplace path, /\A\s*cask\s+"#{Regexp.escape(old_token)}"/, "cask #{new_token.inspect}"
  when ".json"
    json = JSON.parse(path.read)
    json["token"] = new_token
    path.atomic_write json.to_json
  end
end

Instance Method Details

#migrate(dry_run: false) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:

  • dry_run (Boolean) (defaults to: false)


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'cask/migrator.rb', line 34

def migrate(dry_run: false)
  old_token = old_cask.token
  new_token = new_cask.token

  old_caskroom_path = old_cask.caskroom_path
  new_caskroom_path = new_cask.caskroom_path

  old_installed_caskfile = old_cask.installed_caskfile.relative_path_from(old_caskroom_path)
  new_installed_caskfile = old_installed_caskfile.dirname/old_installed_caskfile.basename.sub(
    old_token,
    new_token,
  )

  if dry_run
    oh1 "Would migrate cask #{Formatter.identifier(old_token)} to #{Formatter.identifier(new_token)}"

    puts "cp -r #{old_caskroom_path} #{new_caskroom_path}"
    puts "mv #{new_caskroom_path}/#{old_installed_caskfile} #{new_caskroom_path}/#{new_installed_caskfile}"
    puts "rm -r #{old_caskroom_path}"
    puts "ln -s #{new_caskroom_path.basename} #{old_caskroom_path}"
  else
    oh1 "Migrating cask #{Formatter.identifier(old_token)} to #{Formatter.identifier(new_token)}"

    begin
      FileUtils.cp_r old_caskroom_path, new_caskroom_path
      FileUtils.mv new_caskroom_path/old_installed_caskfile, new_caskroom_path/new_installed_caskfile
      self.class.replace_caskfile_token(new_caskroom_path/new_installed_caskfile, old_token, new_token)
    rescue => e
      FileUtils.rm_rf new_caskroom_path
      raise e
    end

    FileUtils.rm_r old_caskroom_path
    FileUtils.ln_s new_caskroom_path.basename, old_caskroom_path
  end
end