cfoundry 0.5.3.rc2 → 0.5.3.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +0 -30
- data/lib/cc_api_stub/helper.rb +6 -2
- data/lib/cfoundry/upload_helpers.rb +75 -31
- data/lib/cfoundry/version.rb +1 -1
- data/spec/cfoundry/upload_helpers_spec.rb +24 -4
- data/spec/fixtures/apps/with_external_symlink/foo +1 -0
- data/spec/fixtures/apps/with_ignored_external_symlink/foo +1 -0
- data/spec/fixtures/apps/with_vmcignore/ambiguous_ignored +0 -0
- data/spec/fixtures/apps/with_vmcignore/non_ignored_dir/toplevel_ignored.txt +0 -0
- data/spec/fixtures/apps/with_vmcignore/toplevel_ignored.txt +0 -0
- metadata +54 -44
data/Rakefile
CHANGED
@@ -6,33 +6,3 @@ require "cfoundry/version"
|
|
6
6
|
|
7
7
|
RSpec::Core::RakeTask.new(:spec)
|
8
8
|
task :default => :spec
|
9
|
-
|
10
|
-
namespace :deploy do
|
11
|
-
def last_staging_sha
|
12
|
-
`git rev-parse latest-staging`.strip
|
13
|
-
end
|
14
|
-
|
15
|
-
def last_release_sha
|
16
|
-
`git rev-parse latest-release`.strip
|
17
|
-
end
|
18
|
-
|
19
|
-
def last_staging_ref_was_released?
|
20
|
-
last_staging_sha == last_release_sha
|
21
|
-
end
|
22
|
-
|
23
|
-
task :staging, :version do |_, args|
|
24
|
-
sh "gem bump --push #{"--version #{args.version}" if args.version}" if last_staging_ref_was_released?
|
25
|
-
sh "git tag -f latest-staging"
|
26
|
-
sh "git push origin :latest-staging"
|
27
|
-
sh "git push origin latest-staging"
|
28
|
-
end
|
29
|
-
|
30
|
-
task :gem do
|
31
|
-
sh "git fetch"
|
32
|
-
sh "git checkout #{last_staging_sha}"
|
33
|
-
sh "gem release --tag"
|
34
|
-
sh "git tag -f latest-release"
|
35
|
-
sh "git push origin :latest-release"
|
36
|
-
sh "git push origin latest-release"
|
37
|
-
end
|
38
|
-
end
|
data/lib/cc_api_stub/helper.rb
CHANGED
@@ -29,8 +29,12 @@ module CcApiStub
|
|
29
29
|
to_return(response(400, error_attributes))
|
30
30
|
end
|
31
31
|
|
32
|
-
def load_fixtures(
|
33
|
-
path =
|
32
|
+
def load_fixtures(fixture_name_or_path, options = {})
|
33
|
+
path = if options.delete(:use_local_fixture)
|
34
|
+
fixture_name_or_path
|
35
|
+
else
|
36
|
+
File.join(File.dirname(__FILE__), "..", "..", "spec/fixtures/#{fixture_name_or_path.to_s}.json")
|
37
|
+
end
|
34
38
|
JSON.parse(File.read(path)).tap do |fixture|
|
35
39
|
fixture["entity"].merge!(options.stringify_keys) if options.any?
|
36
40
|
end
|
@@ -59,46 +59,26 @@ module CFoundry
|
|
59
59
|
elsif war_file = Dir.glob("#{path}/*.war").first
|
60
60
|
CFoundry::Zip.unpack(war_file, to)
|
61
61
|
else
|
62
|
-
check_unreachable_links(path)
|
63
|
-
|
64
62
|
FileUtils.mkdir(to)
|
65
63
|
|
66
|
-
files = Dir.glob("#{path}/{*,.[^\.]*}")
|
67
|
-
|
68
64
|
exclude = UPLOAD_EXCLUDE
|
69
65
|
if File.exists?("#{path}/.vmcignore")
|
70
66
|
exclude += File.read("#{path}/.vmcignore").split(/\n+/)
|
71
67
|
end
|
72
68
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
File.fnmatch(f.sub(path + "/", ""), e)
|
77
|
-
end
|
78
|
-
end
|
69
|
+
files = files_to_consider(path, exclude)
|
70
|
+
|
71
|
+
check_unreachable_links(files, path)
|
79
72
|
|
80
|
-
|
73
|
+
copy_tree(files, path, to)
|
81
74
|
|
82
75
|
find_sockets(to).each do |s|
|
83
76
|
File.delete s
|
84
77
|
end
|
85
|
-
|
86
|
-
# remove ignored globs more thoroughly
|
87
|
-
#
|
88
|
-
# note that the above file list only includes toplevel
|
89
|
-
# files/directories for cp_r, so this is where sub-files/etc. are
|
90
|
-
# removed
|
91
|
-
exclude.each do |e|
|
92
|
-
Dir.glob("#{to}/#{e}").each do |f|
|
93
|
-
FileUtils.rm_rf(f)
|
94
|
-
end
|
95
|
-
end
|
96
78
|
end
|
97
79
|
end
|
98
80
|
|
99
|
-
def check_unreachable_links(path)
|
100
|
-
files = Dir.glob("#{path}/**/*", File::FNM_DOTMATCH)
|
101
|
-
|
81
|
+
def check_unreachable_links(files, path)
|
102
82
|
# only used for friendlier error message
|
103
83
|
pwd = Pathname.pwd
|
104
84
|
|
@@ -118,9 +98,54 @@ module CFoundry
|
|
118
98
|
end
|
119
99
|
end
|
120
100
|
|
101
|
+
# TODO: handle negation
|
102
|
+
def files_to_consider(path, exclusions)
|
103
|
+
entries = all_files(path)
|
104
|
+
|
105
|
+
to_exclude = exclusions.dup
|
106
|
+
until to_exclude.empty?
|
107
|
+
exclude = to_exclude.shift
|
108
|
+
|
109
|
+
entries.reject! do |entry|
|
110
|
+
is_dir = File.directory?(entry)
|
111
|
+
excluded = glob_matches?(entry, path, exclude)
|
112
|
+
|
113
|
+
if is_dir && excluded
|
114
|
+
# if a directory was excluded, exclude its contents
|
115
|
+
to_exclude.unshift(entry.sub(path + "/", "/") + "/**")
|
116
|
+
end
|
117
|
+
|
118
|
+
excluded
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
entries
|
123
|
+
end
|
124
|
+
|
125
|
+
def glob_matches?(file, path, pattern)
|
126
|
+
name = file.sub("#{path}/", "/")
|
127
|
+
flags = File::FNM_DOTMATCH
|
128
|
+
|
129
|
+
# when pattern ends with /, match only directories
|
130
|
+
if pattern.end_with?("/") && File.directory?(file)
|
131
|
+
name = "#{name}/"
|
132
|
+
end
|
133
|
+
|
134
|
+
case pattern
|
135
|
+
# when pattern contains /, do a pathname match
|
136
|
+
when /\/./
|
137
|
+
flags |= File::FNM_PATHNAME
|
138
|
+
|
139
|
+
# otherwise, match any file path
|
140
|
+
else
|
141
|
+
pattern = "**/#{pattern}"
|
142
|
+
end
|
143
|
+
|
144
|
+
File.fnmatch(pattern, name, flags)
|
145
|
+
end
|
146
|
+
|
121
147
|
def find_sockets(path)
|
122
|
-
|
123
|
-
files && files.select { |f| File.socket? f }
|
148
|
+
all_files(path).select { |f| File.socket? f }
|
124
149
|
end
|
125
150
|
|
126
151
|
def determine_resources(path)
|
@@ -150,14 +175,13 @@ module CFoundry
|
|
150
175
|
# This ensures that directories containing empty directories
|
151
176
|
# are also pruned.
|
152
177
|
def prune_empty_directories(path)
|
153
|
-
all_files =
|
154
|
-
all_files.reject! { |fn| fn =~ /\/\.+$/ }
|
178
|
+
all_files = all_files(path)
|
155
179
|
|
156
180
|
directories = all_files.select { |x| File.directory?(x) }
|
157
181
|
directories.sort! { |a, b| b.size <=> a.size }
|
158
182
|
|
159
183
|
directories.each do |directory|
|
160
|
-
entries =
|
184
|
+
entries = all_files(directory)
|
161
185
|
FileUtils.rmdir(directory) if entries.empty?
|
162
186
|
end
|
163
187
|
end
|
@@ -166,7 +190,7 @@ module CFoundry
|
|
166
190
|
fingerprints = []
|
167
191
|
total_size = 0
|
168
192
|
|
169
|
-
|
193
|
+
all_files(path).each do |filename|
|
170
194
|
next if File.directory?(filename)
|
171
195
|
|
172
196
|
size = File.size(filename)
|
@@ -182,5 +206,25 @@ module CFoundry
|
|
182
206
|
|
183
207
|
[fingerprints, total_size]
|
184
208
|
end
|
209
|
+
|
210
|
+
def all_files(path)
|
211
|
+
Dir.glob("#{path}/**/*", File::FNM_DOTMATCH).reject! do |fn|
|
212
|
+
fn =~ /\.$/
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def copy_tree(files, path, to)
|
217
|
+
files.each do |file|
|
218
|
+
dest = file.sub("#{path}/", "#{to}/")
|
219
|
+
|
220
|
+
if File.directory?(file)
|
221
|
+
FileUtils.mkdir_p(dest)
|
222
|
+
else
|
223
|
+
destdir = File.dirname(dest)
|
224
|
+
FileUtils.mkdir_p(destdir)
|
225
|
+
FileUtils.cp(file, dest)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
185
229
|
end
|
186
230
|
end
|
data/lib/cfoundry/version.rb
CHANGED
@@ -95,12 +95,14 @@ describe CFoundry::UploadHelpers do
|
|
95
95
|
subject
|
96
96
|
end
|
97
97
|
|
98
|
-
it 'does not include files and directories specified in the vmcignore
|
98
|
+
it 'does not include files and directories specified in the vmcignore' do
|
99
99
|
mock_zip do |src, _|
|
100
100
|
files = relative_glob(src)
|
101
|
-
expect(files).
|
102
|
-
|
103
|
-
|
101
|
+
expect(files).to match_array(%w[
|
102
|
+
.hidden_file .vmcignore non_ignored_dir ambiguous_ignored
|
103
|
+
non_ignored_dir/file_in_non_ignored_dir.txt non_ignored_file.txt
|
104
|
+
non_ignored_dir/toplevel_ignored.txt
|
105
|
+
])
|
104
106
|
end
|
105
107
|
subject
|
106
108
|
end
|
@@ -170,5 +172,23 @@ describe CFoundry::UploadHelpers do
|
|
170
172
|
fake_model.upload(path)
|
171
173
|
end
|
172
174
|
end
|
175
|
+
|
176
|
+
context "when there is a symlink pointing outside of the root" do
|
177
|
+
let(:path) { "#{SPEC_ROOT}/fixtures/apps/with_external_symlink" }
|
178
|
+
|
179
|
+
it "blows up" do
|
180
|
+
expect {
|
181
|
+
fake_model.upload(path)
|
182
|
+
}.to raise_error(CFoundry::Error, /contains links.*that point outside/)
|
183
|
+
end
|
184
|
+
|
185
|
+
context "and it is vmcignored" do
|
186
|
+
let(:path) { "#{SPEC_ROOT}/fixtures/apps/with_ignored_external_symlink" }
|
187
|
+
|
188
|
+
it "ignores it" do
|
189
|
+
expect { fake_model.upload(path) }.to_not raise_error
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
173
193
|
end
|
174
194
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
foo
|
@@ -0,0 +1 @@
|
|
1
|
+
foo
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfoundry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1230613173
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 5
|
9
9
|
- 3
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 0.5.3.
|
11
|
+
- 3
|
12
|
+
version: 0.5.3.rc3
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Cloud Foundry Team
|
@@ -18,10 +18,12 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date: 2013-03-
|
21
|
+
date: 2013-03-08 00:00:00 Z
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
24
|
+
name: multipart-post
|
25
|
+
prerelease: false
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
27
|
none: false
|
26
28
|
requirements:
|
27
29
|
- - ~>
|
@@ -31,12 +33,12 @@ dependencies:
|
|
31
33
|
- 1
|
32
34
|
- 1
|
33
35
|
version: "1.1"
|
34
|
-
prerelease: false
|
35
36
|
type: :runtime
|
36
|
-
|
37
|
-
requirement: *id001
|
37
|
+
version_requirements: *id001
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
39
|
+
name: multi_json
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
42
|
none: false
|
41
43
|
requirements:
|
42
44
|
- - ~>
|
@@ -46,12 +48,12 @@ dependencies:
|
|
46
48
|
- 1
|
47
49
|
- 3
|
48
50
|
version: "1.3"
|
49
|
-
prerelease: false
|
50
51
|
type: :runtime
|
51
|
-
|
52
|
-
requirement: *id002
|
52
|
+
version_requirements: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
|
54
|
+
name: rubyzip
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
57
|
none: false
|
56
58
|
requirements:
|
57
59
|
- - ~>
|
@@ -61,12 +63,12 @@ dependencies:
|
|
61
63
|
- 0
|
62
64
|
- 9
|
63
65
|
version: "0.9"
|
64
|
-
prerelease: false
|
65
66
|
type: :runtime
|
66
|
-
|
67
|
-
requirement: *id003
|
67
|
+
version_requirements: *id003
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
|
-
|
69
|
+
name: cf-uaa-lib
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
72
|
none: false
|
71
73
|
requirements:
|
72
74
|
- - ~>
|
@@ -77,12 +79,12 @@ dependencies:
|
|
77
79
|
- 3
|
78
80
|
- 3
|
79
81
|
version: 1.3.3
|
80
|
-
prerelease: false
|
81
82
|
type: :runtime
|
82
|
-
|
83
|
-
requirement: *id004
|
83
|
+
version_requirements: *id004
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
|
-
|
85
|
+
name: rake
|
86
|
+
prerelease: false
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
86
88
|
none: false
|
87
89
|
requirements:
|
88
90
|
- - ~>
|
@@ -92,12 +94,12 @@ dependencies:
|
|
92
94
|
- 0
|
93
95
|
- 9
|
94
96
|
version: "0.9"
|
95
|
-
prerelease: false
|
96
97
|
type: :development
|
97
|
-
|
98
|
-
requirement: *id005
|
98
|
+
version_requirements: *id005
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
|
-
|
100
|
+
name: rspec
|
101
|
+
prerelease: false
|
102
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
103
|
none: false
|
102
104
|
requirements:
|
103
105
|
- - ~>
|
@@ -107,12 +109,12 @@ dependencies:
|
|
107
109
|
- 2
|
108
110
|
- 11
|
109
111
|
version: "2.11"
|
110
|
-
prerelease: false
|
111
112
|
type: :development
|
112
|
-
|
113
|
-
requirement: *id006
|
113
|
+
version_requirements: *id006
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
|
-
|
115
|
+
name: webmock
|
116
|
+
prerelease: false
|
117
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
116
118
|
none: false
|
117
119
|
requirements:
|
118
120
|
- - ~>
|
@@ -122,12 +124,12 @@ dependencies:
|
|
122
124
|
- 1
|
123
125
|
- 9
|
124
126
|
version: "1.9"
|
125
|
-
prerelease: false
|
126
127
|
type: :development
|
127
|
-
|
128
|
-
requirement: *id007
|
128
|
+
version_requirements: *id007
|
129
129
|
- !ruby/object:Gem::Dependency
|
130
|
-
|
130
|
+
name: rr
|
131
|
+
prerelease: false
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
131
133
|
none: false
|
132
134
|
requirements:
|
133
135
|
- - ~>
|
@@ -137,12 +139,12 @@ dependencies:
|
|
137
139
|
- 1
|
138
140
|
- 0
|
139
141
|
version: "1.0"
|
140
|
-
prerelease: false
|
141
142
|
type: :development
|
142
|
-
|
143
|
-
requirement: *id008
|
143
|
+
version_requirements: *id008
|
144
144
|
- !ruby/object:Gem::Dependency
|
145
|
-
|
145
|
+
name: gem-release
|
146
|
+
prerelease: false
|
147
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
146
148
|
none: false
|
147
149
|
requirements:
|
148
150
|
- - ">="
|
@@ -151,12 +153,12 @@ dependencies:
|
|
151
153
|
segments:
|
152
154
|
- 0
|
153
155
|
version: "0"
|
154
|
-
prerelease: false
|
155
156
|
type: :development
|
156
|
-
|
157
|
-
requirement: *id009
|
157
|
+
version_requirements: *id009
|
158
158
|
- !ruby/object:Gem::Dependency
|
159
|
-
|
159
|
+
name: timecop
|
160
|
+
prerelease: false
|
161
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
160
162
|
none: false
|
161
163
|
requirements:
|
162
164
|
- - ">="
|
@@ -165,10 +167,8 @@ dependencies:
|
|
165
167
|
segments:
|
166
168
|
- 0
|
167
169
|
version: "0"
|
168
|
-
prerelease: false
|
169
170
|
type: :development
|
170
|
-
|
171
|
-
requirement: *id010
|
171
|
+
version_requirements: *id010
|
172
172
|
description:
|
173
173
|
email:
|
174
174
|
- vcap-dev@googlegroups.com
|
@@ -284,13 +284,18 @@ files:
|
|
284
284
|
- spec/fakes/space_fake.rb
|
285
285
|
- spec/fakes/user_fake.rb
|
286
286
|
- spec/fixtures/apps/with_dotfiles/xyz
|
287
|
+
- spec/fixtures/apps/with_external_symlink/foo
|
288
|
+
- spec/fixtures/apps/with_ignored_external_symlink/foo
|
287
289
|
- spec/fixtures/apps/with_nested_directories/foo/bar/baz/fizz
|
288
290
|
- spec/fixtures/apps/with_nested_directories/xyz
|
291
|
+
- spec/fixtures/apps/with_vmcignore/ambiguous_ignored
|
289
292
|
- spec/fixtures/apps/with_vmcignore/ignored_dir/file_in_ignored_dir.txt
|
290
293
|
- spec/fixtures/apps/with_vmcignore/ignored_file.txt
|
291
294
|
- spec/fixtures/apps/with_vmcignore/non_ignored_dir/file_in_non_ignored_dir.txt
|
292
295
|
- spec/fixtures/apps/with_vmcignore/non_ignored_dir/ignored_file.txt
|
296
|
+
- spec/fixtures/apps/with_vmcignore/non_ignored_dir/toplevel_ignored.txt
|
293
297
|
- spec/fixtures/apps/with_vmcignore/non_ignored_file.txt
|
298
|
+
- spec/fixtures/apps/with_vmcignore/toplevel_ignored.txt
|
294
299
|
- spec/fixtures/empty_file
|
295
300
|
- spec/fixtures/fake_cc_application.json
|
296
301
|
- spec/fixtures/fake_cc_application_summary.json
|
@@ -405,13 +410,18 @@ test_files:
|
|
405
410
|
- spec/fakes/space_fake.rb
|
406
411
|
- spec/fakes/user_fake.rb
|
407
412
|
- spec/fixtures/apps/with_dotfiles/xyz
|
413
|
+
- spec/fixtures/apps/with_external_symlink/foo
|
414
|
+
- spec/fixtures/apps/with_ignored_external_symlink/foo
|
408
415
|
- spec/fixtures/apps/with_nested_directories/foo/bar/baz/fizz
|
409
416
|
- spec/fixtures/apps/with_nested_directories/xyz
|
417
|
+
- spec/fixtures/apps/with_vmcignore/ambiguous_ignored
|
410
418
|
- spec/fixtures/apps/with_vmcignore/ignored_dir/file_in_ignored_dir.txt
|
411
419
|
- spec/fixtures/apps/with_vmcignore/ignored_file.txt
|
412
420
|
- spec/fixtures/apps/with_vmcignore/non_ignored_dir/file_in_non_ignored_dir.txt
|
413
421
|
- spec/fixtures/apps/with_vmcignore/non_ignored_dir/ignored_file.txt
|
422
|
+
- spec/fixtures/apps/with_vmcignore/non_ignored_dir/toplevel_ignored.txt
|
414
423
|
- spec/fixtures/apps/with_vmcignore/non_ignored_file.txt
|
424
|
+
- spec/fixtures/apps/with_vmcignore/toplevel_ignored.txt
|
415
425
|
- spec/fixtures/empty_file
|
416
426
|
- spec/fixtures/fake_cc_application.json
|
417
427
|
- spec/fixtures/fake_cc_application_summary.json
|