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/package.rb
CHANGED
@@ -1,16 +1,21 @@
|
|
1
1
|
require 'fig/logging'
|
2
2
|
require 'fig/packageerror'
|
3
|
-
require 'fig/
|
4
|
-
require 'fig/
|
5
|
-
require 'fig/
|
6
|
-
require 'fig/
|
3
|
+
require 'fig/statement/archive'
|
4
|
+
require 'fig/statement/configuration'
|
5
|
+
require 'fig/statement/resource'
|
6
|
+
require 'fig/statement/retrieve'
|
7
7
|
|
8
8
|
module Fig; end
|
9
9
|
|
10
10
|
# The parsed representation of a configuration file. Contains the statement
|
11
11
|
# objects.
|
12
12
|
class Fig::Package
|
13
|
-
|
13
|
+
include Comparable
|
14
|
+
|
15
|
+
UNPUBLISHED = '<unpublished>'
|
16
|
+
DEFAULT_CONFIG = 'default'
|
17
|
+
|
18
|
+
attr_reader :package_name, :version_name, :directory, :statements
|
14
19
|
attr_accessor :backtrace
|
15
20
|
|
16
21
|
def initialize(package_name, version_name, directory, statements)
|
@@ -18,59 +23,170 @@ class Fig::Package
|
|
18
23
|
@version_name = version_name
|
19
24
|
@directory = directory
|
20
25
|
@statements = statements
|
26
|
+
@applied_config_names = []
|
21
27
|
@backtrace = nil
|
22
28
|
end
|
23
29
|
|
24
30
|
def [](config_name)
|
25
31
|
@statements.each do |stmt|
|
26
|
-
return stmt if stmt.is_a?(Configuration) && stmt.name == config_name
|
32
|
+
return stmt if stmt.is_a?(Fig::Statement::Configuration) && stmt.name == config_name
|
27
33
|
end
|
28
|
-
|
29
|
-
|
34
|
+
|
35
|
+
message =
|
36
|
+
'Configuration not found: ' +
|
37
|
+
(@package_name || '<empty>') +
|
38
|
+
'/' +
|
39
|
+
(@version_name || '<empty>') +
|
40
|
+
':' +
|
41
|
+
(config_name || '<empty>')
|
42
|
+
|
43
|
+
raise Fig::PackageError.new(message)
|
44
|
+
end
|
45
|
+
|
46
|
+
def <=>(other)
|
47
|
+
compared = compare_components(package_name, other.package_name)
|
48
|
+
return compared if compared != 0
|
49
|
+
|
50
|
+
return compare_components(version_name, other.version_name)
|
30
51
|
end
|
31
52
|
|
32
53
|
def configs
|
33
|
-
@statements.select { |statement| statement.is_a?(Configuration) }
|
54
|
+
return @statements.select { |statement| statement.is_a?(Fig::Statement::Configuration) }
|
55
|
+
end
|
56
|
+
|
57
|
+
def config_names
|
58
|
+
return configs.collect { |statement| statement.name }
|
34
59
|
end
|
35
60
|
|
36
61
|
def retrieves
|
37
62
|
retrieves = {}
|
38
|
-
|
39
|
-
|
63
|
+
|
64
|
+
statements.each do
|
65
|
+
|statement|
|
66
|
+
|
67
|
+
retrieves[statement.var] = statement.path if statement.is_a?(Fig::Statement::Retrieve)
|
68
|
+
end
|
69
|
+
|
70
|
+
return retrieves
|
40
71
|
end
|
41
72
|
|
42
73
|
def archive_urls
|
43
|
-
@statements.select{|s| s.is_a?(Archive)}.map{|s|s.url}
|
74
|
+
return @statements.select{|s| s.is_a?(Fig::Statement::Archive)}.map{|s| s.url}
|
44
75
|
end
|
45
76
|
|
46
77
|
def resource_urls
|
47
|
-
@statements.select{|s| s.is_a?(Resource)}.map{|s|s.url}
|
78
|
+
return @statements.select{|s| s.is_a?(Fig::Statement::Resource)}.map{|s|s.url}
|
79
|
+
end
|
80
|
+
|
81
|
+
def applied_config_names()
|
82
|
+
return @applied_config_names.clone
|
83
|
+
end
|
84
|
+
|
85
|
+
def add_applied_config_name(name)
|
86
|
+
@applied_config_names << name
|
87
|
+
end
|
88
|
+
|
89
|
+
def primary_config_name()
|
90
|
+
return @applied_config_names.first
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns an array of PackageDescriptors
|
94
|
+
def package_dependencies(config_name)
|
95
|
+
descriptors = []
|
96
|
+
|
97
|
+
self[config_name || DEFAULT_CONFIG].walk_statements do
|
98
|
+
|statement|
|
99
|
+
|
100
|
+
if statement.is_a?(Fig::Statement::Include)
|
101
|
+
descriptors << statement.resolved_dependency_descriptor(self)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
return descriptors
|
48
106
|
end
|
49
107
|
|
108
|
+
# Block will receive a Statement.
|
50
109
|
def walk_statements(&block)
|
51
110
|
@statements.each do |statement|
|
52
111
|
yield statement
|
53
112
|
statement.walk_statements &block
|
54
113
|
end
|
114
|
+
|
115
|
+
return
|
116
|
+
end
|
117
|
+
|
118
|
+
# Block will receive a Package and a Statement.
|
119
|
+
def walk_statements_following_package_dependencies(repository, &block)
|
120
|
+
@statements.each do |statement|
|
121
|
+
yield self, statement
|
122
|
+
statement.walk_statements_following_package_dependencies(
|
123
|
+
repository, self, &block
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
127
|
+
return
|
55
128
|
end
|
56
129
|
|
57
130
|
def unparse
|
58
|
-
@statements.map { |statement| statement.unparse('') }.join("\n")
|
131
|
+
return @statements.map { |statement| statement.unparse('') }.join("\n")
|
59
132
|
end
|
60
133
|
|
61
134
|
def ==(other)
|
62
135
|
return false if other.nil?
|
63
|
-
|
136
|
+
|
137
|
+
return @package_name == other.package_name &&
|
138
|
+
@version_name == other.version_name &&
|
139
|
+
@statements.to_yaml == other.statements.to_yaml
|
64
140
|
end
|
65
141
|
|
66
142
|
def to_s
|
67
|
-
package_name
|
68
|
-
version_name
|
69
|
-
package_name + '/' + version_name
|
143
|
+
package_name = @package_name || '<empty>'
|
144
|
+
version_name = @version_name || '<empty>'
|
145
|
+
return package_name + '/' + version_name
|
146
|
+
end
|
147
|
+
|
148
|
+
def to_s_with_config(config_name)
|
149
|
+
string = nil
|
150
|
+
|
151
|
+
if package_name.nil?
|
152
|
+
string = UNPUBLISHED
|
153
|
+
else
|
154
|
+
string = to_s
|
155
|
+
end
|
156
|
+
|
157
|
+
if not config_name.nil? and config_name != DEFAULT_CONFIG
|
158
|
+
string += ":#{config_name}"
|
159
|
+
end
|
160
|
+
|
161
|
+
return string
|
162
|
+
end
|
163
|
+
|
164
|
+
def to_s_with_primary_config()
|
165
|
+
return to_s_with_config(primary_config_name)
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
|
170
|
+
def compare_components(mine, others)
|
171
|
+
if mine.nil?
|
172
|
+
if others.nil?
|
173
|
+
return 0
|
174
|
+
end
|
175
|
+
|
176
|
+
return 1
|
177
|
+
end
|
178
|
+
|
179
|
+
if others.nil?
|
180
|
+
return -1
|
181
|
+
end
|
182
|
+
|
183
|
+
return mine <=> others
|
70
184
|
end
|
71
185
|
end
|
72
186
|
|
187
|
+
# TODO: get this out of the global namespace
|
73
188
|
def unparse_statements(indent, prefix, statements, suffix)
|
74
189
|
body = @statements.map { |statement| statement.unparse(indent+' ') }.join("\n")
|
190
|
+
|
75
191
|
return ["\n#{indent}#{prefix}", body, "#{indent}#{suffix}"].join("\n")
|
76
192
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Fig; end
|
2
|
+
|
3
|
+
# Simple double-level cache of Packages.
|
4
|
+
class Fig::PackageCache
|
5
|
+
def initialize()
|
6
|
+
@packages = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_package(package)
|
10
|
+
versions = @packages[package.package_name]
|
11
|
+
if not versions
|
12
|
+
versions = {}
|
13
|
+
@packages[package.package_name] = versions
|
14
|
+
end
|
15
|
+
|
16
|
+
versions[package.version_name] = package
|
17
|
+
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_package(name, version)
|
22
|
+
versions = @packages[name]
|
23
|
+
return if not versions
|
24
|
+
|
25
|
+
return versions[version]
|
26
|
+
end
|
27
|
+
|
28
|
+
def remove_package(name, version)
|
29
|
+
versions = @packages[name]
|
30
|
+
return if not versions
|
31
|
+
|
32
|
+
versions.delete(version)
|
33
|
+
|
34
|
+
return
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Fig; end
|
2
|
+
|
3
|
+
# Parsed representation of a package name:config/version.
|
4
|
+
class Fig::PackageDescriptor
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
DEFAULT_CONFIG = 'default'
|
8
|
+
|
9
|
+
attr_reader :name, :version, :config
|
10
|
+
|
11
|
+
def self.parse(raw_string)
|
12
|
+
self.new(
|
13
|
+
raw_string =~ %r< ^ ( [^:/]+ ) >x ? $1 : nil,
|
14
|
+
raw_string =~ %r< / ( [^:/]+ ) >x ? $1 : nil,
|
15
|
+
raw_string =~ %r< : ( [^:/]+ ) >x ? $1 : nil
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(name, version, config)
|
20
|
+
@name = name
|
21
|
+
@version = version
|
22
|
+
@config = config
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_string(use_default_config = false)
|
26
|
+
string = @name || ''
|
27
|
+
|
28
|
+
if @version
|
29
|
+
string += '/'
|
30
|
+
string += @version
|
31
|
+
end
|
32
|
+
|
33
|
+
if @config
|
34
|
+
string += ':'
|
35
|
+
string += @config
|
36
|
+
elsif use_default_config
|
37
|
+
string += ':default'
|
38
|
+
end
|
39
|
+
|
40
|
+
return string
|
41
|
+
end
|
42
|
+
|
43
|
+
def <=>(other)
|
44
|
+
return to_string() <=> other.to_string()
|
45
|
+
end
|
46
|
+
end
|
data/lib/fig/parser.rb
CHANGED
@@ -32,12 +32,12 @@ module Fig
|
|
32
32
|
def find_multiple_command_statements(package)
|
33
33
|
command_processed = false
|
34
34
|
package.walk_statements do |statement|
|
35
|
-
if statement.is_a?(
|
35
|
+
if statement.is_a?(Statement::Command)
|
36
36
|
if command_processed == true
|
37
37
|
raise UserInputError.new("Multiple command statements cannot be processed.")
|
38
38
|
end
|
39
39
|
command_processed = true
|
40
|
-
elsif statement.is_a?(
|
40
|
+
elsif statement.is_a?(Statement::Configuration)
|
41
41
|
command_processed = false
|
42
42
|
end
|
43
43
|
end
|
data/lib/fig/repository.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'fig/logging'
|
2
2
|
require 'fig/notfounderror'
|
3
|
-
require 'fig/
|
4
|
-
require 'fig/package/resource'
|
3
|
+
require 'fig/packagecache'
|
5
4
|
require 'fig/parser'
|
6
5
|
require 'fig/repositoryerror'
|
6
|
+
require 'fig/statement/archive'
|
7
|
+
require 'fig/statement/resource'
|
7
8
|
require 'fig/urlaccesserror'
|
8
9
|
|
9
10
|
module Fig
|
@@ -14,36 +15,31 @@ module Fig
|
|
14
15
|
not (/ftp:\/\/|http:\/\/|file:\/\/|ssh:\/\// =~ url).nil?
|
15
16
|
end
|
16
17
|
|
17
|
-
def initialize(
|
18
|
-
|
18
|
+
def initialize(
|
19
|
+
os,
|
20
|
+
local_repository_dir,
|
21
|
+
remote_repository_url,
|
22
|
+
application_config,
|
23
|
+
remote_repository_user = nil,
|
24
|
+
update = false,
|
25
|
+
update_if_missing = true
|
26
|
+
)
|
27
|
+
@operating_system = os
|
19
28
|
@local_repository_dir = local_repository_dir
|
20
29
|
@remote_repository_url = remote_repository_url
|
21
30
|
@remote_repository_user = remote_repository_user
|
22
|
-
@application_config = application_config
|
23
31
|
@update = update
|
24
32
|
@update_if_missing = update_if_missing
|
25
|
-
@parser = Parser.new(@application_config)
|
26
|
-
|
27
|
-
@overrides = {}
|
28
|
-
if File.exist?('fig.properties')
|
29
|
-
File.readlines('fig.properties').each do |line|
|
30
|
-
descriptor, path = line.strip.split('=')
|
31
|
-
@overrides[descriptor] = path
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
33
|
|
36
|
-
|
37
|
-
|
38
|
-
dir = File.join(dir, version_name) if version_name
|
39
|
-
FileUtils.rm_rf(dir)
|
34
|
+
@parser = Parser.new(@application_config)
|
35
|
+
@packages = PackageCache.new()
|
40
36
|
end
|
41
37
|
|
42
38
|
def list_packages
|
43
39
|
results = []
|
44
40
|
if File.exist?(@local_repository_dir)
|
45
|
-
@
|
46
|
-
@
|
41
|
+
@operating_system.list(@local_repository_dir).each do |package_name|
|
42
|
+
@operating_system.list(File.join(@local_repository_dir, package_name)).each do |version_name|
|
47
43
|
results << "#{package_name}/#{version_name}"
|
48
44
|
end
|
49
45
|
end
|
@@ -52,84 +48,142 @@ module Fig
|
|
52
48
|
end
|
53
49
|
|
54
50
|
def list_remote_packages
|
55
|
-
@
|
51
|
+
@operating_system.download_list(@remote_repository_url)
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_package(package_name, version_name, disable_updating = false)
|
55
|
+
package = @packages.get_package(package_name, version_name)
|
56
|
+
return package if package
|
57
|
+
|
58
|
+
Logging.debug "Considering #{package_name}/#{version_name}."
|
59
|
+
|
60
|
+
if should_update?(package_name, version_name, disable_updating)
|
61
|
+
update_package(package_name, version_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
return read_local_package(package_name, version_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def clean(package_name, version_name)
|
68
|
+
@packages.remove_package(package_name, version_name)
|
69
|
+
|
70
|
+
dir = File.join(@local_repository_dir, package_name)
|
71
|
+
dir = File.join(dir, version_name) if version_name
|
72
|
+
|
73
|
+
FileUtils.rm_rf(dir)
|
74
|
+
|
75
|
+
return
|
56
76
|
end
|
57
77
|
|
58
|
-
def publish_package(
|
78
|
+
def publish_package(
|
79
|
+
package_statements, package_name, version_name, local_only
|
80
|
+
)
|
59
81
|
temp_dir = temp_dir_for_package(package_name, version_name)
|
60
|
-
@
|
82
|
+
@operating_system.clear_directory(temp_dir)
|
61
83
|
local_dir = local_dir_for_package(package_name, version_name)
|
62
|
-
@
|
84
|
+
@operating_system.clear_directory(local_dir)
|
63
85
|
fig_file = File.join(temp_dir, '.fig')
|
64
|
-
content =
|
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
|
-
|
86
|
+
content = derive_package_content(
|
87
|
+
package_statements, package_name, version_name, local_dir, local_only
|
88
|
+
)
|
89
|
+
@operating_system.write(fig_file, content.join("\n").strip)
|
90
|
+
@operating_system.upload(
|
91
|
+
fig_file,
|
92
|
+
remote_fig_file_for_package(package_name, version_name),
|
93
|
+
@remote_repository_user
|
94
|
+
) unless local_only
|
95
|
+
@operating_system.copy(
|
96
|
+
fig_file, local_fig_file_for_package(package_name, version_name)
|
97
|
+
)
|
98
|
+
|
99
|
+
FileUtils.rm_rf(temp_dir)
|
100
|
+
end
|
101
|
+
|
102
|
+
def updating?
|
103
|
+
return @update || @update_if_missing
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def should_update?(package_name, version_name, disable_updating)
|
109
|
+
return false if disable_updating
|
110
|
+
|
111
|
+
return true if @update
|
112
|
+
|
113
|
+
return @update_if_missing &&
|
114
|
+
package_missing?(package_name, version_name)
|
115
|
+
end
|
116
|
+
|
117
|
+
def read_local_package(package_name, version_name)
|
118
|
+
dir = local_dir_for_package(package_name, version_name)
|
119
|
+
return read_package_from_directory(dir, package_name, version_name)
|
94
120
|
end
|
95
121
|
|
96
122
|
def bundle_resources(package_statements)
|
97
123
|
resources = []
|
98
124
|
new_package_statements = package_statements.reject do |statement|
|
99
|
-
if
|
125
|
+
if (
|
126
|
+
statement.is_a?(Statement::Resource) &&
|
127
|
+
! Repository.is_url?(statement.url)
|
128
|
+
)
|
100
129
|
resources << statement.url
|
101
130
|
true
|
102
131
|
else
|
103
132
|
false
|
104
133
|
end
|
105
134
|
end
|
135
|
+
|
106
136
|
if resources.size > 0
|
107
137
|
resources = expand_globs_from(resources)
|
108
138
|
file = 'resources.tar.gz'
|
109
|
-
@
|
110
|
-
new_package_statements.unshift(
|
139
|
+
@operating_system.create_archive(file, resources)
|
140
|
+
new_package_statements.unshift(Statement::Archive.new(file))
|
111
141
|
at_exit { File.delete(file) }
|
112
142
|
end
|
113
|
-
new_package_statements
|
114
|
-
end
|
115
143
|
|
116
|
-
|
117
|
-
Logging.debug "Considering #{package_name}/#{version_name}."
|
118
|
-
if @update || (@update_if_missing && package_missing?(package_name, version_name))
|
119
|
-
update_package(package_name, version_name)
|
120
|
-
end
|
121
|
-
read_local_package(package_name, version_name)
|
144
|
+
return new_package_statements
|
122
145
|
end
|
123
146
|
|
124
|
-
def
|
125
|
-
|
147
|
+
def install_package(package_name, version_name)
|
148
|
+
temp_dir = nil
|
149
|
+
|
150
|
+
begin
|
151
|
+
package = read_local_package(package_name, version_name)
|
152
|
+
temp_dir = temp_dir_for_package(package_name, version_name)
|
153
|
+
@operating_system.clear_directory(temp_dir)
|
154
|
+
package.archive_urls.each do |archive_url|
|
155
|
+
if not Repository.is_url?(archive_url)
|
156
|
+
archive_url = remote_dir_for_package(package_name, version_name) + '/' + archive_url
|
157
|
+
end
|
158
|
+
@operating_system.download_archive(archive_url, File.join(temp_dir))
|
159
|
+
end
|
160
|
+
package.resource_urls.each do |resource_url|
|
161
|
+
if not Repository.is_url?(resource_url)
|
162
|
+
resource_url = remote_dir_for_package(package_name, version_name) + '/' + resource_url
|
163
|
+
end
|
164
|
+
@operating_system.download_resource(resource_url, File.join(temp_dir))
|
165
|
+
end
|
166
|
+
local_dir = local_dir_for_package(package_name, version_name)
|
167
|
+
@operating_system.clear_directory(local_dir)
|
168
|
+
# some packages contain no files, only a fig file.
|
169
|
+
if not (package.archive_urls.empty? && package.resource_urls.empty?)
|
170
|
+
FileUtils.mv(Dir.glob(File.join(temp_dir, '*')), local_dir)
|
171
|
+
end
|
172
|
+
write_local_package(package_name, version_name, package)
|
173
|
+
rescue
|
174
|
+
Logging.fatal 'Install failed, cleaning up.'
|
175
|
+
delete_local_package(package_name, version_name)
|
176
|
+
raise RepositoryError.new
|
177
|
+
ensure
|
178
|
+
FileUtils.rm_rf(temp_dir)
|
179
|
+
end
|
126
180
|
end
|
127
181
|
|
128
182
|
def update_package(package_name, version_name)
|
129
183
|
remote_fig_file = remote_fig_file_for_package(package_name, version_name)
|
130
184
|
local_fig_file = local_fig_file_for_package(package_name, version_name)
|
131
185
|
begin
|
132
|
-
if @
|
186
|
+
if @operating_system.download(remote_fig_file, local_fig_file)
|
133
187
|
install_package(package_name, version_name)
|
134
188
|
end
|
135
189
|
rescue NotFoundError
|
@@ -139,9 +193,11 @@ module Fig
|
|
139
193
|
end
|
140
194
|
end
|
141
195
|
|
142
|
-
|
143
|
-
|
144
|
-
|
196
|
+
# 'resources' is an Array of filenames: ['tmp/foo/file1', 'tmp/foo/*.jar']
|
197
|
+
def expand_globs_from(resources)
|
198
|
+
expanded_files = []
|
199
|
+
resources.each {|f| expanded_files.concat(Dir.glob(f))}
|
200
|
+
expanded_files
|
145
201
|
end
|
146
202
|
|
147
203
|
def read_package_from_directory(dir, package_name, version_name)
|
@@ -150,10 +206,11 @@ module Fig
|
|
150
206
|
file = File.join(dir, 'package.fig')
|
151
207
|
end
|
152
208
|
if not File.exist?(file)
|
153
|
-
Logging.fatal
|
209
|
+
Logging.fatal %Q<Fig file not found for package "#{package_name || '<unnamed>'}": #{file}>
|
154
210
|
raise RepositoryError.new
|
155
211
|
end
|
156
|
-
|
212
|
+
|
213
|
+
return read_package_from_file(file, package_name, version_name)
|
157
214
|
end
|
158
215
|
|
159
216
|
def read_package_from_file(file_name, package_name, version_name)
|
@@ -162,58 +219,14 @@ module Fig
|
|
162
219
|
raise RepositoryError.new
|
163
220
|
end
|
164
221
|
content = File.read(file_name)
|
165
|
-
return @parser.parse_package(package_name, version_name, File.dirname(file_name), content)
|
166
|
-
end
|
167
|
-
|
168
|
-
def local_dir_for_package(package_name, version_name)
|
169
|
-
descriptor = "#{package_name}/#{version_name}"
|
170
|
-
dir = @overrides[descriptor]
|
171
|
-
if dir
|
172
|
-
Logging.info "override: #{descriptor}=#{dir}"
|
173
|
-
else
|
174
|
-
dir = File.join(@local_repository_dir, package_name, version_name)
|
175
|
-
end
|
176
|
-
dir
|
177
|
-
end
|
178
222
|
|
179
|
-
|
223
|
+
package = @parser.parse_package(
|
224
|
+
package_name, version_name, File.dirname(file_name), content
|
225
|
+
)
|
180
226
|
|
181
|
-
|
182
|
-
begin
|
183
|
-
package = read_local_package(package_name, version_name)
|
184
|
-
temp_dir = temp_dir_for_package(package_name, version_name)
|
185
|
-
@os.clear_directory(temp_dir)
|
186
|
-
package.archive_urls.each do |archive_url|
|
187
|
-
if not Repository.is_url?(archive_url)
|
188
|
-
archive_url = remote_dir_for_package(package_name, version_name) + '/' + archive_url
|
189
|
-
end
|
190
|
-
@os.download_archive(archive_url, File.join(temp_dir))
|
191
|
-
end
|
192
|
-
package.resource_urls.each do |resource_url|
|
193
|
-
if not Repository.is_url?(resource_url)
|
194
|
-
resource_url = remote_dir_for_package(package_name, version_name) + '/' + resource_url
|
195
|
-
end
|
196
|
-
@os.download_resource(resource_url, File.join(temp_dir))
|
197
|
-
end
|
198
|
-
local_dir = local_dir_for_package(package_name, version_name)
|
199
|
-
@os.clear_directory(local_dir)
|
200
|
-
# some packages contain no files, only a fig file.
|
201
|
-
if not (package.archive_urls.empty? && package.resource_urls.empty?)
|
202
|
-
FileUtils.mv(Dir.glob(File.join(temp_dir, '*')), local_dir)
|
203
|
-
end
|
204
|
-
write_local_package(package_name, version_name, package)
|
205
|
-
rescue
|
206
|
-
Logging.fatal 'Install failed, cleaning up.'
|
207
|
-
delete_local_package(package_name, version_name)
|
208
|
-
raise RepositoryError.new
|
209
|
-
end
|
210
|
-
end
|
227
|
+
@packages.add_package(package)
|
211
228
|
|
212
|
-
|
213
|
-
def expand_globs_from(resources)
|
214
|
-
expanded_files = []
|
215
|
-
resources.each {|f| expanded_files.concat(Dir.glob(f))}
|
216
|
-
expanded_files
|
229
|
+
return package
|
217
230
|
end
|
218
231
|
|
219
232
|
def delete_local_package(package_name, version_name)
|
@@ -222,7 +235,7 @@ module Fig
|
|
222
235
|
|
223
236
|
def write_local_package(package_name, version_name, package)
|
224
237
|
file = local_fig_file_for_package(package_name, version_name)
|
225
|
-
@
|
238
|
+
@operating_system.write(file, package.unparse)
|
226
239
|
end
|
227
240
|
|
228
241
|
def remote_fig_file_for_package(package_name, version_name)
|
@@ -237,6 +250,10 @@ module Fig
|
|
237
250
|
"#{@remote_repository_url}/#{package_name}/#{version_name}"
|
238
251
|
end
|
239
252
|
|
253
|
+
def local_dir_for_package(package_name, version_name)
|
254
|
+
return File.join(@local_repository_dir, package_name, version_name)
|
255
|
+
end
|
256
|
+
|
240
257
|
def temp_dir_for_package(package_name, version_name)
|
241
258
|
File.join(@local_repository_dir, 'tmp')
|
242
259
|
end
|
@@ -244,5 +261,37 @@ module Fig
|
|
244
261
|
def package_missing?(package_name, version_name)
|
245
262
|
not File.exist?(local_fig_file_for_package(package_name, version_name))
|
246
263
|
end
|
264
|
+
|
265
|
+
def derive_package_content(
|
266
|
+
package_statements, package_name, version_name, local_dir, local_only
|
267
|
+
)
|
268
|
+
return bundle_resources(package_statements).map do |statement|
|
269
|
+
if statement.is_a?(Statement::Publish)
|
270
|
+
nil
|
271
|
+
elsif statement.is_a?(Statement::Archive) || statement.is_a?(Statement::Resource)
|
272
|
+
if statement.is_a?(Statement::Resource) && !Repository.is_url?(statement.url)
|
273
|
+
archive_name = statement.url
|
274
|
+
archive_remote = "#{remote_dir_for_package(package_name, version_name)}/#{statement.url}"
|
275
|
+
else
|
276
|
+
archive_name = statement.url.split('/').last
|
277
|
+
archive_remote = "#{remote_dir_for_package(package_name, version_name)}/#{archive_name}"
|
278
|
+
end
|
279
|
+
if Repository.is_url?(statement.url)
|
280
|
+
archive_local = File.join(temp_dir, archive_name)
|
281
|
+
@operating_system.download(statement.url, archive_local)
|
282
|
+
else
|
283
|
+
archive_local = statement.url
|
284
|
+
end
|
285
|
+
@operating_system.upload(archive_local, archive_remote, @remote_repository_user) unless local_only
|
286
|
+
@operating_system.copy(archive_local, local_dir + '/' + archive_name)
|
287
|
+
if statement.is_a?(Statement::Archive)
|
288
|
+
@operating_system.unpack_archive(local_dir, archive_name)
|
289
|
+
end
|
290
|
+
statement.class.new(archive_name).unparse('')
|
291
|
+
else
|
292
|
+
statement.unparse('')
|
293
|
+
end
|
294
|
+
end.select { |s|not s.nil? }
|
295
|
+
end
|
247
296
|
end
|
248
297
|
end
|