r10k 3.14.1 → 5.0.1

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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +17 -0
  3. data/.github/workflows/docker.yml +9 -4
  4. data/.github/workflows/release.yml +3 -2
  5. data/.github/workflows/rspec_tests.yml +8 -10
  6. data/CHANGELOG.mkd +100 -0
  7. data/CODEOWNERS +1 -2
  8. data/Gemfile +2 -2
  9. data/README.mkd +18 -19
  10. data/doc/common-patterns.mkd +1 -2
  11. data/doc/dynamic-environments/configuration.mkd +91 -12
  12. data/doc/dynamic-environments/usage.mkd +4 -0
  13. data/doc/dynamic-environments/workflow-guide.mkd +3 -3
  14. data/doc/faq.mkd +1 -1
  15. data/doc/puppetfile.mkd +9 -3
  16. data/integration/Gemfile +3 -4
  17. data/integration/Rakefile +58 -23
  18. data/integration/files/pre-suite/git_config.pp.erb +1 -1
  19. data/integration/pre-suite/00_pe_install.rb +3 -0
  20. data/integration/pre-suite/10_git_config.rb +1 -3
  21. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
  22. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
  23. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
  24. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
  25. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
  26. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
  27. data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
  28. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
  29. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
  30. data/integration/tests/git_source/git_source_git.rb +1 -4
  31. data/integration/tests/git_source/git_source_repeated_remote.rb +2 -5
  32. data/integration/tests/git_source/git_source_submodule.rb +1 -1
  33. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
  34. data/integration/tests/purging/content_not_purged_at_root.rb +2 -5
  35. data/integration/tests/purging/default_purging.rb +0 -3
  36. data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
  37. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -4
  38. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -4
  39. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -4
  40. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
  41. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
  42. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
  43. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
  44. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
  45. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
  46. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
  47. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
  48. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -4
  49. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
  50. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
  51. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
  52. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
  53. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -4
  54. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
  55. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
  56. data/lib/r10k/action/deploy/environment.rb +2 -19
  57. data/lib/r10k/action/deploy/module.rb +1 -0
  58. data/lib/r10k/action/puppetfile/check.rb +7 -0
  59. data/lib/r10k/action/puppetfile/install.rb +3 -1
  60. data/lib/r10k/cli/deploy.rb +15 -1
  61. data/lib/r10k/cli/puppetfile.rb +1 -0
  62. data/lib/r10k/content_synchronizer.rb +7 -2
  63. data/lib/r10k/environment/with_modules.rb +24 -1
  64. data/lib/r10k/environment.rb +0 -1
  65. data/lib/r10k/git/rugged/bare_repository.rb +5 -4
  66. data/lib/r10k/git/rugged/thin_repository.rb +7 -0
  67. data/lib/r10k/git/rugged/working_repository.rb +13 -7
  68. data/lib/r10k/git/shellgit/thin_repository.rb +5 -1
  69. data/lib/r10k/git/shellgit/working_repository.rb +5 -4
  70. data/lib/r10k/git/stateful_repository.rb +4 -4
  71. data/lib/r10k/module/base.rb +3 -3
  72. data/lib/r10k/module/git.rb +19 -5
  73. data/lib/r10k/module_loader/puppetfile/dsl.rb +4 -0
  74. data/lib/r10k/module_loader/puppetfile.rb +22 -14
  75. data/lib/r10k/puppetfile.rb +1 -1
  76. data/lib/r10k/settings/container.rb +1 -0
  77. data/lib/r10k/settings.rb +6 -7
  78. data/lib/r10k/tarball.rb +1 -1
  79. data/lib/r10k/version.rb +1 -1
  80. data/locales/r10k.pot +34 -82
  81. data/r10k.gemspec +8 -18
  82. metadata +40 -213
  83. data/.github/workflows/stale.yml +0 -21
  84. data/.travis.yml +0 -42
  85. data/docker/.gitignore +0 -1
  86. data/docker/.rspec +0 -4
  87. data/docker/Gemfile +0 -11
  88. data/docker/Makefile +0 -92
  89. data/docker/README.md +0 -28
  90. data/docker/docker-compose.yml +0 -18
  91. data/docker/r10k/Dockerfile +0 -68
  92. data/docker/r10k/adduser.sh +0 -13
  93. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
  94. data/docker/r10k/docker-entrypoint.sh +0 -10
  95. data/docker/r10k/release.Dockerfile +0 -55
  96. data/docker/spec/dockerfile_spec.rb +0 -37
  97. data/docker/spec/fixtures/Puppetfile +0 -2
  98. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
  99. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
  100. data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
  102. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
  103. data/lib/r10k/environment/bare.rb +0 -13
  104. data/spec/fixtures/empty/.empty +0 -0
  105. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  106. data/spec/fixtures/module/forge/bad_module/metadata.json +0 -1
  107. data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
  108. data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
  109. data/spec/fixtures/tarball/tarball.tar.gz +0 -0
  110. data/spec/fixtures/unit/action/r10k.yaml +0 -5
  111. data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
  112. data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
  113. data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
  114. data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
  115. data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
  116. data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
  117. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
  118. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
  119. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
  120. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
  121. data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
  122. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
  123. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
  124. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
  125. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
  126. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
  127. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
  128. data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
  129. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  130. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
  131. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_1 +0 -0
  132. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  133. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  134. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/unmanaged_symlink_dir +0 -1
  135. data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
  136. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  137. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
  138. data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +0 -0
  139. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  140. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  141. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +0 -3
  142. data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
  143. data/spec/integration/git/rugged/cache_spec.rb +0 -33
  144. data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
  145. data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
  146. data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
  147. data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
  148. data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
  149. data/spec/integration/git/stateful_repository_spec.rb +0 -159
  150. data/spec/integration/util/purageable_spec.rb +0 -41
  151. data/spec/matchers/exit_with.rb +0 -28
  152. data/spec/matchers/match_realpath.rb +0 -18
  153. data/spec/r10k-mocks/mock_config.rb +0 -33
  154. data/spec/r10k-mocks/mock_env.rb +0 -18
  155. data/spec/r10k-mocks/mock_source.rb +0 -17
  156. data/spec/r10k-mocks.rb +0 -3
  157. data/spec/shared-contexts/git-fixtures.rb +0 -55
  158. data/spec/shared-contexts/tarball.rb +0 -32
  159. data/spec/shared-examples/deploy-actions.rb +0 -69
  160. data/spec/shared-examples/git/bare_repository.rb +0 -132
  161. data/spec/shared-examples/git/thin_repository.rb +0 -26
  162. data/spec/shared-examples/git/working_repository.rb +0 -207
  163. data/spec/shared-examples/git-repository.rb +0 -38
  164. data/spec/shared-examples/puppetfile-action.rb +0 -39
  165. data/spec/shared-examples/settings/ancestry.rb +0 -44
  166. data/spec/shared-examples/subprocess-runner.rb +0 -89
  167. data/spec/spec_helper.rb +0 -41
  168. data/spec/unit/action/cri_runner_spec.rb +0 -72
  169. data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
  170. data/spec/unit/action/deploy/display_spec.rb +0 -61
  171. data/spec/unit/action/deploy/environment_spec.rb +0 -640
  172. data/spec/unit/action/deploy/module_spec.rb +0 -476
  173. data/spec/unit/action/puppetfile/check_spec.rb +0 -53
  174. data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
  175. data/spec/unit/action/puppetfile/install_spec.rb +0 -112
  176. data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
  177. data/spec/unit/action/runner_spec.rb +0 -407
  178. data/spec/unit/action/visitor_spec.rb +0 -39
  179. data/spec/unit/cli_spec.rb +0 -9
  180. data/spec/unit/deployment/config_spec.rb +0 -33
  181. data/spec/unit/deployment_spec.rb +0 -162
  182. data/spec/unit/environment/bare_spec.rb +0 -13
  183. data/spec/unit/environment/base_spec.rb +0 -122
  184. data/spec/unit/environment/git_spec.rb +0 -114
  185. data/spec/unit/environment/name_spec.rb +0 -181
  186. data/spec/unit/environment/plain_spec.rb +0 -8
  187. data/spec/unit/environment/svn_spec.rb +0 -146
  188. data/spec/unit/environment/tarball_spec.rb +0 -45
  189. data/spec/unit/environment/with_modules_spec.rb +0 -75
  190. data/spec/unit/errors/formatting_spec.rb +0 -84
  191. data/spec/unit/feature_spec.rb +0 -50
  192. data/spec/unit/forge/module_release_spec.rb +0 -213
  193. data/spec/unit/git/alternates_spec.rb +0 -116
  194. data/spec/unit/git/cache_spec.rb +0 -66
  195. data/spec/unit/git/rugged/cache_spec.rb +0 -48
  196. data/spec/unit/git/rugged/credentials_spec.rb +0 -215
  197. data/spec/unit/git/shellgit/cache_spec.rb +0 -27
  198. data/spec/unit/git/stateful_repository_spec.rb +0 -45
  199. data/spec/unit/git_spec.rb +0 -102
  200. data/spec/unit/initializers_spec.rb +0 -68
  201. data/spec/unit/instance_cache_spec.rb +0 -78
  202. data/spec/unit/keyed_factory_spec.rb +0 -51
  203. data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
  204. data/spec/unit/logging_spec.rb +0 -68
  205. data/spec/unit/module/base_spec.rb +0 -118
  206. data/spec/unit/module/forge_spec.rb +0 -271
  207. data/spec/unit/module/git_spec.rb +0 -387
  208. data/spec/unit/module/metadata_file_spec.rb +0 -68
  209. data/spec/unit/module/svn_spec.rb +0 -208
  210. data/spec/unit/module/tarball_spec.rb +0 -70
  211. data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
  212. data/spec/unit/module_spec.rb +0 -114
  213. data/spec/unit/puppetfile_spec.rb +0 -304
  214. data/spec/unit/settings/collection_spec.rb +0 -123
  215. data/spec/unit/settings/container_spec.rb +0 -92
  216. data/spec/unit/settings/definition_spec.rb +0 -79
  217. data/spec/unit/settings/enum_definition_spec.rb +0 -20
  218. data/spec/unit/settings/inheritance_spec.rb +0 -38
  219. data/spec/unit/settings/list_spec.rb +0 -88
  220. data/spec/unit/settings/loader_spec.rb +0 -110
  221. data/spec/unit/settings/uri_definition_spec.rb +0 -23
  222. data/spec/unit/settings_spec.rb +0 -303
  223. data/spec/unit/source/base_spec.rb +0 -31
  224. data/spec/unit/source/exec_spec.rb +0 -81
  225. data/spec/unit/source/git_spec.rb +0 -233
  226. data/spec/unit/source/hash_spec.rb +0 -54
  227. data/spec/unit/source/svn_spec.rb +0 -196
  228. data/spec/unit/source/yaml_spec.rb +0 -42
  229. data/spec/unit/source_spec.rb +0 -10
  230. data/spec/unit/svn/remote_spec.rb +0 -21
  231. data/spec/unit/svn/working_dir_spec.rb +0 -56
  232. data/spec/unit/tarball_spec.rb +0 -57
  233. data/spec/unit/util/attempt_spec.rb +0 -82
  234. data/spec/unit/util/cacheable_spec.rb +0 -23
  235. data/spec/unit/util/commands_spec.rb +0 -61
  236. data/spec/unit/util/downloader_spec.rb +0 -98
  237. data/spec/unit/util/exec_env_spec.rb +0 -56
  238. data/spec/unit/util/purgeable_spec.rb +0 -267
  239. data/spec/unit/util/setopts_spec.rb +0 -83
  240. data/spec/unit/util/subprocess/result_spec.rb +0 -36
  241. data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
  242. data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
  243. data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
  244. data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
  245. data/spec/unit/util/subprocess_spec.rb +0 -65
  246. data/spec/unit/util/symbolize_keys_spec.rb +0 -67
@@ -1,271 +0,0 @@
1
- require 'r10k/module/forge'
2
- require 'spec_helper'
3
-
4
- describe R10K::Module::Forge do
5
- # TODO: make these *unit* tests not depend on a real module on the real Forge :(
6
-
7
- include_context 'fail on execution'
8
-
9
- let(:fixture_modulepath) { File.expand_path('spec/fixtures/module/forge', PROJECT_ROOT) }
10
- let(:empty_modulepath) { File.expand_path('spec/fixtures/empty', PROJECT_ROOT) }
11
-
12
- describe "statically determined version support" do
13
- it 'returns explicitly released forge versions' do
14
- static_version = described_class.statically_defined_version('branan/eight_hundred', { version: '8.0.0' })
15
- expect(static_version).to eq('8.0.0')
16
- end
17
-
18
- it 'returns explicit pre-released forge versions' do
19
- static_version = described_class.statically_defined_version('branan/eight_hundred', { version: '8.0.0-pre1' })
20
- expect(static_version).to eq('8.0.0-pre1')
21
- end
22
-
23
- it 'retuns nil for latest versions' do
24
- static_version = described_class.statically_defined_version('branan/eight_hundred', { version: :latest })
25
- expect(static_version).to eq(nil)
26
- end
27
-
28
- it 'retuns nil for undefined versions' do
29
- static_version = described_class.statically_defined_version('branan/eight_hundred', { version: nil })
30
- expect(static_version).to eq(nil)
31
- end
32
- end
33
-
34
- describe "implementing the Puppetfile spec" do
35
- it "should implement 'branan/eight_hundred', '8.0.0'" do
36
- expect(described_class).to be_implement('branan/eight_hundred', { type: 'forge', version: '8.0.0' })
37
- end
38
-
39
- it "should implement 'branan-eight_hundred', '8.0.0'" do
40
- expect(described_class).to be_implement('branan-eight_hundred', { type: 'forge', version: '8.0.0' })
41
- end
42
- end
43
-
44
- describe "implementing the standard options interface" do
45
- it "should implement {type: forge}" do
46
- expect(described_class).to be_implement('branan-eight_hundred', { type: 'forge', version: '8.0.0', source: 'not implemented' })
47
- end
48
- end
49
-
50
- describe "setting attributes" do
51
- subject { described_class.new('branan/eight_hundred', '/moduledir', { version: '8.0.0' }) }
52
-
53
- it "sets the name" do
54
- expect(subject.name).to eq 'eight_hundred'
55
- end
56
-
57
- it "sets the author" do
58
- expect(subject.author).to eq 'branan'
59
- end
60
-
61
- it "sets the dirname" do
62
- expect(subject.dirname).to eq '/moduledir'
63
- end
64
-
65
- it "sets the title" do
66
- expect(subject.title).to eq 'branan-eight_hundred'
67
- end
68
- end
69
-
70
- describe "invalid attributes" do
71
- it "errors on invalid versions" do
72
- expect { described_class.new('branan/eight_hundred', '/moduledir', { version: '_8.0.0_' }) }.to raise_error ArgumentError, /version/
73
- end
74
- end
75
-
76
- describe "properties" do
77
- subject { described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' }) }
78
-
79
- it "sets the module type to :forge" do
80
- expect(subject.properties).to include(:type => :forge)
81
- end
82
-
83
- it "sets the expected version" do
84
- expect(subject.properties).to include(:expected => '8.0.0')
85
- end
86
-
87
- it "sets the actual version" do
88
- expect(subject).to receive(:current_version).and_return('0.8.0')
89
- expect(subject.properties).to include(:actual => '0.8.0')
90
- end
91
- end
92
-
93
- context "when a module is deprecated" do
94
- subject { described_class.new('puppetlabs/corosync', fixture_modulepath, { version: :latest }) }
95
-
96
- it "warns on sync if module is not already insync" do
97
- allow(subject).to receive(:status).and_return(:absent)
98
-
99
- allow(R10K::Forge::ModuleRelease).to receive(:new).and_return(double('mod_release', install: true))
100
-
101
- logger_dbl = double(Log4r::Logger)
102
- allow_any_instance_of(described_class).to receive(:logger).and_return(logger_dbl)
103
-
104
- allow(logger_dbl).to receive(:info).with(/Deploying module to.*/)
105
- allow(logger_dbl).to receive(:debug2).with(/No spec dir detected/)
106
- expect(logger_dbl).to receive(:warn).with(/puppet forge module.*puppetlabs-corosync.*has been deprecated/i)
107
-
108
- subject.sync
109
- end
110
-
111
- it "does not warn on sync if module is already insync" do
112
- allow(subject).to receive(:status).and_return(:insync)
113
-
114
- logger_dbl = double(Log4r::Logger)
115
- allow_any_instance_of(described_class).to receive(:logger).and_return(logger_dbl)
116
-
117
- allow(logger_dbl).to receive(:info).with(/Deploying module to.*/)
118
- allow(logger_dbl).to receive(:debug2).with(/No spec dir detected/)
119
- expect(logger_dbl).to_not receive(:warn).with(/puppet forge module.*puppetlabs-corosync.*has been deprecated/i)
120
-
121
- subject.sync
122
- end
123
- end
124
-
125
- describe '#expected_version' do
126
- it "returns an explicitly given expected version" do
127
- subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' })
128
- expect(subject.expected_version).to eq '8.0.0'
129
- end
130
-
131
- it "uses the latest version from the forge when the version is :latest" do
132
- subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: :latest })
133
- release = double("Module Release", version: '8.8.8')
134
- expect(subject.v3_module).to receive(:current_release).and_return(release).twice
135
- expect(subject.expected_version).to eq '8.8.8'
136
- end
137
-
138
- it "throws when there are no available versions" do
139
- subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: :latest })
140
- expect(subject.v3_module).to receive(:current_release).and_return(nil)
141
- expect { subject.expected_version }.to raise_error(PuppetForge::ReleaseNotFound)
142
- end
143
- end
144
-
145
- describe "determining the status" do
146
-
147
- subject { described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' }) }
148
-
149
- it "is :absent if the module directory is absent" do
150
- allow(subject).to receive(:exist?).and_return false
151
- expect(subject.status).to eq :absent
152
- end
153
-
154
- it "is :mismatched if there is no module metadata" do
155
- allow(subject).to receive(:exist?).and_return true
156
- allow(File).to receive(:exist?).and_return false
157
-
158
- expect(subject.status).to eq :mismatched
159
- end
160
-
161
- it "is :mismatched if module was previously a git checkout" do
162
- allow(File).to receive(:directory?).and_return true
163
-
164
- expect(subject.status).to eq :mismatched
165
- end
166
-
167
- it "is :mismatched if the metadata author doesn't match the expected author" do
168
- allow(subject).to receive(:exist?).and_return true
169
-
170
- allow(subject.instance_variable_get(:@metadata_file)).to receive(:read).and_return subject.metadata
171
- allow(subject.metadata).to receive(:full_module_name).and_return 'blargh-blargh'
172
-
173
- expect(subject.status).to eq :mismatched
174
- end
175
-
176
- it "is :outdated if the metadata version doesn't match the expected version" do
177
- allow(subject).to receive(:exist?).and_return true
178
-
179
- allow(subject.instance_variable_get(:@metadata_file)).to receive(:read).and_return subject.metadata
180
- allow(subject.metadata).to receive(:version).and_return '7.0.0'
181
- expect(subject.status).to eq :outdated
182
- end
183
-
184
- it "is :insync if the version and the author are in sync" do
185
- allow(subject).to receive(:exist?).and_return true
186
-
187
- expect(subject.status).to eq :insync
188
- end
189
- end
190
-
191
- describe "#sync" do
192
- subject { described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' }) }
193
-
194
- context "syncing the repo" do
195
- let(:module_org) { "coolorg" }
196
- let(:module_name) { "coolmod" }
197
- let(:title) { "#{module_org}-#{module_name}" }
198
- let(:dirname) { Pathname.new(Dir.mktmpdir) }
199
- let(:spec_path) { dirname + module_name + 'spec' }
200
- subject { described_class.new(title, dirname, {}) }
201
-
202
- it 'defaults to keeping the spec dir' do
203
- FileUtils.mkdir_p(spec_path)
204
- expect(subject).to receive(:status).and_return(:absent)
205
- expect(subject).to receive(:install)
206
- subject.sync
207
- expect(Dir.exist?(spec_path)).to eq true
208
- end
209
- end
210
-
211
- it 'does nothing when the module is in sync' do
212
- allow(subject).to receive(:status).and_return :insync
213
-
214
- expect(subject).to receive(:install).never
215
- expect(subject).to receive(:upgrade).never
216
- expect(subject).to receive(:reinstall).never
217
- expect(subject.sync).to be false
218
- end
219
-
220
- it 'reinstalls the module when it is mismatched' do
221
- allow(subject).to receive(:status).and_return :mismatched
222
- expect(subject).to receive(:reinstall)
223
- expect(subject.sync).to be true
224
- end
225
-
226
- it 'upgrades the module when it is outdated' do
227
- allow(subject).to receive(:status).and_return :outdated
228
- expect(subject).to receive(:upgrade)
229
- expect(subject.sync).to be true
230
- end
231
-
232
- it 'installs the module when it is absent' do
233
- allow(subject).to receive(:status).and_return :absent
234
- expect(subject).to receive(:install)
235
- expect(subject.sync).to be true
236
- end
237
-
238
- it 'returns false if `should_sync?` is false' do
239
- # modules do not sync if they are not requested
240
- mod = described_class.new('my_org/my_mod', '/path/to/mod', { overrides: { modules: { requested_modules: ['other_mod'] } } })
241
- expect(mod.sync).to be false
242
- end
243
- end
244
-
245
- describe '#install' do
246
- it 'installs the module from the forge' do
247
- subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' })
248
- release = instance_double('R10K::Forge::ModuleRelease')
249
- expect(R10K::Forge::ModuleRelease).to receive(:new).with('branan-eight_hundred', '8.0.0').and_return(release)
250
- expect(release).to receive(:install).with(subject.path)
251
- subject.install
252
- end
253
- end
254
-
255
- describe '#uninstall' do
256
- it 'removes the module path' do
257
- subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' })
258
- expect(FileUtils).to receive(:rm_rf).with(subject.path.to_s)
259
- subject.uninstall
260
- end
261
- end
262
-
263
- describe '#reinstall' do
264
- it 'uninstalls and then installs the module' do
265
- subject = described_class.new('branan/eight_hundred', fixture_modulepath, { version: '8.0.0' })
266
- expect(subject).to receive(:uninstall)
267
- expect(subject).to receive(:install)
268
- subject.reinstall
269
- end
270
- end
271
- end
@@ -1,387 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/module/git'
3
-
4
- describe R10K::Module::Git do
5
- let(:mock_repo) do
6
- instance_double("R10K::Git::StatefulRepository")
7
- end
8
-
9
- before(:each) do
10
- allow(R10K::Git::StatefulRepository).to receive(:new).and_return(mock_repo)
11
- end
12
-
13
-
14
- describe "statically determined version support" do
15
- it 'returns a given commit' do
16
- static_version = described_class.statically_defined_version('branan/eight_hundred', { git: 'my/remote', commit: '123adf' })
17
- expect(static_version).to eq('123adf')
18
- end
19
-
20
- it 'returns a given tag' do
21
- static_version = described_class.statically_defined_version('branan/eight_hundred', { git: 'my/remote', tag: 'v1.2.3' })
22
- expect(static_version).to eq('v1.2.3')
23
- end
24
-
25
- it 'returns a ref if it looks like a full commit sha' do
26
- static_version = described_class.statically_defined_version('branan/eight_hundred', { git: 'my/remote', ref: '1234567890abcdef1234567890abcdef12345678' })
27
- expect(static_version).to eq('1234567890abcdef1234567890abcdef12345678')
28
- end
29
-
30
- it 'returns nil for any non-sha-like ref' do
31
- static_version = described_class.statically_defined_version('branan/eight_hundred', { git: 'my/remote', ref: 'refs/heads/main' })
32
- expect(static_version).to eq(nil)
33
- end
34
-
35
- it 'returns nil for branches' do
36
- static_version = described_class.statically_defined_version('branan/eight_hundred', { git: 'my/remote', branch: 'main' })
37
- expect(static_version).to eq(nil)
38
- end
39
- end
40
-
41
- describe "setting the owner and name" do
42
- describe "with a title of 'branan/eight_hundred'" do
43
- subject do
44
- described_class.new(
45
- 'branan/eight_hundred',
46
- '/moduledir',
47
- { :git => 'git://git-server.site/branan/puppet-eight_hundred' }
48
- )
49
- end
50
-
51
- it "sets the owner to 'branan'" do
52
- expect(subject.owner).to eq 'branan'
53
- end
54
-
55
- it "sets the name to 'eight_hundred'" do
56
- expect(subject.name).to eq 'eight_hundred'
57
- end
58
-
59
- it "sets the path to '/moduledir/eight_hundred'" do
60
- expect(subject.path).to eq(Pathname.new('/moduledir/eight_hundred'))
61
- end
62
- end
63
-
64
- describe "with a title of 'modulename'" do
65
- subject do
66
- described_class.new(
67
- 'eight_hundred',
68
- '/moduledir',
69
- { :git => 'git://git-server.site/branan/puppet-eight_hundred' }
70
- )
71
- end
72
-
73
- it "sets the owner to nil" do
74
- expect(subject.owner).to be_nil
75
- end
76
-
77
- it "sets the name to 'eight_hundred'" do
78
- expect(subject.name).to eq 'eight_hundred'
79
- end
80
-
81
- it "sets the path to '/moduledir/eight_hundred'" do
82
- expect(subject.path).to eq(Pathname.new('/moduledir/eight_hundred'))
83
- end
84
- end
85
- end
86
-
87
- describe "properties" do
88
- subject do
89
- described_class.new('boolean', '/moduledir', {:git => 'git://git.example.com/adrienthebo/puppet-boolean'})
90
- end
91
-
92
- before(:each) do
93
- allow(mock_repo).to receive(:resolve).with('master').and_return('abc123')
94
- allow(mock_repo).to receive(:head).and_return('abc123')
95
- end
96
-
97
- it "sets the module type to :git" do
98
- expect(subject.properties).to include(:type => :git)
99
- end
100
-
101
- it "sets the expected version" do
102
- expect(subject.properties).to include(:expected => 'master')
103
- end
104
-
105
- it "sets the actual version to the revision when the revision is available" do
106
- expect(mock_repo).to receive(:head).and_return('35d3517e67ceeb4b485b56d4a14d38fb95516c92')
107
- expect(subject.properties).to include(:actual => '35d3517e67ceeb4b485b56d4a14d38fb95516c92')
108
- end
109
-
110
- it "sets the actual version to (unresolvable) when the revision is unavailable" do
111
- expect(mock_repo).to receive(:head).and_return(nil)
112
- expect(subject.properties).to include(:actual => '(unresolvable)')
113
- end
114
- end
115
-
116
- describe 'syncing the repo' do
117
- let(:module_org) { "coolorg" }
118
- let(:module_name) { "coolmod" }
119
- let(:title) { "#{module_org}-#{module_name}" }
120
- let(:dirname) { Pathname.new(Dir.mktmpdir) }
121
- let(:spec_path) { dirname + module_name + 'spec' }
122
- subject { described_class.new(title, dirname, {}) }
123
-
124
- before(:each) do
125
- allow(mock_repo).to receive(:resolve).with('master').and_return('abc123')
126
- end
127
-
128
- it 'defaults to keeping the spec dir' do
129
- FileUtils.mkdir_p(spec_path)
130
- allow(mock_repo).to receive(:sync)
131
- subject.sync
132
- expect(Dir.exist?(spec_path)).to eq true
133
- end
134
-
135
- it 'returns true if repo was updated' do
136
- expect(mock_repo).to receive(:sync).and_return(true)
137
- expect(subject.sync).to be true
138
- end
139
-
140
- it 'returns false if repo was not updated (in-sync)' do
141
- expect(mock_repo).to receive(:sync).and_return(false)
142
- expect(subject.sync).to be false
143
- end
144
-
145
- it 'returns false if `should_sync?` is false' do
146
- # modules do not sync if they are not requested
147
- mod = described_class.new(title, dirname, { overrides: { modules: { requested_modules: ['other_mod'] } } })
148
- expect(mod.sync).to be false
149
- end
150
- end
151
-
152
- describe "determining the status" do
153
- subject do
154
- described_class.new(
155
- 'boolean',
156
- '/moduledir',
157
- { :git => 'git://git.example.com/adrienthebo/puppet-boolean' }
158
- )
159
- end
160
-
161
- it "delegates to the repo" do
162
- expect(subject).to receive(:version).and_return 'master'
163
- expect(mock_repo).to receive(:status).with('master').and_return :some_status
164
-
165
- expect(subject.status).to eq(:some_status)
166
- end
167
- end
168
-
169
- describe "option parsing" do
170
- def test_module(extra_opts, env=nil)
171
- described_class.new('boolean', '/moduledir', base_opts.merge(extra_opts), env)
172
- end
173
-
174
- let(:base_opts) { { git: 'git://git.example.com/adrienthebo/puppet-boolean' } }
175
-
176
- before(:each) do
177
- allow(mock_repo).to receive(:head).and_return('abc123')
178
- end
179
-
180
- describe "desired ref" do
181
- context "when no desired ref is given" do
182
- it "defaults to master" do
183
- expect(mock_repo).to receive(:resolve).with('master').and_return('abc123')
184
-
185
- expect(test_module({}).properties).to include(expected: 'master')
186
- end
187
- end
188
-
189
- context "specifying a static desired branch" do
190
- let(:opts) { { branch: 'banana' } }
191
-
192
- it "sets expected to specified branch name" do
193
- expect(mock_repo).to receive(:resolve).with('banana').and_return('def456')
194
-
195
- mod = test_module(opts)
196
- expect(mod.properties).to include(expected: 'banana')
197
- end
198
- end
199
-
200
- context "specifying a static desired tag" do
201
- let(:opts) { { tag: '1.2.3' } }
202
-
203
- it "sets expected to specified tag" do
204
- expect(mock_repo).to receive(:resolve).with('1.2.3').and_return('def456')
205
-
206
- mod = test_module(opts)
207
- expect(mod.properties).to include(expected: '1.2.3')
208
- end
209
- end
210
-
211
- context "specifying a static desired commit sha" do
212
- let(:opts) { { commit: 'ace789' } }
213
-
214
- it "sets expected to specified commit sha" do
215
- expect(mock_repo).to receive(:resolve).with('ace789').and_return('ace789')
216
-
217
- mod = test_module(opts)
218
- expect(mod.properties).to include(expected: 'ace789')
219
- end
220
- end
221
-
222
- context "specifying a static desired ref" do
223
- before(:each) do
224
- expect(mock_repo).to receive(:resolve).and_return('abc123')
225
- end
226
-
227
- it "accepts a branch name" do
228
- mod = test_module(ref: 'banana')
229
- expect(mod.properties).to include(expected: 'banana')
230
- end
231
-
232
- it "accepts a tag name" do
233
- mod = test_module(ref: '1.2.3')
234
- expect(mod.properties).to include(expected: '1.2.3')
235
- end
236
-
237
- it "accepts a commit sha" do
238
- mod = test_module(ref: 'abc123')
239
- expect(mod.properties).to include(expected: 'abc123')
240
- end
241
- end
242
-
243
- context "specifying branch to :control_branch" do
244
- let(:mock_env) { instance_double("R10K::Environment::Git", ref: 'env_branch') }
245
-
246
- context "when module belongs to an environment and matching branch is resolvable" do
247
- before(:each) do
248
- expect(mock_repo).to receive(:resolve).with(mock_env.ref).and_return('abc123')
249
- end
250
-
251
- it "tracks environment branch" do
252
- mod = test_module({branch: :control_branch}, mock_env)
253
- expect(mod.properties).to include(expected: mock_env.ref)
254
- end
255
- end
256
-
257
- context "when module does not belong to an environment" do
258
- it "leaves desired_ref unchanged" do
259
- mod = test_module(branch: :control_branch)
260
- expect(mod.desired_ref).to eq(:control_branch)
261
- end
262
-
263
- it "warns control branch may be unresolvable" do
264
- logger = double("logger")
265
- allow_any_instance_of(described_class).to receive(:logger).and_return(logger)
266
- expect(logger).to receive(:warn).with(/Cannot track control repo branch.*boolean.*/)
267
-
268
- test_module(branch: :control_branch)
269
- end
270
-
271
- context "when default ref is provided and resolvable" do
272
- it "uses default ref" do
273
- expect(mock_repo).to receive(:resolve).with('default').and_return('abc123')
274
- mod = test_module({branch: :control_branch, default_branch: 'default'})
275
-
276
- expect(mod.properties).to include(expected: 'default')
277
- end
278
- end
279
-
280
- context "when default ref is provided and not resolvable" do
281
- it "raises appropriate error" do
282
- expect(mock_repo).to receive(:resolve).with('default').and_return(nil)
283
- mod = test_module({branch: :control_branch, default_branch: 'default'})
284
-
285
- expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*could not resolve control repo branch.*or resolve default/i)
286
- end
287
- end
288
-
289
- context "when default ref is not provided" do
290
- it "raises appropriate error" do
291
- mod = test_module({branch: :control_branch})
292
-
293
- expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*could not resolve control repo branch.*no default provided/i)
294
- end
295
- end
296
- end
297
-
298
- context "when module does not have matching branch" do
299
- before(:each) do
300
- allow(mock_repo).to receive(:resolve).with(mock_env.ref).and_return(nil)
301
- end
302
-
303
- context "when default ref is provided and resolvable" do
304
- it "uses default ref" do
305
- expect(mock_repo).to receive(:resolve).with('default').and_return('abc123')
306
- mod = test_module({branch: :control_branch, default_branch: 'default'}, mock_env)
307
-
308
- expect(mod.properties).to include(expected: 'default')
309
- end
310
- end
311
-
312
- context "when default ref is provided and not resolvable" do
313
- it "raises appropriate error" do
314
- expect(mock_repo).to receive(:resolve).with('default').and_return(nil)
315
- mod = test_module({branch: :control_branch, default_branch: 'default'}, mock_env)
316
-
317
- expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*could not resolve desired.*or resolve default/i)
318
- end
319
- end
320
-
321
- context "when default ref is not provided" do
322
- it "raises appropriate error" do
323
- mod = test_module({branch: :control_branch}, mock_env)
324
-
325
- expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*no default provided/i)
326
- end
327
- end
328
- end
329
-
330
- context "when using default_branch_override" do
331
- before(:each) do
332
- allow(mock_repo).to receive(:resolve).with(mock_env.ref).and_return(nil)
333
- end
334
-
335
- context "and the default branch override is resolvable" do
336
- it "uses the override" do
337
- expect(mock_repo).to receive(:resolve).with('default_override').and_return('5566aabb')
338
- mod = test_module({branch: :control_branch,
339
- default_branch: 'default',
340
- default_branch_override: 'default_override'},
341
- mock_env)
342
- expect(mod.properties).to include(expected: 'default_override')
343
- end
344
- end
345
-
346
- context "and the default branch override is not resolvable" do
347
- context "and default branch is provided" do
348
- it "falls back to the default" do
349
- expect(mock_repo).to receive(:resolve).with('default_override').and_return(nil)
350
- expect(mock_repo).to receive(:resolve).with('default').and_return('5566aabb')
351
- mod = test_module({branch: :control_branch,
352
- default_branch: 'default',
353
- default_branch_override: 'default_override'},
354
- mock_env)
355
- expect(mod.properties).to include(expected: 'default')
356
- end
357
- end
358
-
359
- context "and default branch is not provided" do
360
- it "raises the appropriate error" do
361
- expect(mock_repo).to receive(:resolve).with('default_override').and_return(nil)
362
- mod = test_module({branch: :control_branch,
363
- default_branch_override: 'default_override'},
364
- mock_env)
365
-
366
- expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*or resolve the default branch override.*no default provided/i)
367
- end
368
- end
369
-
370
- context "and default branch is not resolvable" do
371
- it "raises the appropriate error" do
372
- expect(mock_repo).to receive(:resolve).with('default_override').and_return(nil)
373
- expect(mock_repo).to receive(:resolve).with('default').and_return(nil)
374
- mod = test_module({branch: :control_branch,
375
- default_branch: 'default',
376
- default_branch_override: 'default_override'},
377
- mock_env)
378
-
379
- expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*or resolve the default branch override.*or resolve default/i)
380
- end
381
- end
382
- end
383
- end
384
- end
385
- end
386
- end
387
- end