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,274 @@
1
+ require 'spec_helper'
2
+ require 'r10k/module/git'
3
+
4
+ describe R10K::Module::Git do
5
+ let(:mock_repo) do
6
+ instance_double("R10K::Git::StatefulRepository")
7
+ end
8
+
9
+ before(:each) do
10
+ allow(R10K::Git::StatefulRepository).to receive(:new).and_return(mock_repo)
11
+ end
12
+
13
+ describe "setting the owner and name" do
14
+ describe "with a title of 'branan/eight_hundred'" do
15
+ subject do
16
+ described_class.new(
17
+ 'branan/eight_hundred',
18
+ '/moduledir',
19
+ {
20
+ :git => 'git://git-server.site/branan/puppet-eight_hundred',
21
+ }
22
+ )
23
+ end
24
+
25
+ it "sets the owner to 'branan'" do
26
+ expect(subject.owner).to eq 'branan'
27
+ end
28
+
29
+ it "sets the name to 'eight_hundred'" do
30
+ expect(subject.name).to eq 'eight_hundred'
31
+ end
32
+
33
+ it "sets the path to '/moduledir/eight_hundred'" do
34
+ expect(subject.path).to eq(Pathname.new('/moduledir/eight_hundred'))
35
+ end
36
+ end
37
+
38
+ describe "with a title of 'modulename'" do
39
+ subject do
40
+ described_class.new(
41
+ 'eight_hundred',
42
+ '/moduledir',
43
+ {
44
+ :git => 'git://git-server.site/branan/puppet-eight_hundred',
45
+ }
46
+ )
47
+ end
48
+
49
+ it "sets the owner to nil" do
50
+ expect(subject.owner).to be_nil
51
+ end
52
+
53
+ it "sets the name to 'eight_hundred'" do
54
+ expect(subject.name).to eq 'eight_hundred'
55
+ end
56
+
57
+ it "sets the path to '/moduledir/eight_hundred'" do
58
+ expect(subject.path).to eq(Pathname.new('/moduledir/eight_hundred'))
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "properties" do
64
+ subject do
65
+ described_class.new('boolean', '/moduledir', {:git => 'git://git.example.com/adrienthebo/puppet-boolean'})
66
+ end
67
+
68
+ before(:each) do
69
+ allow(mock_repo).to receive(:resolve).with('master').and_return('abc123')
70
+ allow(mock_repo).to receive(:head).and_return('abc123')
71
+ end
72
+
73
+ it "sets the module type to :git" do
74
+ expect(subject.properties).to include(:type => :git)
75
+ end
76
+
77
+ it "sets the expected version" do
78
+ expect(subject.properties).to include(:expected => 'master')
79
+ end
80
+
81
+ it "sets the actual version to the revision when the revision is available" do
82
+ expect(mock_repo).to receive(:head).and_return('35d3517e67ceeb4b485b56d4a14d38fb95516c92')
83
+ expect(subject.properties).to include(:actual => '35d3517e67ceeb4b485b56d4a14d38fb95516c92')
84
+ end
85
+
86
+ it "sets the actual version to (unresolvable) when the revision is unavailable" do
87
+ expect(mock_repo).to receive(:head).and_return(nil)
88
+ expect(subject.properties).to include(:actual => '(unresolvable)')
89
+ end
90
+ end
91
+
92
+ describe "determining the status" do
93
+ subject do
94
+ described_class.new(
95
+ 'boolean',
96
+ '/moduledir',
97
+ {
98
+ :git => 'git://git.example.com/adrienthebo/puppet-boolean'
99
+ }
100
+ )
101
+ end
102
+
103
+ it "delegates to the repo" do
104
+ expect(subject).to receive(:version).and_return 'master'
105
+ expect(mock_repo).to receive(:status).with('master').and_return :some_status
106
+
107
+ expect(subject.status).to eq(:some_status)
108
+ end
109
+ end
110
+
111
+ describe "option parsing" do
112
+ def test_module(extra_opts, env=nil)
113
+ described_class.new('boolean', '/moduledir', base_opts.merge(extra_opts), env)
114
+ end
115
+
116
+ let(:base_opts) { { git: 'git://git.example.com/adrienthebo/puppet-boolean' } }
117
+
118
+ before(:each) do
119
+ allow(mock_repo).to receive(:head).and_return('abc123')
120
+ end
121
+
122
+ context "when option is unrecognized" do
123
+ let(:opts) { { unrecognized: true } }
124
+
125
+ it "raises an error" do
126
+ expect { test_module(opts) }.to raise_error(ArgumentError, /unhandled options.*unrecognized/i)
127
+ end
128
+ end
129
+
130
+ describe "desired ref" do
131
+ context "when no desired ref is given" do
132
+ it "defaults to master" do
133
+ expect(mock_repo).to receive(:resolve).with('master').and_return('abc123')
134
+
135
+ expect(test_module({}).properties).to include(expected: 'master')
136
+ end
137
+ end
138
+
139
+ context "specifying a static desired branch" do
140
+ let(:opts) { { branch: 'banana' } }
141
+
142
+ it "sets expected to specified branch name" do
143
+ expect(mock_repo).to receive(:resolve).with('banana').and_return('def456')
144
+
145
+ mod = test_module(opts)
146
+ expect(mod.properties).to include(expected: 'banana')
147
+ end
148
+ end
149
+
150
+ context "specifying a static desired tag" do
151
+ let(:opts) { { tag: '1.2.3' } }
152
+
153
+ it "sets expected to specified tag" do
154
+ expect(mock_repo).to receive(:resolve).with('1.2.3').and_return('def456')
155
+
156
+ mod = test_module(opts)
157
+ expect(mod.properties).to include(expected: '1.2.3')
158
+ end
159
+ end
160
+
161
+ context "specifying a static desired commit sha" do
162
+ let(:opts) { { commit: 'ace789' } }
163
+
164
+ it "sets expected to specified commit sha" do
165
+ expect(mock_repo).to receive(:resolve).with('ace789').and_return('ace789')
166
+
167
+ mod = test_module(opts)
168
+ expect(mod.properties).to include(expected: 'ace789')
169
+ end
170
+ end
171
+
172
+ context "specifying a static desired ref" do
173
+ before(:each) do
174
+ expect(mock_repo).to receive(:resolve).and_return('abc123')
175
+ end
176
+
177
+ it "accepts a branch name" do
178
+ mod = test_module(ref: 'banana')
179
+ expect(mod.properties).to include(expected: 'banana')
180
+ end
181
+
182
+ it "accepts a tag name" do
183
+ mod = test_module(ref: '1.2.3')
184
+ expect(mod.properties).to include(expected: '1.2.3')
185
+ end
186
+
187
+ it "accepts a commit sha" do
188
+ mod = test_module(ref: 'abc123')
189
+ expect(mod.properties).to include(expected: 'abc123')
190
+ end
191
+ end
192
+
193
+ context "specifying branch to :control_branch" do
194
+ let(:mock_env) { instance_double("R10K::Environment::Git", ref: 'env_branch') }
195
+
196
+ context "when module belongs to an environment and matching branch is resolvable" do
197
+ before(:each) do
198
+ expect(mock_repo).to receive(:resolve).with(mock_env.ref).and_return('abc123')
199
+ end
200
+
201
+ it "tracks environment branch" do
202
+ mod = test_module({branch: :control_branch}, mock_env)
203
+ expect(mod.properties).to include(expected: mock_env.ref)
204
+ end
205
+ end
206
+
207
+ context "when module does not belong to an environment" do
208
+ it "leaves desired_ref unchanged" do
209
+ mod = test_module(branch: :control_branch)
210
+ expect(mod.desired_ref).to eq(:control_branch)
211
+ end
212
+
213
+ context "when default ref is provided and resolvable" do
214
+ it "uses default ref" do
215
+ expect(mock_repo).to receive(:resolve).with('default').and_return('abc123')
216
+ mod = test_module({branch: :control_branch, default_branch: 'default'})
217
+
218
+ expect(mod.properties).to include(expected: 'default')
219
+ end
220
+ end
221
+
222
+ context "when default ref is provided and not resolvable" do
223
+ it "raises appropriate error" do
224
+ expect(mock_repo).to receive(:resolve).with('default').and_return(nil)
225
+ mod = test_module({branch: :control_branch, default_branch: 'default'})
226
+
227
+ expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*could not resolve control repo branch.*or resolve default/i)
228
+ end
229
+ end
230
+
231
+ context "when default ref is not provided" do
232
+ it "raises appropriate error" do
233
+ mod = test_module({branch: :control_branch})
234
+
235
+ expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*could not resolve control repo branch.*no default provided/i)
236
+ end
237
+ end
238
+ end
239
+
240
+ context "when module does not have matching branch" do
241
+ before(:each) do
242
+ allow(mock_repo).to receive(:resolve).with(mock_env.ref).and_return(nil)
243
+ end
244
+
245
+ context "when default ref is provided and resolvable" do
246
+ it "uses default ref" do
247
+ expect(mock_repo).to receive(:resolve).with('default').and_return('abc123')
248
+ mod = test_module({branch: :control_branch, default_branch: 'default'}, mock_env)
249
+
250
+ expect(mod.properties).to include(expected: 'default')
251
+ end
252
+ end
253
+
254
+ context "when default ref is provided and not resolvable" do
255
+ it "raises appropriate error" do
256
+ expect(mock_repo).to receive(:resolve).with('default').and_return(nil)
257
+ mod = test_module({branch: :control_branch, default_branch: 'default'}, mock_env)
258
+
259
+ expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*could not resolve desired.*or resolve default/i)
260
+ end
261
+ end
262
+
263
+ context "when default ref is not provided" do
264
+ it "raises appropriate error" do
265
+ mod = test_module({branch: :control_branch}, mock_env)
266
+
267
+ expect { mod.properties }.to raise_error(ArgumentError, /unable to manage.*no default provided/i)
268
+ end
269
+ end
270
+ end
271
+ end
272
+ end
273
+ end
274
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe R10K::Module::MetadataFile do
4
+
5
+ let(:path) { double 'pathname' }
6
+
7
+ subject(:metadata_file) { described_class.new(path) }
8
+
9
+ describe "determining if the metadata file exists" do
10
+ it "doesn't exist if the given path isn't a file" do
11
+ allow(path).to receive(:file?).and_return false
12
+ expect(metadata_file).to_not be_exist
13
+ end
14
+
15
+ it "doesn't exist if the given path is an unreadable file" do
16
+ allow(path).to receive(:file?).and_return true
17
+ allow(path).to receive(:readable?).and_return false
18
+
19
+ expect(metadata_file).to_not be_exist
20
+ end
21
+
22
+ it "exists if the given path exists and is readable" do
23
+ allow(path).to receive(:file?).and_return true
24
+ allow(path).to receive(:readable?).and_return true
25
+
26
+ expect(metadata_file).to be_exist
27
+ end
28
+ end
29
+
30
+ describe "parsing a metadata file" do
31
+ let(:fixture_path) do
32
+ fixture_path = Pathname.new(File.expand_path('spec/fixtures/module/forge/eight_hundred/metadata.json', PROJECT_ROOT))
33
+ end
34
+
35
+ before do
36
+ a_metadata_file = R10K::Module::MetadataFile.new(fixture_path)
37
+ @metadata = a_metadata_file.read
38
+ end
39
+
40
+ it "extracts the module name" do
41
+ expect(@metadata.name).to eq 'eight_hundred'
42
+ end
43
+
44
+ it "extracts the full module name" do
45
+ expect(@metadata.full_module_name).to eq 'branan-eight_hundred'
46
+ end
47
+
48
+ it "extracts the module author" do
49
+ expect(@metadata.author).to eq 'Branan Purvine-Riley'
50
+ end
51
+
52
+ it "extracts the module version" do
53
+ expect(@metadata.version).to eq '8.0.0'
54
+ end
55
+ end
56
+
57
+ describe "parsing an invalid metadata file" do
58
+ let(:fixture_path) do
59
+ fixture_path = Pathname.new(File.expand_path('spec/fixtures/module/forge/bad_module/metadata.json', PROJECT_ROOT))
60
+ end
61
+
62
+ it "raises an error" do
63
+ a_metadata_file = R10K::Module::MetadataFile.new(fixture_path)
64
+ expect {a_metadata_file.read}.to raise_error(R10K::Error, "Could not read metadata.json")
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,178 @@
1
+ require 'spec_helper'
2
+
3
+ require 'r10k/module/svn'
4
+
5
+ describe R10K::Module::SVN do
6
+
7
+ include_context 'fail on execution'
8
+
9
+ describe "determining it implements a Puppetfile mod" do
10
+ it "implements mods with the :svn hash key" do
11
+ implements = described_class.implement?('r10k-fixture-repo', :svn => 'https://github.com/adrienthebo/r10k-fixture-repo')
12
+ expect(implements).to eq true
13
+ end
14
+ end
15
+
16
+ describe "path variables" do
17
+ it "uses the module name as the name" do
18
+ svn = described_class.new('foo', '/moduledir', :rev => 'r10')
19
+ expect(svn.name).to eq 'foo'
20
+ expect(svn.owner).to be_nil
21
+ expect(svn.dirname).to eq '/moduledir'
22
+ expect(svn.path).to eq Pathname.new('/moduledir/foo')
23
+ end
24
+
25
+ it "does not include the owner in the path" do
26
+ svn = described_class.new('bar/foo', '/moduledir', :rev => 'r10')
27
+ expect(svn.name).to eq 'foo'
28
+ expect(svn.owner).to eq 'bar'
29
+ expect(svn.dirname).to eq '/moduledir'
30
+ expect(svn.path).to eq Pathname.new('/moduledir/foo')
31
+ end
32
+ end
33
+
34
+
35
+ describe "instantiating based on Puppetfile configuration" do
36
+ it "can specify a revision with the :rev key" do
37
+ svn = described_class.new('foo', '/moduledir', :rev => 'r10')
38
+ expect(svn.expected_revision).to eq 'r10'
39
+ end
40
+
41
+ it "can specify a revision with the :revision key" do
42
+ svn = described_class.new('foo', '/moduledir', :revision => 'r10')
43
+ expect(svn.expected_revision).to eq 'r10'
44
+ end
45
+ end
46
+
47
+ describe "properties" do
48
+ subject { described_class.new('foo', '/moduledir', :svn => 'https://github.com/adrienthebo/r10k-fixture-repo', :rev => 123) }
49
+
50
+ it "sets the module type to :svn" do
51
+ expect(subject.properties).to include(:type => :svn)
52
+ end
53
+
54
+ it "sets the expected version" do
55
+ expect(subject.properties).to include(:expected => 123)
56
+ end
57
+
58
+ it "sets the actual version to the revision when the revision is available" do
59
+ expect(subject.working_dir).to receive(:revision).and_return(12)
60
+ expect(subject.properties).to include(:actual => 12)
61
+ end
62
+
63
+ it "sets the actual version (unresolvable) when the revision is unavailable" do
64
+ expect(subject.working_dir).to receive(:revision).and_raise(ArgumentError)
65
+ expect(subject.properties).to include(:actual => "(unresolvable)")
66
+ end
67
+ end
68
+
69
+ describe "determining the status" do
70
+ subject { described_class.new('foo', '/moduledir', :svn => 'https://github.com/adrienthebo/r10k-fixture-repo', :rev => 123) }
71
+
72
+ let(:working_dir) { double 'working_dir' }
73
+
74
+ before do
75
+ allow(R10K::SVN::WorkingDir).to receive(:new).and_return working_dir
76
+ end
77
+
78
+ it "is :absent if the module directory is absent" do
79
+ allow(subject).to receive(:exist?).and_return false
80
+
81
+ expect(subject.status).to eq :absent
82
+ end
83
+
84
+ it "is :mismatched if the directory is present but not an SVN repo" do
85
+ allow(subject).to receive(:exist?).and_return true
86
+
87
+ allow(working_dir).to receive(:is_svn?).and_return false
88
+
89
+ expect(subject.status).to eq :mismatched
90
+ end
91
+
92
+ it "is mismatched when the wrong SVN URL is checked out" do
93
+ allow(subject).to receive(:exist?).and_return true
94
+
95
+ allow(working_dir).to receive(:is_svn?).and_return true
96
+ allow(working_dir).to receive(:url).and_return 'svn://nope/trunk'
97
+
98
+ expect(subject.status).to eq :mismatched
99
+ end
100
+
101
+ it "is :outdated when the expected rev doesn't match the actual rev" do
102
+ allow(subject).to receive(:exist?).and_return true
103
+
104
+ allow(working_dir).to receive(:is_svn?).and_return true
105
+ allow(working_dir).to receive(:url).and_return 'https://github.com/adrienthebo/r10k-fixture-repo'
106
+ allow(working_dir).to receive(:revision).and_return 99
107
+
108
+ expect(subject.status).to eq :outdated
109
+ end
110
+
111
+ it "is :insync if all other conditions are satisfied" do
112
+ allow(subject).to receive(:exist?).and_return true
113
+
114
+ allow(working_dir).to receive(:is_svn?).and_return true
115
+ allow(working_dir).to receive(:url).and_return 'https://github.com/adrienthebo/r10k-fixture-repo'
116
+ allow(working_dir).to receive(:revision).and_return 123
117
+
118
+ expect(subject.status).to eq :insync
119
+ end
120
+ end
121
+
122
+ describe "synchronizing" do
123
+
124
+ subject { described_class.new('foo', '/moduledir', :svn => 'https://github.com/adrienthebo/r10k-fixture-repo', :rev => 123) }
125
+
126
+ before do
127
+ allow(File).to receive(:directory?).with('/moduledir').and_return true
128
+ end
129
+
130
+ describe "and the state is :absent" do
131
+ before { allow(subject).to receive(:status).and_return :absent }
132
+
133
+ it "installs the SVN module" do
134
+ expect(subject).to receive(:install)
135
+ subject.sync
136
+ end
137
+ end
138
+
139
+ describe "and the state is :mismatched" do
140
+ before { allow(subject).to receive(:status).and_return :mismatched }
141
+
142
+ it "reinstalls the module" do
143
+ expect(subject).to receive(:reinstall)
144
+
145
+ subject.sync
146
+ end
147
+
148
+ it "removes the existing directory" do
149
+ expect(subject.path).to receive(:rmtree)
150
+ allow(subject).to receive(:install)
151
+
152
+ subject.sync
153
+ end
154
+ end
155
+
156
+ describe "and the state is :outdated" do
157
+ before { allow(subject).to receive(:status).and_return :outdated }
158
+
159
+ it "upgrades the repository" do
160
+ expect(subject).to receive(:update)
161
+
162
+ subject.sync
163
+ end
164
+ end
165
+
166
+ describe "and the state is :insync" do
167
+ before { allow(subject).to receive(:status).and_return :insync }
168
+
169
+ it "doesn't change anything" do
170
+ expect(subject).to receive(:install).never
171
+ expect(subject).to receive(:reinstall).never
172
+ expect(subject).to receive(:update).never
173
+
174
+ subject.sync
175
+ end
176
+ end
177
+ end
178
+ end