fig 0.1.62 → 0.1.64
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 +156 -0
- data/VERSION +1 -1
- data/bin/fig +9 -2
- data/bin/fig-debug +9 -2
- data/lib/fig/applicationconfiguration.rb +3 -2
- data/lib/fig/atexit.rb +37 -0
- data/lib/fig/backtrace.rb +23 -6
- data/lib/fig/command.rb +131 -31
- data/lib/fig/command/coveragesupport.rb +40 -0
- data/lib/fig/command/listing.rb +8 -8
- data/lib/fig/command/optionerror.rb +8 -0
- data/lib/fig/{options.rb → command/options.rb} +248 -144
- data/lib/fig/command/packageload.rb +161 -62
- data/lib/fig/configfileerror.rb +2 -0
- data/lib/fig/environment.rb +350 -246
- data/lib/fig/environmentvariables/casesensitive.rb +1 -1
- data/lib/fig/figrc.rb +78 -78
- data/lib/fig/grammar.treetop +204 -219
- data/lib/fig/log4rconfigerror.rb +2 -0
- data/lib/fig/operatingsystem.rb +382 -334
- data/lib/fig/package.rb +11 -33
- data/lib/fig/packagecache.rb +1 -1
- data/lib/fig/packagedescriptor.rb +103 -21
- data/lib/fig/packagedescriptorparseerror.rb +16 -0
- data/lib/fig/parser.rb +36 -19
- data/lib/fig/parserpackagebuildstate.rb +56 -0
- data/lib/fig/repository.rb +504 -259
- data/lib/fig/statement.rb +30 -12
- data/lib/fig/statement/archive.rb +8 -5
- data/lib/fig/statement/asset.rb +19 -0
- data/lib/fig/statement/command.rb +2 -2
- data/lib/fig/statement/configuration.rb +20 -20
- data/lib/fig/statement/include.rb +13 -34
- data/lib/fig/statement/override.rb +21 -7
- data/lib/fig/statement/path.rb +22 -2
- data/lib/fig/statement/resource.rb +14 -4
- data/lib/fig/statement/retrieve.rb +34 -4
- data/lib/fig/statement/set.rb +22 -2
- data/lib/fig/workingdirectorymaintainer.rb +197 -0
- data/lib/fig/workingdirectorymetadata.rb +45 -0
- metadata +52 -46
- data/lib/fig/retriever.rb +0 -141
- data/lib/fig/statement/publish.rb +0 -15
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
require 'fig/logging'
|
4
|
+
require 'fig/logging/colorizable'
|
5
|
+
require 'fig/packagedescriptor'
|
6
|
+
require 'fig/workingdirectorymetadata'
|
7
|
+
|
8
|
+
module Fig; end
|
9
|
+
|
10
|
+
# Copies files from the project directories in FIG_HOME to the user's working
|
11
|
+
# directory. It keeps track of which files have already been copied, and which
|
12
|
+
# package/versions they came from, and deletes files as necessary to ensure
|
13
|
+
# that we never have files from two different versions of the same package in
|
14
|
+
# the user's working directory.
|
15
|
+
class Fig::WorkingDirectoryMaintainer
|
16
|
+
def initialize(base_dir)
|
17
|
+
@base_dir = base_dir
|
18
|
+
@package_metadata_by_name = {}
|
19
|
+
@local_fig_data_directory = File.join(@base_dir, '.fig')
|
20
|
+
@metadata_file = File.join(@local_fig_data_directory, 'retrieve')
|
21
|
+
|
22
|
+
if File.exist?(@metadata_file)
|
23
|
+
load_metadata()
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def switch_to_package_version(name, version)
|
28
|
+
@package_meta = @package_metadata_by_name[name]
|
29
|
+
if @package_meta && @package_meta.current_version != version
|
30
|
+
clean_up_package_files()
|
31
|
+
@package_meta = nil
|
32
|
+
end
|
33
|
+
if not @package_meta
|
34
|
+
@package_meta = reset_package_metadata_with_version(name, version)
|
35
|
+
end
|
36
|
+
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
def retrieve(source, relpath)
|
41
|
+
copy(source, relpath)
|
42
|
+
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
def prepare_for_shutdown(purged_unused_packages)
|
47
|
+
if purged_unused_packages
|
48
|
+
clean_up_unused_packages()
|
49
|
+
end
|
50
|
+
|
51
|
+
save_metadata()
|
52
|
+
|
53
|
+
return
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def load_metadata()
|
59
|
+
File.open(@metadata_file).each_line do |line|
|
60
|
+
line.strip!()
|
61
|
+
if line =~ /^(.+)=(.+)\/(.+)$/
|
62
|
+
target = $1
|
63
|
+
package_name = $2
|
64
|
+
package_version = $3
|
65
|
+
|
66
|
+
package_meta = @package_metadata_by_name[package_name]
|
67
|
+
if package_meta
|
68
|
+
if package_meta.current_version != package_version
|
69
|
+
raise "Version mismatch for #{package_meta.package_name} in #{@metadata_file}."
|
70
|
+
end
|
71
|
+
else
|
72
|
+
package_meta =
|
73
|
+
reset_package_metadata_with_version(package_name, package_version)
|
74
|
+
end
|
75
|
+
package_meta.add_file(target)
|
76
|
+
else
|
77
|
+
raise "parse error in #{file}: #{line}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
return
|
82
|
+
end
|
83
|
+
|
84
|
+
def reset_package_metadata_with_version(name, version)
|
85
|
+
metadata = @package_metadata_by_name[name]
|
86
|
+
if not metadata
|
87
|
+
metadata = Fig::WorkingDirectoryMetadata.new(name, version)
|
88
|
+
@package_metadata_by_name[name] = metadata
|
89
|
+
else
|
90
|
+
metadata.reset_with_version(version)
|
91
|
+
end
|
92
|
+
|
93
|
+
return metadata
|
94
|
+
end
|
95
|
+
|
96
|
+
def copy(source, relpath)
|
97
|
+
target = File.join(@base_dir, relpath)
|
98
|
+
if File.directory?(source)
|
99
|
+
FileUtils.mkdir_p(target)
|
100
|
+
Fig::Logging.debug "Copying directory #{source} to #{target}."
|
101
|
+
Dir.foreach(source) do |child|
|
102
|
+
if child != '.' and child != '..'
|
103
|
+
source_file = File.join(source, child)
|
104
|
+
target_file = File.join(relpath, child)
|
105
|
+
copy(source_file, target_file)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
else
|
109
|
+
if should_copy_file?(source, target)
|
110
|
+
if Fig::Logging.debug?
|
111
|
+
Fig::Logging.debug \
|
112
|
+
"Copying file from #{source} to #{target}."
|
113
|
+
else
|
114
|
+
Fig::Logging.info(
|
115
|
+
Fig::Logging::Colorizable.new(
|
116
|
+
"+ [#{formatted_meta()}] #{relpath}",
|
117
|
+
:green,
|
118
|
+
nil
|
119
|
+
)
|
120
|
+
)
|
121
|
+
end
|
122
|
+
FileUtils.mkdir_p(File.dirname(target))
|
123
|
+
|
124
|
+
# If the source is a dangling symlink, then there's no time, etc. to
|
125
|
+
# preserve.
|
126
|
+
preserve = File.exist?(source)
|
127
|
+
|
128
|
+
FileUtils.copy_entry(
|
129
|
+
source, target, preserve, false, :remove_destination
|
130
|
+
)
|
131
|
+
end
|
132
|
+
if @package_meta
|
133
|
+
@package_meta.add_file(relpath)
|
134
|
+
@package_meta.mark_as_retrieved()
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
return
|
139
|
+
end
|
140
|
+
|
141
|
+
def should_copy_file?(source, target)
|
142
|
+
if File.symlink?(target)
|
143
|
+
FileUtils.rm(target)
|
144
|
+
return true
|
145
|
+
end
|
146
|
+
|
147
|
+
return true if ! File.exist?(target)
|
148
|
+
return File.mtime(source) > File.mtime(target)
|
149
|
+
end
|
150
|
+
|
151
|
+
def clean_up_package_files(package_meta = @package_meta)
|
152
|
+
package_meta.each_file do |relpath|
|
153
|
+
Fig::Logging.info(
|
154
|
+
Fig::Logging::Colorizable.new(
|
155
|
+
"- [#{formatted_meta(package_meta)}] #{relpath}",
|
156
|
+
:magenta,
|
157
|
+
nil
|
158
|
+
)
|
159
|
+
)
|
160
|
+
FileUtils.rm_f(File.join(@base_dir, relpath))
|
161
|
+
end
|
162
|
+
|
163
|
+
return
|
164
|
+
end
|
165
|
+
|
166
|
+
def clean_up_unused_packages()
|
167
|
+
@package_metadata_by_name.each_value do
|
168
|
+
|metadata|
|
169
|
+
|
170
|
+
if not metadata.retrieved?
|
171
|
+
clean_up_package_files(metadata)
|
172
|
+
metadata.reset_with_version(nil)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
return
|
177
|
+
end
|
178
|
+
|
179
|
+
def save_metadata()
|
180
|
+
FileUtils.mkdir_p(@local_fig_data_directory)
|
181
|
+
File.open(@metadata_file, 'w') do |file|
|
182
|
+
@package_metadata_by_name.each do |name, package_meta|
|
183
|
+
package_meta.each_file do |target|
|
184
|
+
file << target << '=' << formatted_meta(package_meta) << "\n"
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
return
|
190
|
+
end
|
191
|
+
|
192
|
+
def formatted_meta(package_meta = @package_meta)
|
193
|
+
return Fig::PackageDescriptor.format(
|
194
|
+
package_meta.package_name, package_meta.current_version, nil
|
195
|
+
)
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Fig; end
|
4
|
+
|
5
|
+
# Data about a package within the current working directory.
|
6
|
+
class Fig::WorkingDirectoryMetadata
|
7
|
+
attr_reader :package_name, :current_version
|
8
|
+
|
9
|
+
def initialize(package_name, current_version = nil)
|
10
|
+
@package_name = package_name
|
11
|
+
@retrieved = false
|
12
|
+
|
13
|
+
reset_with_version(current_version)
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset_with_version(new_version)
|
17
|
+
@current_version = new_version
|
18
|
+
@files = Set.new
|
19
|
+
|
20
|
+
return
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_file(file)
|
24
|
+
@files << file
|
25
|
+
|
26
|
+
return
|
27
|
+
end
|
28
|
+
|
29
|
+
def mark_as_retrieved()
|
30
|
+
@retrieved = true
|
31
|
+
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
def retrieved?()
|
36
|
+
return @retrieved
|
37
|
+
end
|
38
|
+
|
39
|
+
# So we don't have to expose the files collection.
|
40
|
+
def each_file()
|
41
|
+
@files.each {|file| yield file}
|
42
|
+
|
43
|
+
return
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.64
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,66 +9,55 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 1.5.6
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *24220000
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: libarchive-static
|
27
|
-
requirement: &24219520 !ruby/object:Gem::Requirement
|
15
|
+
name: colorize
|
16
|
+
requirement: &25095560 !ruby/object:Gem::Requirement
|
28
17
|
none: false
|
29
18
|
requirements:
|
30
19
|
- - ! '>='
|
31
20
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
21
|
+
version: 0.5.8
|
33
22
|
type: :runtime
|
34
23
|
prerelease: false
|
35
|
-
version_requirements: *
|
24
|
+
version_requirements: *25095560
|
36
25
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: &
|
26
|
+
name: highline
|
27
|
+
requirement: &25095080 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
29
|
requirements:
|
41
30
|
- - ! '>='
|
42
31
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
32
|
+
version: 1.6.2
|
44
33
|
type: :runtime
|
45
34
|
prerelease: false
|
46
|
-
version_requirements: *
|
35
|
+
version_requirements: *25095080
|
47
36
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
37
|
+
name: json
|
38
|
+
requirement: &25094620 !ruby/object:Gem::Requirement
|
50
39
|
none: false
|
51
40
|
requirements:
|
52
41
|
- - ! '>='
|
53
42
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.6.
|
43
|
+
version: 1.6.5
|
55
44
|
type: :runtime
|
56
45
|
prerelease: false
|
57
|
-
version_requirements: *
|
46
|
+
version_requirements: *25094620
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement: &
|
48
|
+
name: libarchive-static
|
49
|
+
requirement: &25094160 !ruby/object:Gem::Requirement
|
61
50
|
none: false
|
62
51
|
requirements:
|
63
52
|
- - ! '>='
|
64
53
|
- !ruby/object:Gem::Version
|
65
|
-
version: 1.
|
54
|
+
version: 1.0.0
|
66
55
|
type: :runtime
|
67
56
|
prerelease: false
|
68
|
-
version_requirements: *
|
57
|
+
version_requirements: *25094160
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: log4r
|
71
|
-
requirement: &
|
60
|
+
requirement: &25093700 !ruby/object:Gem::Requirement
|
72
61
|
none: false
|
73
62
|
requirements:
|
74
63
|
- - ! '>='
|
@@ -76,10 +65,10 @@ dependencies:
|
|
76
65
|
version: 1.1.5
|
77
66
|
type: :runtime
|
78
67
|
prerelease: false
|
79
|
-
version_requirements: *
|
68
|
+
version_requirements: *25093700
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: net-netrc
|
82
|
-
requirement: &
|
71
|
+
requirement: &25093240 !ruby/object:Gem::Requirement
|
83
72
|
none: false
|
84
73
|
requirements:
|
85
74
|
- - ! '>='
|
@@ -87,10 +76,10 @@ dependencies:
|
|
87
76
|
version: 0.2.2
|
88
77
|
type: :runtime
|
89
78
|
prerelease: false
|
90
|
-
version_requirements: *
|
79
|
+
version_requirements: *25093240
|
91
80
|
- !ruby/object:Gem::Dependency
|
92
81
|
name: net-sftp
|
93
|
-
requirement: &
|
82
|
+
requirement: &25092780 !ruby/object:Gem::Requirement
|
94
83
|
none: false
|
95
84
|
requirements:
|
96
85
|
- - ! '>='
|
@@ -98,10 +87,10 @@ dependencies:
|
|
98
87
|
version: 2.0.4
|
99
88
|
type: :runtime
|
100
89
|
prerelease: false
|
101
|
-
version_requirements: *
|
90
|
+
version_requirements: *25092780
|
102
91
|
- !ruby/object:Gem::Dependency
|
103
92
|
name: net-ssh
|
104
|
-
requirement: &
|
93
|
+
requirement: &25092300 !ruby/object:Gem::Requirement
|
105
94
|
none: false
|
106
95
|
requirements:
|
107
96
|
- - ! '>='
|
@@ -109,10 +98,10 @@ dependencies:
|
|
109
98
|
version: 2.0.15
|
110
99
|
type: :runtime
|
111
100
|
prerelease: false
|
112
|
-
version_requirements: *
|
101
|
+
version_requirements: *25092300
|
113
102
|
- !ruby/object:Gem::Dependency
|
114
103
|
name: polyglot
|
115
|
-
requirement: &
|
104
|
+
requirement: &25091840 !ruby/object:Gem::Requirement
|
116
105
|
none: false
|
117
106
|
requirements:
|
118
107
|
- - ! '>='
|
@@ -120,10 +109,10 @@ dependencies:
|
|
120
109
|
version: 0.2.9
|
121
110
|
type: :runtime
|
122
111
|
prerelease: false
|
123
|
-
version_requirements: *
|
112
|
+
version_requirements: *25091840
|
124
113
|
- !ruby/object:Gem::Dependency
|
125
114
|
name: rdoc
|
126
|
-
requirement: &
|
115
|
+
requirement: &25091340 !ruby/object:Gem::Requirement
|
127
116
|
none: false
|
128
117
|
requirements:
|
129
118
|
- - ! '>='
|
@@ -131,10 +120,21 @@ dependencies:
|
|
131
120
|
version: '3.12'
|
132
121
|
type: :runtime
|
133
122
|
prerelease: false
|
134
|
-
version_requirements: *
|
123
|
+
version_requirements: *25091340
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: sys-admin
|
126
|
+
requirement: &25090880 !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.5.6
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: *25090880
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: treetop
|
137
|
-
requirement: &
|
137
|
+
requirement: &25090360 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
140
|
- - ! '>='
|
@@ -142,7 +142,7 @@ dependencies:
|
|
142
142
|
version: 1.4.2
|
143
143
|
type: :runtime
|
144
144
|
prerelease: false
|
145
|
-
version_requirements: *
|
145
|
+
version_requirements: *25090360
|
146
146
|
description: Fig is a utility for configuring environments and managing dependencies
|
147
147
|
across a team of developers. Given a list of packages and a command to run, Fig
|
148
148
|
builds environment variables named in those packages (e.g., CLASSPATH), then executes
|
@@ -161,6 +161,8 @@ files:
|
|
161
161
|
- bin/fig-debug
|
162
162
|
- bin/fig.bat
|
163
163
|
- lib/fig/logging/colorizable.rb
|
164
|
+
- lib/fig/workingdirectorymetadata.rb
|
165
|
+
- lib/fig/workingdirectorymaintainer.rb
|
164
166
|
- lib/fig/environment.rb
|
165
167
|
- lib/fig/configfileerror.rb
|
166
168
|
- lib/fig/urlaccesserror.rb
|
@@ -171,35 +173,39 @@ files:
|
|
171
173
|
- lib/fig/environmentvariables/caseinsensitive.rb
|
172
174
|
- lib/fig/log4r/outputter.rb
|
173
175
|
- lib/fig/packagecache.rb
|
174
|
-
- lib/fig/retriever.rb
|
175
176
|
- lib/fig/packageparseerror.rb
|
176
177
|
- lib/fig/backtrace.rb
|
177
178
|
- lib/fig/notfounderror.rb
|
178
179
|
- lib/fig/applicationconfiguration.rb
|
179
180
|
- lib/fig/logging.rb
|
180
181
|
- lib/fig/userinputerror.rb
|
181
|
-
- lib/fig/options.rb
|
182
182
|
- lib/fig/nosuchpackageconfigerror.rb
|
183
183
|
- lib/fig/networkerror.rb
|
184
184
|
- lib/fig/log4rconfigerror.rb
|
185
185
|
- lib/fig/statement/path.rb
|
186
186
|
- lib/fig/statement/set.rb
|
187
|
+
- lib/fig/statement/asset.rb
|
187
188
|
- lib/fig/statement/retrieve.rb
|
188
|
-
- lib/fig/statement/publish.rb
|
189
189
|
- lib/fig/statement/include.rb
|
190
190
|
- lib/fig/statement/override.rb
|
191
191
|
- lib/fig/statement/configuration.rb
|
192
192
|
- lib/fig/statement/resource.rb
|
193
193
|
- lib/fig/statement/archive.rb
|
194
194
|
- lib/fig/statement/command.rb
|
195
|
+
- lib/fig/atexit.rb
|
195
196
|
- lib/fig/grammar.treetop
|
197
|
+
- lib/fig/packagedescriptorparseerror.rb
|
196
198
|
- lib/fig/command/listing.rb
|
199
|
+
- lib/fig/command/optionerror.rb
|
200
|
+
- lib/fig/command/coveragesupport.rb
|
201
|
+
- lib/fig/command/options.rb
|
197
202
|
- lib/fig/command/packageload.rb
|
198
203
|
- lib/fig/packagedescriptor.rb
|
199
204
|
- lib/fig/environmentvariables.rb
|
200
205
|
- lib/fig/operatingsystem.rb
|
201
206
|
- lib/fig/repository.rb
|
202
207
|
- lib/fig/figrc.rb
|
208
|
+
- lib/fig/parserpackagebuildstate.rb
|
203
209
|
- lib/fig/command.rb
|
204
210
|
- lib/fig/statement.rb
|
205
211
|
homepage: http://github.com/mfoemmel/fig
|