fig 0.1.39-java → 0.1.41-java
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 +45 -0
- data/LICENSE +2 -2
- data/README.md +154 -100
- data/VERSION +1 -0
- data/bin/fig +4 -182
- data/lib/fig.rb +222 -0
- data/lib/fig/applicationconfiguration.rb +52 -0
- data/lib/fig/backtrace.rb +6 -6
- data/lib/fig/configfileerror.rb +15 -0
- data/lib/fig/environment.rb +46 -26
- data/lib/fig/figrc.rb +105 -0
- data/lib/fig/grammar.treetop +1 -1
- data/lib/fig/log4rconfigerror.rb +14 -0
- data/lib/fig/logging.rb +131 -0
- data/lib/fig/networkerror.rb +7 -0
- data/lib/fig/notfounderror.rb +4 -0
- data/lib/fig/options.rb +191 -54
- data/lib/fig/os.rb +73 -74
- data/lib/fig/package.rb +30 -30
- data/lib/fig/packageerror.rb +7 -0
- data/lib/fig/parser.rb +5 -8
- data/lib/fig/repository.rb +44 -28
- data/lib/fig/repositoryerror.rb +7 -0
- data/lib/fig/retriever.rb +26 -17
- data/lib/fig/urlaccesserror.rb +9 -0
- data/lib/fig/userinputerror.rb +4 -0
- data/lib/fig/windows.rb +3 -3
- metadata +115 -21
data/lib/fig.rb
CHANGED
@@ -0,0 +1,222 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'net/ftp'
|
3
|
+
require 'log4r'
|
4
|
+
|
5
|
+
require 'fig/environment'
|
6
|
+
require 'fig/figrc'
|
7
|
+
require 'fig/logging'
|
8
|
+
require 'fig/options'
|
9
|
+
require 'fig/os'
|
10
|
+
require 'fig/parser'
|
11
|
+
require 'fig/repository'
|
12
|
+
require 'fig/retriever'
|
13
|
+
require 'fig/userinputerror'
|
14
|
+
require 'fig/windows'
|
15
|
+
|
16
|
+
module Fig
|
17
|
+
DEFAULT_FIG_FILE = 'package.fig'
|
18
|
+
|
19
|
+
def parse_descriptor(descriptor)
|
20
|
+
# todo should use treetop for these:
|
21
|
+
package_name = descriptor =~ /^([^:\/]+)/ ? $1 : nil
|
22
|
+
config_name = descriptor =~ /:([^:\/]+)/ ? $1 : nil
|
23
|
+
version_name = descriptor =~ /\/([^:\/]+)/ ? $1 : nil
|
24
|
+
return package_name, config_name, version_name
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_fig(argv)
|
28
|
+
shell_command = nil
|
29
|
+
argv.each_with_index do |arg, i|
|
30
|
+
if arg == '--'
|
31
|
+
shell_command = argv[(i+1)..-1]
|
32
|
+
argv.slice!(i..-1)
|
33
|
+
break
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
options, argv, exit_value = parse_options(argv)
|
38
|
+
if not exit_value.nil?
|
39
|
+
return exit_value
|
40
|
+
end
|
41
|
+
|
42
|
+
Logging.initialize_pre_configuration(options[:log_level])
|
43
|
+
|
44
|
+
vars = {}
|
45
|
+
ENV.each {|key,value| vars[key]=value }
|
46
|
+
|
47
|
+
remote_url = nil
|
48
|
+
if options[:update] || options[:publish] || options[:update_if_missing] || options[:list_remote]
|
49
|
+
remote_url = ENV['FIG_REMOTE_URL']
|
50
|
+
if remote_url.nil?
|
51
|
+
$stderr.puts 'Please define the FIG_REMOTE_URL environment variable.'
|
52
|
+
return 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
configuration = FigRC.find(
|
57
|
+
options[:figrc],
|
58
|
+
remote_url,
|
59
|
+
options[:login],
|
60
|
+
options[:home],
|
61
|
+
options[:no_figrc]
|
62
|
+
)
|
63
|
+
|
64
|
+
Logging.initialize_post_configuration(options[:log_config] || configuration['log configuration'], options[:log_level])
|
65
|
+
|
66
|
+
remote_user = nil
|
67
|
+
|
68
|
+
os = OS.new(options[:login])
|
69
|
+
repos = Repository.new(
|
70
|
+
os,
|
71
|
+
File.expand_path(File.join(options[:home], 'repos')),
|
72
|
+
remote_url,
|
73
|
+
configuration,
|
74
|
+
remote_user,
|
75
|
+
options[:update],
|
76
|
+
options[:update_if_missing]
|
77
|
+
)
|
78
|
+
retriever = Retriever.new('.')
|
79
|
+
# Check to see if this is still happening with the new layers of abstraction.
|
80
|
+
at_exit { retriever.save }
|
81
|
+
env = Environment.new(os, repos, vars, retriever)
|
82
|
+
|
83
|
+
options[:modifiers].each do |modifier|
|
84
|
+
env.apply_config_statement(nil, modifier, nil)
|
85
|
+
end
|
86
|
+
|
87
|
+
input = nil
|
88
|
+
if options[:input] == :none
|
89
|
+
# ignore
|
90
|
+
elsif options[:input] == '-'
|
91
|
+
input = $stdin.read
|
92
|
+
elsif options[:input].nil?
|
93
|
+
input = os.read(DEFAULT_FIG_FILE) if os.exist?(DEFAULT_FIG_FILE)
|
94
|
+
else
|
95
|
+
if os.exist?(options[:input])
|
96
|
+
input = os.read(options[:input])
|
97
|
+
else
|
98
|
+
$stderr.puts %Q<File not found: "#{options[:input]}".>
|
99
|
+
return 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
options[:cleans].each do |descriptor|
|
104
|
+
package_name, version_name = descriptor.split('/')
|
105
|
+
repos.clean(package_name, version_name)
|
106
|
+
end
|
107
|
+
if options[:list]
|
108
|
+
repos.list_packages.sort.each do |item|
|
109
|
+
puts item
|
110
|
+
end
|
111
|
+
return 0
|
112
|
+
end
|
113
|
+
|
114
|
+
if options[:list_remote]
|
115
|
+
repos.list_remote_packages.sort.each do |item|
|
116
|
+
puts item
|
117
|
+
end
|
118
|
+
return 0
|
119
|
+
end
|
120
|
+
|
121
|
+
if not options[:list_configs].empty?
|
122
|
+
options[:list_configs].each do |descriptor|
|
123
|
+
package_name, version_name = descriptor.split('/')
|
124
|
+
repos.read_local_package(package_name, version_name).configs.each do |config|
|
125
|
+
puts config.name
|
126
|
+
end
|
127
|
+
end
|
128
|
+
return 0
|
129
|
+
end
|
130
|
+
|
131
|
+
if input
|
132
|
+
package = Parser.new.parse_package(nil, nil, '.', input)
|
133
|
+
direct_retrieves=[]
|
134
|
+
if options[:retrieve]
|
135
|
+
package.retrieves.each do |var, path|
|
136
|
+
if var =~ /^@([^\/]+)(.*)/
|
137
|
+
direct_retrieves << [$1, $2, path]
|
138
|
+
else
|
139
|
+
env.add_retrieve(var, path)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
unless options[:publish] || options[:list] || options[:publish_local]
|
144
|
+
env.register_package(package)
|
145
|
+
env.apply_config(package, options[:config], nil)
|
146
|
+
direct_retrieves.each do |info|
|
147
|
+
env.direct_retrieve(info[0], info[1], info[2])
|
148
|
+
end
|
149
|
+
end
|
150
|
+
else
|
151
|
+
package = Package.new(nil, nil, '.', [])
|
152
|
+
end
|
153
|
+
|
154
|
+
if options[:publish] || options[:publish_local]
|
155
|
+
if !argv.empty?
|
156
|
+
$stderr.puts %Q<Unexpected arguments: #{argv.join(' ')}>
|
157
|
+
return 10
|
158
|
+
end
|
159
|
+
package_name, config_name, version_name = parse_descriptor(options[:publish] || options[:publish_local])
|
160
|
+
if package_name.nil? || version_name.nil?
|
161
|
+
$stderr.puts 'Please specify a package name and a version name.'
|
162
|
+
return 10
|
163
|
+
end
|
164
|
+
if not options[:modifiers].empty?
|
165
|
+
publish_statements = options[:resources] + options[:archives] + [Configuration.new('default', options[:modifiers])]
|
166
|
+
publish_statements << Publish.new('default','default')
|
167
|
+
elsif not package.statements.empty?
|
168
|
+
publish_statements = package.statements
|
169
|
+
else
|
170
|
+
$stderr.puts 'Nothing to publish.'
|
171
|
+
return 1
|
172
|
+
end
|
173
|
+
if options[:publish]
|
174
|
+
Logging.info "Checking status of #{package_name}/#{version_name}..."
|
175
|
+
if repos.list_remote_packages.include?("#{package_name}/#{version_name}")
|
176
|
+
Logging.info "#{package_name}/#{version_name} has already been published."
|
177
|
+
if not options[:force]
|
178
|
+
Logging.fatal 'Use the --force option if you really want to overwrite, or use --publish-local for testing.'
|
179
|
+
return 1
|
180
|
+
else
|
181
|
+
Logging.info 'Overwriting...'
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
Logging.info "Publishing #{package_name}/#{version_name}."
|
186
|
+
repos.publish_package(publish_statements, package_name, version_name, options[:publish_local])
|
187
|
+
elsif options[:echo]
|
188
|
+
puts env[options[:echo]]
|
189
|
+
elsif shell_command
|
190
|
+
argv.shift
|
191
|
+
env.execute_shell(shell_command) { |cmd| os.shell_exec cmd }
|
192
|
+
elsif argv[0]
|
193
|
+
package_name, config_name, version_name = parse_descriptor(argv.shift)
|
194
|
+
env.include_config(package, package_name, config_name, version_name, {}, nil)
|
195
|
+
env.execute_config(package, package_name, config_name, nil, argv) { |cmd| os.shell_exec cmd }
|
196
|
+
elsif input
|
197
|
+
env.execute_config(package, nil, options[:config], nil, argv) { |cmd| os.shell_exec cmd }
|
198
|
+
elsif !repos.updating?
|
199
|
+
$stderr.puts USAGE
|
200
|
+
$stderr.puts %q<Run "fig --help" for a full list of commands.>
|
201
|
+
end
|
202
|
+
|
203
|
+
return 0
|
204
|
+
end
|
205
|
+
|
206
|
+
def run_with_exception_handling(argv)
|
207
|
+
begin
|
208
|
+
return_code = run_fig(argv)
|
209
|
+
return return_code
|
210
|
+
rescue URLAccessError => exception
|
211
|
+
$stderr.puts "Access to #{exception.url} not allowed."
|
212
|
+
return 1
|
213
|
+
rescue UserInputError => exception
|
214
|
+
# If there's no message, we assume that the cause has already been logged.
|
215
|
+
if not exception.message.nil?
|
216
|
+
$stderr.puts exception.to_s
|
217
|
+
end
|
218
|
+
|
219
|
+
return 1
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
module Fig
|
3
|
+
class ApplicationConfiguration
|
4
|
+
def initialize(remote_repository_url)
|
5
|
+
@data = []
|
6
|
+
@remote_repository_url = remote_repository_url
|
7
|
+
clear_cached_data
|
8
|
+
end
|
9
|
+
|
10
|
+
def ensure_url_whitelist_initialized()
|
11
|
+
return if not @whitelist.nil?
|
12
|
+
whitelist = self['url_whitelist']
|
13
|
+
if whitelist.nil?
|
14
|
+
@whitelist = []
|
15
|
+
else
|
16
|
+
@whitelist = [@remote_repository_url, whitelist].flatten
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](key)
|
21
|
+
@data.each do |dataset|
|
22
|
+
if dataset.has_key?(key)
|
23
|
+
return dataset[key]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
return nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def push_dataset(dataset)
|
30
|
+
@data.push(dataset)
|
31
|
+
end
|
32
|
+
|
33
|
+
def unshift_dataset(dataset)
|
34
|
+
@data.unshift(dataset)
|
35
|
+
end
|
36
|
+
|
37
|
+
# after push_dataset or unshift_dataset, call clear_cached, and lazy initialize as far as the list of things to exclude
|
38
|
+
|
39
|
+
def clear_cached_data()
|
40
|
+
@whitelist = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def url_access_allowed?(url)
|
44
|
+
ensure_url_whitelist_initialized
|
45
|
+
return true if @whitelist.empty?
|
46
|
+
@whitelist.each do |allowed_url|
|
47
|
+
return true if url.match(/\A#{Regexp.quote(allowed_url)}\b/)
|
48
|
+
end
|
49
|
+
return false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/fig/backtrace.rb
CHANGED
@@ -5,7 +5,7 @@ class Backtrace
|
|
5
5
|
@parent = parent
|
6
6
|
@package_name = package_name
|
7
7
|
@version_name = version_name
|
8
|
-
@config_name = config_name ||
|
8
|
+
@config_name = config_name || 'default'
|
9
9
|
@overrides = {}
|
10
10
|
end
|
11
11
|
|
@@ -13,15 +13,15 @@ class Backtrace
|
|
13
13
|
if @parent
|
14
14
|
@parent.collect(stack)
|
15
15
|
end
|
16
|
-
elem =
|
16
|
+
elem = ''
|
17
17
|
if @package_name
|
18
18
|
elem = @package_name
|
19
19
|
end
|
20
20
|
if @version_name
|
21
|
-
elem +=
|
21
|
+
elem += '/' + @version_name
|
22
22
|
end
|
23
23
|
if @config_name
|
24
|
-
elem +=
|
24
|
+
elem += ':' + @config_name
|
25
25
|
end
|
26
26
|
stack << elem
|
27
27
|
end
|
@@ -41,8 +41,8 @@ class Backtrace
|
|
41
41
|
collect(stack)
|
42
42
|
i=0
|
43
43
|
for elem in stack
|
44
|
-
indent=
|
45
|
-
i.times { indent +=
|
44
|
+
indent=''
|
45
|
+
i.times { indent += ' ' }
|
46
46
|
out.puts indent+elem
|
47
47
|
i += 1
|
48
48
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'fig/userinputerror'
|
2
|
+
|
3
|
+
module Fig
|
4
|
+
# Could not determine some kind of information from a configuration file,
|
5
|
+
# whether .figrc, log4r, package.fig, etc.
|
6
|
+
class ConfigFileError < UserInputError
|
7
|
+
def initialize(message, file)
|
8
|
+
super(message)
|
9
|
+
|
10
|
+
@file = file
|
11
|
+
|
12
|
+
return
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/fig/environment.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
1
3
|
require 'fig/backtrace'
|
4
|
+
require 'fig/logging'
|
5
|
+
require 'fig/repositoryerror'
|
2
6
|
|
3
7
|
module Fig
|
4
|
-
|
5
|
-
#
|
6
|
-
# variables, and which packages have already been applied
|
8
|
+
# This class manages the program's state, including the value of all
|
9
|
+
# environment variables, and which packages have already been applied.
|
7
10
|
class Environment
|
8
|
-
DEFAULT_VERSION_NAME =
|
11
|
+
DEFAULT_VERSION_NAME = 'current'
|
9
12
|
|
10
13
|
def initialize(os, repository, variables, retriever)
|
11
14
|
@os = os
|
@@ -22,8 +25,8 @@ module Fig
|
|
22
25
|
@variables[name]
|
23
26
|
end
|
24
27
|
|
25
|
-
# Indicates that the values from a particular envrionment variable path
|
26
|
-
|
28
|
+
# Indicates that the values from a particular envrionment variable path
|
29
|
+
|
27
30
|
def add_retrieve(name, path)
|
28
31
|
@retrieve_vars[name] = path
|
29
32
|
end
|
@@ -31,8 +34,8 @@ module Fig
|
|
31
34
|
def register_package(package)
|
32
35
|
name = package.package_name
|
33
36
|
if @packages[name]
|
34
|
-
|
35
|
-
|
37
|
+
Fig::Logging.fatal %Q<There is already a package with the name "#{name}".>
|
38
|
+
raise RepositoryError.new
|
36
39
|
end
|
37
40
|
@packages[name] = package
|
38
41
|
end
|
@@ -41,7 +44,7 @@ module Fig
|
|
41
44
|
if (@applied_configs[package.package_name] ||= []).member?(config_name)
|
42
45
|
return
|
43
46
|
end
|
44
|
-
new_backtrace = backtrace
|
47
|
+
new_backtrace = backtrace
|
45
48
|
|
46
49
|
config = package[config_name]
|
47
50
|
config.statements.each { |stmt| apply_config_statement(package, stmt, new_backtrace) }
|
@@ -57,11 +60,11 @@ module Fig
|
|
57
60
|
def execute_config(base_package, package_name, config_name, version_name, args)
|
58
61
|
package = lookup_package(package_name || base_package.package_name, version_name, Backtrace.new(nil, package_name, version_name, config_name))
|
59
62
|
result = nil
|
60
|
-
commands = package[config_name ||
|
63
|
+
commands = package[config_name || 'default'].commands
|
61
64
|
with_environment do
|
62
|
-
#
|
65
|
+
# TODO nil check
|
63
66
|
commands.each do |command|
|
64
|
-
result = yield expand_arg("#{command.command} #{args.join(' ')}").gsub(
|
67
|
+
result = yield expand_arg("#{command.command} #{args.join(' ')}").gsub('@',package.directory).split(' ')
|
65
68
|
end
|
66
69
|
end
|
67
70
|
result
|
@@ -83,7 +86,7 @@ module Fig
|
|
83
86
|
end
|
84
87
|
|
85
88
|
def include_config(base_package, package_name, config_name, version_name, overrides, backtrace)
|
86
|
-
# Check to see if this include has been overridden
|
89
|
+
# Check to see if this include has been overridden.
|
87
90
|
if backtrace
|
88
91
|
override = backtrace.get_override(package_name || base_package.package_name)
|
89
92
|
if override
|
@@ -95,7 +98,7 @@ module Fig
|
|
95
98
|
new_backtrace.add_override(override.package_name, override.version_name)
|
96
99
|
end
|
97
100
|
package = lookup_package(package_name || base_package.package_name, version_name, new_backtrace)
|
98
|
-
apply_config(package, config_name ||
|
101
|
+
apply_config(package, config_name || 'default', new_backtrace)
|
99
102
|
end
|
100
103
|
|
101
104
|
def direct_retrieve(package_name, source_path, target_path)
|
@@ -104,7 +107,7 @@ module Fig
|
|
104
107
|
FileUtils.cp_r(File.join(package.directory, source_path, '.'), target_path)
|
105
108
|
end
|
106
109
|
|
107
|
-
private
|
110
|
+
private
|
108
111
|
|
109
112
|
def set_variable(base_package, name, value)
|
110
113
|
@variables[name] = expand_value(base_package, name, value)
|
@@ -146,10 +149,14 @@ module Fig
|
|
146
149
|
package.backtrace = backtrace
|
147
150
|
@packages[package_name] = package
|
148
151
|
elsif version_name && version_name != package.version_name
|
149
|
-
|
150
|
-
backtrace.dump(
|
151
|
-
package.backtrace.dump(
|
152
|
-
|
152
|
+
string_handle = StringIO.new
|
153
|
+
backtrace.dump(string_handle) if backtrace
|
154
|
+
package.backtrace.dump(string_handle) if package.backtrace
|
155
|
+
stacktrace = string_handle.to_s
|
156
|
+
Fig::Logging.fatal \
|
157
|
+
"Version mismatch: #{package_name}" \
|
158
|
+
+ stacktrace.empty? ? '' : "\n#{stacktrace}"
|
159
|
+
raise RepositoryError.new
|
153
160
|
end
|
154
161
|
package
|
155
162
|
end
|
@@ -159,18 +166,31 @@ module Fig
|
|
159
166
|
return value unless base_package && base_package.package_name
|
160
167
|
file = value.gsub(/\@/, base_package.directory)
|
161
168
|
if @retrieve_vars.member?(name)
|
162
|
-
# A '//' in the source file's path tells us to preserve path
|
163
|
-
# after the '//' when doing a retrieve.
|
169
|
+
# A '//' in the source file's path tells us to preserve path
|
170
|
+
# information after the '//' when doing a retrieve.
|
164
171
|
if file.split('//').size > 1
|
165
172
|
preserved_path = file.split('//').last
|
166
|
-
target = File.join(
|
173
|
+
target = File.join(
|
174
|
+
@retrieve_vars[name].gsub(
|
175
|
+
/\[package\]/,
|
176
|
+
base_package.package_name
|
177
|
+
),
|
178
|
+
preserved_path
|
179
|
+
)
|
167
180
|
else
|
168
|
-
target = File.join(
|
181
|
+
target = File.join(
|
182
|
+
@retrieve_vars[name].gsub(
|
183
|
+
/\[package\]/,
|
184
|
+
base_package.package_name
|
185
|
+
)
|
186
|
+
)
|
169
187
|
if not File.directory?(file)
|
170
188
|
target = File.join(target, File.basename(file))
|
171
189
|
end
|
172
190
|
end
|
173
|
-
@retriever.
|
191
|
+
@retriever.with_package_config(
|
192
|
+
base_package.package_name, base_package.version_name
|
193
|
+
) do
|
174
194
|
@retriever.retrieve(file, target)
|
175
195
|
end
|
176
196
|
file = target
|
@@ -182,8 +202,8 @@ module Fig
|
|
182
202
|
arg.gsub(/\@([a-zA-Z0-9\-\.]+)/) do |match|
|
183
203
|
package = @packages[$1]
|
184
204
|
if package.nil?
|
185
|
-
|
186
|
-
|
205
|
+
Fig::Logging.fatal "Package not found: #{$1}"
|
206
|
+
raise RepositoryError.new
|
187
207
|
end
|
188
208
|
package.directory
|
189
209
|
end
|