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,61 @@
1
+ require 'r10k/util/commands'
2
+ require 'r10k/util/exec_env'
3
+
4
+ require 'tmpdir'
5
+
6
+ describe R10K::Util::Commands do
7
+ describe "#which" do
8
+
9
+ before do
10
+ allow(File).to receive(:executable?).and_return false
11
+ allow(File).to receive(:file?).and_return false
12
+ end
13
+
14
+ def stub_executable(exe)
15
+ allow(File).to receive(:executable?).with(exe).and_return true
16
+ allow(File).to receive(:file?).with(exe).and_return true
17
+ end
18
+
19
+ describe "when ENV['PATHEXT'] is unset" do
20
+ let(:path) { Dir.mktmpdir }
21
+
22
+ around(:each) do |example|
23
+ R10K::Util::ExecEnv.withenv('PATHEXT' => nil, 'PATH' => path) do
24
+ example.run
25
+ end
26
+ end
27
+
28
+ it "returns the first matching command in PATH" do
29
+ exe = File.join(path, 'git')
30
+ stub_executable(exe)
31
+ expect(described_class.which("git")).to eq exe
32
+ end
33
+
34
+ it "returns nil if the command could not be found" do
35
+ exe = File.join(path, 'git')
36
+ expect(described_class.which("git")).to be_nil
37
+ end
38
+ end
39
+
40
+ describe "when ENV['PATHEXT'] is set" do
41
+ let(:path) { Dir.mktmpdir }
42
+
43
+ around(:each) do |example|
44
+ R10K::Util::ExecEnv.withenv('PATHEXT' => '.bat;.exe;.cmd', 'PATH' => path) do
45
+ example.run
46
+ end
47
+ end
48
+
49
+ it "returns the first matching command in PATH" do
50
+ exe = File.join(path, 'git.exe')
51
+ stub_executable(exe)
52
+ expect(described_class.which("git")).to eq exe
53
+ end
54
+
55
+ it "returns nil if the command could not be found" do
56
+ exe = File.join(path, 'git.exe')
57
+ expect(described_class.which("git")).to be_nil
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,56 @@
1
+ require 'r10k/util/exec_env'
2
+
3
+ describe R10K::Util::ExecEnv do
4
+ describe "withenv" do
5
+ it "adds the keys to the environment during the block" do
6
+ val = nil
7
+ described_class.withenv('VAL' => 'something') do
8
+ val = ENV['VAL']
9
+ end
10
+ expect(val).to eq 'something'
11
+ end
12
+
13
+ it "doesn't modify values that were not modified by the passed hash" do
14
+ origpath = ENV['PATH']
15
+ path = nil
16
+ described_class.withenv('VAL' => 'something') do
17
+ path = ENV['PATH']
18
+ end
19
+ expect(path).to eq origpath
20
+ end
21
+
22
+ it "removes new values after the block" do
23
+ val = nil
24
+ described_class.withenv('VAL' => 'something') { }
25
+ expect(ENV['VAL']).to be_nil
26
+ end
27
+
28
+ it "restores old values after the block" do
29
+ path = ENV['PATH']
30
+ described_class.withenv('PATH' => '/usr/bin') { }
31
+ expect(ENV['PATH']).to eq path
32
+ end
33
+ end
34
+
35
+ describe "reset" do
36
+
37
+ after { ENV.delete('VAL') }
38
+
39
+ it "replaces environment keys with the specified keys" do
40
+ ENV['VAL'] = 'hi'
41
+
42
+ newenv = ENV.to_hash
43
+ newenv['VAL'] = 'bye'
44
+
45
+ described_class.reset(newenv)
46
+ expect(ENV['VAL']).to eq 'bye'
47
+ end
48
+
49
+ it "removes any keys that were not provided" do
50
+ env = ENV.to_hash
51
+ ENV['VAL'] = 'hi'
52
+ described_class.reset(env)
53
+ expect(ENV['VAL']).to be_nil
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,230 @@
1
+ require 'spec_helper'
2
+ require 'r10k/util/purgeable'
3
+
4
+ RSpec.describe R10K::Util::Purgeable do
5
+ let(:managed_directories) do
6
+ [
7
+ 'spec/fixtures/unit/util/purgeable/managed_one',
8
+ 'spec/fixtures/unit/util/purgeable/managed_two',
9
+ ]
10
+ end
11
+
12
+ let(:desired_contents) do
13
+ [
14
+ 'spec/fixtures/unit/util/purgeable/managed_one/expected_1',
15
+ 'spec/fixtures/unit/util/purgeable/managed_one/new_1',
16
+ 'spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1',
17
+ 'spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1',
18
+ 'spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_new_1',
19
+ 'spec/fixtures/unit/util/purgeable/managed_two/expected_2',
20
+ 'spec/fixtures/unit/util/purgeable/managed_two/new_2',
21
+ ]
22
+ end
23
+
24
+ let(:test_class) do
25
+ Struct.new(:managed_directories, :desired_contents) do
26
+ include R10K::Util::Purgeable
27
+ include R10K::Logging
28
+ end
29
+ end
30
+
31
+ subject { test_class.new(managed_directories, desired_contents) }
32
+
33
+ context 'without recurse option' do
34
+ let(:recurse) { false }
35
+
36
+ describe '#current_contents' do
37
+ it 'collects direct contents of all managed directories' do
38
+ expect(subject.current_contents(recurse)).to contain_exactly(/\/expected_1/, /\/expected_2/, /\/unmanaged_1/, /\/unmanaged_2/, /\/managed_subdir_1/)
39
+ end
40
+ end
41
+
42
+ describe '#pending_contents' do
43
+ it 'collects desired_contents that do not yet exist' do
44
+ expect(subject.pending_contents(recurse)).to include(/\/new_1/, /\/new_2/)
45
+ end
46
+ end
47
+
48
+ describe '#stale_contents' do
49
+ context 'with no whitelist or exclusions' do
50
+ let(:exclusions) { [] }
51
+ let(:whitelist) { [] }
52
+
53
+ it 'collects current_contents that should not exist' do
54
+ expect(subject.stale_contents(recurse, exclusions, whitelist)).to contain_exactly(/\/unmanaged_1/, /\/unmanaged_2/)
55
+ end
56
+ end
57
+
58
+ context 'with whitelisted items' do
59
+ let(:exclusions) { [] }
60
+ let(:whitelist) { ['**/unmanaged_1'] }
61
+
62
+ it 'collects current_contents that should not exist except whitelisted items' do
63
+ expect(subject.logger).to receive(:debug).with(/unmanaged_1.*whitelist match/i)
64
+ expect(subject.stale_contents(recurse, exclusions, whitelist)).to contain_exactly(/\/unmanaged_2/)
65
+ end
66
+ end
67
+
68
+ context 'with excluded items' do
69
+ let(:exclusions) { ['**/unmanaged_2'] }
70
+ let(:whitelist) { [] }
71
+
72
+ it 'collects current_contents that should not exist except excluded items' do
73
+ expect(subject.logger).to receive(:debug2).with(/unmanaged_2.*internal exclusion match/i)
74
+ expect(subject.stale_contents(recurse, exclusions, whitelist)).to contain_exactly(/\/unmanaged_1/)
75
+ end
76
+ end
77
+ end
78
+
79
+ describe '#purge!' do
80
+ let(:exclusions) { [] }
81
+ let(:whitelist) { [] }
82
+ let(:purge_opts) { { recurse: recurse, whitelist: whitelist } }
83
+
84
+ it 'does nothing when there is no stale_contents' do
85
+ allow(subject).to receive(:stale_contents).and_return([])
86
+
87
+ expect(FileUtils).to_not receive(:rm_rf)
88
+
89
+ subject.purge!(purge_opts)
90
+ end
91
+
92
+ it 'recursively deletes all stale_contents' do
93
+ subject.stale_contents(recurse, exclusions, whitelist).each do |stale|
94
+ expect(FileUtils).to receive(:rm_r).with(stale, hash_including(secure: true))
95
+ end
96
+
97
+ subject.purge!(purge_opts)
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'with recurse option' do
103
+ let(:recurse) { true }
104
+
105
+ describe '#current_contents' do
106
+ it 'collects contents of all managed directories recursively' do
107
+ expect(subject.current_contents(recurse)).to contain_exactly(/\/expected_1/, /\/expected_2/, /\/unmanaged_1/, /\/unmanaged_2/, /\/managed_subdir_1/, /\/subdir_expected_1/, /\/subdir_unmanaged_1/)
108
+ end
109
+ end
110
+
111
+ describe '#pending_contents' do
112
+ it 'collects desired_contents that do not yet exist recursively' do
113
+ expect(subject.pending_contents(recurse)).to include(/\/new_1/, /\/new_2/, /\/subdir_new_1/)
114
+ end
115
+ end
116
+
117
+ describe '#stale_contents' do
118
+ context 'with no whitelist or exclusions' do
119
+ let(:exclusions) { [] }
120
+ let(:whitelist) { [] }
121
+
122
+ it 'collects current_contents that should not exist recursively' do
123
+ expect(subject.stale_contents(recurse, exclusions, whitelist)).to contain_exactly(/\/unmanaged_1/, /\/unmanaged_2/, /\/subdir_unmanaged_1/)
124
+ end
125
+ end
126
+
127
+ context 'with whitelisted items' do
128
+ let(:exclusions) { [] }
129
+ let(:whitelist) { ['**/unmanaged_1'] }
130
+
131
+ it 'collects current_contents that should not exist except whitelisted items' do
132
+ expect(subject.logger).to receive(:debug).with(/unmanaged_1.*whitelist match/i)
133
+ expect(subject.stale_contents(recurse, exclusions, whitelist)).to contain_exactly(/\/unmanaged_2/, /\/subdir_unmanaged_1/)
134
+ end
135
+ end
136
+
137
+ context 'with excluded items' do
138
+ let(:exclusions) { ['**/unmanaged_2'] }
139
+ let(:whitelist) { [] }
140
+
141
+ it 'collects current_contents that should not exist except excluded items' do
142
+ expect(subject.logger).to receive(:debug2).with(/unmanaged_2.*internal exclusion match/i)
143
+ expect(subject.stale_contents(recurse, exclusions, whitelist)).to contain_exactly(/\/unmanaged_1/, /\/subdir_unmanaged_1/)
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#purge!' do
149
+ let(:exclusions) { [] }
150
+ let(:whitelist) { [] }
151
+ let(:purge_opts) { { recurse: recurse, whitelist: whitelist } }
152
+
153
+ it 'does nothing when there is no stale_contents' do
154
+ allow(subject).to receive(:stale_contents).and_return([])
155
+
156
+ expect(FileUtils).to_not receive(:rm_r)
157
+
158
+ subject.purge!(purge_opts)
159
+ end
160
+
161
+ it 'recursively deletes all stale_contents' do
162
+ subject.stale_contents(recurse, exclusions, whitelist).each do |stale|
163
+ expect(FileUtils).to receive(:rm_r).with(stale, hash_including(secure: true))
164
+ end
165
+
166
+ subject.purge!(purge_opts)
167
+ end
168
+ end
169
+ end
170
+
171
+ describe "user whitelist functionality" do
172
+ context "non-recursive whitelist glob" do
173
+ let(:whitelist) { managed_directories.collect { |dir| File.join(dir, "*unmanaged*") } }
174
+ let(:purge_opts) { { recurse: true, whitelist: whitelist } }
175
+
176
+ describe '#purge!' do
177
+ it 'does not purge items matching glob at root level' do
178
+ allow(FileUtils).to receive(:rm_r)
179
+ expect(FileUtils).to_not receive(:rm_r).with(/\/unmanaged_[12]/, anything)
180
+ expect(subject.logger).to receive(:debug).with(/whitelist match/i).at_least(:once)
181
+
182
+ subject.purge!(purge_opts)
183
+ end
184
+ end
185
+ end
186
+
187
+ context "recursive whitelist glob" do
188
+ let(:whitelist) { managed_directories.collect { |dir| File.join(dir, "**", "*unmanaged*") } }
189
+ let(:purge_opts) { { recurse: true, whitelist: whitelist } }
190
+
191
+ describe '#purge!' do
192
+ it 'does not purge items matching glob at any level' do
193
+ expect(FileUtils).to_not receive(:rm_r)
194
+ expect(subject.logger).to receive(:debug).with(/whitelist match/i).at_least(:once)
195
+
196
+ subject.purge!(purge_opts)
197
+ end
198
+ end
199
+ end
200
+ end
201
+
202
+ describe "internal exclusions functionality" do
203
+ let(:purge_opts) { { recurse: true, whitelist: [] } }
204
+ let(:exclusions) { [ File.join('**', 'unmanaged_1') ] }
205
+
206
+ context "when class implements #purge_exclusions" do
207
+ describe '#purge!' do
208
+ it 'does not purge items matching exclusion glob' do
209
+ expect(subject).to receive(:purge_exclusions).and_return(exclusions)
210
+
211
+ allow(FileUtils).to receive(:rm_r)
212
+ expect(FileUtils).to_not receive(:rm_r).with(/\/unmanaged_1/, anything)
213
+ expect(subject.logger).to receive(:debug2).with(/unmanaged_1.*internal exclusion match/i)
214
+
215
+ subject.purge!(purge_opts)
216
+ end
217
+ end
218
+ end
219
+
220
+ context "when class does not implement #purge_exclusions" do
221
+ describe '#purge!' do
222
+ it 'purges normally' do
223
+ expect(FileUtils).to receive(:rm_r).at_least(3).times
224
+
225
+ subject.purge!(purge_opts)
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+ require 'r10k/util/setopts'
3
+
4
+ describe R10K::Util::Setopts do
5
+ let(:klass) do
6
+ Class.new do
7
+ include R10K::Util::Setopts
8
+
9
+ attr_reader :valid, :alsovalid, :truthyvalid
10
+
11
+ def initialize(opts = {})
12
+ setopts(opts, {
13
+ :valid => :self, :alsovalid => :self, :truthyvalid => true,
14
+ :validalias => :valid,
15
+ :ignoreme => nil
16
+ })
17
+ end
18
+ end
19
+ end
20
+
21
+ it "can handle an empty hash of options" do
22
+ o = klass.new()
23
+ expect(o.valid).to be_nil
24
+ expect(o.alsovalid).to be_nil
25
+ end
26
+
27
+ it "can handle a single valid option" do
28
+ o = klass.new(:valid => 'yep')
29
+ expect(o.valid).to eq 'yep'
30
+ expect(o.alsovalid).to be_nil
31
+ end
32
+
33
+ it "can handle multiple valid options" do
34
+ o = klass.new(:valid => 'yep', :alsovalid => 'yarp')
35
+ expect(o.valid).to eq 'yep'
36
+ expect(o.alsovalid).to eq 'yarp'
37
+ end
38
+
39
+ it "can handle options marked with TrueClass" do
40
+ o = klass.new(:truthyvalid => 'so truthy')
41
+ expect(o.truthyvalid).to eq 'so truthy'
42
+ end
43
+
44
+ it "can handle aliases marked with :self" do
45
+ o = klass.new(:validalias => 'yuuup')
46
+ expect(o.valid).to eq 'yuuup'
47
+ end
48
+
49
+
50
+ it "raises an error when given an unhandled option" do
51
+ expect {
52
+ klass.new(:valid => 'yep', :notvalid => 'newp')
53
+ }.to raise_error(ArgumentError, /cannot handle option 'notvalid'/)
54
+ end
55
+
56
+ it "ignores values that are marked as unhandled" do
57
+ klass.new(:ignoreme => "IGNORE ME!")
58
+ end
59
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'r10k/util/subprocess'
3
+
4
+ describe R10K::Util::Subprocess::Result do
5
+ describe "formatting" do
6
+ it "includes the exit code" do
7
+ result = described_class.new(%w[/usr/bin/gti --zoom], '', '', 42)
8
+ expect(result.format).to match(%r[Exit code: 42])
9
+ end
10
+
11
+ describe "stdout" do
12
+ it "is omitted when empty" do
13
+ result = described_class.new(%w[/usr/bin/gti --zoom], '', '', 42)
14
+ expect(result.format).to_not match(%r[Stdout])
15
+ end
16
+ it "is included when non-empty" do
17
+ result = described_class.new(%w[/usr/bin/gti --zoom], 'stuff here', '', 42)
18
+ expect(result.format).to match(%r[Stdout:])
19
+ expect(result.format).to match(%r[stuff here])
20
+ end
21
+ end
22
+
23
+ describe "stderr" do
24
+ it "is omitted when empty" do
25
+ result = described_class.new(%w[/usr/bin/gti --zoom], '', '', 42)
26
+ expect(result.format).to_not match(%r[Stderr])
27
+ end
28
+
29
+ it "is included when non-empty" do
30
+ result = described_class.new(%w[/usr/bin/gti --zoom], '', 'other stuff', 42)
31
+ expect(result.format).to match(%r[Stderr:])
32
+ expect(result.format).to match(%r[other stuff])
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+ require 'r10k/util/subprocess/runner'
3
+
4
+ describe R10K::Util::Subprocess::Runner::POSIX, :if => R10K::Util::Platform.posix? do
5
+ fixture_root = File.expand_path('spec/fixtures/unit/util/subprocess/runner', PROJECT_ROOT)
6
+ it_behaves_like 'a subprocess runner', fixture_root
7
+ end