fig 0.1.51 → 0.1.52
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.
- data/Changes +93 -0
- data/LICENSE +1 -1
- data/README.md +330 -99
- data/TODO +4 -0
- data/VERSION +1 -1
- data/bin/fig +2 -4
- data/lib/fig/backtrace.rb +3 -1
- data/lib/fig/command.rb +477 -0
- data/lib/fig/environment.rb +76 -23
- data/lib/fig/figrc.rb +2 -2
- data/lib/fig/grammar.treetop +23 -31
- data/lib/fig/{os.rb → operatingsystem.rb} +11 -9
- data/lib/fig/options.rb +424 -202
- data/lib/fig/package.rb +134 -18
- data/lib/fig/packagecache.rb +36 -0
- data/lib/fig/packagedescriptor.rb +46 -0
- data/lib/fig/parser.rb +2 -2
- data/lib/fig/repository.rb +173 -124
- data/lib/fig/retriever.rb +3 -1
- data/lib/fig/statement.rb +18 -0
- data/lib/fig/{package → statement}/archive.rb +3 -4
- data/lib/fig/{package → statement}/command.rb +3 -4
- data/lib/fig/{package → statement}/configuration.rb +18 -6
- data/lib/fig/statement/include.rb +87 -0
- data/lib/fig/{package → statement}/override.rb +3 -4
- data/lib/fig/{package → statement}/path.rb +3 -4
- data/lib/fig/{package → statement}/publish.rb +3 -4
- data/lib/fig/{package → statement}/resource.rb +3 -4
- data/lib/fig/{package → statement}/retrieve.rb +3 -4
- data/lib/fig/{package → statement}/set.rb +3 -4
- metadata +118 -71
- data/lib/fig.rb +0 -288
- data/lib/fig/package/include.rb +0 -32
- data/lib/fig/package/install.rb +0 -22
- data/lib/fig/package/statement.rb +0 -13
data/lib/fig/environment.rb
CHANGED
@@ -2,11 +2,12 @@ require 'stringio'
|
|
2
2
|
|
3
3
|
require 'fig/backtrace'
|
4
4
|
require 'fig/logging'
|
5
|
-
require 'fig/package
|
6
|
-
require 'fig/package/include'
|
7
|
-
require 'fig/package/path'
|
8
|
-
require 'fig/package/set'
|
5
|
+
require 'fig/package'
|
9
6
|
require 'fig/repositoryerror'
|
7
|
+
require 'fig/statement/command'
|
8
|
+
require 'fig/statement/include'
|
9
|
+
require 'fig/statement/path'
|
10
|
+
require 'fig/statement/set'
|
10
11
|
require 'fig/userinputerror'
|
11
12
|
|
12
13
|
module Fig
|
@@ -16,56 +17,73 @@ module Fig
|
|
16
17
|
class Environment
|
17
18
|
DEFAULT_VERSION_NAME = 'current'
|
18
19
|
|
19
|
-
def initialize(
|
20
|
-
@os = os
|
20
|
+
def initialize(repository, variables_override, retriever)
|
21
21
|
@repository = repository
|
22
22
|
@variables = variables_override || get_environment_variables
|
23
23
|
@retrieve_vars = {}
|
24
24
|
@packages = {}
|
25
|
-
@applied_configs = {}
|
26
25
|
@retriever = retriever
|
27
26
|
end
|
28
27
|
|
29
28
|
def get_environment_variables
|
30
29
|
vars = {}
|
31
30
|
ENV.each { |key,value| vars[key]=value }
|
31
|
+
|
32
32
|
return vars
|
33
33
|
end
|
34
34
|
|
35
35
|
# Returns the value of an envirionment variable
|
36
36
|
def [](name)
|
37
|
-
@variables[name]
|
37
|
+
return @variables[name]
|
38
38
|
end
|
39
39
|
|
40
40
|
# Indicates that the values from a particular envrionment variable path
|
41
41
|
def add_retrieve(name, path)
|
42
42
|
@retrieve_vars[name] = path
|
43
|
+
|
44
|
+
return
|
43
45
|
end
|
44
46
|
|
45
47
|
def register_package(package)
|
46
48
|
name = package.package_name
|
47
|
-
|
49
|
+
|
50
|
+
if get_package(name)
|
48
51
|
Logging.fatal %Q<There is already a package with the name "#{name}".>
|
49
52
|
raise RepositoryError.new
|
50
53
|
end
|
54
|
+
|
51
55
|
@packages[name] = package
|
56
|
+
|
57
|
+
return
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_package(package_name)
|
61
|
+
return @packages[package_name]
|
62
|
+
end
|
63
|
+
|
64
|
+
def packages
|
65
|
+
return @packages.values
|
52
66
|
end
|
53
67
|
|
54
68
|
def apply_config(package, config_name, backtrace)
|
55
|
-
if
|
69
|
+
if package.applied_config_names.member?(config_name)
|
56
70
|
return
|
57
71
|
end
|
58
72
|
new_backtrace = backtrace
|
59
73
|
|
60
74
|
config = package[config_name]
|
61
75
|
config.statements.each { |stmt| apply_config_statement(package, stmt, new_backtrace) }
|
62
|
-
|
76
|
+
package.add_applied_config_name(config_name)
|
77
|
+
|
78
|
+
return
|
63
79
|
end
|
64
80
|
|
65
81
|
def execute_shell(command)
|
66
82
|
with_environment do
|
67
83
|
yield command.map{|arg| expand_command_line_argument(arg)}
|
68
84
|
end
|
85
|
+
|
86
|
+
return
|
69
87
|
end
|
70
88
|
|
71
89
|
def execute_command(command, args, package)
|
@@ -77,10 +95,17 @@ module Fig
|
|
77
95
|
|
78
96
|
yield expand_path(argument, package).split(' ')
|
79
97
|
end
|
98
|
+
|
99
|
+
return
|
80
100
|
end
|
81
101
|
|
82
102
|
def find_config_name_in_package(package_name)
|
83
|
-
|
103
|
+
package = get_package(package_name)
|
104
|
+
if not package
|
105
|
+
return Package::DEFAULT_CONFIG
|
106
|
+
end
|
107
|
+
|
108
|
+
return package.primary_config_name || Package::DEFAULT_CONFIG
|
84
109
|
end
|
85
110
|
|
86
111
|
def execute_config(base_package, package_name, config_name, version_name, args, &block)
|
@@ -97,21 +122,25 @@ module Fig
|
|
97
122
|
else
|
98
123
|
raise UserInputError.new(%Q<The "#{package.to_s}" package with the "#{config_name}" configuration does not contain a command.>)
|
99
124
|
end
|
125
|
+
|
126
|
+
return
|
100
127
|
end
|
101
128
|
|
102
129
|
def apply_config_statement(base_package, statement, backtrace)
|
103
130
|
case statement
|
104
|
-
when
|
131
|
+
when Statement::Path
|
105
132
|
append_variable(base_package, statement.name, statement.value)
|
106
|
-
when
|
133
|
+
when Statement::Set
|
107
134
|
set_variable(base_package, statement.name, statement.value)
|
108
|
-
when
|
135
|
+
when Statement::Include
|
109
136
|
include_config(base_package, statement.package_name, statement.config_name, statement.version_name, statement.overrides, backtrace)
|
110
|
-
when
|
137
|
+
when Statement::Command
|
111
138
|
# ignore
|
112
139
|
else
|
113
140
|
fail "Unexpected statement: #{statement}"
|
114
141
|
end
|
142
|
+
|
143
|
+
return
|
115
144
|
end
|
116
145
|
|
117
146
|
def include_config(base_package, package_name, config_name, version_name, overrides, backtrace)
|
@@ -126,14 +155,22 @@ module Fig
|
|
126
155
|
overrides.each do |override|
|
127
156
|
new_backtrace.add_override(override.package_name, override.version_name)
|
128
157
|
end
|
129
|
-
package = lookup_package(
|
130
|
-
|
158
|
+
package = lookup_package(
|
159
|
+
package_name || base_package.package_name, version_name, new_backtrace
|
160
|
+
)
|
161
|
+
apply_config(
|
162
|
+
package, config_name || Package::DEFAULT_CONFIG, new_backtrace
|
163
|
+
)
|
164
|
+
|
165
|
+
return
|
131
166
|
end
|
132
167
|
|
133
168
|
private
|
134
169
|
|
135
170
|
def set_variable(base_package, name, value)
|
136
171
|
@variables[name] = expand_and_retrieve_variable_value(base_package, name, value)
|
172
|
+
|
173
|
+
return
|
137
174
|
end
|
138
175
|
|
139
176
|
def append_variable(base_package, name, value)
|
@@ -153,6 +190,8 @@ module Fig
|
|
153
190
|
else
|
154
191
|
@variables[name] = value
|
155
192
|
end
|
193
|
+
|
194
|
+
return
|
156
195
|
end
|
157
196
|
|
158
197
|
def with_environment
|
@@ -163,12 +202,19 @@ module Fig
|
|
163
202
|
ensure
|
164
203
|
old_env.each { |key,value| ENV[key] = value }
|
165
204
|
end
|
205
|
+
|
206
|
+
return
|
166
207
|
end
|
167
208
|
|
168
209
|
def lookup_package(package_name, version_name, backtrace)
|
169
|
-
package =
|
210
|
+
package = get_package(package_name)
|
170
211
|
if package.nil?
|
171
|
-
|
212
|
+
if not version_name
|
213
|
+
Logging.fatal "No version specified for #{package_name}."
|
214
|
+
raise RepositoryError.new
|
215
|
+
end
|
216
|
+
|
217
|
+
package = @repository.get_package(package_name, version_name)
|
172
218
|
package.backtrace = backtrace
|
173
219
|
@packages[package_name] = package
|
174
220
|
elsif version_name && version_name != package.version_name
|
@@ -181,7 +227,8 @@ module Fig
|
|
181
227
|
+ ( stacktrace.empty? ? '' : "\n#{stacktrace}" )
|
182
228
|
raise RepositoryError.new
|
183
229
|
end
|
184
|
-
|
230
|
+
|
231
|
+
return package
|
185
232
|
end
|
186
233
|
|
187
234
|
# Replace @ symbol with the package's directory, "[package]" with the
|
@@ -215,12 +262,14 @@ module Fig
|
|
215
262
|
end
|
216
263
|
file = target
|
217
264
|
end
|
265
|
+
|
218
266
|
return file
|
219
267
|
end
|
220
268
|
|
221
269
|
def expand_path(path, base_package)
|
222
270
|
expanded_path = expand_at_sign_package_references(path, base_package)
|
223
271
|
check_for_bad_escape(expanded_path, path)
|
272
|
+
|
224
273
|
return expanded_path.gsub(%r< \\ ([\\@]) >x, '\1')
|
225
274
|
end
|
226
275
|
|
@@ -235,6 +284,8 @@ module Fig
|
|
235
284
|
backslashes = $1 || ''
|
236
285
|
backslashes + base_package.directory
|
237
286
|
end
|
287
|
+
|
288
|
+
return
|
238
289
|
end
|
239
290
|
|
240
291
|
def expand_command_line_argument(arg)
|
@@ -254,9 +305,9 @@ module Fig
|
|
254
305
|
>x
|
255
306
|
) do |match|
|
256
307
|
backslashes = $1 || ''
|
257
|
-
package =
|
308
|
+
package = get_package($2)
|
258
309
|
if package.nil?
|
259
|
-
raise RepositoryError.new
|
310
|
+
raise RepositoryError.new("Package not found: #{$1}")
|
260
311
|
end
|
261
312
|
backslashes + package.directory
|
262
313
|
end
|
@@ -274,6 +325,8 @@ module Fig
|
|
274
325
|
%Q<Unknown escape "#{$1}" in "#{original}">
|
275
326
|
)
|
276
327
|
end
|
328
|
+
|
329
|
+
return
|
277
330
|
end
|
278
331
|
|
279
332
|
def translate_retrieve_variables(base_package, name)
|
data/lib/fig/figrc.rb
CHANGED
@@ -2,7 +2,7 @@ require 'json'
|
|
2
2
|
|
3
3
|
require 'fig/applicationconfiguration'
|
4
4
|
require 'fig/configfileerror'
|
5
|
-
require 'fig/
|
5
|
+
require 'fig/operatingsystem'
|
6
6
|
|
7
7
|
REPOSITORY_CONFIGURATION = '_meta/figrc'
|
8
8
|
|
@@ -64,7 +64,7 @@ module Fig
|
|
64
64
|
repo_figrc_path =
|
65
65
|
File.expand_path(File.join(fig_home, REPOSITORY_CONFIGURATION))
|
66
66
|
|
67
|
-
os =
|
67
|
+
os = OperatingSystem.new(login)
|
68
68
|
|
69
69
|
repo_config_exists = nil
|
70
70
|
begin
|
data/lib/fig/grammar.treetop
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require 'fig/package'
|
2
|
-
require 'fig/
|
3
|
-
require 'fig/
|
4
|
-
require 'fig/
|
5
|
-
require 'fig/
|
6
|
-
require 'fig/
|
7
|
-
require 'fig/
|
8
|
-
require 'fig/
|
9
|
-
require 'fig/
|
10
|
-
require 'fig/
|
11
|
-
require 'fig/
|
12
|
-
require 'fig/
|
2
|
+
require 'fig/packagedescriptor'
|
3
|
+
require 'fig/statement/archive'
|
4
|
+
require 'fig/statement/command'
|
5
|
+
require 'fig/statement/configuration'
|
6
|
+
require 'fig/statement/include'
|
7
|
+
require 'fig/statement/override'
|
8
|
+
require 'fig/statement/path'
|
9
|
+
require 'fig/statement/publish'
|
10
|
+
require 'fig/statement/resource'
|
11
|
+
require 'fig/statement/retrieve'
|
12
|
+
require 'fig/statement/set'
|
13
13
|
|
14
14
|
module Fig
|
15
15
|
|
@@ -34,7 +34,7 @@ grammar Fig
|
|
34
34
|
rule archive
|
35
35
|
"archive" ws url {
|
36
36
|
def to_package_statement
|
37
|
-
|
37
|
+
Statement::Archive.new(url.value.text_value)
|
38
38
|
end
|
39
39
|
}
|
40
40
|
end
|
@@ -42,7 +42,7 @@ grammar Fig
|
|
42
42
|
rule resource
|
43
43
|
"resource" ws url {
|
44
44
|
def to_package_statement
|
45
|
-
|
45
|
+
Statement::Resource.new(url.value.text_value)
|
46
46
|
end
|
47
47
|
}
|
48
48
|
end
|
@@ -50,7 +50,7 @@ grammar Fig
|
|
50
50
|
rule retrieve
|
51
51
|
"retrieve" ws var:retrieve_variable "->" path:retrieve_path ws {
|
52
52
|
def to_package_statement
|
53
|
-
|
53
|
+
Statement::Retrieve.new(var.text_value, path.text_value)
|
54
54
|
end
|
55
55
|
}
|
56
56
|
end
|
@@ -63,18 +63,10 @@ grammar Fig
|
|
63
63
|
[a-zA-Z0-9_/.\[\]-]+
|
64
64
|
end
|
65
65
|
|
66
|
-
rule install
|
67
|
-
"install" ws statements:config_statement* "end" ws {
|
68
|
-
def to_package_statement
|
69
|
-
Package::Install.new(statements.elements.map { |statement| statement.to_config_statement })
|
70
|
-
end
|
71
|
-
}
|
72
|
-
end
|
73
|
-
|
74
66
|
rule config
|
75
67
|
"config" ws config_name ws statements:config_statement* "end" ws {
|
76
68
|
def to_package_statement
|
77
|
-
|
69
|
+
Statement::Configuration.new(config_name.text_value, statements.elements.map { |statement| statement.to_config_statement })
|
78
70
|
end
|
79
71
|
}
|
80
72
|
end
|
@@ -86,10 +78,10 @@ grammar Fig
|
|
86
78
|
rule include
|
87
79
|
"include" ws descriptor overrides:(override*) {
|
88
80
|
def to_config_statement
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
81
|
+
Statement::Include.new(
|
82
|
+
PackageDescriptor.parse(descriptor.text_value.strip),
|
83
|
+
overrides.elements.map{ |e| e.to_override }
|
84
|
+
)
|
93
85
|
end
|
94
86
|
}
|
95
87
|
end
|
@@ -97,7 +89,7 @@ grammar Fig
|
|
97
89
|
rule override
|
98
90
|
"override" ws package_name "/" version_name ws {
|
99
91
|
def to_override
|
100
|
-
return
|
92
|
+
return Statement::Override.new(package_name.text_value, version_name.text_value)
|
101
93
|
end
|
102
94
|
}
|
103
95
|
end
|
@@ -105,7 +97,7 @@ grammar Fig
|
|
105
97
|
rule path
|
106
98
|
("append" / "path" / "add") ws name:path_name "=" value:path_value ws {
|
107
99
|
def to_config_statement
|
108
|
-
|
100
|
+
Statement::Path.new(name.text_value, value.text_value)
|
109
101
|
end
|
110
102
|
}
|
111
103
|
end
|
@@ -121,7 +113,7 @@ grammar Fig
|
|
121
113
|
rule set
|
122
114
|
"set" ws name:set_name "=" value:set_value ws {
|
123
115
|
def to_config_statement
|
124
|
-
|
116
|
+
Statement::Set.new(name.text_value, value.text_value)
|
125
117
|
end
|
126
118
|
}
|
127
119
|
end
|
@@ -137,7 +129,7 @@ grammar Fig
|
|
137
129
|
rule command
|
138
130
|
"command" ws string {
|
139
131
|
def to_config_statement
|
140
|
-
|
132
|
+
Statement::Command.new(string.value.text_value)
|
141
133
|
end
|
142
134
|
}
|
143
135
|
end
|
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
# Must specify absolute path of ::Archive when using
|
3
|
-
# this module to avoid conflicts with Fig::
|
3
|
+
# this module to avoid conflicts with Fig::Statement::Archive
|
4
4
|
require 'libarchive_ruby' unless RUBY_PLATFORM == 'java'
|
5
|
-
require 'uri'
|
6
5
|
require 'net/http'
|
7
6
|
require 'net/ssh'
|
8
7
|
require 'net/sftp'
|
9
8
|
require 'net/netrc'
|
9
|
+
require 'rbconfig'
|
10
10
|
require 'tempfile'
|
11
|
+
require 'uri'
|
12
|
+
|
11
13
|
require 'highline/import'
|
12
14
|
|
13
15
|
require 'fig/logging'
|
@@ -17,7 +19,7 @@ require 'fig/notfounderror'
|
|
17
19
|
module Fig
|
18
20
|
# Does things requiring real O/S interaction, primarilly taking care of file
|
19
21
|
# transfers and running external commands.
|
20
|
-
class
|
22
|
+
class OperatingSystem
|
21
23
|
def initialize(login)
|
22
24
|
@login = login
|
23
25
|
@username = ENV['FIG_USERNAME']
|
@@ -77,7 +79,7 @@ module Fig
|
|
77
79
|
uri = URI.parse(url)
|
78
80
|
rescue
|
79
81
|
Logging.fatal %Q<Unable to parse url: "#{url}">
|
80
|
-
raise NetworkError.new
|
82
|
+
raise NetworkError.new
|
81
83
|
end
|
82
84
|
case uri.scheme
|
83
85
|
when 'ftp'
|
@@ -184,7 +186,7 @@ module Fig
|
|
184
186
|
begin
|
185
187
|
FileUtils.cp(uri.path, path)
|
186
188
|
return true
|
187
|
-
rescue Errno::ENOENT
|
189
|
+
rescue Errno::ENOENT
|
188
190
|
raise NotFoundError.new
|
189
191
|
end
|
190
192
|
else
|
@@ -292,7 +294,7 @@ module Fig
|
|
292
294
|
|
293
295
|
# Expects files_to_archive as an Array of filenames.
|
294
296
|
def create_archive(archive_name, files_to_archive)
|
295
|
-
if
|
297
|
+
if OperatingSystem.java?
|
296
298
|
`tar czvf #{archive_name} #{files_to_archive.join(' ')}`
|
297
299
|
else
|
298
300
|
# TODO: Need to verify files_to_archive exists.
|
@@ -318,7 +320,7 @@ module Fig
|
|
318
320
|
# .zip
|
319
321
|
def unpack_archive(dir, file)
|
320
322
|
Dir.chdir(dir) do
|
321
|
-
if
|
323
|
+
if OperatingSystem.java?
|
322
324
|
`tar xzvf #{file}`
|
323
325
|
else
|
324
326
|
::Archive.read_open_filename(file) do |ar|
|
@@ -331,7 +333,7 @@ module Fig
|
|
331
333
|
end
|
332
334
|
|
333
335
|
def self.windows?
|
334
|
-
|
336
|
+
RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
335
337
|
end
|
336
338
|
|
337
339
|
def self.java?
|
@@ -343,7 +345,7 @@ module Fig
|
|
343
345
|
end
|
344
346
|
|
345
347
|
def shell_exec(cmd)
|
346
|
-
if
|
348
|
+
if OperatingSystem.windows?
|
347
349
|
Windows.shell_exec_windows(cmd)
|
348
350
|
else
|
349
351
|
shell_exec_unix(cmd)
|