r10k 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.mkd +56 -0
- data/lib/r10k/cli.rb +15 -2
- data/lib/r10k/cli/deploy.rb +0 -12
- data/lib/r10k/cli/puppetfile.rb +2 -2
- data/lib/r10k/git.rb +1 -0
- data/lib/r10k/git/alternates.rb +49 -0
- data/lib/r10k/git/repository.rb +8 -1
- data/lib/r10k/git/working_dir.rb +33 -11
- data/lib/r10k/task/deployment.rb +7 -1
- data/lib/r10k/version.rb +1 -1
- data/spec/unit/git/alternates_spec.rb +90 -0
- data/spec/unit/git/repository_spec.rb +10 -0
- data/spec/unit/git/working_dir_spec.rb +110 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGE0OGNlNWExOWY4OWQ4NjE2NjM1MjQ5MDYzYjc2MjMxN2JkYzQwYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MDg5MWRkNTVlODMyNzlmNzI1Zjk1NzhmOWYwMzc1YWY4NjA1YTJiOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTkxMjk0Y2I1NDVhMDI4NGUwN2EwMjc2NTc2ZTg0YjYzMDlkNDE1ZGUxODk3
|
10
|
+
OGEwY2FlZGU4ZGI3YmU2YzE3N2U4YTc5NjAyZmIzMTU4NWJhZGY0M2QzNmVj
|
11
|
+
NTA4MGQyNWJiMWQ3MjhhZjE1MmZkMDExOGQ3NmRjM2Y4MjE0ZDY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDNmNmE2NTY1YTVkYjY2YWMzMGMzMDIwOTQ2MGQ4YjQ1NmExODdjNjE0NzI2
|
14
|
+
YjE4NGZlYTUwZWRiM2ZlZWJjMDIyZTAyOTgyYjhhZTYzZTgxMTA4Y2JjZTkz
|
15
|
+
YWI3ZDI3MzViMzY1Yjc1OWRjNjMwYjY3ZDhmZjE3OGY3NWU0YWI=
|
data/CHANGELOG.mkd
CHANGED
@@ -1,6 +1,27 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
+
1.3.1
|
5
|
+
-----
|
6
|
+
|
7
|
+
2014/07/16
|
8
|
+
|
9
|
+
### User notes
|
10
|
+
|
11
|
+
(GH-161) Deployments fail where a branch has \W in the git branch name
|
12
|
+
|
13
|
+
In 1.3.0 environment naming was partially reworked to allow better handling of
|
14
|
+
per-environment deployment, but unfortunately this caused a regression where
|
15
|
+
environments would be differently named in 1.3.0. This fix changes the
|
16
|
+
environment deployment on a per-name basis to use the normalized name instead
|
17
|
+
of the raw Git branch name.
|
18
|
+
|
19
|
+
This bugfix release also incorporates all fixes added in 1.2.2.
|
20
|
+
|
21
|
+
### Thanks
|
22
|
+
|
23
|
+
Thanks to Chris Spence for his work on this release.
|
24
|
+
|
4
25
|
1.3.0
|
5
26
|
-----
|
6
27
|
|
@@ -64,6 +85,41 @@ long run r10k will add a plugin system for loading additional code from
|
|
64
85
|
Rubygems and other sources, so r10k will be extensible without requiring
|
65
86
|
modifications to the source.
|
66
87
|
|
88
|
+
1.2.2
|
89
|
+
-----
|
90
|
+
|
91
|
+
2014/07/16
|
92
|
+
|
93
|
+
### User Notes
|
94
|
+
|
95
|
+
(GH-165) `r10k puppetfile` only consumes handled command line options.
|
96
|
+
|
97
|
+
Previously, passing `-v` or other commands when running `r10k puppetfile *`
|
98
|
+
could result in this error:
|
99
|
+
|
100
|
+
r10k puppetfile install --help --trace
|
101
|
+
Error while running: #<RuntimeError: Unrecognized options: help>
|
102
|
+
|
103
|
+
This was due to overly greedy code passing in all options from the command line
|
104
|
+
to the TaskRunner. This has been fixed so only known options are passed along,
|
105
|
+
and options that aren't relevant (such as :verbose) will be ignored.
|
106
|
+
|
107
|
+
(GH-158) Log levels are now documented in the command line --help pages.
|
108
|
+
|
109
|
+
(GH-137) Git remotes are now correctly updated.
|
110
|
+
|
111
|
+
A regression in the Git remote handling meant that git remotes would never be
|
112
|
+
properly updated when switching Git environments and modules from one remote
|
113
|
+
to another, and the git alternates file was never updated properly. This has
|
114
|
+
been fixed so that when the Git remote is updated, all references to the
|
115
|
+
remotes and alternates will be updated.
|
116
|
+
|
117
|
+
(GH-163) All Git tags are deleted when switching Git remotes
|
118
|
+
|
119
|
+
Git tags cannot necessarily be transferred from one Git repository to another,
|
120
|
+
so when a Git repo has its remotes changed all tags are deleted to prevent stale
|
121
|
+
tags from overwriting tags from the new repo.
|
122
|
+
|
67
123
|
1.2.1
|
68
124
|
-----
|
69
125
|
|
data/lib/r10k/cli.rb
CHANGED
@@ -15,10 +15,23 @@ module R10K::CLI
|
|
15
15
|
complex environments.
|
16
16
|
EOD
|
17
17
|
|
18
|
-
|
18
|
+
|
19
|
+
flag :h, :help, 'Show help for this command' do |value, cmd|
|
20
|
+
# This is evil because we may not necessarily be called from the
|
21
|
+
# command line and have a meaningful ARGV to scan. However the best
|
22
|
+
# way of having a globally useful --help command is to define the
|
23
|
+
# behavior in the block of the option to immediately handle it and exit
|
24
|
+
# and we don't have access to the verbose option, so the simple method
|
25
|
+
# is to simply scan ARGV.
|
26
|
+
verbose = (ARGV.include?('-v') || ARGV.include?('--verbose'))
|
27
|
+
puts cmd.help(:verbose => verbose)
|
28
|
+
exit 0
|
29
|
+
end
|
30
|
+
|
19
31
|
flag :t, :trace, 'Display stack traces on application crash'
|
20
32
|
|
21
|
-
|
33
|
+
loglevels = R10K::Logging::LOG_LEVELS.reverse.map(&:downcase).join(", ")
|
34
|
+
optional :v, :verbose, "Set log verbosity. Valid values: #{loglevels}" do |value, cmd|
|
22
35
|
case value
|
23
36
|
when true
|
24
37
|
R10K::Logging.level = 'INFO'
|
data/lib/r10k/cli/deploy.rb
CHANGED
@@ -51,10 +51,6 @@ scheduled. On subsequent deployments, Puppetfile deployment will default to off.
|
|
51
51
|
DESCRIPTION
|
52
52
|
|
53
53
|
flag :p, :puppetfile, 'Deploy modules from a puppetfile'
|
54
|
-
flag :h, :help, 'Show help for this command' do |value, cmd|
|
55
|
-
puts cmd.help
|
56
|
-
exit 0
|
57
|
-
end
|
58
54
|
|
59
55
|
run do |opts, args, cmd|
|
60
56
|
deploy = R10K::Deployment.load_config(opts[:config])
|
@@ -90,10 +86,6 @@ It will load the Puppetfile configurations out of all environments, and will
|
|
90
86
|
try to deploy the given module names in all environments.
|
91
87
|
DESCRIPTION
|
92
88
|
|
93
|
-
flag :h, :help, 'Show help for this command' do |value, cmd|
|
94
|
-
puts cmd.help
|
95
|
-
exit 0
|
96
|
-
end
|
97
89
|
required :e, :environment, 'Update the modules in the given environment'
|
98
90
|
|
99
91
|
run do |opts, args, cmd|
|
@@ -122,10 +114,6 @@ try to deploy the given module names in all environments.
|
|
122
114
|
summary 'Display environments and modules in the deployment'
|
123
115
|
|
124
116
|
flag :p, :puppetfile, 'Display Puppetfile modules'
|
125
|
-
flag :h, :help, 'Show help for this command' do |value, cmd|
|
126
|
-
puts cmd.help
|
127
|
-
exit 0
|
128
|
-
end
|
129
117
|
|
130
118
|
run do |opts, args, cmd|
|
131
119
|
deploy = R10K::Deployment.load_config(opts[:config])
|
data/lib/r10k/cli/puppetfile.rb
CHANGED
@@ -37,7 +37,7 @@ Puppetfile (http://bombasticmonkey.com/librarian-puppet/).
|
|
37
37
|
|
38
38
|
puppetfile = R10K::Puppetfile.new(puppetfile_root, puppetfile_path, puppetfile)
|
39
39
|
|
40
|
-
runner = R10K::TaskRunner.new(opts)
|
40
|
+
runner = R10K::TaskRunner.new(:trace => opts[:trace])
|
41
41
|
task = R10K::Task::Puppetfile::Sync.new(puppetfile)
|
42
42
|
runner.append_task task
|
43
43
|
|
@@ -90,7 +90,7 @@ Puppetfile (http://bombasticmonkey.com/librarian-puppet/).
|
|
90
90
|
|
91
91
|
puppetfile = R10K::Puppetfile.new(puppetfile_root, puppetfile_path, puppetfile)
|
92
92
|
|
93
|
-
runner = R10K::TaskRunner.new(opts)
|
93
|
+
runner = R10K::TaskRunner.new(:trace => opts[:trace])
|
94
94
|
task = R10K::Task::Puppetfile::Purge.new(puppetfile)
|
95
95
|
runner.append_task task
|
96
96
|
|
data/lib/r10k/git.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
# Manage `$GIT_DIR/objects/info/alternates`
|
4
|
+
#
|
5
|
+
# @see man gitrepository-layout(5)
|
6
|
+
class R10K::Git::Alternates
|
7
|
+
|
8
|
+
# @attribute [r] file
|
9
|
+
# @return [Pathname] The alternates file
|
10
|
+
attr_reader :file
|
11
|
+
|
12
|
+
# @param git_dir [String] The path to the git repository
|
13
|
+
def initialize(git_dir)
|
14
|
+
@file = Pathname.new(File.join(git_dir, 'objects', 'info', 'alternates'))
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_a
|
18
|
+
read()
|
19
|
+
end
|
20
|
+
|
21
|
+
def <<(path)
|
22
|
+
write(to_a << path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def include?(path)
|
26
|
+
to_a.include?(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def write(entries)
|
32
|
+
if ! @file.parent.directory?
|
33
|
+
raise R10K::Git::GitError, "Cannot write #{@file.to_path}; parent directory does not exist"
|
34
|
+
end
|
35
|
+
@file.open("w") do |fh|
|
36
|
+
entries.each do |entry|
|
37
|
+
fh.puts(entry)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def read
|
43
|
+
entries = []
|
44
|
+
if @file.file?
|
45
|
+
entries = @file.readlines.map(&:chomp)
|
46
|
+
end
|
47
|
+
entries
|
48
|
+
end
|
49
|
+
end
|
data/lib/r10k/git/repository.rb
CHANGED
@@ -84,7 +84,7 @@ class R10K::Git::Repository
|
|
84
84
|
|
85
85
|
ret = {}
|
86
86
|
output.stdout.each_line do |line|
|
87
|
-
next if line.match
|
87
|
+
next if line.match(/\(push\)/)
|
88
88
|
name, url, _ = line.split(/\s+/)
|
89
89
|
ret[name] = url
|
90
90
|
end
|
@@ -92,6 +92,13 @@ class R10K::Git::Repository
|
|
92
92
|
ret
|
93
93
|
end
|
94
94
|
|
95
|
+
def tags
|
96
|
+
entries = []
|
97
|
+
output = git(['tag', '-l'], :git_dir => @git_dir).stdout
|
98
|
+
output.each_line { |line| entries << line.chomp }
|
99
|
+
entries
|
100
|
+
end
|
101
|
+
|
95
102
|
private
|
96
103
|
|
97
104
|
# Fetch objects and refs from the given git remote
|
data/lib/r10k/git/working_dir.rb
CHANGED
@@ -40,7 +40,8 @@ class R10K::Git::WorkingDir < R10K::Git::Repository
|
|
40
40
|
@full_path = File.join(@basedir, @dirname)
|
41
41
|
@git_dir = File.join(@full_path, '.git')
|
42
42
|
|
43
|
-
@
|
43
|
+
@alternates = R10K::Git::Alternates.new(@git_dir)
|
44
|
+
@cache = R10K::Git::Cache.generate(@remote)
|
44
45
|
|
45
46
|
if ref.is_a? String
|
46
47
|
@ref = R10K::Git::Ref.new(ref, self)
|
@@ -60,7 +61,9 @@ class R10K::Git::WorkingDir < R10K::Git::Repository
|
|
60
61
|
end
|
61
62
|
|
62
63
|
def update
|
63
|
-
if
|
64
|
+
update_remotes if update_remotes?
|
65
|
+
|
66
|
+
if ref_needs_fetch?
|
64
67
|
fetch_from_cache
|
65
68
|
checkout(@ref)
|
66
69
|
elsif needs_checkout?
|
@@ -113,22 +116,17 @@ class R10K::Git::WorkingDir < R10K::Git::Repository
|
|
113
116
|
|
114
117
|
private
|
115
118
|
|
116
|
-
|
119
|
+
# Do we need to fetch additional objects and refs in order to resolve the given ref?
|
120
|
+
# @return [true, false]
|
121
|
+
def ref_needs_fetch?
|
117
122
|
@ref.fetch?
|
118
123
|
end
|
119
124
|
|
120
125
|
def fetch_from_cache
|
121
|
-
set_cache_remote
|
122
126
|
@cache.sync
|
123
127
|
fetch('cache')
|
124
128
|
end
|
125
129
|
|
126
|
-
def set_cache_remote
|
127
|
-
if self.remote != @cache.remote
|
128
|
-
git ["remote", "set-url", "cache", @cache.git_dir], :path => @full_path
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
130
|
# Perform a non-bare clone of a git repository.
|
133
131
|
def clone
|
134
132
|
@cache.sync
|
@@ -150,6 +148,30 @@ class R10K::Git::WorkingDir < R10K::Git::Repository
|
|
150
148
|
expected = ref.sha1
|
151
149
|
actual = rev_parse('HEAD')
|
152
150
|
|
153
|
-
!
|
151
|
+
!(expected == actual)
|
152
|
+
end
|
153
|
+
|
154
|
+
def update_remotes?
|
155
|
+
real_remotes = remotes
|
156
|
+
|
157
|
+
expected_origin = @remote
|
158
|
+
expected_cache = @cache.git_dir
|
159
|
+
|
160
|
+
!(expected_origin == real_remotes['origin'] and expected_cache == real_remotes['cache'])
|
161
|
+
end
|
162
|
+
|
163
|
+
def update_remotes
|
164
|
+
# todo: remove all existing refs as they may belong to the old remote
|
165
|
+
git ['remote', 'set-url', 'origin', remote], :path => @full_path
|
166
|
+
git ['remote', 'set-url', 'cache', @cache.git_dir], :path => @full_path
|
167
|
+
@alternates << File.join(@cache.git_dir, 'objects')
|
168
|
+
logger.debug("Removing stale git tags from #{@full_path}")
|
169
|
+
remove_tags
|
170
|
+
end
|
171
|
+
|
172
|
+
def remove_tags
|
173
|
+
tags.each do |tag|
|
174
|
+
git ['tag', '-d', tag], :path => @full_path
|
175
|
+
end
|
154
176
|
end
|
155
177
|
end
|
data/lib/r10k/task/deployment.rb
CHANGED
@@ -23,8 +23,14 @@ module Deployment
|
|
23
23
|
# while this should be optimized that optimization can wait a while.
|
24
24
|
names.each do |env_name|
|
25
25
|
|
26
|
+
# Elsewhere, we sanitise the env.dirname to sub any \W to _
|
27
|
+
# For this to match here (a single environment deploy where the
|
28
|
+
# branch name has \W we need to sanitise the branch name to match
|
29
|
+
|
30
|
+
safe_branch_name = env_name.gsub(/\W/,'_')
|
31
|
+
|
26
32
|
matching = all_environments.select do |env|
|
27
|
-
env.dirname ==
|
33
|
+
env.dirname == safe_branch_name
|
28
34
|
end
|
29
35
|
|
30
36
|
if matching.empty?
|
data/lib/r10k/version.rb
CHANGED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'r10k/git'
|
4
|
+
|
5
|
+
describe R10K::Git::Alternates do
|
6
|
+
subject { described_class.new("/some/nonexistent/path/.git") }
|
7
|
+
|
8
|
+
it "interacts with the alternates file in the given git repository" do
|
9
|
+
expect(subject.file.to_path).to eq("/some/nonexistent/path/.git/objects/info/alternates")
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "reading alternate object entries" do
|
13
|
+
it "reads the alternates file and splits on lines" do
|
14
|
+
expect(subject.file).to receive(:file?).and_return true
|
15
|
+
expect(subject.file).to receive(:readlines).and_return([
|
16
|
+
"/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git\n",
|
17
|
+
"/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git\n",
|
18
|
+
])
|
19
|
+
|
20
|
+
expect(subject.to_a).to eq([
|
21
|
+
"/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
|
22
|
+
"/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
|
23
|
+
])
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns an empty array when the file is not present" do
|
27
|
+
expect(subject.file).to receive(:file?).and_return false
|
28
|
+
expect(subject.file).to receive(:readlines).never
|
29
|
+
expect(subject.to_a).to eq([])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "determining if an entry is already present" do
|
34
|
+
before do
|
35
|
+
allow(subject).to receive(:to_a).and_return([
|
36
|
+
"/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
|
37
|
+
"/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
|
38
|
+
])
|
39
|
+
end
|
40
|
+
|
41
|
+
it "is true if the element is in the array of read entries" do
|
42
|
+
expect(subject).to include("/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "is false if the element is not in the array of read entries" do
|
46
|
+
expect(subject).to_not include("/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "appending a new alternate object entry" do
|
51
|
+
describe "and the git objects/info directory does not exist" do
|
52
|
+
it "raises an error when the parent directory does not exist" do
|
53
|
+
expect {
|
54
|
+
subject << "/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"
|
55
|
+
}.to raise_error(R10K::Git::GitError,"Cannot write /some/nonexistent/path/.git/objects/info/alternates; parent directory does not exist")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "and the git objects/info directory exists" do
|
60
|
+
let(:io) { StringIO.new }
|
61
|
+
|
62
|
+
before do
|
63
|
+
expect(subject.file).to receive(:open).with('w').and_yield(io)
|
64
|
+
subject.file.stub_chain(:parent, :directory?).and_return true
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
it "creates the alternates file with the new entry when not present" do
|
69
|
+
expect(subject).to receive(:to_a).and_return([])
|
70
|
+
subject << "/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"
|
71
|
+
|
72
|
+
expect(io.string).to eq("/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git\n")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "rewrites the file with all alternate entries" do
|
76
|
+
expect(subject).to receive(:to_a).and_return([
|
77
|
+
"/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
|
78
|
+
"/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
|
79
|
+
])
|
80
|
+
subject << "/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"
|
81
|
+
|
82
|
+
expect(io.string).to eq(<<-EOD)
|
83
|
+
/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git
|
84
|
+
/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git
|
85
|
+
/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git
|
86
|
+
EOD
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -21,4 +21,14 @@ describe R10K::Git::Repository do
|
|
21
21
|
})
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
describe "tags" do
|
26
|
+
let(:tags) { %w[0.1.1 0.1.2 0.1.3 0.1.4 0.2.0 0.3.0 2.0.0] }
|
27
|
+
let(:output) { tags.map {|x| x + "\n"}.join }
|
28
|
+
|
29
|
+
it "returns a list of tags for this repo" do
|
30
|
+
expect(subject).to receive(:git).with(%w[tag -l], anything).and_return(double(:stdout => output))
|
31
|
+
expect(subject.tags).to eq(tags)
|
32
|
+
end
|
33
|
+
end
|
24
34
|
end
|
@@ -2,11 +2,120 @@ require 'spec_helper'
|
|
2
2
|
require 'r10k/git'
|
3
3
|
|
4
4
|
describe R10K::Git::WorkingDir do
|
5
|
+
include_context "fail on execution"
|
5
6
|
|
6
7
|
describe "initializing" do
|
7
8
|
it "generates a new cache for the remote" do
|
8
|
-
wd = described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/
|
9
|
+
wd = described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/some/nonexistent/dir')
|
9
10
|
wd.cache.should be_kind_of R10K::Git::Cache
|
10
11
|
end
|
12
|
+
|
13
|
+
it "uses the provided ref as the dirname when no dirname is given" do
|
14
|
+
wd = described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/some/nonexistent/dir')
|
15
|
+
expect(wd.dirname).to eq('master')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "uses an explicit dirname when given" do
|
19
|
+
wd = described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/some/nonexistent/dir', 'mydir')
|
20
|
+
expect(wd.dirname).to eq('mydir')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "synchronizing the working directory" do
|
25
|
+
subject { described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/some/nonexistent/dir') }
|
26
|
+
it "clones the repository when the repository doesn't exist" do
|
27
|
+
expect(subject).to receive(:cloned?).and_return false
|
28
|
+
expect(subject).to receive(:clone)
|
29
|
+
subject.sync
|
30
|
+
end
|
31
|
+
|
32
|
+
it "updates the repository when the repository already exists" do
|
33
|
+
expect(subject).to receive(:cloned?).and_return true
|
34
|
+
expect(subject).to receive(:update)
|
35
|
+
subject.sync
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "when cloning a new repository" do
|
40
|
+
subject { described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/some/nonexistent/dir') }
|
41
|
+
|
42
|
+
before do
|
43
|
+
allow(subject).to receive(:cloned?).and_return false
|
44
|
+
end
|
45
|
+
|
46
|
+
it "updates the cache before cloning" do
|
47
|
+
expect(subject.cache).to receive(:sync)
|
48
|
+
allow(subject).to receive(:git)
|
49
|
+
allow(subject).to receive(:checkout)
|
50
|
+
subject.sync
|
51
|
+
end
|
52
|
+
|
53
|
+
it "clones the repository and uses the cache git dir as an object reference" do
|
54
|
+
allow(subject.cache).to receive(:sync)
|
55
|
+
expect(subject).to receive(:git).with(['clone', '--reference', subject.cache.git_dir,
|
56
|
+
'git://github.com/adrienthebo/r10k-fixture-repo',
|
57
|
+
'/some/nonexistent/dir/master'])
|
58
|
+
expect(subject).to receive(:git).with(['remote', 'add', 'cache', subject.cache.git_dir],
|
59
|
+
an_instance_of(Hash))
|
60
|
+
|
61
|
+
expect(subject).to receive(:git).with(['fetch', 'cache'], an_instance_of(Hash))
|
62
|
+
allow(subject).to receive(:checkout)
|
63
|
+
subject.sync
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'checks out the specific ref after the clone' do
|
67
|
+
allow(subject.cache).to receive(:sync)
|
68
|
+
allow(subject).to receive(:git)
|
69
|
+
expect(subject).to receive(:checkout)
|
70
|
+
subject.sync
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "updating an existing repository" do
|
75
|
+
subject { described_class.new('master', 'git://github.com/adrienthebo/r10k-fixture-repo', '/some/nonexistent/dir') }
|
76
|
+
|
77
|
+
before do
|
78
|
+
allow(subject).to receive(:cloned?).and_return true
|
79
|
+
end
|
80
|
+
|
81
|
+
it "updates the remotes when they are out of sync" do
|
82
|
+
allow(subject).to receive(:ref_needs_fetch?).and_return false
|
83
|
+
allow(subject).to receive(:needs_checkout?).and_return false
|
84
|
+
|
85
|
+
expect(subject).to receive(:update_remotes?).and_return true
|
86
|
+
expect(subject).to receive(:update_remotes)
|
87
|
+
|
88
|
+
subject.sync
|
89
|
+
end
|
90
|
+
|
91
|
+
it "updates the cache when the ref requires an update" do
|
92
|
+
allow(subject).to receive(:update_remotes?).and_return false
|
93
|
+
|
94
|
+
expect(subject).to receive(:ref_needs_fetch?).and_return true
|
95
|
+
expect(subject).to receive(:fetch_from_cache)
|
96
|
+
expect(subject).to receive(:checkout).with(an_instance_of(R10K::Git::Ref))
|
97
|
+
|
98
|
+
subject.sync
|
99
|
+
end
|
100
|
+
|
101
|
+
it "checks out the ref when the wrong commit is checked out" do
|
102
|
+
allow(subject).to receive(:update_remotes?).and_return false
|
103
|
+
allow(subject).to receive(:ref_needs_fetch?).and_return false
|
104
|
+
|
105
|
+
expect(subject).to receive(:needs_checkout?).and_return true
|
106
|
+
expect(subject).to receive(:checkout).with(an_instance_of(R10K::Git::Ref))
|
107
|
+
|
108
|
+
subject.sync
|
109
|
+
end
|
110
|
+
|
111
|
+
it "doesn't update the repo when everything is in sync" do
|
112
|
+
allow(subject).to receive(:update_remotes?).and_return false
|
113
|
+
allow(subject).to receive(:ref_needs_fetch?).and_return false
|
114
|
+
allow(subject).to receive(:needs_checkout?).and_return false
|
115
|
+
|
116
|
+
expect(subject).to_not receive(:checkout)
|
117
|
+
|
118
|
+
subject.sync
|
119
|
+
end
|
11
120
|
end
|
12
121
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: r10k
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrien Thebo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colored
|
@@ -231,6 +231,7 @@ files:
|
|
231
231
|
- lib/r10k/errors.rb
|
232
232
|
- lib/r10k/execution.rb
|
233
233
|
- lib/r10k/git.rb
|
234
|
+
- lib/r10k/git/alternates.rb
|
234
235
|
- lib/r10k/git/cache.rb
|
235
236
|
- lib/r10k/git/commit.rb
|
236
237
|
- lib/r10k/git/errors.rb
|
@@ -311,6 +312,7 @@ files:
|
|
311
312
|
- spec/unit/deployment/source_spec.rb
|
312
313
|
- spec/unit/environment/git_spec.rb
|
313
314
|
- spec/unit/environment/svn_spec.rb
|
315
|
+
- spec/unit/git/alternates_spec.rb
|
314
316
|
- spec/unit/git/cache_spec.rb
|
315
317
|
- spec/unit/git/commit_spec.rb
|
316
318
|
- spec/unit/git/head_spec.rb
|
@@ -407,6 +409,7 @@ test_files:
|
|
407
409
|
- spec/unit/git/commit_spec.rb
|
408
410
|
- spec/unit/git/repository_spec.rb
|
409
411
|
- spec/unit/git/head_spec.rb
|
412
|
+
- spec/unit/git/alternates_spec.rb
|
410
413
|
- spec/unit/git/tag_spec.rb
|
411
414
|
- spec/unit/keyed_factory_spec.rb
|
412
415
|
- spec/unit/deployment/environment_spec.rb
|