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,30 @@
1
+ require 'r10k/settings/definition'
2
+
3
+ module R10K
4
+ module Settings
5
+ class EnumDefinition < R10K::Settings::Definition
6
+
7
+ def validate
8
+ if @value
9
+ if @multi && @value.respond_to?(:select)
10
+ invalid = @value.select { |val| !@enum.include?(val) }
11
+
12
+ if invalid.size > 0
13
+ raise ArgumentError, _("Setting %{name} may only contain %{enums}; the disallowed values %{invalid} were present") % {name: @name, enums: @enum.inspect, invalid: invalid.inspect}
14
+ end
15
+ else
16
+ if !@enum.include?(@value)
17
+ raise ArgumentError, _("Setting %{name} should be one of %{enums}, not '%{value}'") % {name: @name, enums: @enum.inspect, value: @value}
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def allowed_initialize_opts
26
+ super.merge({:enum => true, :multi => true})
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,38 @@
1
+ require 'r10k/errors'
2
+ require 'r10k/settings/collection'
3
+
4
+ module R10K
5
+ module Settings
6
+ module Helpers
7
+ def self.included(klass)
8
+ klass.send(:include, InstanceMethods)
9
+ klass.send(:extend, ClassMethods)
10
+ end
11
+
12
+ module InstanceMethods
13
+ # Assign a parent collection to this setting. Parent may only be
14
+ # assigned once.
15
+ #
16
+ # @param new_parent [R10K::Settings::Collection] Parent collection
17
+ def parent=(new_parent)
18
+ unless @parent.nil?
19
+ raise R10K::Error.new(_("%{class} instances cannot be reassigned to a new parent.") % {class: self.class} )
20
+ end
21
+
22
+ unless new_parent.is_a?(R10K::Settings::Collection) || new_parent.is_a?(R10K::Settings::List)
23
+ raise R10K::Error.new(_("%{class} instances may only belong to a settings collection or list.") % {class: self.class} )
24
+ end
25
+
26
+ @parent = new_parent
27
+ end
28
+
29
+ def parent
30
+ @parent
31
+ end
32
+ end
33
+
34
+ module ClassMethods
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,107 @@
1
+ require 'r10k/settings/helpers'
2
+ require 'r10k/settings/collection'
3
+ require 'r10k/errors'
4
+ require 'r10k/util/setopts'
5
+
6
+ module R10K
7
+ module Settings
8
+
9
+ # A container for an arbitrarily long list of other settings.
10
+ class List
11
+ include R10K::Settings::Helpers
12
+ include R10K::Util::Setopts
13
+
14
+ # @!attribute [r] name
15
+ # @return [String] The name of this collection
16
+ attr_reader :name
17
+
18
+ # @param name [Symbol] The name of the setting for this definition.
19
+ # @param item_proc [#call] An object whose #call method will return a
20
+ # new instance of another R10K::Settings class to hold each item
21
+ # added to this list.
22
+ # @param opts [Hash] Additional options for this definition to control
23
+ # validation, normalization, and the like.
24
+ #
25
+ # @options opts [String] :desc Extended description of this setting.
26
+ # @options opts [Array] :default Initial/default contents of the list.
27
+ def initialize(name, item_proc, opts = {})
28
+ @name = name
29
+ @item_proc = item_proc
30
+ @items = []
31
+
32
+ setopts(opts, allowed_initialize_opts)
33
+ end
34
+
35
+ # Takes an array of key/value pairs and assigns each into a
36
+ # new instance created by invoking @item_proc.
37
+ #
38
+ # @param items [Array] List of items to add to this list.
39
+ def assign(items)
40
+ return if items.nil?
41
+
42
+ items.each do |values|
43
+ new_item = @item_proc.call
44
+ new_item.parent = self
45
+ new_item.assign(values)
46
+ @items << new_item
47
+ end
48
+ end
49
+
50
+ # Validate all items in the list and return validation errors
51
+ #
52
+ # @return [nil, Hash] If all validation passed nil will be returned; if
53
+ # validation failed then a hash of those errors will be returned.
54
+ def validate
55
+ errors = {}
56
+
57
+ @items.each_with_index do |item, idx|
58
+ begin
59
+ item.validate
60
+ rescue => error
61
+ errors[idx+1] = error
62
+ end
63
+ end
64
+
65
+ if !errors.empty?
66
+ raise ValidationError.new(_("Validation failed for '%{name}' settings list") % {name: @name}, :errors => errors)
67
+ end
68
+ end
69
+
70
+ # Evaluate all items in the list and return a frozen array of the final values.
71
+ # @return [Array]
72
+ def resolve
73
+ @items.collect { |item| item.resolve }.freeze
74
+ end
75
+
76
+ class ValidationError < R10K::Error
77
+ attr_reader :errors
78
+
79
+ def initialize(mesg, options = {})
80
+ super
81
+ @errors = options[:errors]
82
+ end
83
+
84
+ def format
85
+ struct = []
86
+ struct << "#{message}:"
87
+ @errors.each do |item, error|
88
+ struct << indent(structure_exception("Item #{item}", error))
89
+ end
90
+ struct.join("\n")
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ # Subclasses may define additional params that are accepted at
97
+ # initialization; they should override this method to add any
98
+ # additional fields that should be respected.
99
+ def allowed_initialize_opts
100
+ {
101
+ :desc => true,
102
+ :default => true,
103
+ }
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,99 @@
1
+ require 'r10k/logging'
2
+ require 'r10k/errors'
3
+ require 'yaml'
4
+
5
+ module R10K
6
+ module Settings
7
+ # Look for the r10k configuration file in standard locations.
8
+ #
9
+ # r10k.yaml is checked for in the following locations:
10
+ # - $PWD/r10k.yaml
11
+ # - /etc/puppetlabs/r10k/r10k.yaml
12
+ # - /etc/r10k.yaml
13
+ class Loader
14
+
15
+ def self.search(override = nil)
16
+ new.search(override)
17
+ end
18
+
19
+ include R10K::Logging
20
+
21
+ attr_reader :loadpath
22
+
23
+ CONFIG_FILE = 'r10k.yaml'
24
+ DEFAULT_LOCATION = File.join('/etc/puppetlabs/r10k', CONFIG_FILE)
25
+ OLD_DEFAULT_LOCATION = File.join('/etc', CONFIG_FILE)
26
+
27
+ def initialize
28
+ @loadpath = []
29
+ populate_loadpath
30
+ end
31
+
32
+ # Find the first valid config file.
33
+ #
34
+ # @param override [String, nil] An optional path that when is truthy
35
+ # will be preferred over all other files, to make it easy to
36
+ # optionally supply an explicit configuration file that will always
37
+ # be used when set.
38
+ # @return [String, nil] The path to the first valid configfile, or nil
39
+ # if no file was found.
40
+ def search(override = nil)
41
+ return override if override
42
+
43
+ # If both default files are present, issue a warning.
44
+ if (File.file? DEFAULT_LOCATION) && (File.file? OLD_DEFAULT_LOCATION)
45
+ logger.warn _("Both %{default_path} and %{old_default_path} configuration files exist.") % {default_path: DEFAULT_LOCATION, old_default_path: OLD_DEFAULT_LOCATION}
46
+ logger.warn _("%{default_path} will be used.") % {default_path: DEFAULT_LOCATION}
47
+ end
48
+
49
+ path = @loadpath.find {|filename| File.file? filename}
50
+
51
+ if path == OLD_DEFAULT_LOCATION
52
+ logger.warn _("The r10k configuration file at %{old_default_path} is deprecated.") % {old_default_path: OLD_DEFAULT_LOCATION}
53
+ logger.warn _("Please move your r10k configuration to %{default_path}.") % {default_path: DEFAULT_LOCATION}
54
+ end
55
+
56
+ path
57
+ end
58
+
59
+ def read(override = nil)
60
+ path = search(override)
61
+
62
+ if path.nil?
63
+ raise ConfigError, _("No configuration file given, no config file found in current directory, and no global config present")
64
+ end
65
+
66
+ begin
67
+ contents = ::YAML.load_file(path)
68
+ rescue => e
69
+ raise ConfigError, _("Couldn't load config file: %{error_msg}") % {error_msg: e.message}
70
+ end
71
+
72
+ if !contents
73
+ raise ConfigError, _("File exists at #{path} but doesn't contain any YAML") % {path: path}
74
+ end
75
+ R10K::Util::SymbolizeKeys.symbolize_keys!(contents, true)
76
+ contents
77
+ end
78
+
79
+ private
80
+
81
+ def populate_loadpath
82
+
83
+ # Add the current directory for r10k.yaml
84
+ @loadpath << File.join(Dir.getwd, CONFIG_FILE)
85
+
86
+ # Add the AIO location for of r10k.yaml
87
+ @loadpath << DEFAULT_LOCATION
88
+
89
+ # Add the old default location last.
90
+ @loadpath << OLD_DEFAULT_LOCATION
91
+
92
+ @loadpath
93
+ end
94
+
95
+ class ConfigError < R10K::Error
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,54 @@
1
+ module R10K::Settings::Mixin
2
+
3
+ def self.included(klass)
4
+ klass.send(:include, InstanceMethods)
5
+ klass.send(:extend, ClassMethods)
6
+ end
7
+
8
+ module InstanceMethods
9
+
10
+ # @return [R10K::Settings::Container] A settings container for the given instance.
11
+ def settings
12
+ @settings ||= R10K::Settings::Container.new(self.class.settings)
13
+ end
14
+ end
15
+
16
+ module ClassMethods
17
+
18
+ # Define a setting and optional default on the extending class.
19
+ #
20
+ # @param key [Symbol]
21
+ # @param default [Object]
22
+ #
23
+ # @return [void]
24
+ def def_setting_attr(key, default = nil)
25
+ defaults.add_valid_key(key)
26
+ defaults[key] = default if default
27
+ end
28
+
29
+ # A singleton settings container for storing immutable default configuration
30
+ # on the extending class.
31
+ #
32
+ # @return [R10K::Settings::Container]
33
+ def defaults
34
+ @defaults ||= R10K::Settings::Container.new
35
+ end
36
+
37
+ # A singleton settings container for storing manual setting configurations
38
+ # on the extending class.
39
+ #
40
+ # @return [R10K::Settings::Container]
41
+ def settings
42
+ @settings ||= R10K::Settings::Container.new(defaults)
43
+ end
44
+
45
+ # Allow subclasses to use the settings of the parent class as default values
46
+ #
47
+ # @return [void]
48
+ def inherited(subclass)
49
+ subclass.instance_eval do
50
+ @settings = R10K::Settings::Container.new(superclass.settings)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,19 @@
1
+ require 'r10k/settings/definition'
2
+ require 'uri'
3
+
4
+ module R10K
5
+ module Settings
6
+ class URIDefinition < R10K::Settings::Definition
7
+ def validate
8
+ if @value
9
+ begin
10
+ URI.parse(@value)
11
+ rescue URI::Error
12
+ raise ArgumentError, _("Setting %{name} requires a URL but '%{value}' could not be parsed as a URL") % {name: @name, value: @value}
13
+ end
14
+ end
15
+ super
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,42 @@
1
+ require 'r10k'
2
+ require 'r10k/keyed_factory'
3
+ require 'r10k/util/symbolize_keys'
4
+
5
+ module R10K
6
+ module Source
7
+ def self.factory
8
+ @factory ||= R10K::KeyedFactory.new
9
+ end
10
+
11
+ def self.register(key, klass)
12
+ factory.register(key, klass)
13
+ end
14
+
15
+ def self.retrieve(key)
16
+ factory.retrieve(key)
17
+ end
18
+
19
+ def self.generate(type, basedir, name, options = {})
20
+ factory.generate(type, basedir, name, options)
21
+ end
22
+
23
+ def self.from_hash(name, hash)
24
+ R10K::Util::SymbolizeKeys.symbolize_keys!(hash)
25
+
26
+ basedir = hash.delete(:basedir)
27
+
28
+ type = hash.delete(:type)
29
+ type = type.is_a?(String) ? type.to_sym : type
30
+
31
+ generate(type, name, basedir, hash)
32
+ end
33
+
34
+ require 'r10k/source/base'
35
+ require 'r10k/source/hash'
36
+ require 'r10k/source/git'
37
+ require 'r10k/source/svn'
38
+ require 'r10k/source/yaml'
39
+ require 'r10k/source/yamldir'
40
+ require 'r10k/source/exec'
41
+ end
42
+ end
@@ -0,0 +1,74 @@
1
+ # This class defines a common interface for source implementations.
2
+ #
3
+ # @since 1.3.0
4
+ class R10K::Source::Base
5
+
6
+ # @!attribute [r] basedir
7
+ # @return [String] The path this source will place environments in
8
+ attr_reader :basedir
9
+
10
+ # @!attribute [r] name
11
+ # @return [String] The short name for this environment source
12
+ attr_reader :name
13
+
14
+ # @!attribute [r] prefix
15
+ # @return [String, nil] The prefix for the environments basedir.
16
+ # Defaults to nil.
17
+ attr_reader :prefix
18
+
19
+ # @!attribute [r] puppetfile_name
20
+ # @return [String, nil] The Name of the puppetfile
21
+ # Defaults to nil.
22
+ attr_reader :puppetfile_name
23
+
24
+ # Initialize the given source.
25
+ #
26
+ # @param name [String] The identifier for this source.
27
+ # @param basedir [String] The base directory where the generated environments will be created.
28
+ # @param options [Hash] An additional set of options for this source. The
29
+ # semantics of this hash may depend on the source implementation.
30
+ #
31
+ # @option options [Boolean, String] :prefix If a String this becomes the prefix.
32
+ # If true, will use the source name as the prefix. All sources should respect this option.
33
+ # Defaults to false for no environment prefix.
34
+ def initialize(name, basedir, options = {})
35
+ @name = name
36
+ @basedir = Pathname.new(basedir).cleanpath.to_s
37
+ @prefix = options.delete(:prefix)
38
+ @puppetfile_name = options.delete(:puppetfile_name)
39
+ @options = options
40
+ end
41
+
42
+ # Perform any actions needed for loading environments that may have side
43
+ # effects.
44
+ #
45
+ # Actions done during preloading may include things like updating caches or
46
+ # performing network queries. If an environment has not been preloaded but
47
+ # {#environments} is invoked, it should return the best known state of
48
+ # environments or return an empty list.
49
+ #
50
+ # @api public
51
+ # @abstract
52
+ # @return [void]
53
+ def preload!
54
+
55
+ end
56
+
57
+ # Enumerate the environments associated with this SVN source.
58
+ #
59
+ # @api public
60
+ # @abstract
61
+ # @return [Array<R10K::Environment::Base>] An array of environments created
62
+ # from this source.
63
+ def environments
64
+ raise NotImplementedError, _("%{class} has not implemented method %{method}") % {class: self.class, method: __method__}
65
+ end
66
+
67
+ def accept(visitor)
68
+ visitor.visit(:source, self) do
69
+ environments.each do |env|
70
+ env.accept(visitor)
71
+ end
72
+ end
73
+ end
74
+ end