fig 0.1.57 → 0.1.59
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 +80 -0
- data/VERSION +1 -1
- data/bin/fig-debug +12 -0
- data/bin/fig.bat +1 -0
- data/lib/fig/applicationconfiguration.rb +41 -41
- data/lib/fig/backtrace.rb +28 -30
- data/lib/fig/command.rb +52 -112
- data/lib/fig/command/listing.rb +207 -41
- data/lib/fig/command/packageload.rb +137 -0
- data/lib/fig/environment.rb +59 -72
- data/lib/fig/environmentvariables.rb +44 -0
- data/lib/fig/environmentvariables/caseinsensitive.rb +49 -0
- data/lib/fig/environmentvariables/casesensitive.rb +30 -0
- data/lib/fig/grammar.treetop +60 -35
- data/lib/fig/log4r/outputter.rb +96 -0
- data/lib/fig/logging.rb +2 -1
- data/lib/fig/logging/colorizable.rb +14 -0
- data/lib/fig/nosuchpackageconfigerror.rb +15 -0
- data/lib/fig/operatingsystem.rb +24 -13
- data/lib/fig/options.rb +70 -20
- data/lib/fig/package.rb +25 -26
- data/lib/fig/packagecache.rb +3 -3
- data/lib/fig/packagedescriptor.rb +36 -19
- data/lib/fig/packageparseerror.rb +7 -0
- data/lib/fig/parser.rb +76 -39
- data/lib/fig/repository.rb +131 -93
- data/lib/fig/retriever.rb +61 -39
- data/lib/fig/statement.rb +24 -2
- data/lib/fig/statement/archive.rb +4 -6
- data/lib/fig/statement/command.rb +4 -6
- data/lib/fig/statement/configuration.rb +7 -9
- data/lib/fig/statement/include.rb +49 -32
- data/lib/fig/statement/override.rb +7 -8
- data/lib/fig/statement/path.rb +4 -6
- data/lib/fig/statement/publish.rb +4 -11
- data/lib/fig/statement/resource.rb +4 -6
- data/lib/fig/statement/retrieve.rb +4 -6
- data/lib/fig/statement/set.rb +4 -6
- data/lib/fig/urlaccesserror.rb +4 -5
- metadata +52 -215
- data/LICENSE +0 -27
- data/README.md +0 -526
- data/TODO +0 -4
- data/lib/fig/packageerror.rb +0 -8
- data/lib/fig/windows.rb +0 -44
data/lib/fig/packagecache.rb
CHANGED
|
@@ -7,13 +7,13 @@ class Fig::PackageCache
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def add_package(package)
|
|
10
|
-
versions = @packages[package.
|
|
10
|
+
versions = @packages[package.name]
|
|
11
11
|
if not versions
|
|
12
12
|
versions = {}
|
|
13
|
-
@packages[package.
|
|
13
|
+
@packages[package.name] = versions
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
versions[package.
|
|
16
|
+
versions[package.version] = package
|
|
17
17
|
|
|
18
18
|
return
|
|
19
19
|
end
|
|
@@ -1,18 +1,38 @@
|
|
|
1
1
|
module Fig; end
|
|
2
2
|
|
|
3
|
-
# Parsed representation of a package name:config
|
|
3
|
+
# Parsed representation of a package (name/version:config).
|
|
4
4
|
class Fig::PackageDescriptor
|
|
5
5
|
include Comparable
|
|
6
6
|
|
|
7
|
-
DEFAULT_CONFIG = 'default'
|
|
8
|
-
|
|
9
7
|
attr_reader :name, :version, :config
|
|
10
8
|
|
|
9
|
+
def self.format(name, version, config, use_default_config = false)
|
|
10
|
+
string = name || ''
|
|
11
|
+
|
|
12
|
+
if version
|
|
13
|
+
string += '/'
|
|
14
|
+
string += version
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if config
|
|
18
|
+
string += ':'
|
|
19
|
+
string += config
|
|
20
|
+
elsif use_default_config
|
|
21
|
+
string += ':default'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
return string
|
|
25
|
+
end
|
|
26
|
+
|
|
11
27
|
def self.parse(raw_string)
|
|
28
|
+
# Additional checks in validate_component() will take care of the looseness
|
|
29
|
+
# of the regexes. These just need to ensure that the entire string gets
|
|
30
|
+
# assigned to one component or another.
|
|
31
|
+
|
|
12
32
|
self.new(
|
|
13
|
-
raw_string =~ %r<
|
|
14
|
-
raw_string =~ %r< / ( [
|
|
15
|
-
raw_string =~ %r< : (
|
|
33
|
+
raw_string =~ %r< \A ( [^:/]+ ) >x ? $1 : nil,
|
|
34
|
+
raw_string =~ %r< \A [^/]* / ( [^:]+ ) >x ? $1 : nil,
|
|
35
|
+
raw_string =~ %r< \A [^:]* : ( .+ ) \z >x ? $1 : nil
|
|
16
36
|
)
|
|
17
37
|
end
|
|
18
38
|
|
|
@@ -22,22 +42,19 @@ class Fig::PackageDescriptor
|
|
|
22
42
|
@config = config
|
|
23
43
|
end
|
|
24
44
|
|
|
25
|
-
def
|
|
26
|
-
|
|
45
|
+
def validate_component(value, name)
|
|
46
|
+
return if value.nil?
|
|
27
47
|
|
|
28
|
-
if
|
|
29
|
-
string += '/'
|
|
30
|
-
string += @version
|
|
31
|
-
end
|
|
48
|
+
return if value =~ / \A [a-zA-Z0-9_.-]+ \z /x
|
|
32
49
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
string += @config
|
|
36
|
-
elsif use_default_config
|
|
37
|
-
string += ':default'
|
|
38
|
-
end
|
|
50
|
+
raise %Q<Invalid #{name} for package descriptor: "#{value}".>
|
|
51
|
+
end
|
|
39
52
|
|
|
40
|
-
|
|
53
|
+
# Specifically not named :to_s because it doesn't act like that should.
|
|
54
|
+
def to_string(use_default_config = false)
|
|
55
|
+
return Fig::PackageDescriptor.format(
|
|
56
|
+
@name, @version, @config, use_default_config
|
|
57
|
+
)
|
|
41
58
|
end
|
|
42
59
|
|
|
43
60
|
def <=>(other)
|
data/lib/fig/parser.rb
CHANGED
|
@@ -3,61 +3,98 @@ require 'treetop'
|
|
|
3
3
|
|
|
4
4
|
require 'fig/grammar'
|
|
5
5
|
require 'fig/logging'
|
|
6
|
-
require 'fig/
|
|
6
|
+
require 'fig/packageparseerror'
|
|
7
7
|
require 'fig/repository'
|
|
8
8
|
require 'fig/urlaccesserror'
|
|
9
9
|
require 'fig/userinputerror'
|
|
10
10
|
|
|
11
|
-
module Fig
|
|
12
|
-
# Parses configuration files and deals with a few restrictions on them.
|
|
13
|
-
class Parser
|
|
14
|
-
def initialize(application_config)
|
|
15
|
-
@parser = FigParser.new
|
|
16
|
-
@application_config = application_config
|
|
17
|
-
end
|
|
11
|
+
module Fig; end
|
|
18
12
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
bad_urls << url if not @application_config.url_access_allowed?(url)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
13
|
+
# Parses .fig files (wrapping the Treetop-generated parser object) and deals
|
|
14
|
+
# with a few restrictions on them.
|
|
15
|
+
class Fig::Parser
|
|
16
|
+
def self.node_location(node)
|
|
17
|
+
offset_from_start_of_file = node.interval.first
|
|
18
|
+
input = node.input
|
|
28
19
|
|
|
29
|
-
|
|
20
|
+
return [
|
|
21
|
+
input.line_of(offset_from_start_of_file),
|
|
22
|
+
input.column_of(offset_from_start_of_file)
|
|
23
|
+
]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize(application_config, check_include_versions)
|
|
27
|
+
@parser = Fig::FigParser.new
|
|
28
|
+
@application_config = application_config
|
|
29
|
+
@check_include_versions = check_include_versions
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def parse_package(descriptor, directory, input)
|
|
33
|
+
# Bye bye comments.
|
|
34
|
+
input = input.gsub(/#.*$/, '')
|
|
35
|
+
|
|
36
|
+
# Extra space at the end because most of the rules in the grammar require
|
|
37
|
+
# trailing whitespace.
|
|
38
|
+
result = @parser.parse(input + ' ')
|
|
39
|
+
|
|
40
|
+
if result.nil?
|
|
41
|
+
Fig::Logging.fatal "#{directory}: #{@parser.failure_reason}"
|
|
42
|
+
raise Fig::PackageParseError.new("#{directory}: #{@parser.failure_reason}")
|
|
30
43
|
end
|
|
31
44
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
package = result.to_package(descriptor, directory)
|
|
46
|
+
|
|
47
|
+
check_for_bad_urls(package, descriptor)
|
|
48
|
+
check_for_multiple_command_statements(package)
|
|
49
|
+
check_for_missing_versions_on_include_statements(package)
|
|
50
|
+
|
|
51
|
+
return package
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def check_for_bad_urls(package, descriptor)
|
|
57
|
+
bad_urls = []
|
|
58
|
+
package.walk_statements do |statement|
|
|
59
|
+
statement.urls.each do |url|
|
|
60
|
+
# collect all bad urls in bad_urls
|
|
61
|
+
next if not Fig::Repository.is_url?(url)
|
|
62
|
+
bad_urls << url if not @application_config.url_access_allowed?(url)
|
|
43
63
|
end
|
|
44
64
|
end
|
|
45
65
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
66
|
+
raise Fig::URLAccessError.new(bad_urls, descriptor) if not bad_urls.empty?
|
|
67
|
+
|
|
68
|
+
return
|
|
69
|
+
end
|
|
49
70
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
71
|
+
def check_for_multiple_command_statements(package)
|
|
72
|
+
command_processed = false
|
|
73
|
+
package.walk_statements do |statement|
|
|
74
|
+
if statement.is_a?(Fig::Statement::Command)
|
|
75
|
+
if command_processed == true
|
|
76
|
+
raise Fig::UserInputError.new(
|
|
77
|
+
%Q<Found a second "command" statement within a "config" block#{statement.position_string()}.>
|
|
78
|
+
)
|
|
79
|
+
end
|
|
80
|
+
command_processed = true
|
|
81
|
+
elsif statement.is_a?(Fig::Statement::Configuration)
|
|
82
|
+
command_processed = false
|
|
53
83
|
end
|
|
84
|
+
end
|
|
54
85
|
|
|
55
|
-
|
|
86
|
+
return
|
|
87
|
+
end
|
|
56
88
|
|
|
57
|
-
|
|
58
|
-
|
|
89
|
+
def check_for_missing_versions_on_include_statements(package)
|
|
90
|
+
return if not @check_include_versions
|
|
59
91
|
|
|
60
|
-
|
|
92
|
+
package.walk_statements do |statement|
|
|
93
|
+
if statement.is_a?(Fig::Statement::Include)
|
|
94
|
+
statement.complain_if_version_missing()
|
|
95
|
+
end
|
|
61
96
|
end
|
|
97
|
+
|
|
98
|
+
return
|
|
62
99
|
end
|
|
63
100
|
end
|
data/lib/fig/repository.rb
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
require 'socket'
|
|
2
|
+
require 'sys/admin'
|
|
3
|
+
|
|
1
4
|
require 'fig/logging'
|
|
2
5
|
require 'fig/notfounderror'
|
|
3
6
|
require 'fig/packagecache'
|
|
7
|
+
require 'fig/packagedescriptor'
|
|
4
8
|
require 'fig/parser'
|
|
5
9
|
require 'fig/repositoryerror'
|
|
6
10
|
require 'fig/statement/archive'
|
|
@@ -22,27 +26,33 @@ module Fig
|
|
|
22
26
|
local_repository_dir,
|
|
23
27
|
remote_repository_url,
|
|
24
28
|
application_config,
|
|
25
|
-
remote_repository_user
|
|
26
|
-
update
|
|
27
|
-
update_if_missing
|
|
29
|
+
remote_repository_user,
|
|
30
|
+
update,
|
|
31
|
+
update_if_missing,
|
|
32
|
+
check_include_versions
|
|
28
33
|
)
|
|
29
|
-
@operating_system
|
|
30
|
-
@local_repository_dir
|
|
31
|
-
@remote_repository_url
|
|
34
|
+
@operating_system = os
|
|
35
|
+
@local_repository_dir = local_repository_dir
|
|
36
|
+
@remote_repository_url = remote_repository_url
|
|
32
37
|
@remote_repository_user = remote_repository_user
|
|
33
|
-
@update
|
|
34
|
-
@update_if_missing
|
|
38
|
+
@update = update
|
|
39
|
+
@update_if_missing = update_if_missing
|
|
40
|
+
|
|
41
|
+
@parser = Parser.new(application_config, check_include_versions)
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
reset_cached_data()
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def reset_cached_data()
|
|
37
47
|
@packages = PackageCache.new()
|
|
38
48
|
end
|
|
39
49
|
|
|
40
50
|
def list_packages
|
|
41
51
|
results = []
|
|
42
52
|
if File.exist?(@local_repository_dir)
|
|
43
|
-
@operating_system.list(@local_repository_dir).each do |
|
|
44
|
-
@operating_system.list(File.join(@local_repository_dir,
|
|
45
|
-
results <<
|
|
53
|
+
@operating_system.list(@local_repository_dir).each do |name|
|
|
54
|
+
@operating_system.list(File.join(@local_repository_dir, name)).each do |version|
|
|
55
|
+
results << PackageDescriptor.format(name, version, nil)
|
|
46
56
|
end
|
|
47
57
|
end
|
|
48
58
|
end
|
|
@@ -57,69 +67,66 @@ module Fig
|
|
|
57
67
|
end
|
|
58
68
|
|
|
59
69
|
def get_package(
|
|
60
|
-
|
|
61
|
-
version_name,
|
|
62
|
-
disable_updating = false,
|
|
70
|
+
descriptor,
|
|
63
71
|
allow_any_version = false
|
|
64
72
|
)
|
|
65
|
-
if not
|
|
73
|
+
if not descriptor.version
|
|
66
74
|
if allow_any_version
|
|
67
|
-
package = @packages.get_any_version_of_package(
|
|
75
|
+
package = @packages.get_any_version_of_package(descriptor.name)
|
|
68
76
|
if package
|
|
69
77
|
Logging.warn(
|
|
70
|
-
"Picked version #{package.
|
|
78
|
+
"Picked version #{package.version} of #{package.name} at random."
|
|
71
79
|
)
|
|
72
80
|
return package
|
|
73
81
|
end
|
|
74
82
|
end
|
|
75
83
|
|
|
76
84
|
raise RepositoryError.new(
|
|
77
|
-
%Q<Cannot retrieve "#{
|
|
85
|
+
%Q<Cannot retrieve "#{descriptor.name}" without a version.>
|
|
78
86
|
)
|
|
79
87
|
end
|
|
80
88
|
|
|
81
|
-
package = @packages.get_package(
|
|
89
|
+
package = @packages.get_package(descriptor.name, descriptor.version)
|
|
82
90
|
return package if package
|
|
83
91
|
|
|
84
|
-
Logging.debug
|
|
92
|
+
Logging.debug \
|
|
93
|
+
"Considering #{PackageDescriptor.format(descriptor.name, descriptor.version, nil)}."
|
|
85
94
|
|
|
86
|
-
if should_update?(
|
|
87
|
-
update_package(
|
|
95
|
+
if should_update?(descriptor)
|
|
96
|
+
update_package(descriptor)
|
|
88
97
|
end
|
|
89
98
|
|
|
90
|
-
return read_local_package(
|
|
99
|
+
return read_local_package(descriptor)
|
|
91
100
|
end
|
|
92
101
|
|
|
93
|
-
def clean(
|
|
94
|
-
@packages.remove_package(
|
|
102
|
+
def clean(descriptor)
|
|
103
|
+
@packages.remove_package(descriptor.name, descriptor.version)
|
|
95
104
|
|
|
96
|
-
dir = File.join(@local_repository_dir,
|
|
97
|
-
dir = File.join(dir,
|
|
105
|
+
dir = File.join(@local_repository_dir, descriptor.name)
|
|
106
|
+
dir = File.join(dir, descriptor.version) if descriptor.version
|
|
98
107
|
|
|
99
108
|
FileUtils.rm_rf(dir)
|
|
100
109
|
|
|
101
110
|
return
|
|
102
111
|
end
|
|
103
112
|
|
|
104
|
-
def publish_package(
|
|
105
|
-
|
|
106
|
-
)
|
|
107
|
-
temp_dir = temp_dir_for_package(package_name, version_name)
|
|
113
|
+
def publish_package(package_statements, descriptor, local_only)
|
|
114
|
+
temp_dir = temp_dir_for_package(descriptor)
|
|
108
115
|
@operating_system.clear_directory(temp_dir)
|
|
109
|
-
local_dir = local_dir_for_package(
|
|
116
|
+
local_dir = local_dir_for_package(descriptor)
|
|
110
117
|
@operating_system.clear_directory(local_dir)
|
|
111
118
|
fig_file = File.join(temp_dir, '.fig')
|
|
112
119
|
content = derive_package_content(
|
|
113
|
-
package_statements,
|
|
120
|
+
package_statements, descriptor, local_dir, local_only
|
|
114
121
|
)
|
|
115
122
|
@operating_system.write(fig_file, content.join("\n").strip)
|
|
116
123
|
@operating_system.upload(
|
|
117
124
|
fig_file,
|
|
118
|
-
remote_fig_file_for_package(
|
|
125
|
+
remote_fig_file_for_package(descriptor),
|
|
119
126
|
@remote_repository_user
|
|
120
127
|
) unless local_only
|
|
121
128
|
@operating_system.copy(
|
|
122
|
-
fig_file, local_fig_file_for_package(
|
|
129
|
+
fig_file, local_fig_file_for_package(descriptor)
|
|
123
130
|
)
|
|
124
131
|
|
|
125
132
|
FileUtils.rm_rf(temp_dir)
|
|
@@ -131,18 +138,15 @@ module Fig
|
|
|
131
138
|
|
|
132
139
|
private
|
|
133
140
|
|
|
134
|
-
def should_update?(
|
|
135
|
-
return false if disable_updating
|
|
136
|
-
|
|
141
|
+
def should_update?(descriptor)
|
|
137
142
|
return true if @update
|
|
138
143
|
|
|
139
|
-
return @update_if_missing &&
|
|
140
|
-
package_missing?(package_name, version_name)
|
|
144
|
+
return @update_if_missing && package_missing?(descriptor)
|
|
141
145
|
end
|
|
142
146
|
|
|
143
|
-
def read_local_package(
|
|
144
|
-
|
|
145
|
-
return read_package_from_directory(
|
|
147
|
+
def read_local_package(descriptor)
|
|
148
|
+
directory = local_dir_for_package(descriptor)
|
|
149
|
+
return read_package_from_directory(directory, descriptor)
|
|
146
150
|
end
|
|
147
151
|
|
|
148
152
|
def bundle_resources(package_statements)
|
|
@@ -163,42 +167,43 @@ module Fig
|
|
|
163
167
|
resources = expand_globs_from(resources)
|
|
164
168
|
file = 'resources.tar.gz'
|
|
165
169
|
@operating_system.create_archive(file, resources)
|
|
166
|
-
new_package_statements.unshift(Statement::Archive.new(file))
|
|
170
|
+
new_package_statements.unshift(Statement::Archive.new(nil, file))
|
|
167
171
|
at_exit { File.delete(file) }
|
|
168
172
|
end
|
|
169
173
|
|
|
170
174
|
return new_package_statements
|
|
171
175
|
end
|
|
172
176
|
|
|
173
|
-
def install_package(
|
|
177
|
+
def install_package(descriptor)
|
|
174
178
|
temp_dir = nil
|
|
175
179
|
|
|
176
180
|
begin
|
|
177
|
-
package = read_local_package(
|
|
178
|
-
temp_dir = temp_dir_for_package(
|
|
181
|
+
package = read_local_package(descriptor)
|
|
182
|
+
temp_dir = temp_dir_for_package(descriptor)
|
|
179
183
|
@operating_system.clear_directory(temp_dir)
|
|
180
184
|
package.archive_urls.each do |archive_url|
|
|
181
185
|
if not Repository.is_url?(archive_url)
|
|
182
|
-
archive_url = remote_dir_for_package(
|
|
186
|
+
archive_url = remote_dir_for_package(descriptor) + '/' + archive_url
|
|
183
187
|
end
|
|
184
188
|
@operating_system.download_archive(archive_url, File.join(temp_dir))
|
|
185
189
|
end
|
|
186
190
|
package.resource_urls.each do |resource_url|
|
|
187
191
|
if not Repository.is_url?(resource_url)
|
|
188
|
-
resource_url =
|
|
192
|
+
resource_url =
|
|
193
|
+
remote_dir_for_package(descriptor) + '/' + resource_url
|
|
189
194
|
end
|
|
190
195
|
@operating_system.download_resource(resource_url, File.join(temp_dir))
|
|
191
196
|
end
|
|
192
|
-
local_dir = local_dir_for_package(
|
|
197
|
+
local_dir = local_dir_for_package(descriptor)
|
|
193
198
|
@operating_system.clear_directory(local_dir)
|
|
194
199
|
# some packages contain no files, only a fig file.
|
|
195
200
|
if not (package.archive_urls.empty? && package.resource_urls.empty?)
|
|
196
201
|
FileUtils.mv(Dir.glob(File.join(temp_dir, '*')), local_dir)
|
|
197
202
|
end
|
|
198
|
-
write_local_package(
|
|
203
|
+
write_local_package(descriptor, package)
|
|
199
204
|
rescue
|
|
200
205
|
Logging.fatal 'Install failed, cleaning up.'
|
|
201
|
-
delete_local_package(
|
|
206
|
+
delete_local_package(descriptor)
|
|
202
207
|
raise RepositoryError.new
|
|
203
208
|
ensure
|
|
204
209
|
if temp_dir
|
|
@@ -207,49 +212,55 @@ module Fig
|
|
|
207
212
|
end
|
|
208
213
|
end
|
|
209
214
|
|
|
210
|
-
def update_package(
|
|
211
|
-
remote_fig_file = remote_fig_file_for_package(
|
|
212
|
-
local_fig_file = local_fig_file_for_package(
|
|
215
|
+
def update_package(descriptor)
|
|
216
|
+
remote_fig_file = remote_fig_file_for_package(descriptor)
|
|
217
|
+
local_fig_file = local_fig_file_for_package(descriptor)
|
|
213
218
|
begin
|
|
214
219
|
if @operating_system.download(remote_fig_file, local_fig_file)
|
|
215
|
-
install_package(
|
|
220
|
+
install_package(descriptor)
|
|
216
221
|
end
|
|
217
222
|
rescue NotFoundError
|
|
218
|
-
Logging.fatal "Package not found in remote repository: #{
|
|
219
|
-
delete_local_package(
|
|
223
|
+
Logging.fatal "Package not found in remote repository: #{descriptor.to_string()}"
|
|
224
|
+
delete_local_package(descriptor)
|
|
220
225
|
raise RepositoryError.new
|
|
221
226
|
end
|
|
222
227
|
end
|
|
223
228
|
|
|
224
|
-
# 'resources' is an Array of
|
|
229
|
+
# 'resources' is an Array of fileglob patterns: ['tmp/foo/file1',
|
|
230
|
+
# 'tmp/foo/*.jar']
|
|
225
231
|
def expand_globs_from(resources)
|
|
226
232
|
expanded_files = []
|
|
227
233
|
resources.each {|f| expanded_files.concat(Dir.glob(f))}
|
|
228
234
|
expanded_files
|
|
229
235
|
end
|
|
230
236
|
|
|
231
|
-
def read_package_from_directory(dir,
|
|
232
|
-
file =
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
237
|
+
def read_package_from_directory(dir, descriptor)
|
|
238
|
+
file = nil
|
|
239
|
+
dot_fig_file = File.join(dir, '.fig')
|
|
240
|
+
if File.exist?(dot_fig_file)
|
|
241
|
+
file = dot_fig_file
|
|
242
|
+
else
|
|
243
|
+
package_dot_fig_file = File.join(dir, 'package.fig')
|
|
244
|
+
if not File.exist?(package_dot_fig_file)
|
|
245
|
+
Logging.fatal %Q<Fig file not found for package "#{descriptor.name || '<unnamed>'}". Looked for "#{dot_fig_file}" and "#{package_dot_fig_file}" and found neither.>
|
|
246
|
+
raise RepositoryError.new
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
file = package_dot_fig_file
|
|
239
250
|
end
|
|
240
251
|
|
|
241
|
-
return read_package_from_file(file,
|
|
252
|
+
return read_package_from_file(file, descriptor)
|
|
242
253
|
end
|
|
243
254
|
|
|
244
|
-
def read_package_from_file(file_name,
|
|
255
|
+
def read_package_from_file(file_name, descriptor)
|
|
245
256
|
if not File.exist?(file_name)
|
|
246
|
-
Logging.fatal "Package not found: #{
|
|
257
|
+
Logging.fatal "Package not found: #{descriptor.to_string()}"
|
|
247
258
|
raise RepositoryError.new
|
|
248
259
|
end
|
|
249
260
|
content = File.read(file_name)
|
|
250
261
|
|
|
251
262
|
package = @parser.parse_package(
|
|
252
|
-
|
|
263
|
+
descriptor, File.dirname(file_name), content
|
|
253
264
|
)
|
|
254
265
|
|
|
255
266
|
@packages.add_package(package)
|
|
@@ -257,52 +268,79 @@ module Fig
|
|
|
257
268
|
return package
|
|
258
269
|
end
|
|
259
270
|
|
|
260
|
-
def delete_local_package(
|
|
261
|
-
FileUtils.rm_rf(local_dir_for_package(
|
|
271
|
+
def delete_local_package(descriptor)
|
|
272
|
+
FileUtils.rm_rf(local_dir_for_package(descriptor))
|
|
262
273
|
end
|
|
263
274
|
|
|
264
|
-
def write_local_package(
|
|
265
|
-
file = local_fig_file_for_package(
|
|
275
|
+
def write_local_package(descriptor, package)
|
|
276
|
+
file = local_fig_file_for_package(descriptor)
|
|
266
277
|
@operating_system.write(file, package.unparse)
|
|
267
278
|
end
|
|
268
279
|
|
|
269
|
-
def remote_fig_file_for_package(
|
|
270
|
-
"#{@remote_repository_url}/#{
|
|
280
|
+
def remote_fig_file_for_package(descriptor)
|
|
281
|
+
"#{@remote_repository_url}/#{descriptor.name}/#{descriptor.version}/.fig"
|
|
271
282
|
end
|
|
272
283
|
|
|
273
|
-
def local_fig_file_for_package(
|
|
274
|
-
File.join(local_dir_for_package(
|
|
284
|
+
def local_fig_file_for_package(descriptor)
|
|
285
|
+
File.join(local_dir_for_package(descriptor), '.fig')
|
|
275
286
|
end
|
|
276
287
|
|
|
277
|
-
def remote_dir_for_package(
|
|
278
|
-
"#{@remote_repository_url}/#{
|
|
288
|
+
def remote_dir_for_package(descriptor)
|
|
289
|
+
"#{@remote_repository_url}/#{descriptor.name}/#{descriptor.version}"
|
|
279
290
|
end
|
|
280
291
|
|
|
281
|
-
def local_dir_for_package(
|
|
282
|
-
return File.join(
|
|
292
|
+
def local_dir_for_package(descriptor)
|
|
293
|
+
return File.join(
|
|
294
|
+
@local_repository_dir, descriptor.name, descriptor.version
|
|
295
|
+
)
|
|
283
296
|
end
|
|
284
297
|
|
|
285
|
-
def temp_dir_for_package(
|
|
298
|
+
def temp_dir_for_package(descriptor)
|
|
286
299
|
File.join(@local_repository_dir, 'tmp')
|
|
287
300
|
end
|
|
288
301
|
|
|
289
|
-
def package_missing?(
|
|
290
|
-
not File.exist?(local_fig_file_for_package(
|
|
302
|
+
def package_missing?(descriptor)
|
|
303
|
+
not File.exist?(local_fig_file_for_package(descriptor))
|
|
291
304
|
end
|
|
292
305
|
|
|
293
306
|
def derive_package_content(
|
|
294
|
-
package_statements,
|
|
307
|
+
package_statements, descriptor, local_dir, local_only
|
|
308
|
+
)
|
|
309
|
+
header_strings = derive_package_metadata_comments(descriptor)
|
|
310
|
+
resource_statement_strings = derive_package_resources(
|
|
311
|
+
package_statements, descriptor, local_dir, local_only
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
return [header_strings, resource_statement_strings].flatten()
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def derive_package_metadata_comments(descriptor)
|
|
318
|
+
now = Time.now()
|
|
319
|
+
|
|
320
|
+
return [
|
|
321
|
+
%Q<# Publishing information for #{descriptor.to_string()}:>,
|
|
322
|
+
%q<#>,
|
|
323
|
+
%Q<# Time: #{now} (epoch: #{now.to_i()})>,
|
|
324
|
+
%Q<# User: #{Sys::Admin.get_login()}>,
|
|
325
|
+
%Q<# Host: #{Socket.gethostname()}>,
|
|
326
|
+
%Q<# Args: "#{ARGV.join %q[", "]}">,
|
|
327
|
+
%q<#>
|
|
328
|
+
]
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def derive_package_resources(
|
|
332
|
+
package_statements, descriptor, local_dir, local_only
|
|
295
333
|
)
|
|
296
334
|
return bundle_resources(package_statements).map do |statement|
|
|
297
335
|
if statement.is_a?(Statement::Publish)
|
|
298
336
|
nil
|
|
299
337
|
elsif statement.is_a?(Statement::Archive) || statement.is_a?(Statement::Resource)
|
|
300
|
-
if statement.is_a?(Statement::Resource) && !Repository.is_url?(statement.url)
|
|
338
|
+
if statement.is_a?(Statement::Resource) && ! Repository.is_url?(statement.url)
|
|
301
339
|
archive_name = statement.url
|
|
302
|
-
archive_remote = "#{remote_dir_for_package(
|
|
340
|
+
archive_remote = "#{remote_dir_for_package(descriptor)}/#{statement.url}"
|
|
303
341
|
else
|
|
304
342
|
archive_name = statement.url.split('/').last
|
|
305
|
-
archive_remote = "#{remote_dir_for_package(
|
|
343
|
+
archive_remote = "#{remote_dir_for_package(descriptor)}/#{archive_name}"
|
|
306
344
|
end
|
|
307
345
|
if Repository.is_url?(statement.url)
|
|
308
346
|
archive_local = File.join(temp_dir, archive_name)
|
|
@@ -315,11 +353,11 @@ module Fig
|
|
|
315
353
|
if statement.is_a?(Statement::Archive)
|
|
316
354
|
@operating_system.unpack_archive(local_dir, archive_name)
|
|
317
355
|
end
|
|
318
|
-
statement.class.new(archive_name).unparse('')
|
|
356
|
+
statement.class.new(nil, archive_name).unparse('')
|
|
319
357
|
else
|
|
320
358
|
statement.unparse('')
|
|
321
359
|
end
|
|
322
|
-
end.select { |s|not s.nil? }
|
|
360
|
+
end.select { |s| not s.nil? }
|
|
323
361
|
end
|
|
324
362
|
end
|
|
325
363
|
end
|