Class: Cask::Migrator

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(old_cask, new_cask) ⇒ void

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)

Returns the value of attribute new_cask.



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

def new_cask
  @new_cask
end

#old_caskObject (readonly)

Returns the value of attribute old_cask.



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 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 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 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