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.
Files changed (43) hide show
  1. data/Changes +156 -0
  2. data/VERSION +1 -1
  3. data/bin/fig +9 -2
  4. data/bin/fig-debug +9 -2
  5. data/lib/fig/applicationconfiguration.rb +3 -2
  6. data/lib/fig/atexit.rb +37 -0
  7. data/lib/fig/backtrace.rb +23 -6
  8. data/lib/fig/command.rb +131 -31
  9. data/lib/fig/command/coveragesupport.rb +40 -0
  10. data/lib/fig/command/listing.rb +8 -8
  11. data/lib/fig/command/optionerror.rb +8 -0
  12. data/lib/fig/{options.rb → command/options.rb} +248 -144
  13. data/lib/fig/command/packageload.rb +161 -62
  14. data/lib/fig/configfileerror.rb +2 -0
  15. data/lib/fig/environment.rb +350 -246
  16. data/lib/fig/environmentvariables/casesensitive.rb +1 -1
  17. data/lib/fig/figrc.rb +78 -78
  18. data/lib/fig/grammar.treetop +204 -219
  19. data/lib/fig/log4rconfigerror.rb +2 -0
  20. data/lib/fig/operatingsystem.rb +382 -334
  21. data/lib/fig/package.rb +11 -33
  22. data/lib/fig/packagecache.rb +1 -1
  23. data/lib/fig/packagedescriptor.rb +103 -21
  24. data/lib/fig/packagedescriptorparseerror.rb +16 -0
  25. data/lib/fig/parser.rb +36 -19
  26. data/lib/fig/parserpackagebuildstate.rb +56 -0
  27. data/lib/fig/repository.rb +504 -259
  28. data/lib/fig/statement.rb +30 -12
  29. data/lib/fig/statement/archive.rb +8 -5
  30. data/lib/fig/statement/asset.rb +19 -0
  31. data/lib/fig/statement/command.rb +2 -2
  32. data/lib/fig/statement/configuration.rb +20 -20
  33. data/lib/fig/statement/include.rb +13 -34
  34. data/lib/fig/statement/override.rb +21 -7
  35. data/lib/fig/statement/path.rb +22 -2
  36. data/lib/fig/statement/resource.rb +14 -4
  37. data/lib/fig/statement/retrieve.rb +34 -4
  38. data/lib/fig/statement/set.rb +22 -2
  39. data/lib/fig/workingdirectorymaintainer.rb +197 -0
  40. data/lib/fig/workingdirectorymetadata.rb +45 -0
  41. metadata +52 -46
  42. data/lib/fig/retriever.rb +0 -141
  43. 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.62
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-04-02 00:00:00.000000000 Z
12
+ date: 2012-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: sys-admin
16
- requirement: &24220000 !ruby/object:Gem::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: 1.0.0
21
+ version: 0.5.8
33
22
  type: :runtime
34
23
  prerelease: false
35
- version_requirements: *24219520
24
+ version_requirements: *25095560
36
25
  - !ruby/object:Gem::Dependency
37
- name: colorize
38
- requirement: &24219060 !ruby/object:Gem::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: 0.5.8
32
+ version: 1.6.2
44
33
  type: :runtime
45
34
  prerelease: false
46
- version_requirements: *24219060
35
+ version_requirements: *25095080
47
36
  - !ruby/object:Gem::Dependency
48
- name: highline
49
- requirement: &24218600 !ruby/object:Gem::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.2
43
+ version: 1.6.5
55
44
  type: :runtime
56
45
  prerelease: false
57
- version_requirements: *24218600
46
+ version_requirements: *25094620
58
47
  - !ruby/object:Gem::Dependency
59
- name: json
60
- requirement: &24218140 !ruby/object:Gem::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.6.5
54
+ version: 1.0.0
66
55
  type: :runtime
67
56
  prerelease: false
68
- version_requirements: *24218140
57
+ version_requirements: *25094160
69
58
  - !ruby/object:Gem::Dependency
70
59
  name: log4r
71
- requirement: &24217680 !ruby/object:Gem::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: *24217680
68
+ version_requirements: *25093700
80
69
  - !ruby/object:Gem::Dependency
81
70
  name: net-netrc
82
- requirement: &24217220 !ruby/object:Gem::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: *24217220
79
+ version_requirements: *25093240
91
80
  - !ruby/object:Gem::Dependency
92
81
  name: net-sftp
93
- requirement: &24216740 !ruby/object:Gem::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: *24216740
90
+ version_requirements: *25092780
102
91
  - !ruby/object:Gem::Dependency
103
92
  name: net-ssh
104
- requirement: &24216280 !ruby/object:Gem::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: *24216280
101
+ version_requirements: *25092300
113
102
  - !ruby/object:Gem::Dependency
114
103
  name: polyglot
115
- requirement: &24215820 !ruby/object:Gem::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: *24215820
112
+ version_requirements: *25091840
124
113
  - !ruby/object:Gem::Dependency
125
114
  name: rdoc
126
- requirement: &24215360 !ruby/object:Gem::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: *24215360
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: &24214900 !ruby/object:Gem::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: *24214900
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