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,116 +0,0 @@
1
- require 'spec_helper'
2
- require 'stringio'
3
- require 'r10k/git'
4
-
5
- describe R10K::Git::Alternates do
6
- subject { described_class.new(Pathname.new("/some/nonexistent/path/.git")) }
7
-
8
- it "interacts with the alternates file in the given git repository" do
9
- expect(subject.file.to_s).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.read).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
-
51
- describe "writing alternate entries" do
52
- describe "and the git objects/info directory does not exist" do
53
- it "raises an error when the parent directory does not exist" do
54
- expect {
55
- subject.write(["/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"])
56
- }.to raise_error(R10K::Git::GitError,"Cannot write /some/nonexistent/path/.git/objects/info/alternates; parent directory does not exist")
57
- end
58
- end
59
-
60
- describe "and the git objects/info directory exists" do
61
- let(:io) { StringIO.new }
62
-
63
- before do
64
- expect(subject.file).to receive(:open).with('w').and_yield(io)
65
- expect(subject.file).to receive_message_chain(:parent, :directory?).and_return true
66
- end
67
-
68
- it "creates the alternates file with the new entry when not present" do
69
- subject.write(["/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"])
70
- expect(io.string).to eq("/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git\n")
71
- end
72
-
73
- it "rewrites the file with all alternate entries" do
74
- subject.write(["/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
75
- "/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
76
- "/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"])
77
-
78
- expect(io.string).to eq(<<-EOD)
79
- /var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git
80
- /vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git
81
- /tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git
82
- EOD
83
- end
84
- end
85
-
86
- describe "appending a new alternate object entry" do
87
- it "re-writes the file with the new entry concatenated to the file" do
88
- expect(subject).to receive(:to_a).and_return(["/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
89
- "/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"])
90
-
91
- expect(subject).to receive(:write).with(["/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
92
- "/vagrant/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
93
- "/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"])
94
-
95
- subject.add("/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git")
96
- end
97
- end
98
- end
99
-
100
- describe "conditionally appending a new alternate object entry" do
101
- before do
102
- expect(subject).to receive(:read).and_return(%w[/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git])
103
- end
104
-
105
- it "adds the entry and returns true when the entry doesn't exist" do
106
- expect(subject).to receive(:write).with(["/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git",
107
- "/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git"])
108
- expect(subject.add?("/tmp/.r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git")).to eq true
109
- end
110
-
111
- it "doesn't modify the file and returns false when the entry exists" do
112
- expect(subject).to_not receive(:write)
113
- expect(subject.add?("/var/cache/r10k/git/git---github.com-puppetlabs-puppetlabs-apache.git")).to eq false
114
- end
115
- end
116
- end
@@ -1,66 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/git/cache'
3
-
4
- describe R10K::Git::Cache do
5
-
6
- describe 'the default cache_root' do
7
- it 'is in the right location in linux', unless: R10K::Util::Platform.windows? do
8
- expect(described_class.defaults[:cache_root]).to match(/\.r10k\/git/)
9
- end
10
-
11
- it 'is in the right location for windows', if: R10K::Util::Platform.windows? do
12
- expect(described_class.defaults[:cache_root]).to match(/[^.]r10k\/git/)
13
- end
14
- end
15
-
16
- let(:subclass) do
17
- Class.new(described_class) do
18
- def self.bare_repository
19
- Class.new { def initialize(*args) end }
20
- end
21
- end
22
- end
23
-
24
- let(:remote) { 'git://some/git/remote' }
25
- subject { subclass.new(remote) }
26
-
27
- describe "updating the cache" do
28
- it "only updates the cache once" do
29
- expect(subject).to receive(:sync!).exactly(1).times
30
- subject.sync
31
- subject.sync
32
- end
33
- end
34
-
35
- describe "methods on the repository" do
36
- def expect_delegation(method)
37
- expect(subject.repo).to receive(method)
38
- subject.send(method)
39
- end
40
-
41
- it "delegates #git_dir" do
42
- expect_delegation(:git_dir)
43
- end
44
-
45
- it "delegates #objects_dir" do
46
- expect_delegation(:objects_dir)
47
- end
48
-
49
- it "delegates #branches" do
50
- expect_delegation(:branches)
51
- end
52
-
53
- it "delegates #tags" do
54
- expect_delegation(:tags)
55
- end
56
-
57
- it "delegates #exist?" do
58
- expect_delegation(:exist?)
59
- end
60
-
61
- it "aliases #cached? to #exist?" do
62
- expect(subject.repo).to receive(:exist?)
63
- subject.cached?
64
- end
65
- end
66
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe R10K::Git::Rugged::Cache, :unless => R10K::Util::Platform.jruby? do
4
- before(:all) do
5
- require 'r10k/git/rugged/cache'
6
- end
7
-
8
- subject(:cache) { described_class.new('git://some/git/remote') }
9
-
10
- it "wraps a Rugged::BareRepository instance" do
11
- expect(cache.repo).to be_a_kind_of R10K::Git::Rugged::BareRepository
12
- end
13
-
14
- describe "settings" do
15
- before do
16
- R10K::Git::Cache.settings[:cache_root] = '/some/path'
17
- described_class.settings.reset!
18
- end
19
-
20
- after do
21
- R10K::Git::Cache.settings.reset!
22
- described_class.settings.reset!
23
- end
24
-
25
- it "falls back to the parent class settings" do
26
- expect(described_class.settings[:cache_root]).to eq '/some/path'
27
- end
28
- end
29
-
30
- describe "remote url updates" do
31
- before do
32
- allow(subject.repo).to receive(:exist?).and_return true
33
- allow(subject.repo).to receive(:fetch)
34
- allow(subject.repo).to receive(:remotes).and_return({ 'origin' => 'git://some/git/remote' })
35
- end
36
-
37
- it "does not update the URLs if they match" do
38
- expect(subject.repo).to_not receive(:update_remote)
39
- subject.sync!
40
- end
41
-
42
- it "updates the remote URL if they do not match" do
43
- allow(subject.repo).to receive(:remotes).and_return({ 'origin' => 'foo'})
44
- expect(subject.repo).to receive(:update_remote)
45
- subject.sync!
46
- end
47
- end
48
- end
@@ -1,215 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe R10K::Git::Rugged::Credentials, :unless => R10K::Util::Platform.jruby? || R10K::Util::Platform.windows? do
4
- before(:all) do
5
- require 'r10k/git/rugged/credentials'
6
- require 'rugged/credentials'
7
- end
8
-
9
- let(:repo) { R10K::Git::Rugged::BareRepository.new("/some/nonexistent/path", "repo.git") }
10
-
11
- subject { described_class.new(repo) }
12
-
13
- after(:each) { R10K::Git.settings.reset! }
14
-
15
- describe "determining the username" do
16
- before { R10K::Git.settings[:username] = "moderns" }
17
- after { R10K::Git.settings.reset! }
18
-
19
- it "prefers a username from the URL" do
20
- user = subject.get_git_username("https://tessier-ashpool.freeside/repo.git", "ashpool")
21
- expect(user).to eq "ashpool"
22
- end
23
-
24
- it "uses the username from the Git config when specified" do
25
- user = subject.get_git_username("https://tessier-ashpool.freeside/repo.git", nil)
26
- expect(user).to eq "moderns"
27
- end
28
-
29
- it "falls back to the current user" do
30
- R10K::Git.settings.reset!
31
- expect(Etc).to receive(:getlogin).and_return("finn")
32
- user = subject.get_git_username("https://tessier-ashpool.freeside/repo.git", nil)
33
- expect(user).to eq "finn"
34
- end
35
- end
36
-
37
- describe "generating ssh key credentials" do
38
- after(:each) { R10K::Git.settings.reset! }
39
-
40
- it "prefers a per-repository SSH private key" do
41
- allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/tessier-ashpool-id_rsa").and_return true
42
- R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
43
- R10K::Git.settings[:repositories] = [{ remote: "ssh://git@tessier-ashpool.freeside/repo.git",
44
- private_key: "/etc/puppetlabs/r10k/ssh/tessier-ashpool-id_rsa"}]
45
- creds = subject.get_ssh_key_credentials("ssh://git@tessier-ashpool.freeside/repo.git", nil)
46
- expect(creds).to be_a_kind_of(Rugged::Credentials::SshKey)
47
- expect(creds.instance_variable_get(:@privatekey)).to eq("/etc/puppetlabs/r10k/ssh/tessier-ashpool-id_rsa")
48
- end
49
-
50
- it "falls back to the global SSH private key" do
51
- allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/id_rsa").and_return true
52
- R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
53
- creds = subject.get_ssh_key_credentials("ssh://git@tessier-ashpool.freeside/repo.git", nil)
54
- expect(creds).to be_a_kind_of(Rugged::Credentials::SshKey)
55
- expect(creds.instance_variable_get(:@privatekey)).to eq("/etc/puppetlabs/r10k/ssh/id_rsa")
56
- end
57
-
58
- it "raises an error if no key has been set" do
59
- R10K::Git.settings[:private_key] = nil
60
- expect {
61
- subject.get_ssh_key_credentials("https://tessier-ashpool.freeside/repo.git", nil)
62
- }.to raise_error(R10K::Git::GitError, /no private key was given/)
63
- end
64
-
65
- it "raises an error if the private key is unreadable" do
66
- R10K::Git.settings[:private_key] = "/some/nonexistent/.ssh/key"
67
- expect(File).to receive(:readable?).with("/some/nonexistent/.ssh/key").and_return false
68
- expect {
69
- subject.get_ssh_key_credentials("https://tessier-ashpool.freeside/repo.git", nil)
70
- }.to raise_error(R10K::Git::GitError, /Unable to use SSH key auth for.*is missing or unreadable/)
71
- end
72
-
73
- it "generates the rugged sshkey credential type" do
74
- allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/id_rsa").and_return true
75
- R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
76
- creds = subject.get_ssh_key_credentials("https://tessier-ashpool.freeside/repo.git", nil)
77
- expect(creds).to be_a_kind_of(Rugged::Credentials::SshKey)
78
- expect(creds.instance_variable_get(:@privatekey)).to eq("/etc/puppetlabs/r10k/ssh/id_rsa")
79
- end
80
- end
81
-
82
- describe "generating github app tokens" do
83
- it 'errors if app id has invalid characters' do
84
- expect { subject.github_app_token("123A567890", "fake", "300")
85
- }.to raise_error(R10K::Git::GitError, /App id contains invalid characters/)
86
- end
87
- it 'errors if app ttl has invalid characters' do
88
- expect { subject.github_app_token("123456", "fake", "abc")
89
- }.to raise_error(R10K::Git::GitError, /Github App token ttl contains/)
90
- end
91
- it 'errors if private file does not exist' do
92
- R10K::Git.settings[:github_app_key] = "/missing/token/file"
93
- expect(File).to receive(:readable?).with(R10K::Git.settings[:github_app_key]).and_return false
94
- expect {
95
- subject.github_app_token("123456", R10K::Git.settings[:github_app_key], "300")
96
- }.to raise_error(R10K::Git::GitError, /App key is missing or unreadable/)
97
- end
98
- it 'errors if file is not a valid SSL key' do
99
- token_file = Tempfile.new('token')
100
- token_file.write('my_token')
101
- token_file.close
102
- R10K::Git.settings[:github_app_key] = token_file.path
103
- expect(File).to receive(:readable?).with(token_file.path).and_return true
104
- expect {
105
- subject.github_app_token("123456", R10K::Git.settings[:github_app_key], "300")
106
- }.to raise_error(R10K::Git::GitError, /App key is not a valid SSL key/)
107
- token_file.unlink
108
- end
109
- end
110
-
111
- describe "generating token credentials" do
112
- it 'errors if token file does not exist' do
113
- R10K::Git.settings[:oauth_token] = "/missing/token/file"
114
- expect(File).to receive(:readable?).with("/missing/token/file").and_return false
115
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git"}]
116
- expect {
117
- subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
118
- }.to raise_error(R10K::Git::GitError, /cannot load OAuth token/)
119
- end
120
-
121
- it 'errors if the token on stdin is not a valid OAuth token' do
122
- allow($stdin).to receive(:read).and_return("<bad>token")
123
- R10K::Git.settings[:oauth_token] = "-"
124
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git"}]
125
- expect {
126
- subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
127
- }.to raise_error(R10K::Git::GitError, /invalid characters/)
128
- end
129
-
130
- it 'errors if the token in the file is not a valid OAuth token' do
131
- token_file = Tempfile.new('token')
132
- token_file.write('my bad \ntoken')
133
- token_file.close
134
- R10K::Git.settings[:oauth_token] = token_file.path
135
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git"}]
136
- expect {
137
- subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
138
- }.to raise_error(R10K::Git::GitError, /invalid characters/)
139
- end
140
-
141
- it 'prefers per-repo token file' do
142
- token_file = Tempfile.new('token')
143
- token_file.write('my_token')
144
- token_file.close
145
- R10K::Git.settings[:oauth_token] = "/do/not/use"
146
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git",
147
- oauth_token: token_file.path }]
148
- creds = subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
149
- expect(creds).to be_a_kind_of(Rugged::Credentials::UserPassword)
150
- expect(creds.instance_variable_get(:@password)).to eq("my_token")
151
- expect(creds.instance_variable_get(:@username)).to eq("x-oauth-token")
152
- end
153
-
154
- it 'uses the token from a file as a password' do
155
- token_file = Tempfile.new('token')
156
- token_file.write('my_token')
157
- token_file.close
158
- R10K::Git.settings[:oauth_token] = token_file.path
159
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git"}]
160
- creds = subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
161
- expect(creds).to be_a_kind_of(Rugged::Credentials::UserPassword)
162
- expect(creds.instance_variable_get(:@password)).to eq("my_token")
163
- expect(creds.instance_variable_get(:@username)).to eq("x-oauth-token")
164
- end
165
-
166
- it 'uses the token from stdin as a password' do
167
- allow($stdin).to receive(:read).and_return("my_token")
168
- R10K::Git.settings[:oauth_token] = '-'
169
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git"}]
170
- creds = subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
171
- expect(creds).to be_a_kind_of(Rugged::Credentials::UserPassword)
172
- expect(creds.instance_variable_get(:@password)).to eq("my_token")
173
- expect(creds.instance_variable_get(:@username)).to eq("x-oauth-token")
174
- end
175
-
176
- it 'only reads the token in once' do
177
- expect($stdin).to receive(:read).and_return("my_token").once
178
- R10K::Git.settings[:oauth_token] = '-'
179
- R10K::Git.settings[:repositories] = [{remote: "https://tessier-ashpool.freeside/repo.git"}]
180
- creds = subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
181
- expect(creds.instance_variable_get(:@password)).to eq("my_token")
182
- creds = subject.get_plaintext_credentials("https://tessier-ashpool.freeside/repo.git", nil)
183
- expect(creds.instance_variable_get(:@password)).to eq("my_token")
184
- end
185
- end
186
-
187
- describe "generating default credentials" do
188
- it "generates the rugged default credential type" do
189
- creds = subject.get_default_credentials("https://azurediamond:hunter2@tessier-ashpool.freeside/repo.git", "azurediamond")
190
- expect(creds).to be_a_kind_of(Rugged::Credentials::Default)
191
- end
192
- end
193
-
194
- describe "generating credentials" do
195
- it "creates ssh key credentials for the sshkey allowed type" do
196
- allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/id_rsa").and_return true
197
- R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
198
- expect(subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:ssh_key])).to be_a_kind_of(Rugged::Credentials::SshKey)
199
- end
200
-
201
- it "creates user/password credentials for the default allowed type" do
202
- expect(subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:plaintext])).to be_a_kind_of(Rugged::Credentials::UserPassword)
203
- end
204
-
205
- it "creates default credentials when no other types are allowed" do
206
- expect(subject.call("https://tessier-ashpool.freeside/repo.git", nil, [])).to be_a_kind_of(Rugged::Credentials::Default)
207
- end
208
-
209
- it "refuses to generate credentials more than 50 times" do
210
- (1..50).each { subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:plaintext]) }
211
-
212
- expect { subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:plaintext]) }.to raise_error(R10K::Git::GitError, /authentication failed/i)
213
- end
214
- end
215
- end
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/git/shellgit/cache'
3
-
4
- describe R10K::Git::ShellGit::Cache do
5
-
6
- subject { described_class.new('git://some/git/remote') }
7
-
8
- it "wraps a ShellGit::BareRepository instance" do
9
- expect(subject.repo).to be_a_kind_of R10K::Git::ShellGit::BareRepository
10
- end
11
-
12
- describe "settings" do
13
- before do
14
- R10K::Git::Cache.settings[:cache_root] = '/some/path'
15
- described_class.settings.reset!
16
- end
17
-
18
- after do
19
- R10K::Git::Cache.settings.reset!
20
- described_class.settings.reset!
21
- end
22
-
23
- it "falls back to the parent class settings" do
24
- expect(described_class.settings[:cache_root]).to eq '/some/path'
25
- end
26
- end
27
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/git'
3
- require 'r10k/git/stateful_repository'
4
-
5
- describe R10K::Git::StatefulRepository do
6
-
7
- let(:remote) { 'git://some.site/some-repo.git' }
8
- let(:ref) { '0.9.x' }
9
-
10
- subject { described_class.new(remote, '/some/nonexistent/basedir', 'some-dirname') }
11
-
12
- describe "determining if the cache needs to be synced" do
13
- let(:cache) { double('cache') }
14
-
15
- before { expect(R10K::Git.cache).to receive(:generate).with(remote).and_return(cache) }
16
-
17
- it "is true if the cache is absent" do
18
- expect(cache).to receive(:exist?).and_return false
19
- expect(subject.sync_cache?(ref)).to eq true
20
- end
21
-
22
- it "is true if the ref is HEAD" do
23
- expect(cache).to receive(:exist?).and_return true
24
- expect(subject.sync_cache?('HEAD')).to eq true
25
- end
26
-
27
- it "is true if the ref is unresolvable" do
28
- expect(cache).to receive(:exist?).and_return true
29
- expect(cache).to receive(:ref_type).with('0.9.x').and_return(:unknown)
30
- expect(subject.sync_cache?(ref)).to eq true
31
- end
32
-
33
- it "is true if the ref is not a tag or commit" do
34
- expect(cache).to receive(:exist?).and_return true
35
- expect(cache).to receive(:ref_type).with('0.9.x').and_return(:branch)
36
- expect(subject.sync_cache?(ref)).to eq true
37
- end
38
-
39
- it "is false otherwise" do
40
- expect(cache).to receive(:exist?).and_return true
41
- expect(cache).to receive(:ref_type).with('0.9.x').and_return(:tag)
42
- expect(subject.sync_cache?(ref)).to eq false
43
- end
44
- end
45
- end
@@ -1,102 +0,0 @@
1
- require 'spec_helper'
2
- require 'r10k/git'
3
-
4
- describe R10K::Git do
5
- before { described_class.reset! }
6
- after { described_class.reset! }
7
-
8
- describe 'selecting the default provider' do
9
- it 'returns shellgit when the git executable is present' do
10
- expect(R10K::Features).to receive(:available?).with(:shellgit).and_return true
11
- expect(described_class.default_name).to eq :shellgit
12
- end
13
-
14
- context 'under c-based rubies with rugged available', :unless => R10K::Util::Platform.jruby? || R10K::Util::Platform.windows? do
15
- it 'returns rugged when the git executable is absent and the rugged library is present' do
16
- expect(R10K::Features).to receive(:available?).with(:shellgit).and_return false
17
- expect(R10K::Features).to receive(:available?).with(:rugged).and_return true
18
- expect(described_class.default_name).to eq :rugged
19
- end
20
- end
21
-
22
- it 'raises an error when the git executable and rugged library are absent' do
23
- expect(R10K::Features).to receive(:available?).with(:shellgit).and_return false
24
- expect(R10K::Features).to receive(:available?).with(:rugged).and_return false
25
- expect {
26
- described_class.default_name
27
- }.to raise_error(R10K::Error, 'No Git providers are functional.')
28
- end
29
-
30
- it "goes into an error state if an invalid provider was set" do
31
- begin
32
- described_class.provider = :nope
33
- rescue R10K::Error
34
- end
35
-
36
- expect {
37
- described_class.provider
38
- }.to raise_error(R10K::Error, "No Git provider set.")
39
- end
40
- end
41
-
42
- describe 'explicitly setting the provider' do
43
- it "raises an error if the provider doesn't exist" do
44
- expect {
45
- described_class.provider = :nope
46
- }.to raise_error(R10K::Error, "No Git provider named 'nope'.")
47
- end
48
-
49
- it "raises an error if the provider isn't functional" do
50
- expect(R10K::Features).to receive(:available?).with(:shellgit).and_return false
51
- expect {
52
- described_class.provider = :shellgit
53
- }.to raise_error(R10K::Error, "Git provider 'shellgit' is not functional.")
54
- end
55
-
56
- context 'under c-based rubies with rugged available', :unless => R10K::Util::Platform.jruby? || R10K::Util::Platform.windows? do
57
- it "sets the current provider if the provider exists and is functional" do
58
- expect(R10K::Features).to receive(:available?).with(:rugged).and_return true
59
- described_class.provider = :rugged
60
- expect(described_class.provider).to eq(R10K::Git::Rugged)
61
- end
62
- end
63
-
64
- context 'under jruby', :if => R10K::Util::Platform.jruby? do
65
- it "sets the current provider if the provider exists and is functional" do
66
- expect(R10K::Features).to receive(:available?).with(:shellgit).and_return true
67
- described_class.provider = :shellgit
68
- expect(described_class.provider).to eq(R10K::Git::ShellGit)
69
- end
70
- end
71
- end
72
-
73
- describe "retrieving the current provider" do
74
- context 'under c-based rubies', :unless => R10K::Util::Platform.jruby? || R10K::Util::Platform.windows? do
75
- it "uses the default if a provider has not been set" do
76
- expect(described_class).to receive(:default_name).and_return :rugged
77
- expect(described_class.provider).to eq(R10K::Git::Rugged)
78
- end
79
-
80
- it "uses an explicitly set provider" do
81
- expect(R10K::Features).to receive(:available?).with(:rugged).and_return true
82
- described_class.provider = :rugged
83
- expect(described_class).to_not receive(:default)
84
- expect(described_class.provider).to eq R10K::Git::Rugged
85
- end
86
- end
87
-
88
- context 'under jruby', :if => R10K::Util::Platform.jruby? do
89
- it "uses the default if a provider has not been set" do
90
- expect(described_class).to receive(:default_name).and_return :shellgit
91
- expect(described_class.provider).to eq(R10K::Git::ShellGit)
92
- end
93
-
94
- it "uses an explicitly set provider" do
95
- expect(R10K::Features).to receive(:available?).with(:shellgit).and_return true
96
- described_class.provider = :shellgit
97
- expect(described_class).to_not receive(:default)
98
- expect(described_class.provider).to eq R10K::Git::ShellGit
99
- end
100
- end
101
- end
102
- end