cookbook-omnifetch 0.2.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +11 -0
- data/Gemfile +6 -1
- data/README.md +3 -4
- data/Rakefile +17 -0
- data/cookbook-omnifetch.gemspec +17 -17
- data/lib/cookbook-omnifetch.rb +3 -3
- data/lib/cookbook-omnifetch/artifactserver.rb +9 -26
- data/lib/cookbook-omnifetch/base.rb +1 -1
- data/lib/cookbook-omnifetch/chef_server.rb +108 -0
- data/lib/cookbook-omnifetch/exceptions.rb +3 -3
- data/lib/cookbook-omnifetch/git.rb +21 -21
- data/lib/cookbook-omnifetch/integration.rb +1 -2
- data/lib/cookbook-omnifetch/path.rb +3 -3
- data/lib/cookbook-omnifetch/version.rb +1 -1
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb +3 -3
- data/spec/fixtures/cookbooks/example_cookbook/metadata.rb +3 -3
- data/spec/spec_helper.rb +4 -5
- data/spec/unit/artifactserver_spec.rb +10 -9
- data/spec/unit/base_spec.rb +35 -35
- data/spec/unit/chef_server_spec.rb +75 -0
- data/spec/unit/exceptions_spec.rb +2 -2
- data/spec/unit/git_spec.rb +97 -98
- data/spec/unit/path_spec.rb +42 -42
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed71a5a2de183598b020865f4c09f5442e15ee13
|
4
|
+
data.tar.gz: 05911931abea5ef8742300be91f55bdffff9bd73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae1de192ff0125bfd70e08addaf18e14fe081e92cc85e13a0c07b6e3c9f0cc4aa25b390c3bececf72177a74dc4076a8b0d145c07c15cf8716f7ae156b875e02d
|
7
|
+
data.tar.gz: 8624065514fa015f4d2e292ebea63215715848a1c188e8dd00e46291cbd4bb68e0e512430575b8844a65cd26fb9d9ecde5a189bee6219eeb439a5808365dd0b2
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# CookbookOmnifetch
|
2
2
|
|
3
3
|
`CookbookOmnifetch` provides library code for fetching Chef cookbooks
|
4
|
-
from an artifact server (usually
|
4
|
+
from an artifact server (usually https://supermarket.chef.io),
|
5
5
|
git/github, a local path, or a chef-server to a local cache for
|
6
6
|
developement.
|
7
7
|
|
@@ -73,14 +73,13 @@ CookbookOmnifetch.init(dependency, path: "~/chef-cookbooks/apache2")
|
|
73
73
|
|
74
74
|
## Contributing
|
75
75
|
|
76
|
-
|
77
|
-
[agree to the contributor license agreement.](https://supermarket.getchef.com/become-a-contributor)
|
76
|
+
For information on contributing to this project, see https://github.com/chef/chef/blob/master/CONTRIBUTING.md
|
78
77
|
|
79
78
|
After that:
|
80
79
|
|
81
80
|
1. Fork it
|
82
81
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
83
|
-
3. Commit your changes (`git commit -
|
82
|
+
3. Commit your changes (`git commit -asm 'Add some feature'`)
|
84
83
|
4. Push to the branch (`git push origin my-new-feature`)
|
85
84
|
5. Create a new Pull Request
|
86
85
|
|
data/Rakefile
CHANGED
@@ -1,2 +1,19 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
2
3
|
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
desc "Run tests for Travis CI"
|
9
|
+
task ci: [:style, :spec]
|
10
|
+
|
11
|
+
begin
|
12
|
+
require "chefstyle"
|
13
|
+
require "rubocop/rake_task"
|
14
|
+
RuboCop::RakeTask.new(:style) do |task|
|
15
|
+
task.options += ["--display-cop-names", "--no-color"]
|
16
|
+
end
|
17
|
+
rescue LoadError
|
18
|
+
puts "chefstyle/rubocop is not available. gem install chefstyle to do style checking."
|
19
|
+
end
|
data/cookbook-omnifetch.gemspec
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "cookbook-omnifetch/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "cookbook-omnifetch"
|
8
8
|
spec.version = CookbookOmnifetch::VERSION
|
9
9
|
spec.authors = [
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
"Jamie Winsor",
|
11
|
+
"Josiah Kiehl",
|
12
|
+
"Michael Ivey",
|
13
|
+
"Justin Campbell",
|
14
|
+
"Seth Vargo",
|
15
|
+
"Daniel DeLeo",
|
16
16
|
]
|
17
|
-
spec.email
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
spec.email = [
|
18
|
+
"jamie@vialstudios.com",
|
19
|
+
"jkiehl@riotgames.com",
|
20
|
+
"michael.ivey@riotgames.com",
|
21
|
+
"justin@justincampbell.me",
|
22
|
+
"sethvargo@gmail.com",
|
23
|
+
"dan@getchef.com",
|
24
24
|
]
|
25
25
|
spec.summary = %q{Library code to fetch Chef cookbooks from a variety of sources to a local cache}
|
26
26
|
spec.homepage = "http://www.getchef.com/"
|
@@ -31,9 +31,9 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.test_files = spec.files.grep(%r{^spec/})
|
32
32
|
spec.require_paths = ["lib"]
|
33
33
|
|
34
|
-
spec.add_dependency "
|
34
|
+
spec.add_dependency "mixlib-archive", "~> 0.2"
|
35
35
|
|
36
36
|
spec.add_development_dependency "rake", "~> 10.3"
|
37
|
-
spec.add_development_dependency
|
37
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
38
38
|
|
39
39
|
end
|
data/lib/cookbook-omnifetch.rb
CHANGED
@@ -6,7 +6,7 @@ require "cookbook-omnifetch/git"
|
|
6
6
|
require "cookbook-omnifetch/github"
|
7
7
|
require "cookbook-omnifetch/path"
|
8
8
|
require "cookbook-omnifetch/artifactserver"
|
9
|
-
|
9
|
+
require "cookbook-omnifetch/chef_server"
|
10
10
|
|
11
11
|
module CookbookOmnifetch
|
12
12
|
|
@@ -42,8 +42,8 @@ module CookbookOmnifetch
|
|
42
42
|
def self.which(executable)
|
43
43
|
if File.file?(executable) && File.executable?(executable)
|
44
44
|
executable
|
45
|
-
elsif ENV[
|
46
|
-
path = ENV[
|
45
|
+
elsif ENV["PATH"]
|
46
|
+
path = ENV["PATH"].split(File::PATH_SEPARATOR).find do |p|
|
47
47
|
File.executable?(File.join(p, executable))
|
48
48
|
end
|
49
49
|
path && File.expand_path(executable, path)
|
@@ -1,9 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "cookbook-omnifetch/base"
|
2
2
|
|
3
|
-
|
4
|
-
require
|
5
|
-
require 'archive/tar/minitar'
|
6
|
-
require 'tmpdir'
|
3
|
+
require "mixlib/archive"
|
4
|
+
require "tmpdir"
|
7
5
|
|
8
6
|
module CookbookOmnifetch
|
9
7
|
|
@@ -48,12 +46,8 @@ module CookbookOmnifetch
|
|
48
46
|
|
49
47
|
FileUtils.mkdir_p(staging_root) unless staging_root.exist?
|
50
48
|
Dir.mktmpdir(nil, staging_root) do |staging_dir|
|
51
|
-
|
52
|
-
|
53
|
-
tar.each do |e|
|
54
|
-
tar.extract_entry(staging_dir, e)
|
55
|
-
end
|
56
|
-
end
|
49
|
+
Mixlib::Archive.new(cache_path).extract(staging_dir, perms: false,
|
50
|
+
ignore: /^\./)
|
57
51
|
staged_cookbook_path = File.join(staging_dir, cookbook_name)
|
58
52
|
validate_cached!(staged_cookbook_path)
|
59
53
|
FileUtils.mv(staged_cookbook_path, install_path)
|
@@ -91,8 +85,8 @@ module CookbookOmnifetch
|
|
91
85
|
|
92
86
|
def lock_data
|
93
87
|
out = {}
|
94
|
-
out[
|
95
|
-
out[
|
88
|
+
out["artifactserver"] = uri
|
89
|
+
out["version"] = cookbook_version
|
96
90
|
out
|
97
91
|
end
|
98
92
|
|
@@ -104,24 +98,13 @@ module CookbookOmnifetch
|
|
104
98
|
"#to_lock must be implemented on #{self.class.name}!"
|
105
99
|
end
|
106
100
|
|
107
|
-
|
108
|
-
def ==(other)
|
109
|
-
raise 'TODO'
|
110
|
-
other.is_a?(GitLocation) &&
|
111
|
-
other.uri == uri &&
|
112
|
-
other.branch == branch &&
|
113
|
-
other.tag == tag &&
|
114
|
-
other.shortref == shortref &&
|
115
|
-
other.rel == rel
|
116
|
-
end
|
117
|
-
|
118
101
|
# The path where all pristine tarballs from an artifactserver are held.
|
119
102
|
# Tarballs are moved/swapped into this location once they have been staged
|
120
103
|
# in a co-located staging directory.
|
121
104
|
#
|
122
105
|
# @return [Pathname]
|
123
106
|
def cache_root
|
124
|
-
Pathname.new(CookbookOmnifetch.cache_path).join(
|
107
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactserver")
|
125
108
|
end
|
126
109
|
|
127
110
|
# The path where tarballs are downloaded to and unzipped. On certain platforms
|
@@ -135,7 +118,7 @@ module CookbookOmnifetch
|
|
135
118
|
#
|
136
119
|
# @return [Pathname]
|
137
120
|
def staging_root
|
138
|
-
Pathname.new(CookbookOmnifetch.cache_path).join(
|
121
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactserver")
|
139
122
|
end
|
140
123
|
|
141
124
|
# The path where the pristine tarball is cached
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require "cookbook-omnifetch/base"
|
2
|
+
|
3
|
+
module CookbookOmnifetch
|
4
|
+
class CookbookMetadata
|
5
|
+
|
6
|
+
FILE_TYPES = [
|
7
|
+
:resources,
|
8
|
+
:providers,
|
9
|
+
:recipes,
|
10
|
+
:definitions,
|
11
|
+
:libraries,
|
12
|
+
:attributes,
|
13
|
+
:files,
|
14
|
+
:templates,
|
15
|
+
:root_files,
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
def initialize(metadata)
|
19
|
+
@metadata = metadata
|
20
|
+
end
|
21
|
+
|
22
|
+
def files(&block)
|
23
|
+
FILE_TYPES.each do |type|
|
24
|
+
next unless @metadata.has_key?(type.to_s)
|
25
|
+
|
26
|
+
@metadata[type.to_s].each do |file|
|
27
|
+
yield file["url"], file["path"]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ChefserverLocation < BaseLocation
|
34
|
+
|
35
|
+
attr_reader :cookbook_version
|
36
|
+
|
37
|
+
def initialize(dependency, options = {})
|
38
|
+
super
|
39
|
+
@cookbook_version = options[:version]
|
40
|
+
@http_client = options[:http_client]
|
41
|
+
@uri ||= options[:artifactserver]
|
42
|
+
end
|
43
|
+
|
44
|
+
def repo_host
|
45
|
+
@host ||= URI.parse(uri).host
|
46
|
+
end
|
47
|
+
|
48
|
+
def cookbook_name
|
49
|
+
dependency.name
|
50
|
+
end
|
51
|
+
|
52
|
+
def install
|
53
|
+
FileUtils.mkdir_p(staging_root) unless staging_root.exist?
|
54
|
+
md = http_client.get("/cookbooks/#{cookbook_name}/#{cookbook_version}")
|
55
|
+
CookbookMetadata.new(md).files do |url, path|
|
56
|
+
stage = staging_path.join(path)
|
57
|
+
FileUtils.mkdir_p(File.dirname(stage))
|
58
|
+
|
59
|
+
http_client.streaming_request(url) do |tempfile|
|
60
|
+
tempfile.close
|
61
|
+
FileUtils.mv(tempfile.path, stage)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
FileUtils.mv(staging_path, install_path)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Determine if this revision is installed.
|
68
|
+
#
|
69
|
+
# @return [Boolean]
|
70
|
+
def installed?
|
71
|
+
install_path.exist?
|
72
|
+
end
|
73
|
+
|
74
|
+
def http_client
|
75
|
+
@http_client
|
76
|
+
end
|
77
|
+
|
78
|
+
# The path where this cookbook would live in the store, if it were
|
79
|
+
# installed.
|
80
|
+
#
|
81
|
+
# @return [Pathname, nil]
|
82
|
+
def install_path
|
83
|
+
@install_path ||= CookbookOmnifetch.storage_path.join(cache_key)
|
84
|
+
end
|
85
|
+
|
86
|
+
def cache_key
|
87
|
+
"#{dependency.name}-#{cookbook_version}"
|
88
|
+
end
|
89
|
+
|
90
|
+
# The path where tarballs are downloaded to and unzipped. On certain platforms
|
91
|
+
# you have a better chance of getting an atomic move if your temporary working
|
92
|
+
# directory is on the same device/volume as the destination. To support this,
|
93
|
+
# we use a staging directory located under the cache path under the rather mild
|
94
|
+
# assumption that everything under the cache path is going to be on one device.
|
95
|
+
#
|
96
|
+
# Do not create anything under this directory that isn't randomly named and
|
97
|
+
# remember to release your files once you are done.
|
98
|
+
#
|
99
|
+
# @return [Pathname]
|
100
|
+
def staging_root
|
101
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactserver")
|
102
|
+
end
|
103
|
+
|
104
|
+
def staging_path
|
105
|
+
staging_root.join(cache_key)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -20,9 +20,9 @@ module CookbookOmnifetch
|
|
20
20
|
|
21
21
|
class GitNotInstalled < GitError
|
22
22
|
def initialize
|
23
|
-
super
|
24
|
-
|
25
|
-
|
23
|
+
super "You need to install Git before you can download " \
|
24
|
+
"cookbooks from git repositories. For more information, please " \
|
25
|
+
"see the Git docs: http://git-scm.org."
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "tmpdir"
|
2
|
+
require "cookbook-omnifetch"
|
3
|
+
require "cookbook-omnifetch/base"
|
4
|
+
require "cookbook-omnifetch/exceptions"
|
5
5
|
|
6
6
|
module CookbookOmnifetch
|
7
7
|
class GitLocation < BaseLocation
|
@@ -23,7 +23,7 @@ module CookbookOmnifetch
|
|
23
23
|
@rel = options[:rel]
|
24
24
|
|
25
25
|
# The revision to parse
|
26
|
-
@rev_parse = options[:ref] || options[:branch] || options[:tag] ||
|
26
|
+
@rev_parse = options[:ref] || options[:branch] || options[:tag] || "master"
|
27
27
|
end
|
28
28
|
|
29
29
|
# @see BaseLoation#installed?
|
@@ -41,26 +41,26 @@ module CookbookOmnifetch
|
|
41
41
|
|
42
42
|
if cached?
|
43
43
|
Dir.chdir(cache_path) do
|
44
|
-
git
|
44
|
+
git %{fetch --force --tags #{uri} "refs/heads/*:refs/heads/*"}
|
45
45
|
end
|
46
46
|
else
|
47
|
-
git
|
47
|
+
git %{clone #{uri} "#{cache_path}" --bare --no-hardlinks}
|
48
48
|
end
|
49
49
|
|
50
50
|
Dir.chdir(cache_path) do
|
51
|
-
@revision ||= git
|
51
|
+
@revision ||= git %{rev-parse #{@rev_parse}}
|
52
52
|
end
|
53
53
|
|
54
54
|
# Clone into a scratch directory for validations
|
55
|
-
git
|
55
|
+
git %{clone --no-checkout "#{cache_path}" "#{scratch_path}"}
|
56
56
|
|
57
57
|
# Make sure the scratch directory is up-to-date and account for rel paths
|
58
58
|
Dir.chdir(scratch_path) do
|
59
|
-
git
|
60
|
-
git
|
59
|
+
git %{fetch --force --tags "#{cache_path}"}
|
60
|
+
git %{reset --hard #{@revision}}
|
61
61
|
|
62
62
|
if rel
|
63
|
-
git
|
63
|
+
git %{filter-branch --subdirectory-filter "#{rel}" --force}
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -72,7 +72,7 @@ module CookbookOmnifetch
|
|
72
72
|
FileUtils.cp_r(scratch_path, install_path)
|
73
73
|
|
74
74
|
# Remove the git history
|
75
|
-
FileUtils.rm_rf(File.join(install_path,
|
75
|
+
FileUtils.rm_rf(File.join(install_path, ".git"))
|
76
76
|
|
77
77
|
install_path.chmod(0777 & ~File.umask)
|
78
78
|
ensure
|
@@ -91,11 +91,11 @@ module CookbookOmnifetch
|
|
91
91
|
|
92
92
|
def ==(other)
|
93
93
|
other.is_a?(GitLocation) &&
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
94
|
+
other.uri == uri &&
|
95
|
+
other.branch == branch &&
|
96
|
+
other.tag == tag &&
|
97
|
+
other.shortref == shortref &&
|
98
|
+
other.rel == rel
|
99
99
|
end
|
100
100
|
|
101
101
|
def to_s
|
@@ -163,11 +163,11 @@ module CookbookOmnifetch
|
|
163
163
|
# @raise [String]
|
164
164
|
# the +$stdout+ from the command
|
165
165
|
def git(command, error = true)
|
166
|
-
unless CookbookOmnifetch.which(
|
166
|
+
unless CookbookOmnifetch.which("git") || CookbookOmnifetch.which("git.exe") || CookbookOmnifetch.which("git.bat")
|
167
167
|
raise GitNotInstalled.new
|
168
168
|
end
|
169
169
|
|
170
|
-
response = CookbookOmnifetch.shell_out_class.shell_out(
|
170
|
+
response = CookbookOmnifetch.shell_out_class.shell_out(%{git #{command}})
|
171
171
|
|
172
172
|
if error && !response.success?
|
173
173
|
raise GitCommandError.new(command, cache_path, response.stderr)
|
@@ -188,7 +188,7 @@ module CookbookOmnifetch
|
|
188
188
|
# @return [Pathname]
|
189
189
|
def cache_path
|
190
190
|
Pathname.new(CookbookOmnifetch.cache_path)
|
191
|
-
.join(
|
191
|
+
.join(".cache", "git", Digest::SHA1.hexdigest(uri))
|
192
192
|
end
|
193
193
|
end
|
194
194
|
end
|