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,50 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require 'r10k/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "r10k"
8
+ s.version = R10K::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+
11
+ s.authors = "Adrien Thebo"
12
+ s.email = "adrien@somethingsinistral.net"
13
+ s.homepage = "https://github.com/puppetlabs/r10k"
14
+ s.summary = "Puppet environment and module deployment"
15
+ s.description = <<-DESCRIPTION
16
+ R10K provides a general purpose toolset for deploying Puppet environments and modules.
17
+ It implements the Puppetfile format and provides a native implementation of Puppet
18
+ dynamic environments.
19
+ DESCRIPTION
20
+
21
+ s.required_ruby_version = '>= 2.3.0'
22
+
23
+ s.license = 'Apache-2.0'
24
+
25
+ s.add_dependency 'colored2', '3.1.2'
26
+ s.add_dependency 'cri', ['>= 2.15.10', '< 3.0.0']
27
+
28
+ s.add_dependency 'log4r', '1.1.10'
29
+ s.add_dependency 'multi_json', '~> 1.10'
30
+
31
+ s.add_dependency 'puppet_forge', '~> 2.3.0'
32
+
33
+ s.add_dependency 'gettext-setup', '~>0.24'
34
+ # These two pins narrow what is allowed by gettext-setup,
35
+ # to preserver compatability with Ruby 2.4
36
+ s.add_dependency 'fast_gettext', '~> 1.1.0'
37
+ s.add_dependency 'gettext', ['>= 3.0.2', '< 3.3.0']
38
+
39
+ s.add_development_dependency 'rspec', '~> 3.1'
40
+
41
+ s.add_development_dependency 'rake'
42
+
43
+ s.add_development_dependency 'yard', '~> 0.9.11'
44
+ s.add_development_dependency 'minitar', '~> 0.9.0'
45
+
46
+ s.files = %x[git ls-files].split($/)
47
+ s.require_path = 'lib'
48
+ s.bindir = 'bin'
49
+ s.executables = 'r10k'
50
+ end
@@ -0,0 +1,112 @@
1
+ ---
2
+ # This example configuration details the most commonly used configuration
3
+ # options for the `r10k deploy` command.
4
+ #
5
+
6
+ # The 'cachedir' setting controls where cached content, such as mirrored Git
7
+ # repositories, are stored on the local machine. This location should be
8
+ # persistent, as environments and modules may rely on these files in order to
9
+ # be updated.
10
+ #
11
+ # The default value is "~/.r10k"
12
+ #cachedir: '/var/cache/r10k'
13
+
14
+ # The 'proxy' setting configures an HTTP proxy to use for all HTTP/HTTPS
15
+ # operations performed by r10k. This includes requests to the Puppet Forge
16
+ # as well as any Git operations performed against an HTTP/HTTPS remote.
17
+ # You can also configure specific proxies for only Git or Forge operations
18
+ # using settings below. Authenticated proxies can be configured by providing
19
+ # credentials in the URL, e.g. 'https://username:password@proxy.example.com:8888'
20
+ #proxy: 'https://proxy.example.com:8888'
21
+
22
+ # The 'sources' setting determines what repositories r10k will use when creating
23
+ # Puppet environments.
24
+ sources:
25
+ # Each source should have a unique name, and preferrably should only use
26
+ # alphanumeric characters and underscores.
27
+ #operations:
28
+ # The 'remote' setting determines the location of the VCS repository used
29
+ # for creating environments.
30
+ #remote: 'git@github.com:my-org/org-operations-modules'
31
+
32
+ # The 'basedir' setting specifies where environments will be created for
33
+ # this source. This setting should match the Puppet 'environmentpath'
34
+ # setting in puppet.conf.
35
+ #
36
+ # See http://docs.puppetlabs.com/references/latest/configuration.html#environmentpath
37
+ # for more information about the Puppet 'environmentpath' setting.
38
+ #basedir: '/etc/puppetlabs/puppet/environments'
39
+
40
+ # The Puppetfile filename in the repo, defaults to 'Puppetfile'. This
41
+ # setting can be used, to allow custom Puppetfile names to allow hybrid
42
+ # use of librarian-puppet (transitive dependency resolution) and r10k
43
+ # (code management on the server).
44
+ #puppetfile_name: 'Puppetfile.r10k'
45
+
46
+ # One or more sources can be specified; each source is simple another entry
47
+ # in the sources map.
48
+ #qa:
49
+ #remote: 'git@github.com:my-org/org-qa-modules'
50
+
51
+ # Multiple sources can have the same 'basedir' setting, in case there is a
52
+ # reason to push different sets of environments to the same Puppet master.
53
+ # If two different sources have the same basedir care should be exercised
54
+ # to make sure that two sources don't try create multiple environments with
55
+ # the same name. See the 'prefix' setting for more information.
56
+ #basedir: '/etc/puppetlabs/puppet/environments'
57
+
58
+ # Sources can use the 'prefix' setting to avoid collisions between multiple
59
+ # sources being created in the same directory. Setting prefix to true
60
+ # prepends the source name and an underscore to each environment, so for
61
+ # the qa source the "production" branch will create the "qa_production"
62
+ # branch.
63
+ #
64
+ # The default value is 'false'.
65
+ #prefix: true
66
+
67
+ # Additional configuration can be supplied to configure how r10k uses Git
68
+ # and what version of Git it uses.
69
+ git:
70
+
71
+ # As of 1.5.0 r10k can interact with Git repositories in two ways - by
72
+ # shelling out to the 'git' executable, and by using libgit2 through the
73
+ # 'rugged' library.
74
+ #provider: 'shellgit' # Either 'shellgit' or 'rugged', defaults to 'shellgit'
75
+
76
+ # The 'private_key' setting sets the the SSH private key to use for remote
77
+ # Git repositories accessed over SSH.
78
+ #
79
+ # The 'private_key' setting is only used by the 'rugged' Git provider.
80
+ #private_key: '/root/.ssh/id_rsa'
81
+
82
+ # The 'username' setting sets the SSH username for remote Git repositories
83
+ # when a username is not provided in the URL. The username defaults to the
84
+ # current user.
85
+ #
86
+ # The 'username' setting is only used by the 'rugged' Git provider.
87
+ #username: 'git'
88
+
89
+ # The 'proxy' setting configures an HTTP proxy to use for all Git sources
90
+ # that have an HTTP/HTTPS remote URL. This can be overridden on a
91
+ # per-repository basis using the 'repositories' setting below.
92
+ #proxy: 'https://proxy.example.com:8888'
93
+
94
+ # The 'repositories' setting allows other git related settings to be
95
+ # configured for each remote repository individually. The value of
96
+ # this setting should be a list of repositories with a 'remote' key
97
+ # to identify the specific repository to be configured.
98
+ #repositories:
99
+ # - remote: "ssh://tessier-ashpool.freeside/protected-repo.git"
100
+ # private_key: "/etc/puppetlabs/r10k/ssh/id_rsa-protected-repo-deploy-key"
101
+ # proxy: 'https://proxy.example.com:8888'
102
+
103
+ # Configuration options for downloading modules from the Puppet Forge
104
+ forge:
105
+ # The 'proxy' setting specifies an optional HTTP proxy to use when making
106
+ # requests to the Puppet Forge. This will override the top level 'proxy'
107
+ # option or any proxy related environment variables when configured.
108
+ #proxy: 'https://proxy.example.com:8888'
109
+
110
+ # The 'baseurl' setting indicates where Forge modules should be installed
111
+ # from. This defaults to 'https://forgeapi.puppetlabs.com'
112
+ #baseurl: 'https://forgemirror.example.com'
File without changes
@@ -0,0 +1,8 @@
1
+ name 'branan-eight_hundred'
2
+ version '8.0.0'
3
+ source 'https://github.com/branan/puppet-module-eight_hundred'
4
+ author 'Branan Purvine-Riley'
5
+ license 'Apache License 2.0'
6
+ summary '800 modules! WOOOOOOO!'
7
+ description '800 modules! WOOOOOOOOOOOOOOOOOO!'
8
+ project_page 'https://github.com/branan/puppet-module-eight_hundred'
@@ -0,0 +1,19 @@
1
+ {
2
+ "checksums": {
3
+ "Modulefile": "1e780d794bcd6629dc3006129fc02edf"
4
+ },
5
+ "license": "Apache License 2.0",
6
+ "types": [
7
+
8
+ ],
9
+ "version": "8.0.0",
10
+ "dependencies": [
11
+
12
+ ],
13
+ "summary": "800 modules! WOOOOOOO!",
14
+ "source": "https://github.com/branan/puppet-module-eight_hundred",
15
+ "description": "800 modules! WOOOOOOOOOOOOOOOOOO!",
16
+ "author": "Branan Purvine-Riley",
17
+ "name": "branan-eight_hundred",
18
+ "project_page": "https://github.com/branan/puppet-module-eight_hundred"
19
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ cachedir: /config_cachedir
3
+ deploy:
4
+ generate_types: /config_generate_types
5
+ puppet_path: /config_puppet_path
@@ -0,0 +1,2 @@
1
+ ---
2
+ cachedir: /config_cachedir
@@ -0,0 +1,3 @@
1
+ ---
2
+ deploy:
3
+ generate_types: /config_generate_types
@@ -0,0 +1,3 @@
1
+ ---
2
+ deploy:
3
+ puppet_path: /config_puppet_path
@@ -0,0 +1 @@
1
+ mod 'branan/eight_hundred', '1.0.0', :git => 'https://github.com/branan/eight_hundred', :ref => 'master'
@@ -0,0 +1,5 @@
1
+ mod 'cd4pe',
2
+ :git => 'test@randomurl.com:something/some_module.git',
3
+ :ref => 'expected_ref',
4
+ :default_branch => 'here_lies_the_default_branch'
5
+
@@ -0,0 +1,10 @@
1
+ forge "http://forge.puppetlabs.com"
2
+
3
+ mod "puppetlabs/stdlib", '4.11.0'
4
+ mod "puppetlabs/stdlib", '4.12.0'
5
+ mod "puppetlabs/concat", '2.1.0'
6
+ mod "otheruser/concat", '2.1.0'
7
+
8
+ mod 'apache',
9
+ :git => 'https://github.com/puppetlabs/puppetlabs-apache',
10
+ :branch => 'docs_experiment'
@@ -0,0 +1 @@
1
+ mod 'branan/eight_hundred' :git => 'https://github.com/branan/eight_hundred'
@@ -0,0 +1 @@
1
+ require 'a-shrubbery!'
@@ -0,0 +1 @@
1
+ mod 'branan/eight_hundred', undefined_lookup_function('eight_hundred')
@@ -0,0 +1 @@
1
+ mod 'puppetlabs/apt', '2.1.1'
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ echo "This was supposed to be non-executable..."
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/rugged/bare_repository'
3
+
4
+ describe R10K::Git::Rugged::BareRepository, :if => R10K::Features.available?(:rugged) do
5
+ include_context 'Git integration'
6
+
7
+ let(:dirname) { 'bare-repo.git' }
8
+
9
+ subject { described_class.new(basedir, dirname) }
10
+
11
+ it_behaves_like 'a git repository'
12
+ it_behaves_like 'a git bare repository'
13
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/rugged/thin_repository'
3
+
4
+ describe R10K::Git::Rugged::ThinRepository, :if => R10K::Features.available?(:rugged) do
5
+ include_context 'Git integration'
6
+
7
+ let(:dirname) { 'working-repo' }
8
+
9
+ let(:cacherepo) { R10K::Git::Rugged::Cache.generate(remote) }
10
+
11
+ subject { described_class.new(basedir, dirname, cacherepo) }
12
+
13
+ it_behaves_like "a git thin repository"
14
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/rugged/working_repository'
3
+
4
+ describe R10K::Git::Rugged::WorkingRepository, :if => R10K::Features.available?(:rugged) do
5
+ include_context 'Git integration'
6
+
7
+ let(:dirname) { 'working-repo' }
8
+
9
+ subject { described_class.new(basedir, dirname) }
10
+
11
+ it_behaves_like 'a git repository'
12
+ it_behaves_like 'a git working repository'
13
+
14
+ describe "checking out an unresolvable ref" do
15
+ it "raises an error indicating that the ref was unresolvable" do
16
+ expect(subject).to receive(:resolve).with("unresolvable")
17
+ expect {
18
+ subject.checkout("unresolvable")
19
+ }.to raise_error(R10K::Git::GitError, /Unable to check out unresolvable ref 'unresolvable'/)
20
+ end
21
+ end
22
+
23
+ context "checking out a specific SHA" do
24
+ let(:_rugged_repo) { double("Repository") }
25
+
26
+ before do
27
+ subject.clone(remote)
28
+ allow(subject).to receive(:with_repo).and_yield(_rugged_repo)
29
+ allow(subject).to receive(:resolve).and_return("157011a4eaa27f1202a9d94335ee4876b26d377e")
30
+ end
31
+
32
+ describe "with force" do
33
+ it "does not receive a checkout call" do
34
+ expect(_rugged_repo).to_not receive(:checkout)
35
+ expect(_rugged_repo).to receive(:reset)
36
+ subject.checkout("157011a4eaa27f1202a9d94335ee4876b26d377e", {:force => true})
37
+ end
38
+ end
39
+
40
+ describe "without force" do
41
+ it "does receive a checkout call" do
42
+ expect(_rugged_repo).to receive(:checkout)
43
+ expect(_rugged_repo).to_not receive(:reset)
44
+ subject.checkout("157011a4eaa27f1202a9d94335ee4876b26d377e", {:force => false})
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/shellgit/bare_repository'
3
+
4
+ describe R10K::Git::ShellGit::BareRepository do
5
+ include_context 'Git integration'
6
+
7
+ let(:dirname) { 'bare-repo.git' }
8
+
9
+ subject { described_class.new(basedir, dirname) }
10
+
11
+ it_behaves_like 'a git repository'
12
+ it_behaves_like 'a git bare repository'
13
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/shellgit/thin_repository'
3
+
4
+ describe R10K::Git::ShellGit::ThinRepository do
5
+ include_context 'Git integration'
6
+
7
+ let(:dirname) { 'working-repo' }
8
+
9
+ let(:cacherepo) { R10K::Git::ShellGit::Cache.generate(remote) }
10
+
11
+ subject { described_class.new(basedir, dirname, cacherepo) }
12
+
13
+ it_behaves_like "a git thin repository"
14
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git/shellgit/working_repository'
3
+
4
+ describe R10K::Git::ShellGit::WorkingRepository do
5
+ include_context 'Git integration'
6
+
7
+ let(:dirname) { 'working-repo' }
8
+
9
+ subject { described_class.new(basedir, dirname) }
10
+
11
+ it_behaves_like 'a git repository'
12
+ it_behaves_like 'a git working repository'
13
+ end
@@ -0,0 +1,159 @@
1
+ require 'spec_helper'
2
+ require 'r10k/git'
3
+ require 'r10k/git/stateful_repository'
4
+
5
+ describe R10K::Git::StatefulRepository do
6
+ include_context 'Git integration'
7
+
8
+ let(:dirname) { 'working-repo' }
9
+
10
+ let(:cacherepo) { R10K::Git.cache.generate(remote) }
11
+ let(:thinrepo) { R10K::Git.thin_repository.new(basedir, dirname, cacherepo) }
12
+ let(:ref) { '0.9.x' }
13
+
14
+ subject { described_class.new(remote, basedir, dirname) }
15
+
16
+ describe 'status' do
17
+ describe "when the directory does not exist" do
18
+ it "is absent" do
19
+ expect(subject.status(ref)).to eq :absent
20
+ end
21
+ end
22
+
23
+ describe "when the directory is not a git repository" do
24
+ it "is mismatched" do
25
+ thinrepo.path.mkdir
26
+ expect(subject.status(ref)).to eq :mismatched
27
+ end
28
+ end
29
+
30
+ describe "when the directory has a .git file" do
31
+ it "is mismatched" do
32
+ thinrepo.path.mkdir
33
+ File.open("#{thinrepo.path}/.git", "w") {}
34
+ expect(subject.status(ref)).to eq :mismatched
35
+ end
36
+ end
37
+
38
+ describe "when the repository doesn't match the desired remote" do
39
+ it "is mismatched" do
40
+ thinrepo.clone(remote, {:ref => '1.0.0'})
41
+ allow(subject.repo).to receive(:origin).and_return('http://some.site/repo.git')
42
+ expect(subject.status(ref)).to eq :mismatched
43
+ end
44
+ end
45
+
46
+ describe "when the wrong ref is checked out" do
47
+ it "is outdated" do
48
+ thinrepo.clone(remote, {:ref => '1.0.0'})
49
+ expect(subject.status(ref)).to eq :outdated
50
+ end
51
+ end
52
+
53
+ describe "when the ref is a branch and the cache is not synced" do
54
+ it "is outdated" do
55
+ thinrepo.clone(remote, {:ref => ref})
56
+ cacherepo.reset!
57
+ expect(subject.status(ref)).to eq :outdated
58
+ end
59
+ end
60
+
61
+ describe "when the ref can't be resolved" do
62
+ let(:ref) { '1.1.x' }
63
+
64
+ it "is outdated" do
65
+ thinrepo.clone(remote, {:ref => '0.9.x'})
66
+ expect(subject.status(ref)).to eq :outdated
67
+ end
68
+ end
69
+
70
+ describe "when the workdir has local modifications" do
71
+ it "is dirty when workdir is up to date" do
72
+ thinrepo.clone(remote, {:ref => ref})
73
+ File.open(File.join(thinrepo.path, 'README.markdown'), 'a') { |f| f.write('local modifications!') }
74
+
75
+ expect(subject.status(ref)).to eq :dirty
76
+ end
77
+
78
+ it "is dirty when workdir is not up to date" do
79
+ thinrepo.clone(remote, {:ref => '1.0.0'})
80
+ File.open(File.join(thinrepo.path, 'README.markdown'), 'a') { |f| f.write('local modifications!') }
81
+
82
+ expect(subject.status(ref)).to eq :dirty
83
+ end
84
+ end
85
+
86
+ describe "if the right ref is checked out" do
87
+ it "is insync" do
88
+ thinrepo.clone(remote, {:ref => ref})
89
+ expect(subject.status(ref)).to eq :insync
90
+ end
91
+ end
92
+ end
93
+
94
+ describe "syncing" do
95
+ describe "when the ref is unresolvable" do
96
+ let(:ref) { '1.1.x' }
97
+
98
+ it "raises an error" do
99
+ expect {
100
+ subject.sync(ref)
101
+ }.to raise_error(R10K::Git::UnresolvableRefError)
102
+ end
103
+ end
104
+
105
+ describe "when the repo is absent" do
106
+ it "creates the repo" do
107
+ subject.sync(ref)
108
+ expect(subject.status(ref)).to eq :insync
109
+ end
110
+ end
111
+
112
+ describe "when the repo is mismatched" do
113
+ it "removes and recreates the repo" do
114
+ thinrepo.path.mkdir
115
+ subject.sync(ref)
116
+ expect(subject.status(ref)).to eq :insync
117
+ end
118
+ end
119
+
120
+ describe "when the repo is out of date" do
121
+ it "updates the repository" do
122
+ thinrepo.clone(remote, {:ref => '1.0.0'})
123
+ subject.sync(ref)
124
+ expect(subject.status(ref)).to eq :insync
125
+ end
126
+ end
127
+
128
+ describe "when the workdir is dirty" do
129
+ before(:each) do
130
+ thinrepo.clone(remote, {:ref => ref})
131
+ File.open(File.join(thinrepo.path, 'README.markdown'), 'a') { |f| f.write('local modifications!') }
132
+ end
133
+
134
+ context "when force == true" do
135
+ let(:force) { true }
136
+
137
+ it "warns and overwrites local modifications" do
138
+ expect(subject.logger).to receive(:warn).with(/overwriting local modifications/i)
139
+
140
+ subject.sync(ref, force)
141
+
142
+ expect(subject.status(ref)).to eq :insync
143
+ end
144
+ end
145
+
146
+ context "when force != true" do
147
+ let(:force) { false }
148
+
149
+ it "warns and does not overwrite local modifications" do
150
+ expect(subject.logger).to receive(:warn).with(/skipping.*due to local modifications/i)
151
+
152
+ subject.sync(ref, force)
153
+
154
+ expect(subject.status(ref)).to eq :dirty
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end