/
cask.rb
147 lines (129 loc) 路 4.11 KB
/
cask.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
HOMEBREW_CACHE_CASKS = HOMEBREW_CACHE.join('Casks')
class Cask; end
require 'download_strategy'
# transitional, for set_up_taps (see below)
require 'cmd/update'
require 'rubygems'
require 'cask/artifact'
require 'cask/audit'
require 'cask/auditor'
require 'cask/without_source'
require 'cask/checkable'
require 'cask/cli'
require 'cask/caveats'
require 'cask/container'
require 'cask/download'
require 'cask/download_strategy'
require 'cask/dsl'
require 'cask/exceptions'
require 'cask/fetcher'
require 'cask/installer'
require 'cask/link_checker'
require 'cask/locations'
require 'cask/options'
require 'cask/pkg'
require 'cask/pretty_listing'
require 'cask/qualified_cask_name'
require 'cask/scopes'
require 'cask/source'
require 'cask/system_command'
require 'cask/underscore_supporting_uri'
require 'cask/url'
require 'cask/utils'
require 'cask/version'
require 'plist/parser'
class Cask
include Cask::DSL
include Cask::Locations
include Cask::Scopes
include Cask::Options
def self.init
set_up_taps
odebug 'Creating directories'
HOMEBREW_CACHE.mkpath unless HOMEBREW_CACHE.exist?
HOMEBREW_CACHE_CASKS.mkpath unless HOMEBREW_CACHE_CASKS.exist?
unless caskroom.exist?
ohai "We need to make Caskroom for the first time at #{caskroom}"
ohai "We'll set permissions properly so we won't need sudo in the future"
current_user = Etc.getpwuid(Process.euid).name
if caskroom.parent.writable?
system '/bin/mkdir', caskroom
else
toplevel_dir = caskroom
toplevel_dir = toplevel_dir.parent until toplevel_dir.parent.root?
unless toplevel_dir.directory?
# If a toplevel dir such as '/opt' must be created, enforce standard permissions.
# sudo in system is rude.
system '/usr/bin/sudo', '--', '/bin/mkdir', '--', toplevel_dir
system '/usr/bin/sudo', '--', '/bin/chmod', '--', '0775', toplevel_dir
end
# sudo in system is rude.
system '/usr/bin/sudo', '--', '/bin/mkdir', '-p', '--', caskroom
unless caskroom.parent == toplevel_dir
system '/usr/bin/sudo', '--', '/usr/sbin/chown', '-R', '--', "#{current_user}:staff", caskroom.parent
end
end
end
end
def self.set_up_taps
odebug 'Initializing Taps'
return true if Cask.default_tap.match(%r{test[^/]*\Z})
# transitional: help with Homebrew's move of Tap dirs, Apr 2014
minimum_homebrew_version = '0.9.5'
unless Gem::Version.new(HOMEBREW_VERSION) >= Gem::Version.new(minimum_homebrew_version)
raise CaskError.new <<-EOS.undent
Minimum Homebrew version '#{minimum_homebrew_version}' required.
(Homebrew version #{HOMEBREW_VERSION} was detected.)
Try running "brew update".
EOS
end
begin
Homebrew.send(:rename_taps_dir_if_necessary)
rescue StandardError
opoo %q{Trouble with automatic Tap migration. You may need to run "brew update && brew upgrade brew-cask"}
end
# transitional: help with our own move to new GitHub project, May 2014
legacy_user = 'phinze'
new_user = 'caskroom'
repo = 'cask'
legacy_tap = HOMEBREW_LIBRARY/"Taps/#{legacy_user}/homebrew-#{repo}"
new_tap = HOMEBREW_LIBRARY/"Taps/#{new_user}/homebrew-#{repo}"
if legacy_tap.directory?
ohai 'Removing legacy Tap'
files = []
legacy_tap.find_formula { |file| files << file }
Homebrew.unlink_tap_formula(files)
legacy_tap.rmtree
legacy_tap.dirname.rmdir_if_possible
end
unless new_tap.directory?
ohai 'Adding caskroom Tap'
Homebrew.install_tap(new_user, repo)
end
end
def self.load(query)
odebug 'Loading Cask definitions'
cask = Cask::Source.for_query(query).load
odumpcask cask
cask
end
def self.title
self.name.gsub(/([a-zA-Z\d])([A-Z])/,'\1-\2').gsub(/([a-zA-Z\d])([A-Z])/,'\1-\2').downcase
end
attr_reader :title
def initialize(title=self.class.title)
@title = title
end
def caskroom_path
self.class.caskroom.join(title)
end
def destination_path
caskroom_path.join(version)
end
def installed?
destination_path.exist?
end
def to_s
@title
end
end