r10k 3.8.0 → 3.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/docker.yml +4 -1
- data/.github/workflows/release.yml +3 -2
- data/.github/workflows/rspec_tests.yml +1 -1
- data/.travis.yml +8 -1
- data/CHANGELOG.mkd +10 -0
- data/CODEOWNERS +1 -1
- data/doc/common-patterns.mkd +1 -0
- data/doc/dynamic-environments/configuration.mkd +90 -43
- data/doc/dynamic-environments/usage.mkd +7 -7
- data/doc/puppetfile.mkd +23 -3
- data/docker/Gemfile +1 -1
- data/docker/Makefile +4 -3
- data/docker/docker-compose.yml +18 -0
- data/docker/r10k/Dockerfile +1 -1
- data/docker/r10k/docker-entrypoint.sh +0 -1
- data/docker/r10k/release.Dockerfile +1 -1
- data/docker/spec/dockerfile_spec.rb +26 -32
- data/integration/tests/git_source/git_source_repeated_remote.rb +2 -2
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +2 -1
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +2 -1
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +2 -1
- data/lib/r10k/action/deploy/display.rb +9 -3
- data/lib/r10k/action/deploy/environment.rb +36 -14
- data/lib/r10k/cli/deploy.rb +5 -3
- data/lib/r10k/environment/base.rb +1 -1
- data/lib/r10k/environment/git.rb +17 -2
- data/lib/r10k/environment/name.rb +22 -4
- data/lib/r10k/environment/svn.rb +11 -2
- data/lib/r10k/environment/with_modules.rb +1 -1
- data/lib/r10k/git/rugged/credentials.rb +22 -15
- data/lib/r10k/module/forge.rb +15 -3
- data/lib/r10k/module/git.rb +24 -23
- data/lib/r10k/module/local.rb +1 -1
- data/lib/r10k/module/svn.rb +14 -11
- data/lib/r10k/settings.rb +6 -1
- data/lib/r10k/source/base.rb +5 -0
- data/lib/r10k/source/git.rb +4 -1
- data/lib/r10k/source/hash.rb +4 -2
- data/lib/r10k/source/svn.rb +5 -1
- data/lib/r10k/util/setopts.rb +33 -12
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +22 -18
- data/r10k.gemspec +1 -1
- data/spec/unit/action/deploy/display_spec.rb +4 -0
- data/spec/unit/action/deploy/environment_spec.rb +111 -10
- data/spec/unit/environment/git_spec.rb +16 -0
- data/spec/unit/environment/name_spec.rb +28 -0
- data/spec/unit/environment/svn_spec.rb +12 -0
- data/spec/unit/git/rugged/credentials_spec.rb +10 -0
- data/spec/unit/module/forge_spec.rb +6 -0
- data/spec/unit/module/git_spec.rb +1 -1
- data/spec/unit/module_spec.rb +59 -9
- data/spec/unit/util/setopts_spec.rb +25 -1
- metadata +5 -11
- data/azure-pipelines.yml +0 -87
@@ -0,0 +1,18 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
services:
|
4
|
+
r10k_check:
|
5
|
+
image: ${R10K_IMAGE:-puppet/r10k}
|
6
|
+
environment:
|
7
|
+
- PUPPERWARE_ANALYTICS_ENABLED=${PUPPERWARE_ANALYTICS_ENABLED:-false}
|
8
|
+
command: 'puppetfile check --verbose --trace --puppetfile test/Puppetfile'
|
9
|
+
volumes:
|
10
|
+
- ${SPEC_DIRECTORY}/fixtures:/home/puppet/test
|
11
|
+
|
12
|
+
r10k_install:
|
13
|
+
image: ${R10K_IMAGE:-puppet/r10k}
|
14
|
+
environment:
|
15
|
+
- PUPPERWARE_ANALYTICS_ENABLED=${PUPPERWARE_ANALYTICS_ENABLED:-false}
|
16
|
+
command: 'puppetfile install --verbose --trace --puppetfile test/Puppetfile'
|
17
|
+
volumes:
|
18
|
+
- ${SPEC_DIRECTORY}/fixtures:/home/puppet/test
|
data/docker/r10k/Dockerfile
CHANGED
@@ -49,7 +49,7 @@ COPY --from=build /workspace/r10k.gem /
|
|
49
49
|
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
|
50
50
|
# ignore apk and gem pinning
|
51
51
|
# hadolint ignore=DL3018,DL3028
|
52
|
-
RUN chmod a+x /adduser.sh /docker-entrypoint.sh && \
|
52
|
+
RUN chmod a+x /adduser.sh /docker-entrypoint.sh /docker-entrypoint.d/*.sh && \
|
53
53
|
# Add a puppet user to run r10k as for consistency with puppetserver
|
54
54
|
/adduser.sh && \
|
55
55
|
chown -R puppet: /docker-entrypoint.d /docker-entrypoint.sh && \
|
@@ -38,7 +38,7 @@ LABEL org.label-schema.version="$version" \
|
|
38
38
|
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
|
39
39
|
# ignore apk and gem pinning
|
40
40
|
# hadolint ignore=DL3018,DL3028
|
41
|
-
RUN chmod a+x /adduser.sh /docker-entrypoint.sh && \
|
41
|
+
RUN chmod a+x /adduser.sh /docker-entrypoint.sh /docker-entrypoint.d/*.sh && \
|
42
42
|
/adduser.sh && \
|
43
43
|
chown -R puppet: /docker-entrypoint.d /docker-entrypoint.sh && \
|
44
44
|
apk add --no-cache ruby openssh-client git ruby-rugged curl ruby-dev make gcc musl-dev && \
|
@@ -1,43 +1,37 @@
|
|
1
1
|
require 'rspec/core'
|
2
2
|
require 'fileutils'
|
3
3
|
require 'open3'
|
4
|
+
include Pupperware::SpecHelpers
|
4
5
|
|
5
|
-
SPEC_DIRECTORY = File.dirname(__FILE__)
|
6
|
+
ENV['SPEC_DIRECTORY'] = File.dirname(__FILE__)
|
7
|
+
# unifies volume naming
|
8
|
+
ENV['COMPOSE_PROJECT_NAME'] ||= 'r10k'
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
--trace \
|
15
|
-
--puppetfile test/Puppetfile")
|
16
|
-
end
|
17
|
-
|
18
|
-
before(:all) do
|
19
|
-
@image = require_test_image
|
10
|
+
RSpec.configure do |c|
|
11
|
+
c.before(:suite) do
|
12
|
+
ENV['R10K_IMAGE'] = require_test_image
|
13
|
+
pull_images(['r10k_check','r10k_install'])
|
14
|
+
teardown_cluster()
|
15
|
+
# no certs to preload, but if the suite adds puppetserver, be explicit
|
16
|
+
docker_compose_up(preload_certs: true)
|
20
17
|
end
|
21
18
|
|
22
|
-
after(:
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
it 'should validate the Puppetfile' do
|
27
|
-
result = run_r10k('puppetfile check')
|
28
|
-
container = result[:stdout].chomp
|
29
|
-
wait_on_container_exit(container)
|
30
|
-
expect(get_container_exit_code(container)).to eq(0)
|
31
|
-
emit_log(container)
|
32
|
-
teardown_container(container)
|
19
|
+
c.after(:suite) do
|
20
|
+
teardown_cluster()
|
21
|
+
FileUtils.rm_rf(File.join(ENV['SPEC_DIRECTORY'], 'fixtures', 'modules'))
|
33
22
|
end
|
23
|
+
end
|
34
24
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
25
|
+
describe 'r10k container' do
|
26
|
+
{
|
27
|
+
'r10k_check': 'validate',
|
28
|
+
'r10k_install': 'install',
|
29
|
+
}.each do |container, op|
|
30
|
+
it "should #{op} the Puppetfile" do
|
31
|
+
container = get_service_container(container)
|
32
|
+
wait_on_container_exit(container)
|
33
|
+
expect(get_container_exit_code(container)).to eq(0)
|
34
|
+
emit_log(container)
|
35
|
+
end
|
42
36
|
end
|
43
37
|
end
|
@@ -30,11 +30,11 @@ CONF
|
|
30
30
|
puppetfile = <<-EOS
|
31
31
|
mod 'prod_apache',
|
32
32
|
:git => 'git://github.com/puppetlabs/puppetlabs-apache.git',
|
33
|
-
:
|
33
|
+
:tag => 'v6.0.0'
|
34
34
|
|
35
35
|
mod 'test_apache',
|
36
36
|
:git => 'git://github.com/puppetlabs/puppetlabs-apache.git',
|
37
|
-
:
|
37
|
+
:tag => 'v6.0.0'
|
38
38
|
EOS
|
39
39
|
|
40
40
|
teardown do
|
@@ -27,7 +27,8 @@ stdlib_notify_message_regex = /The test message is:.*one.*=>.*1.*two.*=>.*bats.*
|
|
27
27
|
puppet_file = <<-PUPPETFILE
|
28
28
|
mod "puppetlabs/motd"
|
29
29
|
mod 'puppetlabs/stdlib',
|
30
|
-
:git => 'git://github.com/puppetlabs/puppetlabs-stdlib.git'
|
30
|
+
:git => 'git://github.com/puppetlabs/puppetlabs-stdlib.git',
|
31
|
+
:tag => 'v7.0.1'
|
31
32
|
PUPPETFILE
|
32
33
|
|
33
34
|
puppet_file_path = File.join(git_environments_path, 'Puppetfile')
|
data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb
CHANGED
@@ -31,7 +31,8 @@ puppet_file = <<-PUPPETFILE
|
|
31
31
|
moduledir '#{@module_path}'
|
32
32
|
mod "puppetlabs/motd"
|
33
33
|
mod 'puppetlabs/stdlib',
|
34
|
-
:git => 'git://github.com/puppetlabs/puppetlabs-stdlib.git'
|
34
|
+
:git => 'git://github.com/puppetlabs/puppetlabs-stdlib.git',
|
35
|
+
:tag => 'v7.0.1'
|
35
36
|
PUPPETFILE
|
36
37
|
|
37
38
|
puppet_file_path = File.join(git_environments_path, 'Puppetfile')
|
@@ -65,7 +65,7 @@ env_structs = {:production => GitEnv.new('/git_repos',
|
|
65
65
|
'/git_repos_alt/environments_alt.git',
|
66
66
|
'/root/environments_alt',
|
67
67
|
'/root/environments_alt/Puppetfile',
|
68
|
-
'mod "puppetlabs/stdlib", :git => "git://github.com/puppetlabs/puppetlabs-stdlib.git"',
|
68
|
+
'mod "puppetlabs/stdlib", :git => "git://github.com/puppetlabs/puppetlabs-stdlib.git", :tag => "v7.0.1"',
|
69
69
|
'/root/environments_alt/manifests/site.pp',
|
70
70
|
create_site_pp(master_certname, stage_env_manifest)
|
71
71
|
),
|
@@ -28,7 +28,8 @@ notify_message_regex = /I am in the production environment/
|
|
28
28
|
puppet_file = <<-PUPPETFILE
|
29
29
|
mod "puppetlabs/motd"
|
30
30
|
mod 'puppetlabs/inifile',
|
31
|
-
:git => 'git://github.com/puppetlabs/puppetlabs-inifile'
|
31
|
+
:git => 'git://github.com/puppetlabs/puppetlabs-inifile',
|
32
|
+
:tag => 'v5.0.1'
|
32
33
|
PUPPETFILE
|
33
34
|
|
34
35
|
puppet_file_path = File.join(git_environments_path, 'Puppetfile')
|
@@ -59,14 +59,14 @@ module R10K
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def environment_info(env)
|
62
|
-
if !@
|
62
|
+
if !@modules && !@detail
|
63
63
|
env.dirname
|
64
64
|
else
|
65
65
|
env_info = env.info.merge({
|
66
66
|
:status => (env.status rescue nil),
|
67
67
|
})
|
68
68
|
|
69
|
-
env_info[:modules] = env.modules.map { |mod| module_info(mod) } if @
|
69
|
+
env_info[:modules] = env.modules.map { |mod| module_info(mod) } if @modules
|
70
70
|
|
71
71
|
env_info
|
72
72
|
end
|
@@ -81,7 +81,13 @@ module R10K
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def allowed_initialize_opts
|
84
|
-
super.merge(
|
84
|
+
super.merge({
|
85
|
+
puppetfile: :modules,
|
86
|
+
modules: :self,
|
87
|
+
detail: :self,
|
88
|
+
format: :self,
|
89
|
+
fetch: :self
|
90
|
+
})
|
85
91
|
end
|
86
92
|
end
|
87
93
|
end
|
@@ -18,7 +18,8 @@ module R10K
|
|
18
18
|
def initialize(opts, argv, settings = nil)
|
19
19
|
settings ||= {}
|
20
20
|
@purge_levels = settings.fetch(:deploy, {}).fetch(:purge_levels, [])
|
21
|
-
@
|
21
|
+
@user_purge_allowlist = read_purge_allowlist(settings.fetch(:deploy, {}).fetch(:purge_whitelist, []),
|
22
|
+
settings.fetch(:deploy, {}).fetch(:purge_allowlist, []))
|
22
23
|
@generate_types = settings.fetch(:deploy, {}).fetch(:generate_types, false)
|
23
24
|
|
24
25
|
super
|
@@ -43,6 +44,23 @@ module R10K
|
|
43
44
|
|
44
45
|
private
|
45
46
|
|
47
|
+
def read_purge_allowlist (whitelist, allowlist)
|
48
|
+
whitelist_has_content = !whitelist.empty?
|
49
|
+
allowlist_has_content = !allowlist.empty?
|
50
|
+
case
|
51
|
+
when whitelist_has_content == false && allowlist_has_content == false
|
52
|
+
[]
|
53
|
+
when whitelist_has_content && allowlist_has_content
|
54
|
+
raise R10K::Error.new "Values found for both purge_whitelist and purge_allowlist. Setting " <<
|
55
|
+
"purge_whitelist is deprecated, please only use purge_allowlist."
|
56
|
+
when allowlist_has_content
|
57
|
+
allowlist
|
58
|
+
else
|
59
|
+
logger.warn "Setting purge_whitelist is deprecated; please use purge_allowlist instead."
|
60
|
+
whitelist
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
46
64
|
def visit_deployment(deployment)
|
47
65
|
# Ensure that everything can be preloaded. If we cannot preload all
|
48
66
|
# sources then we can't fully enumerate all environments which
|
@@ -95,7 +113,7 @@ module R10K
|
|
95
113
|
environment.sync
|
96
114
|
logger.info _("Environment %{env_dir} is now at %{env_signature}") % {env_dir: environment.dirname, env_signature: environment.signature}
|
97
115
|
|
98
|
-
if status == :absent || @
|
116
|
+
if status == :absent || @modules
|
99
117
|
if status == :absent
|
100
118
|
logger.debug(_("Environment %{env_dir} is new, updating all modules") % {env_dir: environment.dirname})
|
101
119
|
end
|
@@ -110,7 +128,7 @@ module R10K
|
|
110
128
|
if @purge_levels.include?(:environment)
|
111
129
|
if @visit_ok
|
112
130
|
logger.debug("Purging unmanaged content for environment '#{environment.dirname}'...")
|
113
|
-
environment.purge!(:recurse => true, :whitelist => environment.whitelist(@
|
131
|
+
environment.purge!(:recurse => true, :whitelist => environment.whitelist(@user_purge_allowlist))
|
114
132
|
else
|
115
133
|
logger.debug("Not purging unmanaged content for environment '#{environment.dirname}' due to prior deploy failures.")
|
116
134
|
end
|
@@ -145,17 +163,20 @@ module R10K
|
|
145
163
|
end
|
146
164
|
|
147
165
|
def write_environment_info!(environment, started_at, success)
|
148
|
-
module_deploys =
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
166
|
+
module_deploys =
|
167
|
+
begin
|
168
|
+
environment.modules.map do |mod|
|
169
|
+
props = mod.properties
|
170
|
+
{
|
171
|
+
name: mod.name,
|
172
|
+
version: props[:expected],
|
173
|
+
sha: props[:type] == :git ? props[:actual] : nil
|
174
|
+
}
|
175
|
+
end
|
176
|
+
rescue
|
177
|
+
logger.debug("Unable to get environment module deploy data for .r10k-deploy.json at #{environment.path}")
|
178
|
+
[]
|
155
179
|
end
|
156
|
-
rescue
|
157
|
-
logger.debug("Unable to get environment module deploy data for .r10k-deploy.json at #{environment.path}")
|
158
|
-
end
|
159
180
|
|
160
181
|
# make this file write as atomic as possible in pure ruby
|
161
182
|
final = "#{environment.path}/.r10k-deploy.json"
|
@@ -183,7 +204,8 @@ module R10K
|
|
183
204
|
end
|
184
205
|
|
185
206
|
def allowed_initialize_opts
|
186
|
-
super.merge(puppetfile: :
|
207
|
+
super.merge(puppetfile: :modules,
|
208
|
+
modules: :self,
|
187
209
|
cachedir: :self,
|
188
210
|
'no-force': :self,
|
189
211
|
'generate-types': :self,
|
data/lib/r10k/cli/deploy.rb
CHANGED
@@ -55,7 +55,7 @@ branches.
|
|
55
55
|
|
56
56
|
Environments can provide a Puppetfile at the root of the directory to deploy
|
57
57
|
independent Puppet modules. To recursively deploy an environment, pass the
|
58
|
-
`--
|
58
|
+
`--modules` flag to the command.
|
59
59
|
|
60
60
|
**NOTE**: If an environment has a Puppetfile when it is instantiated a
|
61
61
|
recursive update will be forced. It is assumed that environments are dependent
|
@@ -63,7 +63,8 @@ on modules specified in the Puppetfile and an update will be automatically
|
|
63
63
|
scheduled. On subsequent deployments, Puppetfile deployment will default to off.
|
64
64
|
DESCRIPTION
|
65
65
|
|
66
|
-
flag :p, :puppetfile, 'Deploy modules
|
66
|
+
flag :p, :puppetfile, 'Deploy modules (deprecated, use -m)'
|
67
|
+
flag :m, :modules, 'Deploy modules'
|
67
68
|
option nil, :'default-branch-override', 'Specify a branchname to override the default branch in the puppetfile',
|
68
69
|
argument: :required
|
69
70
|
|
@@ -100,7 +101,8 @@ try to deploy the given module names in all environments.
|
|
100
101
|
usage 'display'
|
101
102
|
summary 'Display environments and modules in the deployment'
|
102
103
|
|
103
|
-
flag :p, :puppetfile, 'Display
|
104
|
+
flag :p, :puppetfile, 'Display modules (deprecated, use -m)'
|
105
|
+
flag :m, :modules, 'Display modules'
|
104
106
|
flag nil, :detail, 'Display detailed information'
|
105
107
|
flag nil, :fetch, 'Update available environment lists from all remote sources'
|
106
108
|
option nil, :format, 'Display output in a specific format. Valid values: json, yaml. Default: yaml',
|
@@ -43,7 +43,7 @@ class R10K::Environment::Base
|
|
43
43
|
@basedir = basedir
|
44
44
|
@dirname = dirname
|
45
45
|
@options = options
|
46
|
-
@puppetfile_name = options
|
46
|
+
@puppetfile_name = options.delete(:puppetfile_name)
|
47
47
|
|
48
48
|
@full_path = File.join(@basedir, @dirname)
|
49
49
|
@path = Pathname.new(File.join(@basedir, @dirname))
|
data/lib/r10k/environment/git.rb
CHANGED
@@ -27,6 +27,8 @@ class R10K::Environment::Git < R10K::Environment::WithModules
|
|
27
27
|
# @return [R10K::Git::StatefulRepository] The git repo backing this environment
|
28
28
|
attr_reader :repo
|
29
29
|
|
30
|
+
include R10K::Util::Setopts
|
31
|
+
|
30
32
|
# Initialize the given Git environment.
|
31
33
|
#
|
32
34
|
# @param name [String] The unique name describing this environment.
|
@@ -38,8 +40,21 @@ class R10K::Environment::Git < R10K::Environment::WithModules
|
|
38
40
|
# @param options [String] :ref The git reference to use for this environment
|
39
41
|
def initialize(name, basedir, dirname, options = {})
|
40
42
|
super
|
41
|
-
|
42
|
-
|
43
|
+
setopts(options, {
|
44
|
+
# Standard option interface
|
45
|
+
:version => :ref,
|
46
|
+
:source => :remote,
|
47
|
+
:type => ::R10K::Util::Setopts::Ignore,
|
48
|
+
|
49
|
+
# Type-specific options
|
50
|
+
:ref => :self,
|
51
|
+
:remote => :self,
|
52
|
+
|
53
|
+
}, raise_on_unhandled: false)
|
54
|
+
# TODO: in r10k 4.0.0, a major version bump, stop allowing garbage options.
|
55
|
+
# We only allow them now, here, on this object, because prior to adopting
|
56
|
+
# setopts in the constructor, this object type didn't do any validation
|
57
|
+
# checking of options passed, and would permit garbage parameters.
|
43
58
|
|
44
59
|
@repo = R10K::Git::StatefulRepository.new(@remote, @basedir, @dirname)
|
45
60
|
end
|
@@ -12,13 +12,13 @@ module R10K
|
|
12
12
|
INVALID_CHARACTERS = %r[\W]
|
13
13
|
|
14
14
|
def initialize(name, opts)
|
15
|
-
@name = name
|
16
|
-
@opts = opts
|
17
|
-
|
18
15
|
@source = opts[:source]
|
19
16
|
@prefix = opts[:prefix]
|
20
17
|
@invalid = opts[:invalid]
|
21
18
|
|
19
|
+
@name = derive_name(name, opts[:strip_component])
|
20
|
+
@opts = opts
|
21
|
+
|
22
22
|
case @invalid
|
23
23
|
when 'correct_and_warn'
|
24
24
|
@validate = true
|
@@ -71,8 +71,26 @@ module R10K
|
|
71
71
|
|
72
72
|
private
|
73
73
|
|
74
|
-
def
|
74
|
+
def derive_name(name, strip_component)
|
75
|
+
return name unless strip_component
|
76
|
+
|
77
|
+
unless strip_component.is_a?(String)
|
78
|
+
raise _('Improper configuration value given for strip_component setting in %{src} source. ' \
|
79
|
+
'Value must be a string, a /regex/, false, or omitted. Got "%{val}" (%{type})' \
|
80
|
+
% {src: @source, val: strip_component, type: strip_component.class})
|
81
|
+
end
|
75
82
|
|
83
|
+
if %r{^/.*/$}.match(strip_component)
|
84
|
+
regex = Regexp.new(strip_component[1..-2])
|
85
|
+
name.gsub(regex, '')
|
86
|
+
elsif name.start_with?(strip_component)
|
87
|
+
name[strip_component.size..-1]
|
88
|
+
else
|
89
|
+
name
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def derive_prefix(source,prefix)
|
76
94
|
if prefix == true
|
77
95
|
"#{source}_"
|
78
96
|
elsif prefix.is_a? String
|
data/lib/r10k/environment/svn.rb
CHANGED
@@ -44,8 +44,17 @@ class R10K::Environment::SVN < R10K::Environment::Base
|
|
44
44
|
# @option options [String] :password The SVN password
|
45
45
|
def initialize(name, basedir, dirname, options = {})
|
46
46
|
super
|
47
|
+
setopts(options, {
|
48
|
+
# Standard option interface
|
49
|
+
:source => :remote,
|
50
|
+
:version => :expected_revision,
|
51
|
+
:type => ::R10K::Util::Setopts::Ignore,
|
47
52
|
|
48
|
-
|
53
|
+
# Type-specific options
|
54
|
+
:remote => :self,
|
55
|
+
:username => :self,
|
56
|
+
:password => :self,
|
57
|
+
})
|
49
58
|
|
50
59
|
@working_dir = R10K::SVN::WorkingDir.new(Pathname.new(@full_path), :username => @username, :password => @password)
|
51
60
|
end
|
@@ -61,7 +70,7 @@ class R10K::Environment::SVN < R10K::Environment::Base
|
|
61
70
|
if @working_dir.is_svn?
|
62
71
|
@working_dir.update
|
63
72
|
else
|
64
|
-
@working_dir.checkout(@remote)
|
73
|
+
@working_dir.checkout(@remote, @expected_revision)
|
65
74
|
end
|
66
75
|
@synced = true
|
67
76
|
end
|