r10k 3.5.2

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 (358) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.github/pull_request_template.md +1 -0
  4. data/.github/workflows/docker.yml +56 -0
  5. data/.github/workflows/release.yml +36 -0
  6. data/.gitignore +9 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.mkd +1759 -0
  9. data/CODEOWNERS +2 -0
  10. data/CONTRIBUTING.mkd +105 -0
  11. data/Gemfile +15 -0
  12. data/LICENSE +14 -0
  13. data/README.mkd +118 -0
  14. data/Rakefile +3 -0
  15. data/azure-pipelines.yml +86 -0
  16. data/bin/r10k +17 -0
  17. data/doc/common-patterns.mkd +44 -0
  18. data/doc/dynamic-environments.mkd +31 -0
  19. data/doc/dynamic-environments/configuration.mkd +669 -0
  20. data/doc/dynamic-environments/git-environments.mkd +75 -0
  21. data/doc/dynamic-environments/introduction.mkd +69 -0
  22. data/doc/dynamic-environments/master-configuration.mkd +40 -0
  23. data/doc/dynamic-environments/quickstart.mkd +201 -0
  24. data/doc/dynamic-environments/svn-environments.mkd +45 -0
  25. data/doc/dynamic-environments/usage.mkd +132 -0
  26. data/doc/dynamic-environments/workflow-guide.mkd +247 -0
  27. data/doc/faq.mkd +164 -0
  28. data/doc/git/cloning-and-mirroring.mkd +60 -0
  29. data/doc/git/providers.mkd +111 -0
  30. data/doc/puppetfile.mkd +309 -0
  31. data/doc/updating-your-puppetfile.mkd +38 -0
  32. data/docker/.gitignore +1 -0
  33. data/docker/.rspec +4 -0
  34. data/docker/Gemfile +11 -0
  35. data/docker/Makefile +89 -0
  36. data/docker/README.md +28 -0
  37. data/docker/r10k/Dockerfile +67 -0
  38. data/docker/r10k/adduser.sh +13 -0
  39. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
  40. data/docker/r10k/docker-entrypoint.sh +11 -0
  41. data/docker/r10k/release.Dockerfile +54 -0
  42. data/docker/spec/dockerfile_spec.rb +43 -0
  43. data/docker/spec/fixtures/Puppetfile +2 -0
  44. data/integration/Gemfile +19 -0
  45. data/integration/README.mkd +29 -0
  46. data/integration/Rakefile +77 -0
  47. data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
  48. data/integration/files/README.mkd +4 -0
  49. data/integration/files/hiera.yaml +8 -0
  50. data/integration/files/modules/helloworld/manifests/init.pp +3 -0
  51. data/integration/files/modules/hieratest/manifests/init.pp +3 -0
  52. data/integration/files/modules/unicode/files/pretend_unicode +1 -0
  53. data/integration/files/modules/unicode/manifests/init.pp +6 -0
  54. data/integration/files/pre-suite/git_config.pp.erb +19 -0
  55. data/integration/files/pre-suite/prod_env.config +3 -0
  56. data/integration/files/r10k_conf.yaml.erb +9 -0
  57. data/integration/lib/README.mkd +4 -0
  58. data/integration/lib/git_utils.rb +205 -0
  59. data/integration/lib/master_manipulator.rb +205 -0
  60. data/integration/lib/r10k_utils.rb +222 -0
  61. data/integration/manifests/README.mkd +4 -0
  62. data/integration/pre-suite/00_pe_install.rb +6 -0
  63. data/integration/pre-suite/10_git_config.rb +48 -0
  64. data/integration/pre-suite/20_pe_r10k.rb +55 -0
  65. data/integration/pre-suite/README.mkd +5 -0
  66. data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
  67. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
  68. data/integration/tests/README.mkd +4 -0
  69. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
  70. data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
  71. data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
  72. data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
  73. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
  74. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
  75. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
  76. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
  77. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
  78. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
  79. data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
  80. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
  81. data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
  82. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
  83. data/integration/tests/git_source/git_source_git.rb +128 -0
  84. data/integration/tests/git_source/git_source_ssh.rb +87 -0
  85. data/integration/tests/git_source/git_source_submodule.rb +70 -0
  86. data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
  87. data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
  88. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
  89. data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
  90. data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
  91. data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
  92. data/integration/tests/purging/default_purging.rb +125 -0
  93. data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
  94. data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
  95. data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
  96. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
  97. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
  98. data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
  99. data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
  100. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
  102. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
  103. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
  104. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
  105. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
  106. data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
  107. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
  108. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
  109. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
  110. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
  111. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
  112. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
  113. data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
  114. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
  115. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
  116. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
  117. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
  118. data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
  119. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
  120. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
  121. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
  122. data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
  123. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
  124. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
  125. data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
  126. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
  127. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
  128. data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
  129. data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
  130. data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
  131. data/lib/r10k.rb +11 -0
  132. data/lib/r10k/action/base.rb +31 -0
  133. data/lib/r10k/action/cri_runner.rb +72 -0
  134. data/lib/r10k/action/deploy.rb +9 -0
  135. data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
  136. data/lib/r10k/action/deploy/display.rb +89 -0
  137. data/lib/r10k/action/deploy/environment.rb +196 -0
  138. data/lib/r10k/action/deploy/module.rb +84 -0
  139. data/lib/r10k/action/puppetfile.rb +10 -0
  140. data/lib/r10k/action/puppetfile/check.rb +31 -0
  141. data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
  142. data/lib/r10k/action/puppetfile/install.rb +45 -0
  143. data/lib/r10k/action/puppetfile/purge.rb +28 -0
  144. data/lib/r10k/action/runner.rb +96 -0
  145. data/lib/r10k/action/visitor.rb +31 -0
  146. data/lib/r10k/cli.rb +51 -0
  147. data/lib/r10k/cli/deploy.rb +114 -0
  148. data/lib/r10k/cli/ext/logging.rb +15 -0
  149. data/lib/r10k/cli/help.rb +7 -0
  150. data/lib/r10k/cli/puppetfile.rb +74 -0
  151. data/lib/r10k/cli/version.rb +31 -0
  152. data/lib/r10k/deployment.rb +132 -0
  153. data/lib/r10k/deployment/config.rb +56 -0
  154. data/lib/r10k/environment.rb +37 -0
  155. data/lib/r10k/environment/bare.rb +16 -0
  156. data/lib/r10k/environment/base.rb +150 -0
  157. data/lib/r10k/environment/git.rb +81 -0
  158. data/lib/r10k/environment/name.rb +86 -0
  159. data/lib/r10k/environment/svn.rb +91 -0
  160. data/lib/r10k/environment/with_modules.rb +139 -0
  161. data/lib/r10k/errors.rb +61 -0
  162. data/lib/r10k/errors/formatting.rb +28 -0
  163. data/lib/r10k/feature.rb +56 -0
  164. data/lib/r10k/feature/collection.rb +23 -0
  165. data/lib/r10k/features.rb +20 -0
  166. data/lib/r10k/forge/module_release.rb +228 -0
  167. data/lib/r10k/git.rb +196 -0
  168. data/lib/r10k/git/alternates.rb +63 -0
  169. data/lib/r10k/git/cache.rb +108 -0
  170. data/lib/r10k/git/errors.rb +34 -0
  171. data/lib/r10k/git/rugged.rb +17 -0
  172. data/lib/r10k/git/rugged/bare_repository.rb +85 -0
  173. data/lib/r10k/git/rugged/base_repository.rb +93 -0
  174. data/lib/r10k/git/rugged/cache.rb +11 -0
  175. data/lib/r10k/git/rugged/credentials.rb +91 -0
  176. data/lib/r10k/git/rugged/thin_repository.rb +89 -0
  177. data/lib/r10k/git/rugged/working_repository.rb +145 -0
  178. data/lib/r10k/git/shellgit.rb +9 -0
  179. data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
  180. data/lib/r10k/git/shellgit/base_repository.rb +137 -0
  181. data/lib/r10k/git/shellgit/cache.rb +11 -0
  182. data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
  183. data/lib/r10k/git/shellgit/working_repository.rb +111 -0
  184. data/lib/r10k/git/stateful_repository.rb +95 -0
  185. data/lib/r10k/initializers.rb +67 -0
  186. data/lib/r10k/instance_cache.rb +32 -0
  187. data/lib/r10k/keyed_factory.rb +39 -0
  188. data/lib/r10k/logging.rb +109 -0
  189. data/lib/r10k/logging/terminaloutputter.rb +36 -0
  190. data/lib/r10k/module.rb +38 -0
  191. data/lib/r10k/module/base.rb +113 -0
  192. data/lib/r10k/module/forge.rb +177 -0
  193. data/lib/r10k/module/git.rb +109 -0
  194. data/lib/r10k/module/local.rb +36 -0
  195. data/lib/r10k/module/metadata_file.rb +31 -0
  196. data/lib/r10k/module/svn.rb +112 -0
  197. data/lib/r10k/puppetfile.rb +286 -0
  198. data/lib/r10k/settings.rb +194 -0
  199. data/lib/r10k/settings/collection.rb +123 -0
  200. data/lib/r10k/settings/container.rb +97 -0
  201. data/lib/r10k/settings/definition.rb +124 -0
  202. data/lib/r10k/settings/enum_definition.rb +30 -0
  203. data/lib/r10k/settings/helpers.rb +38 -0
  204. data/lib/r10k/settings/list.rb +107 -0
  205. data/lib/r10k/settings/loader.rb +99 -0
  206. data/lib/r10k/settings/mixin.rb +54 -0
  207. data/lib/r10k/settings/uri_definition.rb +19 -0
  208. data/lib/r10k/source.rb +42 -0
  209. data/lib/r10k/source/base.rb +74 -0
  210. data/lib/r10k/source/exec.rb +51 -0
  211. data/lib/r10k/source/git.rb +142 -0
  212. data/lib/r10k/source/hash.rb +182 -0
  213. data/lib/r10k/source/svn.rb +136 -0
  214. data/lib/r10k/source/yaml.rb +20 -0
  215. data/lib/r10k/source/yamldir.rb +32 -0
  216. data/lib/r10k/svn.rb +6 -0
  217. data/lib/r10k/svn/remote.rb +68 -0
  218. data/lib/r10k/svn/working_dir.rb +125 -0
  219. data/lib/r10k/util/attempt.rb +84 -0
  220. data/lib/r10k/util/basedir.rb +65 -0
  221. data/lib/r10k/util/commands.rb +31 -0
  222. data/lib/r10k/util/exec_env.rb +36 -0
  223. data/lib/r10k/util/license.rb +24 -0
  224. data/lib/r10k/util/platform.rb +42 -0
  225. data/lib/r10k/util/purgeable.rb +88 -0
  226. data/lib/r10k/util/setopts.rb +55 -0
  227. data/lib/r10k/util/subprocess.rb +84 -0
  228. data/lib/r10k/util/subprocess/result.rb +56 -0
  229. data/lib/r10k/util/subprocess/runner.rb +26 -0
  230. data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
  231. data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
  232. data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
  233. data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
  234. data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
  235. data/lib/r10k/util/symbolize_keys.rb +35 -0
  236. data/lib/r10k/version.rb +6 -0
  237. data/locales/config.yaml +21 -0
  238. data/locales/r10k.pot +545 -0
  239. data/r10k.gemspec +50 -0
  240. data/r10k.yaml.example +112 -0
  241. data/spec/fixtures/empty/.empty +0 -0
  242. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  243. data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
  244. data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
  245. data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
  246. data/spec/fixtures/unit/action/r10k.yaml +5 -0
  247. data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
  248. data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
  249. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
  250. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
  251. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
  252. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
  253. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
  254. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
  255. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
  256. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
  257. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
  258. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  259. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  260. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  261. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  262. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  263. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  264. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
  265. data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
  266. data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
  267. data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
  268. data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
  269. data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
  270. data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
  271. data/spec/integration/git/stateful_repository_spec.rb +159 -0
  272. data/spec/matchers/exit_with.rb +28 -0
  273. data/spec/matchers/match_realpath.rb +18 -0
  274. data/spec/r10k-mocks.rb +3 -0
  275. data/spec/r10k-mocks/mock_config.rb +33 -0
  276. data/spec/r10k-mocks/mock_env.rb +15 -0
  277. data/spec/r10k-mocks/mock_source.rb +13 -0
  278. data/spec/shared-contexts/git-fixtures.rb +55 -0
  279. data/spec/shared-examples/deploy-actions.rb +69 -0
  280. data/spec/shared-examples/git-repository.rb +38 -0
  281. data/spec/shared-examples/git/bare_repository.rb +132 -0
  282. data/spec/shared-examples/git/thin_repository.rb +26 -0
  283. data/spec/shared-examples/git/working_repository.rb +207 -0
  284. data/spec/shared-examples/puppetfile-action.rb +39 -0
  285. data/spec/shared-examples/settings/ancestry.rb +44 -0
  286. data/spec/shared-examples/subprocess-runner.rb +83 -0
  287. data/spec/spec_helper.rb +40 -0
  288. data/spec/unit/action/cri_runner_spec.rb +72 -0
  289. data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
  290. data/spec/unit/action/deploy/display_spec.rb +31 -0
  291. data/spec/unit/action/deploy/environment_spec.rb +395 -0
  292. data/spec/unit/action/deploy/module_spec.rb +139 -0
  293. data/spec/unit/action/puppetfile/check_spec.rb +41 -0
  294. data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
  295. data/spec/unit/action/puppetfile/install_spec.rb +84 -0
  296. data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
  297. data/spec/unit/action/runner_spec.rb +213 -0
  298. data/spec/unit/action/visitor_spec.rb +39 -0
  299. data/spec/unit/cli_spec.rb +9 -0
  300. data/spec/unit/deployment/config_spec.rb +33 -0
  301. data/spec/unit/deployment_spec.rb +162 -0
  302. data/spec/unit/environment/base_spec.rb +109 -0
  303. data/spec/unit/environment/git_spec.rb +97 -0
  304. data/spec/unit/environment/name_spec.rb +135 -0
  305. data/spec/unit/environment/svn_spec.rb +133 -0
  306. data/spec/unit/errors/formatting_spec.rb +84 -0
  307. data/spec/unit/feature_spec.rb +50 -0
  308. data/spec/unit/forge/module_release_spec.rb +213 -0
  309. data/spec/unit/git/alternates_spec.rb +116 -0
  310. data/spec/unit/git/cache_spec.rb +55 -0
  311. data/spec/unit/git/rugged/cache_spec.rb +29 -0
  312. data/spec/unit/git/rugged/credentials_spec.rb +109 -0
  313. data/spec/unit/git/shellgit/cache_spec.rb +27 -0
  314. data/spec/unit/git/stateful_repository_spec.rb +40 -0
  315. data/spec/unit/git_spec.rb +102 -0
  316. data/spec/unit/initializers_spec.rb +68 -0
  317. data/spec/unit/instance_cache_spec.rb +78 -0
  318. data/spec/unit/keyed_factory_spec.rb +51 -0
  319. data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
  320. data/spec/unit/logging_spec.rb +68 -0
  321. data/spec/unit/module/base_spec.rb +72 -0
  322. data/spec/unit/module/forge_spec.rb +207 -0
  323. data/spec/unit/module/git_spec.rb +274 -0
  324. data/spec/unit/module/metadata_file_spec.rb +68 -0
  325. data/spec/unit/module/svn_spec.rb +178 -0
  326. data/spec/unit/module_spec.rb +29 -0
  327. data/spec/unit/puppetfile_spec.rb +300 -0
  328. data/spec/unit/settings/collection_spec.rb +123 -0
  329. data/spec/unit/settings/container_spec.rb +92 -0
  330. data/spec/unit/settings/definition_spec.rb +79 -0
  331. data/spec/unit/settings/enum_definition_spec.rb +20 -0
  332. data/spec/unit/settings/inheritance_spec.rb +38 -0
  333. data/spec/unit/settings/list_spec.rb +88 -0
  334. data/spec/unit/settings/loader_spec.rb +110 -0
  335. data/spec/unit/settings/uri_definition_spec.rb +23 -0
  336. data/spec/unit/settings_spec.rb +246 -0
  337. data/spec/unit/source/base_spec.rb +31 -0
  338. data/spec/unit/source/exec_spec.rb +81 -0
  339. data/spec/unit/source/git_spec.rb +185 -0
  340. data/spec/unit/source/hash_spec.rb +54 -0
  341. data/spec/unit/source/svn_spec.rb +196 -0
  342. data/spec/unit/source/yaml_spec.rb +42 -0
  343. data/spec/unit/source_spec.rb +10 -0
  344. data/spec/unit/svn/remote_spec.rb +21 -0
  345. data/spec/unit/svn/working_dir_spec.rb +56 -0
  346. data/spec/unit/util/attempt_spec.rb +82 -0
  347. data/spec/unit/util/commands_spec.rb +61 -0
  348. data/spec/unit/util/exec_env_spec.rb +56 -0
  349. data/spec/unit/util/purgeable_spec.rb +230 -0
  350. data/spec/unit/util/setopts_spec.rb +59 -0
  351. data/spec/unit/util/subprocess/result_spec.rb +36 -0
  352. data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
  353. data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
  354. data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
  355. data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
  356. data/spec/unit/util/subprocess_spec.rb +65 -0
  357. data/spec/unit/util/symbolize_keys_spec.rb +67 -0
  358. metadata +582 -0
@@ -0,0 +1,116 @@
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
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/cache'
3
+
4
+ describe R10K::Git::Cache do
5
+
6
+ let(:subclass) do
7
+ Class.new(described_class) do
8
+ def self.bare_repository
9
+ Class.new { def initialize(*args) end }
10
+ end
11
+ end
12
+ end
13
+
14
+ subject { subclass.new('git://some/git/remote') }
15
+
16
+ describe "updating the cache" do
17
+ it "only updates the cache once" do
18
+ expect(subject).to receive(:sync!).exactly(1).times
19
+ subject.sync
20
+ subject.sync
21
+ end
22
+ end
23
+
24
+ describe "methods on the repository" do
25
+ def expect_delegation(method)
26
+ expect(subject.repo).to receive(method)
27
+ subject.send(method)
28
+ end
29
+
30
+ it "delegates #git_dir" do
31
+ expect_delegation(:git_dir)
32
+ end
33
+
34
+ it "delegates #objects_dir" do
35
+ expect_delegation(:objects_dir)
36
+ end
37
+
38
+ it "delegates #branches" do
39
+ expect_delegation(:branches)
40
+ end
41
+
42
+ it "delegates #tags" do
43
+ expect_delegation(:tags)
44
+ end
45
+
46
+ it "delegates #exist?" do
47
+ expect_delegation(:exist?)
48
+ end
49
+
50
+ it "aliases #cached? to #exist?" do
51
+ expect(subject.repo).to receive(:exist?)
52
+ subject.cached?
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
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
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe R10K::Git::Rugged::Credentials, :unless => R10K::Util::Platform.jruby? 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(:all) { 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[:repositories] = [{ remote: "ssh://git@tessier-ashpool.freeside/repo.git",
43
+ private_key: "/etc/puppetlabs/r10k/ssh/tessier-ashpool-id_rsa"}]
44
+ creds = subject.get_ssh_key_credentials("ssh://git@tessier-ashpool.freeside/repo.git", nil)
45
+ expect(creds).to be_a_kind_of(Rugged::Credentials::SshKey)
46
+ expect(creds.instance_variable_get(:@privatekey)).to eq("/etc/puppetlabs/r10k/ssh/tessier-ashpool-id_rsa")
47
+ end
48
+
49
+ it "falls back to the global SSH private key" do
50
+ allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/id_rsa").and_return true
51
+ R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
52
+ creds = subject.get_ssh_key_credentials("ssh://git@tessier-ashpool.freeside/repo.git", nil)
53
+ expect(creds).to be_a_kind_of(Rugged::Credentials::SshKey)
54
+ expect(creds.instance_variable_get(:@privatekey)).to eq("/etc/puppetlabs/r10k/ssh/id_rsa")
55
+ end
56
+
57
+ it "raises an error if no key has been set" do
58
+ R10K::Git.settings[:private_key] = nil
59
+ expect {
60
+ subject.get_ssh_key_credentials("https://tessier-ashpool.freeside/repo.git", nil)
61
+ }.to raise_error(R10K::Git::GitError, /no private key was given/)
62
+ end
63
+
64
+ it "raises an error if the private key is unreadable" do
65
+ R10K::Git.settings[:private_key] = "/some/nonexistent/.ssh/key"
66
+ expect(File).to receive(:readable?).with("/some/nonexistent/.ssh/key").and_return false
67
+ expect {
68
+ subject.get_ssh_key_credentials("https://tessier-ashpool.freeside/repo.git", nil)
69
+ }.to raise_error(R10K::Git::GitError, /Unable to use SSH key auth for.*is missing or unreadable/)
70
+ end
71
+
72
+ it "generates the rugged sshkey credential type" do
73
+ allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/id_rsa").and_return true
74
+ R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
75
+ creds = subject.get_ssh_key_credentials("https://tessier-ashpool.freeside/repo.git", nil)
76
+ expect(creds).to be_a_kind_of(Rugged::Credentials::SshKey)
77
+ expect(creds.instance_variable_get(:@privatekey)).to eq("/etc/puppetlabs/r10k/ssh/id_rsa")
78
+ end
79
+ end
80
+
81
+ describe "generating default credentials" do
82
+ it "generates the rugged default credential type" do
83
+ creds = subject.get_default_credentials("https://azurediamond:hunter2@tessier-ashpool.freeside/repo.git", "azurediamond")
84
+ expect(creds).to be_a_kind_of(Rugged::Credentials::Default)
85
+ end
86
+ end
87
+
88
+ describe "generating credentials" do
89
+ it "creates ssh key credentials for the sshkey allowed type" do
90
+ allow(File).to receive(:readable?).with("/etc/puppetlabs/r10k/ssh/id_rsa").and_return true
91
+ R10K::Git.settings[:private_key] = "/etc/puppetlabs/r10k/ssh/id_rsa"
92
+ expect(subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:ssh_key])).to be_a_kind_of(Rugged::Credentials::SshKey)
93
+ end
94
+
95
+ it "creates user/password credentials for the default allowed type" do
96
+ expect(subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:plaintext])).to be_a_kind_of(Rugged::Credentials::UserPassword)
97
+ end
98
+
99
+ it "creates default credentials when no other types are allowed" do
100
+ expect(subject.call("https://tessier-ashpool.freeside/repo.git", nil, [])).to be_a_kind_of(Rugged::Credentials::Default)
101
+ end
102
+
103
+ it "refuses to generate credentials more than 50 times" do
104
+ (1..50).each { subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:plaintext]) }
105
+
106
+ expect { subject.call("https://tessier-ashpool.freeside/repo.git", nil, [:plaintext]) }.to raise_error(R10K::Git::GitError, /authentication failed/i)
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,27 @@
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
@@ -0,0 +1,40 @@
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 unresolvable" do
23
+ expect(cache).to receive(:exist?).and_return true
24
+ expect(cache).to receive(:ref_type).with('0.9.x').and_return(:unknown)
25
+ expect(subject.sync_cache?(ref)).to eq true
26
+ end
27
+
28
+ it "is true if the ref is not a tag or commit" do
29
+ expect(cache).to receive(:exist?).and_return true
30
+ expect(cache).to receive(:ref_type).with('0.9.x').and_return(:branch)
31
+ expect(subject.sync_cache?(ref)).to eq true
32
+ end
33
+
34
+ it "is false otherwise" do
35
+ expect(cache).to receive(:exist?).and_return true
36
+ expect(cache).to receive(:ref_type).with('0.9.x').and_return(:tag)
37
+ expect(subject.sync_cache?(ref)).to eq false
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,102 @@
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', :unless => R10K::Util::Platform.jruby? 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', :unless => R10K::Util::Platform.jruby? 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? 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