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,20 @@
1
+ class R10K::Source::Yaml < R10K::Source::Hash
2
+ R10K::Source.register(:yaml, self)
3
+
4
+ def initialize(name, basedir, options = {})
5
+ config = options[:config] || '/etc/puppetlabs/r10k/environments.yaml'
6
+
7
+ begin
8
+ contents = ::YAML.load_file(config)
9
+ rescue => e
10
+ raise ConfigError, _("Couldn't open environments file %{file}: %{err}") % {file: config, err: e.message}
11
+ end
12
+
13
+ # Set the environments key for the parent class to consume
14
+ options[:environments] = contents
15
+
16
+ # All we need to do is supply options with the :environments hash.
17
+ # The R10K::Source::Hash parent class takes care of the rest.
18
+ super(name, basedir, options)
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ class R10K::Source::Yamldir < R10K::Source::Hash
2
+ R10K::Source.register(:yamldir, self)
3
+
4
+ def initialize(name, basedir, options = {})
5
+ config = options[:config] || '/etc/puppetlabs/r10k/environments.d'
6
+
7
+ unless File.directory?(config)
8
+ raise R10K::Deployment::Config::ConfigError, _("Error opening %{dir}: config must be a directory") % {dir: config}
9
+ end
10
+
11
+ unless File.readable?(config)
12
+ raise R10K::Deployment::Config::ConfigError, _("Error opening %{dir}: permission denied") % {dir: config}
13
+ end
14
+
15
+ environment_data = Dir.glob(File.join(config, '*.yaml')).reduce({}) do |memo,path|
16
+ name = File.basename(path, '.yaml')
17
+ begin
18
+ contents = ::YAML.load_file(path)
19
+ rescue => e
20
+ raise R10K::Deployment::Config::ConfigError, _("Error loading %{path}: %{err}") % {path: path, err: e.message}
21
+ end
22
+ memo.merge({name => contents })
23
+ end
24
+
25
+ # Set the environments key for the parent class to consume
26
+ options[:environments] = environment_data
27
+
28
+ # All we need to do is supply options with the :environments hash.
29
+ # The R10K::Source::Hash parent class takes care of the rest.
30
+ super(name, basedir, options)
31
+ end
32
+ end
@@ -0,0 +1,6 @@
1
+ module R10K
2
+ module SVN
3
+ require 'r10k/svn/working_dir'
4
+ require 'r10k/svn/remote'
5
+ end
6
+ end
@@ -0,0 +1,68 @@
1
+ require 'r10k/util/subprocess'
2
+ require 'r10k/util/setopts'
3
+
4
+ # Inspect and interact with SVN remote repositories
5
+ #
6
+ # @api private
7
+ # @since 1.3.0
8
+ class R10K::SVN::Remote
9
+
10
+ include R10K::Util::Setopts
11
+
12
+ def initialize(baseurl, opts = {})
13
+ @baseurl = baseurl
14
+ setopts(opts, {:username => :self, :password => :self})
15
+ end
16
+
17
+ # @todo validate that the path to trunk exists in the remote
18
+ def trunk
19
+ "#{@baseurl}/trunk"
20
+ end
21
+
22
+ # @todo gracefully handle cases where no branches exist
23
+ def branches
24
+ argv = ['ls', "#{@baseurl}/branches"]
25
+ argv.concat(auth)
26
+ text = svn(argv)
27
+ text.lines.map do |line|
28
+ line.chomp!
29
+ line.gsub!(%r[/$], '')
30
+ line
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ # Format authentication information for SVN command args, if applicable
37
+ def auth
38
+ auth = []
39
+ if @username
40
+ auth << "--username" << @username
41
+ auth << "--password" << @password
42
+ end
43
+ auth
44
+ end
45
+
46
+ include R10K::Logging
47
+
48
+ # Wrap SVN commands
49
+ #
50
+ # @param argv [Array<String>]
51
+ # @param opts [Hash]
52
+ #
53
+ # @option opts [Pathname] :cwd The directory to run the command in
54
+ #
55
+ # @return [String] The stdout from the given command
56
+ def svn(argv, opts = {})
57
+ argv.unshift('svn', '--non-interactive')
58
+
59
+ subproc = R10K::Util::Subprocess.new(argv)
60
+ subproc.raise_on_fail = true
61
+ subproc.logger = self.logger
62
+
63
+ subproc.cwd = opts[:cwd]
64
+ result = subproc.execute
65
+
66
+ result.stdout
67
+ end
68
+ end
@@ -0,0 +1,125 @@
1
+ require 'r10k/util/subprocess'
2
+ require 'r10k/util/setopts'
3
+
4
+ module R10K
5
+ module SVN
6
+
7
+ # Manage an SVN working copy.
8
+ #
9
+ # If SVN authentication is required, both username and password must be specified.
10
+ #
11
+ # @api private
12
+ # @since 1.2.0
13
+ class WorkingDir
14
+
15
+ include R10K::Util::Setopts
16
+
17
+ # @attribute [r] path
18
+ # @return [Pathname] The full path to the SVN working directory
19
+ # @api private
20
+ attr_reader :path
21
+
22
+ # @!attribute [r] username
23
+ # @return [String, nil] The SVN username, if provided
24
+ # @api private
25
+ attr_reader :username
26
+
27
+ # @!attribute [r] password
28
+ # @return [String, nil] The SVN password, if provided
29
+ # @api private
30
+ attr_reader :password
31
+
32
+ # @param path [Pathname]
33
+ # @param opts [Hash]
34
+ #
35
+ # @option opts [String] :username
36
+ # @option opts [String] :password
37
+ def initialize(path, opts = {})
38
+ @path = path
39
+
40
+ setopts(opts, {:username => :self, :password => :self})
41
+
42
+ if !!(@username) ^ !!(@password)
43
+ raise ArgumentError, _("Both username and password must be specified")
44
+ end
45
+ end
46
+
47
+ # Is the directory at this path actually an SVN repository?
48
+ def is_svn?
49
+ dot_svn = @path + '.svn'
50
+ dot_svn.exist?
51
+ end
52
+
53
+ def revision
54
+ info.slice(/^Revision: (\d+)$/, 1)
55
+ end
56
+
57
+ def url
58
+ info.slice(/^URL: (.*)$/, 1)
59
+ end
60
+
61
+ def root
62
+ info.slice(/^Repository Root: (.*)$/, 1)
63
+ end
64
+
65
+ def update(revision = nil)
66
+ argv = %w[update]
67
+ argv << '-r' << revision if revision
68
+ argv.concat(auth)
69
+
70
+ svn(argv, :cwd => @path)
71
+ end
72
+
73
+ def checkout(url, revision = nil)
74
+ argv = ['checkout', url]
75
+ argv << '-r' << revision if revision
76
+ argv << @path.basename.to_s
77
+ argv.concat(auth)
78
+ argv << '-q'
79
+
80
+ svn(argv, :cwd => @path.parent)
81
+ end
82
+
83
+ private
84
+
85
+ def info
86
+ argv = %w[info]
87
+ argv.concat(auth)
88
+ svn(argv, :cwd => @path)
89
+ end
90
+
91
+ # Format authentication information for SVN command args, if applicable
92
+ def auth
93
+ auth = []
94
+ if @username
95
+ auth << "--username" << @username
96
+ auth << "--password" << @password
97
+ end
98
+ auth
99
+ end
100
+
101
+ include R10K::Logging
102
+
103
+ # Wrap SVN commands
104
+ #
105
+ # @param argv [Array<String>]
106
+ # @param opts [Hash]
107
+ #
108
+ # @option opts [Pathname] :cwd The directory to run the command in
109
+ #
110
+ # @return [String] The stdout from the given command
111
+ def svn(argv, opts = {})
112
+ argv.unshift('svn', '--non-interactive')
113
+
114
+ subproc = R10K::Util::Subprocess.new(argv)
115
+ subproc.raise_on_fail = true
116
+ subproc.logger = self.logger
117
+
118
+ subproc.cwd = opts[:cwd]
119
+ result = subproc.execute
120
+
121
+ result.stdout
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,84 @@
1
+ require 'r10k/logging'
2
+ require 'r10k/errors/formatting'
3
+ require 'r10k/util/setopts'
4
+ require 'colored2'
5
+
6
+ module R10K
7
+ module Util
8
+
9
+ # Attempt a series of dependent nested tasks and cleanly handle errors.
10
+ #
11
+ # @api private
12
+ class Attempt
13
+
14
+ include R10K::Logging
15
+ include R10K::Util::Setopts
16
+
17
+ # @!attribute [r] status
18
+ # @return [Symbol] The status of this task
19
+ attr_reader :status
20
+
21
+ def initialize(initial, opts = {})
22
+ @initial = initial
23
+ @tries = []
24
+ @status = :notrun
25
+ setopts(opts, {:trace => :self})
26
+ end
27
+
28
+ # Run this attempt to completion.
29
+ #
30
+ # @todo determine the structure of the ret
31
+ # @return [Object] The aggregate result of all work performed.
32
+ def run
33
+ @status = :running
34
+ result = apply(@initial, @tries)
35
+ @status = :ok if @status == :running
36
+ result
37
+ end
38
+
39
+ # Add another action to take for this attempt
40
+ #
41
+ # @yieldparam [Object] The result of the previous action.
42
+ # @yieldreturn [Object, Array<Object>, NilClass] The result of this action.
43
+ # If the value is an object, it will be passed to the next attempt. If
44
+ # the value is an Array then each element will be individually passed
45
+ # to the next try. If the value is false or nil then no further action
46
+ # will be taken.
47
+ def try(&block)
48
+ @tries << block
49
+ self
50
+ end
51
+
52
+ def ok?
53
+ @status == :ok
54
+ end
55
+
56
+ private
57
+
58
+ def apply(input, tries)
59
+ return input if tries.empty?
60
+
61
+ case input
62
+ when Array
63
+ apply_all(input, tries)
64
+ when NilClass, FalseClass
65
+ input
66
+ else
67
+ apply_one(input, tries)
68
+ end
69
+ end
70
+
71
+ def apply_all(values, tries)
72
+ values.map { |v| apply_one(v, tries) }
73
+ end
74
+
75
+ def apply_one(value, tries)
76
+ apply(tries.first.call(value), tries.drop(1))
77
+ rescue => e
78
+ @status = :failed
79
+ logger.error R10K::Errors::Formatting.format_exception(e, @trace)
80
+ e
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,65 @@
1
+ require 'r10k/deployment'
2
+ require 'r10k/logging'
3
+ require 'r10k/util/purgeable'
4
+
5
+ module R10K
6
+ module Util
7
+
8
+ # Represents a directory that can purge unmanaged contents
9
+ #
10
+ # @todo pick a better name than basedir. Expect this class to be renamed.
11
+ #
12
+ # @api private
13
+ class Basedir
14
+
15
+ include R10K::Util::Purgeable
16
+ include R10K::Logging
17
+
18
+ # Create a new Basedir by selecting sources from a deployment that match
19
+ # the specified path.
20
+ #
21
+ # @param path [String]
22
+ # @param deployment [R10K::Deployment]
23
+ #
24
+ # @return [R10K::Util::Basedir]
25
+ def self.from_deployment(path, deployment)
26
+ sources = deployment.sources.select { |source| source.managed_directory == path }
27
+ new(path, sources)
28
+ end
29
+
30
+ # @param path [String] The path to the directory to manage
31
+ # @param sources [Array<#desired_contents>] A list of objects that may create filesystem entries
32
+ def initialize(path, sources)
33
+ if sources.is_a? R10K::Deployment
34
+ raise ArgumentError, _("Expected Array<#desired_contents>, got R10K::Deployment")
35
+ end
36
+ @path = path
37
+ @sources = sources
38
+ end
39
+
40
+ # Return the path of the basedir
41
+ # @note This implements a required method for the Purgeable mixin
42
+ # @return [Array]
43
+ def managed_directories
44
+ [@path]
45
+ end
46
+
47
+ # List all environments that should exist in this basedir
48
+ # @note This implements a required method for the Purgeable mixin
49
+ # @return [Array<String>]
50
+ def desired_contents
51
+ @sources.flat_map do |src|
52
+ src.desired_contents.collect { |env| File.join(@path, env) }
53
+ end
54
+ end
55
+
56
+ def purge!
57
+ @sources.each do |source|
58
+ logger.debug1 _("Source %{source_name} in %{path} manages contents %{contents}") % {source_name: source.name, path: @path, contents: source.desired_contents.inspect}
59
+ end
60
+
61
+ super
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,31 @@
1
+ module R10K
2
+ module Util
3
+ module Commands
4
+ module_function
5
+
6
+ # Find the full path of a shell command.
7
+ #
8
+ # On POSIX platforms, the PATHEXT environment variable will be unset, so
9
+ # the first command named 'cmd' will be returned.
10
+ #
11
+ # On Windows platforms, the PATHEXT environment variable will contain a
12
+ # semicolon delimited list of executable file extensions, so the first
13
+ # command with a matching path extension will be returned.
14
+ #
15
+ # @param cmd [String] The name of the command to search for
16
+ # @return [String, nil] The path to the file if found, nil otherwise
17
+ def which(cmd)
18
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
19
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
20
+ exts.each do |ext|
21
+ path = File.join(dir, "#{cmd}#{ext}")
22
+ if File.executable?(path) && File.file?(path)
23
+ return path
24
+ end
25
+ end
26
+ end
27
+ nil
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ module R10K
2
+ module Util
3
+
4
+ # Utility methods for dealing with environment variables
5
+ module ExecEnv
6
+ module_function
7
+
8
+ # Swap out all environment settings
9
+ #
10
+ # @param env [Hash] The new environment to use
11
+ # @return [void]
12
+ def reset(env)
13
+ env.each_pair do |key, value|
14
+ ENV[key] = value
15
+ end
16
+
17
+ (ENV.keys - env.keys).each do |key|
18
+ ENV.delete(key)
19
+ end
20
+ end
21
+
22
+ # Add the specified settings to the env for the supplied block
23
+ #
24
+ # @param env [Hash] The values to add to the environment
25
+ # @param block [Proc] The code to call with the modified environnment
26
+ # @return [void]
27
+ def withenv(env, &block)
28
+ original = ENV.to_hash
29
+ reset(original.merge(env))
30
+ block.call
31
+ ensure
32
+ reset(original)
33
+ end
34
+ end
35
+ end
36
+ end