lyp 0.3.7 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/lilypond +4 -2
- data/lib/lyp/cli.rb +39 -31
- data/lib/lyp/lilypond.rb +106 -104
- data/lib/lyp/package.rb +88 -85
- data/lib/lyp/resolver.rb +487 -445
- data/lib/lyp/version.rb +1 -1
- data/lib/lyp/wrapper.rb +6 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7da1232df992cc03f2e059a9bc2b5f0c62ce567e
|
4
|
+
data.tar.gz: 3d39b6fa1cde695641532f14f9bdef006c891dfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a52d51cab0e4055d0880fed425c5227c5548fc173acedbd17b9b847b375bcb39ca56f728853db9b91d50d3996609199fd630ab7fce548adb2268503fa2d9f02
|
7
|
+
data.tar.gz: 91ef6fa48d124b7ea7c7d6c6cb971d825e9246bcf50096524d82b26fce7e091788bd4c43327e8fe4c7c4de96c0c8fe3649390112ba6fc00037c92d46ef1b6048
|
data/bin/lilypond
CHANGED
@@ -19,10 +19,12 @@ OVERRIDING_LILYPOND_SWITCHES = %w{
|
|
19
19
|
scheme-sandbox
|
20
20
|
}
|
21
21
|
LILYPOND_HELP_SWITCHES = %w{
|
22
|
-
-h --help
|
22
|
+
-h --help -dhelp
|
23
23
|
}
|
24
|
+
|
24
25
|
LYP_LY_HELP = <<EOF
|
25
26
|
Lyp-provided options:
|
27
|
+
-c, --cropped crop output (requires setting 0 margins)
|
26
28
|
-E, --env use version specified in $LILYPOND_VERSION
|
27
29
|
-n, --install install the specified version if not found
|
28
30
|
-O, --open open the target file after compilation
|
@@ -39,7 +41,7 @@ when nil, *OVERRIDING_LILYPOND_SWITCHES
|
|
39
41
|
when *LILYPOND_HELP_SWITCHES
|
40
42
|
STDERR.puts "Lyp version #{Lyp::VERSION}"
|
41
43
|
puts `#{$lilypond_path} #{$argv.join(' ')}`
|
42
|
-
puts LYP_LY_HELP
|
44
|
+
puts LYP_LY_HELP unless $argv.first == '-dhelp'
|
43
45
|
else
|
44
46
|
begin
|
45
47
|
Lyp::Lilypond.compile($argv, $options)
|
data/lib/lyp/cli.rb
CHANGED
@@ -46,30 +46,30 @@ class Lyp::CLI < Thor
|
|
46
46
|
map "-v" => :version
|
47
47
|
check_unknown_options! :except => :compile
|
48
48
|
class_option :verbose, aliases: '-V', :type => :boolean, desc: 'show verbose output'
|
49
|
-
|
49
|
+
|
50
50
|
desc "version", "show Lyp version"
|
51
51
|
def version
|
52
52
|
$stderr.puts "Lyp #{Lyp::VERSION}"
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
desc "search [PATTERN|lilypond]", "List available packages matching PATTERN or versions of lilypond"
|
56
56
|
def search(pattern = '')
|
57
57
|
$cmd_options = options
|
58
58
|
|
59
59
|
pattern =~ Lyp::PACKAGE_RE
|
60
60
|
package, version = $1, $2
|
61
|
-
|
61
|
+
|
62
62
|
if package == 'lilypond'
|
63
63
|
search_lilypond(version)
|
64
64
|
else
|
65
65
|
search_package(pattern)
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
no_commands do
|
70
70
|
def search_lilypond(version)
|
71
71
|
versions = Lyp::Lilypond.search(version)
|
72
|
-
|
72
|
+
|
73
73
|
if versions.empty?
|
74
74
|
puts "\nNo available versions of lilypond@#{version} found\n\n"
|
75
75
|
else
|
@@ -81,9 +81,9 @@ class Lyp::CLI < Thor
|
|
81
81
|
puts "\n * Currently installed\n\n"
|
82
82
|
end
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
PACKAGE_FMT = "%-16s => %s"
|
86
|
-
|
86
|
+
|
87
87
|
def search_package(pattern)
|
88
88
|
packages = Lyp::Package.list_lyp_index(pattern)
|
89
89
|
if packages.empty?
|
@@ -109,7 +109,7 @@ class Lyp::CLI < Thor
|
|
109
109
|
Lyp::System.test_installed_status!
|
110
110
|
Lyp::Lilypond.compile(argv, opts)
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
desc "test [<option>...] [.|PATTERN]", "Runs package tests on installed packages or local directory"
|
114
114
|
method_option :install, aliases: '-n', type: :boolean, desc: 'Install the requested version of lilypond if not present'
|
115
115
|
method_option :env, aliases: '-E', type: :boolean, desc: 'Use version set by LILYPOND_VERSION environment variable'
|
@@ -124,7 +124,7 @@ class Lyp::CLI < Thor
|
|
124
124
|
end
|
125
125
|
options[:use] = ENV['LILYPOND_VERSION']
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
if options[:use]
|
129
129
|
if options[:install]
|
130
130
|
Lyp::Lilypond.install_if_missing(options[:use], no_version_test: true)
|
@@ -134,7 +134,7 @@ class Lyp::CLI < Thor
|
|
134
134
|
|
135
135
|
# check lilypond default / current settings
|
136
136
|
Lyp::Lilypond.check_lilypond!
|
137
|
-
|
137
|
+
|
138
138
|
$stderr.puts "Lyp #{Lyp::VERSION}"
|
139
139
|
case args
|
140
140
|
when ['.']
|
@@ -151,7 +151,7 @@ class Lyp::CLI < Thor
|
|
151
151
|
$cmd_options = options
|
152
152
|
|
153
153
|
raise "No package specified" if args.empty?
|
154
|
-
|
154
|
+
|
155
155
|
args.each do |package|
|
156
156
|
case package
|
157
157
|
when 'self'
|
@@ -187,7 +187,7 @@ class Lyp::CLI < Thor
|
|
187
187
|
end
|
188
188
|
end
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
desc "use [lilypond@]<VERSION>", "Switch version of lilypond"
|
192
192
|
method_option :default, aliases: '-d', type: :boolean, desc: 'Set default lilypond version'
|
193
193
|
def use(version)
|
@@ -198,7 +198,7 @@ class Lyp::CLI < Thor
|
|
198
198
|
if version =~ Lyp::LILYPOND_RE
|
199
199
|
version = $1
|
200
200
|
end
|
201
|
-
|
201
|
+
|
202
202
|
lilypond = Lyp::Lilypond.use(version, options)
|
203
203
|
puts "Using lilypond version #{lilypond[:version]}"
|
204
204
|
end
|
@@ -227,11 +227,11 @@ class Lyp::CLI < Thor
|
|
227
227
|
return puts "\nNo packages are currently installed\n\n"
|
228
228
|
end
|
229
229
|
end
|
230
|
-
|
230
|
+
|
231
231
|
by_package = list.inject({}) do |m, p|
|
232
232
|
p =~ Lyp::PACKAGE_RE; (m[$1] ||= []) << $2; m
|
233
233
|
end
|
234
|
-
|
234
|
+
|
235
235
|
puts "\nInstalled packages:\n\n"
|
236
236
|
by_package.keys.sort.each do |p|
|
237
237
|
puts " #{p} => (#{by_package[p].sort.join(', ')})"
|
@@ -239,7 +239,7 @@ class Lyp::CLI < Thor
|
|
239
239
|
puts "\n\n"
|
240
240
|
end
|
241
241
|
end
|
242
|
-
|
242
|
+
|
243
243
|
desc "which [PATTERN|lilypond]", "List locations of installed packages matching PATTERN or versions of lilypond"
|
244
244
|
def which(pattern = nil)
|
245
245
|
$cmd_options = options
|
@@ -257,37 +257,46 @@ class Lyp::CLI < Thor
|
|
257
257
|
Lyp::Package.which(args.first).each {|p| puts p}
|
258
258
|
end
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
desc "deps FILE", "Lists dependencies found in user's files"
|
262
262
|
def deps(fn)
|
263
263
|
$cmd_options = options
|
264
264
|
|
265
|
-
resolver = Lyp::
|
266
|
-
tree = resolver.
|
267
|
-
tree
|
268
|
-
versions =
|
265
|
+
resolver = Lyp::DependencyResolver.new(fn)
|
266
|
+
tree = resolver.compile_dependency_tree(ignore_missing: true)
|
267
|
+
tree.dependencies.each do |package, spec|
|
268
|
+
versions = spec.versions.keys.map {|k| k =~ Lyp::PACKAGE_RE; $2 }.sort
|
269
269
|
if versions.empty?
|
270
|
-
puts " #{
|
270
|
+
puts " #{spec.clause} => (no local version found)"
|
271
271
|
else
|
272
|
-
puts " #{
|
272
|
+
puts " #{spec.clause} => #{versions.join(', ')}"
|
273
273
|
end
|
274
274
|
end
|
275
275
|
end
|
276
|
-
|
276
|
+
|
277
277
|
desc "resolve FILE", "Resolves and installs missing dependencies found in user's files"
|
278
278
|
method_option :all, aliases: '-a', type: :boolean, desc: 'Install all found dependencies'
|
279
279
|
def resolve(fn)
|
280
280
|
$cmd_options = options
|
281
281
|
|
282
|
-
resolver = Lyp::
|
283
|
-
tree = resolver.
|
284
|
-
tree
|
285
|
-
if options[:all] ||
|
286
|
-
Lyp::Package.install(
|
282
|
+
resolver = Lyp::DependencyResolver.new(fn)
|
283
|
+
tree = resolver.compile_dependency_tree(ignore_missing: true)
|
284
|
+
tree.dependencies.each do |package, spec|
|
285
|
+
if options[:all] || spec.versions.empty?
|
286
|
+
Lyp::Package.install(spec.clause)
|
287
287
|
end
|
288
288
|
end
|
289
289
|
end
|
290
|
-
|
290
|
+
|
291
|
+
desc "cleanup", "Cleanup temporary files"
|
292
|
+
def cleanup
|
293
|
+
$stderr.puts "Lyp #{Lyp::VERSION}"
|
294
|
+
Dir["#{Lyp::TMP_ROOT}/*"].each do |fn|
|
295
|
+
puts "Cleaning up #{fn}"
|
296
|
+
FileUtils.rm_rf(fn)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
291
300
|
def self.run
|
292
301
|
start(ARGV)
|
293
302
|
rescue => e
|
@@ -296,4 +305,3 @@ class Lyp::CLI < Thor
|
|
296
305
|
exit(1)
|
297
306
|
end
|
298
307
|
end
|
299
|
-
|
data/lib/lyp/lilypond.rb
CHANGED
@@ -32,6 +32,8 @@ module Lyp::Lilypond
|
|
32
32
|
options[:install] = true
|
33
33
|
when '-O', '--open'
|
34
34
|
options[:open] = true
|
35
|
+
when '-c', '--cropped'
|
36
|
+
argv_clean += ['-dbackend=eps', '-daux-files=#f']
|
35
37
|
else
|
36
38
|
argv_clean << arg
|
37
39
|
end
|
@@ -39,7 +41,7 @@ module Lyp::Lilypond
|
|
39
41
|
|
40
42
|
[options, argv_clean]
|
41
43
|
end
|
42
|
-
|
44
|
+
|
43
45
|
def select_lilypond_version(opts)
|
44
46
|
if opts[:use_version]
|
45
47
|
if opts[:install]
|
@@ -58,19 +60,19 @@ module Lyp::Lilypond
|
|
58
60
|
STDERR.puts e.message
|
59
61
|
exit 1
|
60
62
|
end
|
61
|
-
|
63
|
+
|
62
64
|
def compile(argv, opts = {})
|
63
65
|
unless argv.last == '-'
|
64
66
|
fn = Lyp.wrap(argv.pop, opts)
|
65
67
|
argv << fn
|
66
68
|
end
|
67
|
-
|
69
|
+
|
68
70
|
invoke(argv, opts)
|
69
71
|
end
|
70
|
-
|
72
|
+
|
71
73
|
def invoke(argv, opts = {})
|
72
74
|
lilypond = current_lilypond
|
73
|
-
|
75
|
+
|
74
76
|
case opts[:mode]
|
75
77
|
when :system
|
76
78
|
system("#{lilypond} #{argv.join(" ")}")
|
@@ -78,30 +80,30 @@ module Lyp::Lilypond
|
|
78
80
|
Kernel.exec(lilypond, *argv)
|
79
81
|
end
|
80
82
|
end
|
81
|
-
|
83
|
+
|
82
84
|
def default_lilypond
|
83
85
|
Lyp::Settings['lilypond/default']
|
84
86
|
end
|
85
|
-
|
87
|
+
|
86
88
|
def set_default_lilypond(path)
|
87
89
|
Lyp::Settings['lilypond/default'] = path
|
88
90
|
end
|
89
|
-
|
90
|
-
# The current lilypond path is stored in a temporary file named by the
|
91
|
+
|
92
|
+
# The current lilypond path is stored in a temporary file named by the
|
91
93
|
# session id. Thus we can persist the version selected by the user
|
92
94
|
def current_lilypond
|
93
95
|
return forced_lilypond if @forced_version
|
94
|
-
|
96
|
+
|
95
97
|
settings = get_session_settings
|
96
98
|
|
97
99
|
if !settings[:current]
|
98
100
|
settings[:current] = default_lilypond
|
99
101
|
set_session_settings(settings)
|
100
102
|
end
|
101
|
-
|
103
|
+
|
102
104
|
settings[:current]
|
103
105
|
end
|
104
|
-
|
106
|
+
|
105
107
|
def current_lilypond_version
|
106
108
|
path = current_lilypond
|
107
109
|
version = File.basename(File.expand_path("#{File.dirname(path)}/../.."))
|
@@ -114,13 +116,13 @@ module Lyp::Lilypond
|
|
114
116
|
end
|
115
117
|
version
|
116
118
|
end
|
117
|
-
|
119
|
+
|
118
120
|
def set_current_lilypond(path)
|
119
121
|
settings = get_session_settings
|
120
122
|
settings[:current] = path
|
121
123
|
set_session_settings(settings)
|
122
124
|
end
|
123
|
-
|
125
|
+
|
124
126
|
def forced_lilypond
|
125
127
|
lilypond = filter_installed_list(@forced_version)[0]
|
126
128
|
if lilypond
|
@@ -129,32 +131,32 @@ module Lyp::Lilypond
|
|
129
131
|
raise "No installed version found matching '#{@forced_version}'"
|
130
132
|
end
|
131
133
|
end
|
132
|
-
|
134
|
+
|
133
135
|
def force_env_version!
|
134
136
|
@forced_version = ENV['LILYPOND_VERSION']
|
135
137
|
unless @forced_version
|
136
138
|
raise "LILYPOND_VERSION not set"
|
137
139
|
end
|
138
140
|
end
|
139
|
-
|
141
|
+
|
140
142
|
def force_version!(version)
|
141
143
|
@forced_version = version
|
142
144
|
end
|
143
|
-
|
145
|
+
|
144
146
|
attr_reader :forced_version
|
145
|
-
|
147
|
+
|
146
148
|
def check_lilypond!
|
147
149
|
path = default_lilypond
|
148
150
|
select_default_lilypond! unless path && path =~ /lilypond$/
|
149
|
-
|
151
|
+
|
150
152
|
path = current_lilypond
|
151
153
|
set_current_lilypond(default_lilypond) unless path && path =~ /lilypond$/
|
152
154
|
end
|
153
|
-
|
155
|
+
|
154
156
|
def valid_lilypond?(path)
|
155
157
|
(File.file?(path) rescue nil) && (`#{path} -v` =~ /^GNU LilyPond/)
|
156
158
|
end
|
157
|
-
|
159
|
+
|
158
160
|
def select_default_lilypond!
|
159
161
|
latest = system_lilyponds.sort(&CMP_VERSION).last || lyp_lilyponds.sort(&CMP_VERSION).last
|
160
162
|
if latest
|
@@ -164,34 +166,34 @@ module Lyp::Lilypond
|
|
164
166
|
raise Lyp::LILYPOND_NOT_FOUND_MSG
|
165
167
|
end
|
166
168
|
end
|
167
|
-
|
169
|
+
|
168
170
|
def get_session_settings
|
169
171
|
YAML.load(IO.read(session_settings_filename)) rescue {}
|
170
172
|
end
|
171
|
-
|
173
|
+
|
172
174
|
def set_session_settings(settings)
|
173
175
|
File.open(session_settings_filename, 'w+') do |f|
|
174
176
|
f << YAML.dump(settings)
|
175
177
|
end
|
176
178
|
end
|
177
|
-
|
179
|
+
|
178
180
|
def session_settings_filename
|
179
181
|
"#{Lyp::TMP_ROOT}/session.#{Process.getsid}.yml"
|
180
182
|
end
|
181
|
-
|
183
|
+
|
182
184
|
CMP_VERSION = proc do |x, y|
|
183
185
|
Gem::Version.new(x[:version]) <=> Gem::Version.new(y[:version])
|
184
186
|
end
|
185
|
-
|
187
|
+
|
186
188
|
def filter_installed_list(version_specifier)
|
187
189
|
list = (system_lilyponds + lyp_lilyponds).sort!(&CMP_VERSION)
|
188
190
|
list.select {|l| version_match(l[:version], version_specifier, list)}
|
189
191
|
end
|
190
|
-
|
192
|
+
|
191
193
|
def list(opts = {})
|
192
194
|
system_list = opts[:lyp_only] ? [] : system_lilyponds
|
193
195
|
lyp_list = opts[:system_only] ? [] : lyp_lilyponds
|
194
|
-
|
196
|
+
|
195
197
|
default = default_lilypond
|
196
198
|
unless default
|
197
199
|
latest = system_list.sort(&CMP_VERSION).last || lyp_list.sort(&CMP_VERSION).last
|
@@ -201,24 +203,24 @@ module Lyp::Lilypond
|
|
201
203
|
end
|
202
204
|
end
|
203
205
|
current = current_lilypond
|
204
|
-
|
206
|
+
|
205
207
|
lilyponds = system_list + lyp_list
|
206
208
|
|
207
209
|
lilyponds.each do |l|
|
208
210
|
l[:default] = l[:path] == default
|
209
211
|
l[:current] = l[:path] == current
|
210
212
|
end
|
211
|
-
|
213
|
+
|
212
214
|
# sort by version
|
213
215
|
lilyponds.sort!(&CMP_VERSION)
|
214
216
|
end
|
215
|
-
|
217
|
+
|
216
218
|
def lyp_lilyponds
|
217
219
|
list = []
|
218
|
-
|
220
|
+
|
219
221
|
Dir["#{Lyp.lilyponds_dir}/*"].each do |path|
|
220
222
|
next unless File.directory?(path) && File.basename(path) =~ /^[\d\.]+$/
|
221
|
-
|
223
|
+
|
222
224
|
root_path = path
|
223
225
|
version = File.basename(path)
|
224
226
|
path = File.join(path, "bin/lilypond")
|
@@ -229,14 +231,14 @@ module Lyp::Lilypond
|
|
229
231
|
version: version
|
230
232
|
}
|
231
233
|
end
|
232
|
-
|
234
|
+
|
233
235
|
list
|
234
236
|
end
|
235
|
-
|
237
|
+
|
236
238
|
def system_lilyponds
|
237
239
|
list = get_system_lilyponds_paths
|
238
240
|
return list if list.empty?
|
239
|
-
|
241
|
+
|
240
242
|
list.inject([]) do |m, path|
|
241
243
|
begin
|
242
244
|
resp = `#{path} #{Lyp::DETECT_SYSTEM_LILYPOND_FILENAME} 2>/dev/null`
|
@@ -257,32 +259,32 @@ module Lyp::Lilypond
|
|
257
259
|
m
|
258
260
|
end
|
259
261
|
end
|
260
|
-
|
262
|
+
|
261
263
|
def get_system_lilyponds_paths
|
262
264
|
self_bin_dir = File.dirname(File.expand_path($0))
|
263
|
-
|
265
|
+
|
264
266
|
list = `which -a lilypond`
|
265
267
|
list = list.lines.map {|f| f.chomp}.uniq.reject do |l|
|
266
268
|
dir = File.dirname(l)
|
267
269
|
(dir == Gem.bindir) || (dir == Lyp::LYP_BIN_DIRECTORY) || (dir == self_bin_dir)
|
268
270
|
end
|
269
271
|
end
|
270
|
-
|
272
|
+
|
271
273
|
BASE_URL = "http://download.linuxaudio.org/lilypond/binaries"
|
272
|
-
|
274
|
+
|
273
275
|
# Returns a list of versions of lilyponds available for download
|
274
276
|
def search(version_specifier = nil)
|
275
277
|
require 'open-uri'
|
276
278
|
|
277
279
|
platform = detect_lilypond_platform
|
278
280
|
url = "#{BASE_URL}/#{platform}/"
|
279
|
-
|
281
|
+
|
280
282
|
versions = []
|
281
|
-
|
282
|
-
open(url).read.scan(/a href=\"lilypond-([0-9\.]+)[^>]+\"/) do |m|
|
283
|
+
|
284
|
+
open(url).read.scan(/a href=\"lilypond-([0-9\.]+)[^>]+\"/) do |m|
|
283
285
|
versions << $1
|
284
286
|
end
|
285
|
-
|
287
|
+
|
286
288
|
installed_versions = list.map {|l| l[:version]}
|
287
289
|
versions.select! {|v| version_match(v, version_specifier, versions)}
|
288
290
|
versions.map do |v|
|
@@ -292,7 +294,7 @@ module Lyp::Lilypond
|
|
292
294
|
}
|
293
295
|
end
|
294
296
|
end
|
295
|
-
|
297
|
+
|
296
298
|
def version_match(version, specifier, all_versions)
|
297
299
|
case specifier
|
298
300
|
when 'latest'
|
@@ -305,29 +307,29 @@ module Lyp::Lilypond
|
|
305
307
|
Gem::Requirement.new(specifier) =~ Gem::Version.new(version)
|
306
308
|
end
|
307
309
|
end
|
308
|
-
|
310
|
+
|
309
311
|
def latest_stable_version
|
310
312
|
search.reverse.find {|l| Gem::Version.new(l[:version]).segments[1].even?}[:version]
|
311
313
|
end
|
312
|
-
|
314
|
+
|
313
315
|
def latest_unstable_version
|
314
316
|
search.reverse.find {|l| Gem::Version.new(l[:version]).segments[1].odd?}[:version]
|
315
317
|
end
|
316
|
-
|
318
|
+
|
317
319
|
def latest_version
|
318
320
|
search.last[:version]
|
319
321
|
end
|
320
|
-
|
322
|
+
|
321
323
|
def install_if_missing(version_specifier, opts = {})
|
322
324
|
if filter_installed_list(version_specifier).empty?
|
323
325
|
install(version_specifier, opts)
|
324
326
|
end
|
325
327
|
end
|
326
|
-
|
328
|
+
|
327
329
|
def install(version_specifier, opts = {})
|
328
330
|
version = detect_version_from_specifier(version_specifier)
|
329
331
|
raise "No version found matching specifier #{version_specifier}" unless version
|
330
|
-
|
332
|
+
|
331
333
|
STDERR.puts "Installing version #{version}" unless opts[:silent]
|
332
334
|
install_version(version, opts)
|
333
335
|
|
@@ -335,11 +337,11 @@ module Lyp::Lilypond
|
|
335
337
|
set_current_lilypond(lilypond_path)
|
336
338
|
set_default_lilypond(lilypond_path) if opts[:default]
|
337
339
|
end
|
338
|
-
|
340
|
+
|
339
341
|
def lyp_lilypond_path(version)
|
340
342
|
"#{Lyp.lilyponds_dir}/#{version}/bin/lilypond"
|
341
343
|
end
|
342
|
-
|
344
|
+
|
343
345
|
def detect_version_from_specifier(version_specifier)
|
344
346
|
case version_specifier
|
345
347
|
when /^\d/
|
@@ -360,7 +362,7 @@ module Lyp::Lilypond
|
|
360
362
|
end
|
361
363
|
end
|
362
364
|
end
|
363
|
-
|
365
|
+
|
364
366
|
def detect_lilypond_platform
|
365
367
|
case RUBY_PLATFORM
|
366
368
|
when /x86_64-darwin/
|
@@ -377,7 +379,7 @@ module Lyp::Lilypond
|
|
377
379
|
"mingw"
|
378
380
|
end
|
379
381
|
end
|
380
|
-
|
382
|
+
|
381
383
|
def install_version(version, opts)
|
382
384
|
platform = detect_lilypond_platform
|
383
385
|
url = lilypond_install_url(platform, version, opts)
|
@@ -385,7 +387,7 @@ module Lyp::Lilypond
|
|
385
387
|
|
386
388
|
download_lilypond(url, fn, opts) unless File.file?(fn)
|
387
389
|
install_lilypond_files(fn, platform, version, opts)
|
388
|
-
|
390
|
+
|
389
391
|
patch_font_scm(version)
|
390
392
|
copy_fonts_from_all_packages(version, opts)
|
391
393
|
end
|
@@ -400,15 +402,15 @@ module Lyp::Lilypond
|
|
400
402
|
".exe"
|
401
403
|
end
|
402
404
|
filename = "lilypond-#{version}-1.#{platform}"
|
403
|
-
|
405
|
+
|
404
406
|
"#{BASE_URL}/#{platform}/#{filename}#{ext}"
|
405
407
|
end
|
406
|
-
|
408
|
+
|
407
409
|
def temp_install_filename(url)
|
408
410
|
u = URI(url)
|
409
411
|
"#{Lyp::TMP_ROOT}/#{File.basename(u.path)}"
|
410
412
|
end
|
411
|
-
|
413
|
+
|
412
414
|
def download_lilypond(url, fn, opts)
|
413
415
|
require 'httpclient'
|
414
416
|
|
@@ -435,7 +437,7 @@ module Lyp::Lilypond
|
|
435
437
|
end
|
436
438
|
pbar.finish unless opts[:silent]
|
437
439
|
end
|
438
|
-
|
440
|
+
|
439
441
|
def install_lilypond_files(fn, platform, version, opts)
|
440
442
|
tmp_target = "#{Lyp::TMP_ROOT}/lilypond-#{version}"
|
441
443
|
FileUtils.mkdir_p(tmp_target)
|
@@ -448,19 +450,19 @@ module Lyp::Lilypond
|
|
448
450
|
when /mingw/
|
449
451
|
install_lilypond_files_windows(fn, tmp_target, platform, version, opts)
|
450
452
|
end
|
451
|
-
|
453
|
+
|
452
454
|
ensure
|
453
455
|
FileUtils.rm_rf(tmp_target)
|
454
456
|
end
|
455
|
-
|
457
|
+
|
456
458
|
def install_lilypond_files_osx(fn, target, platform, version, opts)
|
457
459
|
STDERR.puts "Extracting..." unless opts[:silent]
|
458
460
|
exec "tar -xjf #{fn} -C #{target}"
|
459
|
-
|
461
|
+
|
460
462
|
copy_lilypond_files("#{target}/LilyPond.app/Contents/Resources", version, opts)
|
461
463
|
end
|
462
|
-
|
463
|
-
# Since linux versions are distributed as sh archives, we need first to
|
464
|
+
|
465
|
+
# Since linux versions are distributed as sh archives, we need first to
|
464
466
|
# extract the sh archive, then extract the resulting tar file
|
465
467
|
def install_lilypond_files_linux(fn, target, platform, version, opts)
|
466
468
|
STDERR.puts "Extracting..." unless opts[:silent]
|
@@ -468,30 +470,30 @@ module Lyp::Lilypond
|
|
468
470
|
# create temp directory in which to extract .sh file
|
469
471
|
tmp_dir = "#{Lyp::TMP_ROOT}/#{Time.now.to_f}"
|
470
472
|
FileUtils.mkdir_p(tmp_dir)
|
471
|
-
|
473
|
+
|
472
474
|
FileUtils.cd(tmp_dir) do
|
473
475
|
exec "sh #{fn} --tarball >/dev/null"
|
474
476
|
end
|
475
|
-
|
477
|
+
|
476
478
|
tmp_fn = "#{tmp_dir}/lilypond-#{version}-1.#{platform}.tar.bz2"
|
477
|
-
|
479
|
+
|
478
480
|
exec "tar -xjf #{tmp_fn} -C #{target}"
|
479
|
-
|
481
|
+
|
480
482
|
copy_lilypond_files("#{target}/usr", version, opts)
|
481
483
|
ensure
|
482
484
|
FileUtils.rm_rf(tmp_dir)
|
483
485
|
end
|
484
|
-
|
486
|
+
|
485
487
|
def install_lilypond_files_windows(fn, target, platform, version, opts)
|
486
488
|
STDERR.puts "Running NSIS Installer..." unless opts[:silent]
|
487
|
-
|
489
|
+
|
488
490
|
target_dir = File.join(Lyp.lilyponds_dir, version)
|
489
491
|
FileUtils.mkdir_p(target_dir)
|
490
|
-
|
492
|
+
|
491
493
|
# run installer
|
492
494
|
cmd = "#{fn} /S /D=#{target_dir.gsub('/', '\\')}"
|
493
495
|
`#{cmd}`
|
494
|
-
|
496
|
+
|
495
497
|
# wait for installer to finish
|
496
498
|
t1 = Time.now
|
497
499
|
while !File.file?("#{target_dir}/usr/bin/lilypond.exe")
|
@@ -505,44 +507,44 @@ module Lyp::Lilypond
|
|
505
507
|
|
506
508
|
def copy_lilypond_files(base_path, version, opts)
|
507
509
|
target_dir = File.join(Lyp.lilyponds_dir, version)
|
508
|
-
|
510
|
+
|
509
511
|
FileUtils.rm_rf(target_dir) if File.exists?(target_dir)
|
510
|
-
|
512
|
+
|
511
513
|
# create directory for lilypond files
|
512
514
|
FileUtils.mkdir_p(target_dir)
|
513
|
-
|
515
|
+
|
514
516
|
# copy files
|
515
517
|
STDERR.puts "Copying..." unless opts[:silent]
|
516
518
|
%w{bin etc lib lib64 share var}.each do |entry|
|
517
519
|
dir = File.join(base_path, entry)
|
518
520
|
FileUtils.cp_r(dir, target_dir, remove_destination: true) if File.directory?(dir)
|
519
521
|
end
|
520
|
-
|
522
|
+
|
521
523
|
# Show lilypond versions
|
522
524
|
STDERR.puts `#{target_dir}/bin/lilypond -v` unless opts[:silent] || opts[:no_version_test]
|
523
525
|
rescue => e
|
524
526
|
puts e.message
|
525
527
|
end
|
526
|
-
|
528
|
+
|
527
529
|
def patch_font_scm(version)
|
528
530
|
return unless Lyp::FONT_PATCH_REQ =~ Gem::Version.new(version)
|
529
|
-
|
531
|
+
|
530
532
|
target_fn = File.join(lyp_lilypond_share_dir(version), 'lilypond/current/scm/font.scm')
|
531
533
|
FileUtils.cp(Lyp::FONT_PATCH_FILENAME, target_fn)
|
532
534
|
end
|
533
535
|
|
534
536
|
SYSTEM_LILYPOND_PATCH_WARNING = <<-EOF.gsub(/^\s{6}/, '').chomp
|
535
|
-
The system-installed lilypond version %s needs to be patched in
|
537
|
+
The system-installed lilypond version %s needs to be patched in
|
536
538
|
order to support custom music fonts. This operation will replace the file
|
537
|
-
|
539
|
+
|
538
540
|
%s
|
539
|
-
|
540
|
-
Would you like to overwrite this file? (y/n):
|
541
|
+
|
542
|
+
Would you like to overwrite this file? (y/n):
|
541
543
|
EOF
|
542
|
-
|
544
|
+
|
543
545
|
def patch_system_lilypond_font_scm(lilypond, opts)
|
544
546
|
return false unless Lyp::FONT_PATCH_REQ =~ Gem::Version.new(lilypond[:version])
|
545
|
-
|
547
|
+
|
546
548
|
target_fn = File.join(lilypond[:data_path], '/scm/font.scm')
|
547
549
|
# do nothing if alredy patched
|
548
550
|
if IO.read(target_fn) == IO.read(Lyp::FONT_PATCH_FILENAME)
|
@@ -551,7 +553,7 @@ module Lyp::Lilypond
|
|
551
553
|
|
552
554
|
prompt = SYSTEM_LILYPOND_PATCH_WARNING % [lilypond[:version], target_fn]
|
553
555
|
return unless Lyp.confirm_action(prompt)
|
554
|
-
|
556
|
+
|
555
557
|
puts "Patching #{target_fn}:" unless opts[:silent]
|
556
558
|
if File.writeable?(target_fn)
|
557
559
|
FileUtils.cp(target_fn, "#{target_fn}.old")
|
@@ -561,38 +563,38 @@ module Lyp::Lilypond
|
|
561
563
|
Lyp.sudo_cp(Lyp::FONT_PATCH_FILENAME, target_fn)
|
562
564
|
end
|
563
565
|
end
|
564
|
-
|
566
|
+
|
565
567
|
def copy_fonts_from_all_packages(version, opts)
|
566
568
|
return unless Lyp::FONT_COPY_REQ =~ Gem::Version.new(version)
|
567
|
-
|
569
|
+
|
568
570
|
ly_fonts_dir = File.join(lyp_lilypond_share_dir(version), 'lilypond/current/fonts')
|
569
|
-
|
571
|
+
|
570
572
|
Dir["#{Lyp.packages_dir}/**/fonts"].each do |package_fonts_dir|
|
571
573
|
|
572
574
|
Dir["#{package_fonts_dir}/*.otf"].each do |fn|
|
573
575
|
target_fn = File.join(ly_fonts_dir, 'otf', File.basename(fn))
|
574
576
|
FileUtils.cp(fn, target_fn)
|
575
577
|
end
|
576
|
-
|
578
|
+
|
577
579
|
Dir["#{package_fonts_dir}/*.svg"].each do |fn|
|
578
580
|
target_fn = File.join(ly_fonts_dir, 'svg', File.basename(fn))
|
579
581
|
FileUtils.cp(fn, target_fn)
|
580
582
|
end
|
581
|
-
|
583
|
+
|
582
584
|
Dir["#{package_fonts_dir}/*.woff"].each do |fn|
|
583
585
|
target_fn = File.join(ly_fonts_dir, 'svg', File.basename(fn))
|
584
586
|
FileUtils.cp(fn, target_fn)
|
585
587
|
end
|
586
588
|
end
|
587
589
|
end
|
588
|
-
|
590
|
+
|
589
591
|
def lyp_lilypond_share_dir(version)
|
590
592
|
File.join(Lyp.lilyponds_dir, version, 'share')
|
591
593
|
end
|
592
|
-
|
594
|
+
|
593
595
|
def use(version, opts)
|
594
596
|
lilypond_list = list.reverse
|
595
|
-
|
597
|
+
|
596
598
|
case version
|
597
599
|
when 'system'
|
598
600
|
lilypond = lilypond_list.find {|v| v[:system] }
|
@@ -614,17 +616,17 @@ module Lyp::Lilypond
|
|
614
616
|
req = Gem::Requirement.new(version)
|
615
617
|
lilypond = lilypond_list.find {|v| req =~ Gem::Version.new(v[:version])}
|
616
618
|
end
|
617
|
-
|
619
|
+
|
618
620
|
unless lilypond
|
619
621
|
raise "Could not find a lilypond matching \"#{version}\""
|
620
622
|
end
|
621
|
-
|
623
|
+
|
622
624
|
set_current_lilypond(lilypond[:path])
|
623
625
|
set_default_lilypond(lilypond[:path]) if opts[:default]
|
624
|
-
|
626
|
+
|
625
627
|
lilypond
|
626
628
|
end
|
627
|
-
|
629
|
+
|
628
630
|
def uninstall(version_specifier, opts = {})
|
629
631
|
list = list(lyp_only: true)
|
630
632
|
if version_specifier
|
@@ -633,7 +635,7 @@ module Lyp::Lilypond
|
|
633
635
|
# if no version is specified
|
634
636
|
raise "No version specifier given.\nTo uninstall all versions run 'lyp uninstall lilypond -a'.\n"
|
635
637
|
end
|
636
|
-
|
638
|
+
|
637
639
|
if list.empty?
|
638
640
|
if version_specifier
|
639
641
|
raise "No lilypond found matching #{version_specifier}"
|
@@ -641,7 +643,7 @@ module Lyp::Lilypond
|
|
641
643
|
raise "No lilypond found"
|
642
644
|
end
|
643
645
|
end
|
644
|
-
|
646
|
+
|
645
647
|
list.each do |l|
|
646
648
|
puts "Uninstalling lilypond #{l[:version]}" unless opts[:silent]
|
647
649
|
set_current_lilypond(nil) if l[:current]
|
@@ -649,11 +651,11 @@ module Lyp::Lilypond
|
|
649
651
|
uninstall_lilypond_version(l[:root_path])
|
650
652
|
end
|
651
653
|
end
|
652
|
-
|
654
|
+
|
653
655
|
def uninstall_lilypond_version(path)
|
654
656
|
FileUtils.rm_rf(path)
|
655
657
|
end
|
656
|
-
|
658
|
+
|
657
659
|
def exec(cmd, raise_on_failure = true)
|
658
660
|
$_out = ""
|
659
661
|
$_err = ""
|
@@ -669,9 +671,9 @@ module Lyp::Lilypond
|
|
669
671
|
end
|
670
672
|
success
|
671
673
|
end
|
672
|
-
|
674
|
+
|
673
675
|
def parse_error_msg(msg)
|
674
676
|
(msg =~ /[^\n]+: error.+failed files: ".+"/m) ? $& : msg
|
675
677
|
end
|
676
678
|
end
|
677
|
-
end
|
679
|
+
end
|