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,81 @@
1
+ require 'r10k/logging'
2
+ require 'r10k/puppetfile'
3
+ require 'r10k/git/stateful_repository'
4
+ require 'forwardable'
5
+
6
+ # This class implements an environment based on a Git branch.
7
+ #
8
+ # @since 1.3.0
9
+ class R10K::Environment::Git < R10K::Environment::WithModules
10
+
11
+ include R10K::Logging
12
+
13
+ R10K::Environment.register(:git, self)
14
+ # Register git as the default environment type
15
+ R10K::Environment.register(nil, self)
16
+
17
+ # @!attribute [r] remote
18
+ # @return [String] The URL to the remote git repository
19
+ attr_reader :remote
20
+
21
+ # @!attribute [r] ref
22
+ # @return [String] The git reference to use for this environment
23
+ attr_reader :ref
24
+
25
+ # @!attribute [r] repo
26
+ # @api private
27
+ # @return [R10K::Git::StatefulRepository] The git repo backing this environment
28
+ attr_reader :repo
29
+
30
+ # Initialize the given Git environment.
31
+ #
32
+ # @param name [String] The unique name describing this environment.
33
+ # @param basedir [String] The base directory where this environment will be created.
34
+ # @param dirname [String] The directory name for this environment.
35
+ # @param options [Hash] An additional set of options for this environment.
36
+ #
37
+ # @param options [String] :remote The URL to the remote git repository
38
+ # @param options [String] :ref The git reference to use for this environment
39
+ def initialize(name, basedir, dirname, options = {})
40
+ super
41
+ @remote = options[:remote]
42
+ @ref = options[:ref]
43
+
44
+ @repo = R10K::Git::StatefulRepository.new(@remote, @basedir, @dirname)
45
+ end
46
+
47
+ # Clone or update the given Git environment.
48
+ #
49
+ # If the environment is being created for the first time, it will
50
+ # automatically update all modules to ensure that the environment is complete.
51
+ #
52
+ # @api public
53
+ # @return [void]
54
+ def sync
55
+ @repo.sync(@ref)
56
+ end
57
+
58
+ def status
59
+ @repo.status(@ref)
60
+ end
61
+
62
+ # Return a sting which uniquely identifies (per source) the current state of the
63
+ # environment.
64
+ #
65
+ # @api public
66
+ # @return [String]
67
+ def signature
68
+ @repo.head
69
+ end
70
+
71
+ include R10K::Util::Purgeable
72
+
73
+ # Returns an array of the full paths to all the content being managed.
74
+ # @note This implements a required method for the Purgeable mixin
75
+ # @return [Array<String>]
76
+ def desired_contents
77
+ desired = [File.join(@full_path, '.git')]
78
+ desired += @repo.tracked_paths.map { |entry| File.join(@full_path, entry) }
79
+ desired += super
80
+ end
81
+ end
@@ -0,0 +1,86 @@
1
+ module R10K
2
+ module Environment
3
+ # Handle environment name validation and modification.
4
+ #
5
+ # @api private
6
+ class Name
7
+
8
+ # @!attribute [r] name
9
+ # @return [String] The unmodified name of the environment
10
+ attr_reader :name
11
+
12
+ INVALID_CHARACTERS = %r[\W]
13
+
14
+ def initialize(name, opts)
15
+ @name = name
16
+ @opts = opts
17
+
18
+ @source = opts[:source]
19
+ @prefix = opts[:prefix]
20
+ @invalid = opts[:invalid]
21
+
22
+ case @invalid
23
+ when 'correct_and_warn'
24
+ @validate = true
25
+ @correct = true
26
+ when 'correct'
27
+ @validate = false
28
+ @correct = true
29
+ when 'error'
30
+ @validate = true
31
+ @correct = false
32
+ when NilClass
33
+ @validate = opts[:validate]
34
+ @correct = opts[:correct]
35
+ end
36
+ end
37
+
38
+ # Should the environment name have invalid characters removed?
39
+ def correct?
40
+ @correct
41
+ end
42
+
43
+ def validate?
44
+ @validate
45
+ end
46
+
47
+ def valid?
48
+ if @validate
49
+ ! @name.match(INVALID_CHARACTERS)
50
+ else
51
+ true
52
+ end
53
+ end
54
+
55
+ # The directory name for the environment, modified as necessary to remove
56
+ # invalid characters.
57
+ #
58
+ # @return [String]
59
+ def dirname
60
+ dir = @name.dup
61
+
62
+ prefix = derive_prefix(@source,@prefix)
63
+
64
+ if @correct
65
+ dir.gsub!(INVALID_CHARACTERS, '_')
66
+ end
67
+
68
+ "#{prefix}#{dir}"
69
+ end
70
+
71
+
72
+ private
73
+
74
+ def derive_prefix(source,prefix)
75
+
76
+ if prefix == true
77
+ "#{source}_"
78
+ elsif prefix.is_a? String
79
+ "#{prefix}_"
80
+ else
81
+ nil
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,91 @@
1
+ require 'r10k/puppetfile'
2
+ require 'r10k/svn/working_dir'
3
+ require 'r10k/util/setopts'
4
+
5
+ # This class implements an environment based on an SVN branch.
6
+ #
7
+ # @since 1.3.0
8
+ class R10K::Environment::SVN < R10K::Environment::Base
9
+
10
+ include R10K::Logging
11
+
12
+ R10K::Environment.register(:svn, self)
13
+
14
+ # @!attribute [r] remote
15
+ # @return [String] The URL to the remote SVN branch to check out
16
+ attr_reader :remote
17
+
18
+ # @!attribute [r] working_dir
19
+ # @api private
20
+ # @return [R10K::SVN::WorkingDir] The SVN working directory backing this environment
21
+ attr_reader :working_dir
22
+
23
+ # @!attribute [r] username
24
+ # @return [String, nil] The SVN username to be passed to the underlying SVN commands
25
+ # @api private
26
+ attr_reader :username
27
+
28
+ # @!attribute [r] password
29
+ # @return [String, nil] The SVN password to be passed to the underlying SVN commands
30
+ # @api private
31
+ attr_reader :password
32
+
33
+ include R10K::Util::Setopts
34
+
35
+ # Initialize the given SVN environment.
36
+ #
37
+ # @param name [String] The unique name describing this environment.
38
+ # @param basedir [String] The base directory where this environment will be created.
39
+ # @param dirname [String] The directory name for this environment.
40
+ # @param options [Hash] An additional set of options for this environment.
41
+ #
42
+ # @option options [String] :remote The URL to the remote SVN branch to check out
43
+ # @option options [String] :username The SVN username
44
+ # @option options [String] :password The SVN password
45
+ def initialize(name, basedir, dirname, options = {})
46
+ super
47
+
48
+ setopts(options, {:remote => :self, :username => :self, :password => :self, :puppetfile_name => :self })
49
+
50
+ @working_dir = R10K::SVN::WorkingDir.new(Pathname.new(@full_path), :username => @username, :password => @password)
51
+ end
52
+
53
+ # Perform an initial checkout of the SVN repository or update the repository.
54
+ #
55
+ # If the environment is being created for the first time, it will
56
+ # automatically update all modules to ensure that the environment is complete.
57
+ #
58
+ # @api public
59
+ # @return [void]
60
+ def sync
61
+ if @working_dir.is_svn?
62
+ @working_dir.update
63
+ else
64
+ @working_dir.checkout(@remote)
65
+ end
66
+ @synced = true
67
+ end
68
+
69
+ # Return a sting which uniquely identifies (per source) the current state of the
70
+ # environment.
71
+ #
72
+ # @api public
73
+ # @return [String]
74
+ def signature
75
+ @working_dir.revision
76
+ end
77
+
78
+ def status
79
+ if !@path.exist?
80
+ :absent
81
+ elsif !@working_dir.is_svn?
82
+ :mismatched
83
+ elsif !(@remote == @working_dir.url)
84
+ :mismatched
85
+ elsif !@synced
86
+ :outdated
87
+ else
88
+ :insync
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,139 @@
1
+ require 'r10k/logging'
2
+ require 'r10k/util/purgeable'
3
+
4
+ # This abstract base class implements an environment that can include module
5
+ # content
6
+ #
7
+ # @since 3.4.0
8
+ class R10K::Environment::WithModules < R10K::Environment::Base
9
+
10
+ include R10K::Logging
11
+
12
+ # @!attribute [r] moduledir
13
+ # @return [String] The directory to install environment-defined modules
14
+ # into (default: #{basedir}/modules)
15
+ attr_reader :moduledir
16
+
17
+ # Initialize the given environment.
18
+ #
19
+ # @param name [String] The unique name describing this environment.
20
+ # @param basedir [String] The base directory where this environment will be created.
21
+ # @param dirname [String] The directory name for this environment.
22
+ # @param options [Hash] An additional set of options for this environment.
23
+ #
24
+ # @param options [String] :moduledir The path to install modules to
25
+ # @param options [Hash] :modules Modules to add to the environment
26
+ def initialize(name, basedir, dirname, options = {})
27
+ super(name, basedir, dirname, options)
28
+
29
+ @managed_content = {}
30
+ @modules = []
31
+ @moduledir = case options[:moduledir]
32
+ when nil
33
+ File.join(@basedir, @dirname, 'modules')
34
+ when File.absolute_path(options[:moduledir])
35
+ options.delete(:moduledir)
36
+ else
37
+ File.join(@basedir, @dirname, options.delete(:moduledir))
38
+ end
39
+
40
+ modhash = options.delete(:modules)
41
+ load_modules(modhash) unless modhash.nil?
42
+ end
43
+
44
+ # @return [Array<R10K::Module::Base>] All modules associated with this environment.
45
+ # Modules may originate from either:
46
+ # - The r10k environment object
47
+ # - A Puppetfile in the environment's content
48
+ def modules
49
+ return @modules if @puppetfile.nil?
50
+
51
+ @puppetfile.load unless @puppetfile.loaded?
52
+ @modules + @puppetfile.modules
53
+ end
54
+
55
+ def accept(visitor)
56
+ visitor.visit(:environment, self) do
57
+ @modules.each do |mod|
58
+ mod.accept(visitor)
59
+ end
60
+
61
+ puppetfile.accept(visitor)
62
+ validate_no_module_conflicts
63
+ end
64
+ end
65
+
66
+ def load_modules(module_hash)
67
+ module_hash.each do |name, args|
68
+ add_module(name, args)
69
+ end
70
+ end
71
+
72
+ # @param [String] name
73
+ # @param [*Object] args
74
+ def add_module(name, args)
75
+ if args.is_a?(Hash)
76
+ # symbolize keys in the args hash
77
+ args = args.inject({}) { |memo,(k,v)| memo[k.to_sym] = v; memo }
78
+ end
79
+
80
+ if args.is_a?(Hash) && install_path = args.delete(:install_path)
81
+ install_path = resolve_install_path(install_path)
82
+ validate_install_path(install_path, name)
83
+ else
84
+ install_path = @moduledir
85
+ end
86
+
87
+ # Keep track of all the content this environment is managing to enable purging.
88
+ @managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
89
+
90
+ mod = R10K::Module.new(name, install_path, args, self.name)
91
+ mod.origin = 'Environment'
92
+
93
+ @managed_content[install_path] << mod.name
94
+ @modules << mod
95
+ end
96
+
97
+ def validate_no_module_conflicts
98
+ @puppetfile.load unless @puppetfile.loaded?
99
+ conflicts = (@modules + @puppetfile.modules)
100
+ .group_by { |mod| mod.name }
101
+ .select { |_, v| v.size > 1 }
102
+ .map(&:first)
103
+ unless conflicts.empty?
104
+ msg = _('Puppetfile cannot contain module names defined by environment %{name}') % {name: self.name}
105
+ msg += ' '
106
+ msg += _("Remove the conflicting definitions of the following modules: %{conflicts}" % { conflicts: conflicts.join(' ') })
107
+ raise R10K::Error.new(msg)
108
+ end
109
+ end
110
+
111
+ include R10K::Util::Purgeable
112
+
113
+ # Returns an array of the full paths that can be purged.
114
+ # @note This implements a required method for the Purgeable mixin
115
+ # @return [Array<String>]
116
+ def managed_directories
117
+ [@full_path]
118
+ end
119
+
120
+ # Returns an array of the full paths of filenames that should exist. Files
121
+ # inside managed_directories that are not listed in desired_contents will
122
+ # be purged.
123
+ # @note This implements a required method for the Purgeable mixin
124
+ # @return [Array<String>]
125
+ def desired_contents
126
+ list = @managed_content.keys
127
+ list += @managed_content.flat_map do |install_path, modnames|
128
+ modnames.collect { |name| File.join(install_path, name) }
129
+ end
130
+ end
131
+
132
+ def purge_exclusions
133
+ super + @managed_content.flat_map do |install_path, modnames|
134
+ modnames.map do |name|
135
+ File.join(install_path, name, '**', '*')
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,61 @@
1
+ require 'r10k'
2
+
3
+ module R10K
4
+
5
+ # An error class that accepts an optional hash and wrapped error message
6
+ #
7
+ class Error < StandardError
8
+ attr_accessor :original
9
+
10
+ # Generate a wrapped exception
11
+ #
12
+ # @param original [Exception] The exception to wrap
13
+ # @param mesg [String]
14
+ # @param options [Hash]
15
+ #
16
+ # @return [R10K::Error]
17
+ def self.wrap(original, mesg, options = {})
18
+ new(mesg, options).tap do |e|
19
+ e.set_backtrace(caller(4))
20
+ e.original = original
21
+ end
22
+ end
23
+
24
+ # @overload initialize(mesg)
25
+ # @param mesg [String] The exception mesg
26
+ #
27
+ # @overload initialize(mesg, options)
28
+ # @param mesg [String] The exception mesg
29
+ # @param options [Hash] A set of options to store on the exception
30
+ #
31
+ # @options options [Array<String>] :backtrace
32
+ def initialize(mesg, options = {})
33
+ super(mesg)
34
+
35
+ bt = options.delete(:backtrace)
36
+ if bt
37
+ set_backtrace(bt)
38
+ end
39
+
40
+ @options = options
41
+ end
42
+
43
+ protected
44
+
45
+ def structure_exception(name, exc)
46
+ struct = []
47
+ struct << "#{name}:"
48
+ if exc.respond_to?(:format)
49
+ struct << indent(exc.format)
50
+ else
51
+ struct << indent(exc.message)
52
+ end
53
+ struct.join("\n")
54
+ end
55
+
56
+ def indent(str, level = 4)
57
+ prefix = ' ' * level
58
+ str.gsub(/^/, prefix)
59
+ end
60
+ end
61
+ end