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,111 @@
1
+ require 'r10k/git'
2
+ require 'r10k/git/alternates'
3
+ require 'r10k/git/shellgit/base_repository'
4
+
5
+ # Manage a non-bare Git repository
6
+ class R10K::Git::ShellGit::WorkingRepository < R10K::Git::ShellGit::BaseRepository
7
+
8
+ # @attribute [r] path
9
+ # @return [Pathname]
10
+ attr_reader :path
11
+
12
+ # @return [Pathname] The path to the Git directory inside of this repository
13
+ def git_dir
14
+ @path + '.git'
15
+ end
16
+
17
+ def initialize(basedir, dirname)
18
+ @path = Pathname.new(File.join(basedir, dirname))
19
+ end
20
+
21
+ # Clone this git repository
22
+ #
23
+ # @param remote [String] The Git remote to clone
24
+ # @param opts [Hash]
25
+ #
26
+ # @options opts [String] :ref The git ref to check out on clone
27
+ # @options opts [String] :reference A Git repository to use as an alternate object database
28
+ #
29
+ # @return [void]
30
+ def clone(remote, opts = {})
31
+ argv = ['clone', remote, @path.to_s]
32
+ if opts[:reference]
33
+ argv += ['--reference', opts[:reference]]
34
+ end
35
+
36
+ proxy = R10K::Git.get_proxy_for_remote(remote)
37
+
38
+ R10K::Git.with_proxy(proxy) do
39
+ git argv
40
+ end
41
+
42
+ if opts[:ref]
43
+ checkout(opts[:ref])
44
+ end
45
+ end
46
+
47
+ # Check out the given Git ref
48
+ #
49
+ # @param ref [String] The git reference to check out
50
+ # @param opts [Hash] Optional hash of additional options.
51
+ def checkout(ref, opts = {})
52
+ argv = ['checkout', ref]
53
+
54
+ # :force defaults to true
55
+ if !opts.has_key?(:force) || opts[:force]
56
+ argv << '--force'
57
+ end
58
+
59
+ git argv, :path => @path.to_s
60
+ end
61
+
62
+ def fetch(remote_name='origin')
63
+ remote = remotes[remote_name]
64
+ proxy = R10K::Git.get_proxy_for_remote(remote)
65
+
66
+ R10K::Git.with_proxy(proxy) do
67
+ git ['fetch', remote_name, '--prune'], :path => @path.to_s
68
+ end
69
+ end
70
+
71
+ def exist?
72
+ @path.exist?
73
+ end
74
+
75
+ # @return [String] The currently checked out ref
76
+ def head
77
+ resolve('HEAD')
78
+ end
79
+
80
+ def alternates
81
+ R10K::Git::Alternates.new(git_dir)
82
+ end
83
+
84
+ # @return [String] The origin remote URL
85
+ def origin
86
+ result = git(['config', '--get', 'remote.origin.url'], :path => @path.to_s, :raise_on_fail => false)
87
+ if result.success?
88
+ result.stdout
89
+ end
90
+ end
91
+
92
+ # does the working tree have local modifications to tracked files?
93
+ def dirty?
94
+ result = git(['diff-index', '--exit-code', '--name-only', 'HEAD'], :path => @path.to_s, :raise_on_fail => false)
95
+
96
+ if result.exit_code != 0
97
+ dirty_files = result.stdout.split('\n')
98
+
99
+ dirty_files.each do |file|
100
+ logger.debug(_("Found local modifications in %{file_path}" % {file_path: File.join(@path, file)}))
101
+
102
+ # Do this in a block so that the extra subprocess only gets invoked when needed.
103
+ logger.debug1 { git(['diff-index', '-p', 'HEAD', file], :path => @path.to_s, :raise_on_fail => false).stdout }
104
+ end
105
+
106
+ return true
107
+ else
108
+ return false
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,95 @@
1
+ require 'r10k/git'
2
+ require 'r10k/git/errors'
3
+ require 'forwardable'
4
+ require 'r10k/logging'
5
+
6
+ # Manage how Git repositories are created and set to specific refs
7
+ class R10K::Git::StatefulRepository
8
+
9
+ include R10K::Logging
10
+
11
+ # @!attribute [r] repo
12
+ # @api private
13
+ attr_reader :repo
14
+
15
+ extend Forwardable
16
+ def_delegators :@repo, :head, :tracked_paths
17
+
18
+ # Create a new shallow git working directory
19
+ #
20
+ # @param remote [String] The git remote to use for the repo
21
+ # @param basedir [String] The path containing the Git repo
22
+ # @param dirname [String] The directory name of the Git repo
23
+ def initialize(remote, basedir, dirname)
24
+ @remote = remote
25
+ @cache = R10K::Git.cache.generate(@remote)
26
+ @repo = R10K::Git.thin_repository.new(basedir, dirname, @cache)
27
+ end
28
+
29
+ def resolve(ref)
30
+ @cache.sync if sync_cache?(ref)
31
+ @cache.resolve(ref)
32
+ end
33
+
34
+ def sync(ref, force=true)
35
+ @cache.sync if sync_cache?(ref)
36
+
37
+ sha = @cache.resolve(ref)
38
+
39
+ if sha.nil?
40
+ raise R10K::Git::UnresolvableRefError.new(_("Unable to sync repo to unresolvable ref '%{ref}'") % {ref: ref}, :git_dir => @repo.git_dir)
41
+ end
42
+
43
+ workdir_status = status(ref)
44
+
45
+ case workdir_status
46
+ when :absent
47
+ logger.debug(_("Cloning %{repo_path} and checking out %{ref}") % {repo_path: @repo.path, ref: ref })
48
+ @repo.clone(@remote, {:ref => sha})
49
+ when :mismatched
50
+ logger.debug(_("Replacing %{repo_path} and checking out %{ref}") % {repo_path: @repo.path, ref: ref })
51
+ @repo.path.rmtree
52
+ @repo.clone(@remote, {:ref => sha})
53
+ when :outdated
54
+ logger.debug(_("Updating %{repo_path} to %{ref}") % {repo_path: @repo.path, ref: ref })
55
+ @repo.checkout(sha, {:force => force})
56
+ when :dirty
57
+ if force
58
+ logger.warn(_("Overwriting local modifications to %{repo_path}") % {repo_path: @repo.path})
59
+ logger.debug(_("Updating %{repo_path} to %{ref}") % {repo_path: @repo.path, ref: ref })
60
+ @repo.checkout(sha, {:force => force})
61
+ else
62
+ logger.warn(_("Skipping %{repo_path} due to local modifications") % {repo_path: @repo.path})
63
+ end
64
+ else
65
+ logger.debug(_("%{repo_path} is already at Git ref %{ref}") % {repo_path: @repo.path, ref: ref })
66
+ end
67
+ end
68
+
69
+ def status(ref)
70
+ if !@repo.exist?
71
+ :absent
72
+ elsif !@repo.git_dir.exist?
73
+ :mismatched
74
+ elsif !@repo.git_dir.directory?
75
+ :mismatched
76
+ elsif !(@repo.origin == @remote)
77
+ :mismatched
78
+ elsif @repo.dirty?
79
+ :dirty
80
+ elsif !(@repo.head == @cache.resolve(ref))
81
+ :outdated
82
+ elsif @cache.ref_type(ref) == :branch && !@cache.synced?
83
+ :outdated
84
+ else
85
+ :insync
86
+ end
87
+ end
88
+
89
+ # @api private
90
+ def sync_cache?(ref)
91
+ return true if !@cache.exist?
92
+ return true if !([:commit, :tag].include? @cache.ref_type(ref))
93
+ return false
94
+ end
95
+ end
@@ -0,0 +1,67 @@
1
+ require 'r10k/logging'
2
+
3
+ require 'r10k/git'
4
+ require 'r10k/git/cache'
5
+
6
+ require 'r10k/forge/module_release'
7
+
8
+ module R10K
9
+ module Initializers
10
+ class BaseInitializer
11
+
12
+ include R10K::Logging
13
+
14
+ def initialize(settings)
15
+ @settings = settings
16
+ end
17
+
18
+ private
19
+
20
+ def with_setting(key)
21
+ if !@settings[key].nil?
22
+ yield @settings[key]
23
+ end
24
+ end
25
+ end
26
+
27
+ class GlobalInitializer < BaseInitializer
28
+ def call
29
+ with_setting(:purgedirs) do |_|
30
+ logger.warn(_("the purgedirs key in r10k.yaml is deprecated. it is currently ignored."))
31
+ end
32
+
33
+ with_setting(:deploy) { |value| DeployInitializer.new(value).call }
34
+
35
+ with_setting(:cachedir) { |value| R10K::Git::Cache.settings[:cache_root] = value }
36
+ with_setting(:cachedir) { |value| R10K::Forge::ModuleRelease.settings[:cache_root] = value }
37
+ with_setting(:pool_size) { |value| R10K::Puppetfile.settings[:pool_size] = value }
38
+
39
+ with_setting(:git) { |value| GitInitializer.new(value).call }
40
+ with_setting(:forge) { |value| ForgeInitializer.new(value).call }
41
+ end
42
+ end
43
+
44
+ class DeployInitializer < BaseInitializer
45
+ def call
46
+ with_setting(:puppet_path) { |value| R10K::Settings.puppet_path = value }
47
+ end
48
+ end
49
+
50
+ class GitInitializer < BaseInitializer
51
+ def call
52
+ with_setting(:provider) { |value| R10K::Git.provider = value }
53
+ with_setting(:username) { |value| R10K::Git.settings[:username] = value }
54
+ with_setting(:private_key) { |value| R10K::Git.settings[:private_key] = value }
55
+ with_setting(:proxy) { |value| R10K::Git.settings[:proxy] = value }
56
+ with_setting(:repositories) { |value| R10K::Git.settings[:repositories] = value }
57
+ end
58
+ end
59
+
60
+ class ForgeInitializer < BaseInitializer
61
+ def call
62
+ with_setting(:baseurl) { |value| PuppetForge.host = value }
63
+ with_setting(:proxy) { |value| PuppetForge::Connection.proxy = value }
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,32 @@
1
+ module R10K
2
+
3
+ # This class implements a generic object memoization container. It caches
4
+ # new objects and returns cached objects based on the instantiation arguments.
5
+ class InstanceCache
6
+
7
+ # Initialize a new registry with a given class
8
+ #
9
+ # @param klass [Class] The class to memoize
10
+ # @param method [Symbol] The method name to use when creating objects.
11
+ # Defaults to :new.
12
+ def initialize(klass, method = :new)
13
+ @klass = klass
14
+ @method = method
15
+ @instances = {}
16
+ end
17
+
18
+ # Create a new object, or return a memoized object.
19
+ #
20
+ # @param args [*Object] The arguments to pass to the initialize method
21
+ #
22
+ # @return [Object] A memoized instance of the registered class
23
+ def generate(*args)
24
+ @instances[args] ||= @klass.send(@method, *args)
25
+ end
26
+
27
+ # Clear all memoized objects
28
+ def clear!
29
+ @instances = {}
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ module R10K
2
+
3
+ # This implements a factory by storing classes indexed with a given key and
4
+ # creates objects based on that key.
5
+ class KeyedFactory
6
+
7
+ # @!attribute [r] implementations
8
+ # @return [Hash<Object, Class>] A hash of keys and the associated
9
+ # implementations that this factory can generate.
10
+ attr_reader :implementations
11
+
12
+ def initialize
13
+ @implementations = {}
14
+ end
15
+
16
+ def register(key, klass)
17
+ if @implementations.has_key?(key)
18
+ raise DuplicateImplementationError, _("Class already registered for %{key}") % {key: key}
19
+ else
20
+ @implementations[key] = klass
21
+ end
22
+ end
23
+
24
+ def retrieve(key)
25
+ @implementations[key]
26
+ end
27
+
28
+ def generate(key, *args)
29
+ if (impl = @implementations[key])
30
+ impl.new(*args)
31
+ else
32
+ raise UnknownImplementationError, _("No class registered for %{key}") % {key: key}
33
+ end
34
+ end
35
+
36
+ class DuplicateImplementationError < StandardError; end
37
+ class UnknownImplementationError < StandardError; end
38
+ end
39
+ end
@@ -0,0 +1,109 @@
1
+ require 'r10k'
2
+ require 'forwardable'
3
+
4
+ require 'log4r'
5
+ require 'log4r/configurator'
6
+ require 'r10k/logging/terminaloutputter'
7
+
8
+ module R10K::Logging
9
+
10
+ LOG_LEVELS = %w{DEBUG2 DEBUG1 DEBUG INFO NOTICE WARN ERROR FATAL}
11
+
12
+ def logger_name
13
+ self.class.to_s
14
+ end
15
+
16
+ def logger
17
+ if @logger.nil?
18
+ name = logger_name
19
+ if Log4r::Logger[name]
20
+ @logger = Log4r::Logger[name]
21
+ else
22
+ @logger = Log4r::Logger.new(name)
23
+ @logger.add(R10K::Logging.outputter)
24
+ end
25
+ end
26
+ @logger
27
+ end
28
+
29
+ class << self
30
+
31
+ # Convert the input to a valid Log4r log level
32
+ #
33
+ # @param input [String, TrueClass] The level to parse. If TrueClass then
34
+ # Log4r::INFO will be returned (indicating a generic raised verbosity),
35
+ # if a string it will be parsed either as a numeric value or a textual
36
+ # log level.
37
+ # @api private
38
+ # @return [Integer, NilClass] The numeric log level, or nil if the log
39
+ # level is invalid.
40
+ def parse_level(input)
41
+ case input
42
+ when TrueClass
43
+ Log4r::INFO
44
+ when /\A\d+\Z/
45
+ Integer(input)
46
+ when String
47
+ const_name = input.upcase
48
+ if LOG_LEVELS.include?(const_name)
49
+ begin
50
+ Log4r.const_get(const_name.to_sym)
51
+ rescue NameError
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def level=(val)
58
+ level = parse_level(val)
59
+ if level.nil?
60
+ raise ArgumentError, _("Invalid log level '%{val}'. Valid levels are %{log_levels}") % {val: val, log_levels: LOG_LEVELS.map(&:downcase).inspect}
61
+ end
62
+ outputter.level = level
63
+ @level = level
64
+
65
+ if level < Log4r::INFO
66
+ outputter.formatter = debug_formatter
67
+ else
68
+ outputter.formatter = default_formatter
69
+ end
70
+ end
71
+
72
+ extend Forwardable
73
+ def_delegators :@outputter, :use_color, :use_color=
74
+
75
+ # @!attribute [r] level
76
+ # @return [Integer] The current log level. Lower numbers correspond
77
+ # to more verbose log levels.
78
+ attr_reader :level
79
+
80
+ # @!attribute [r] formatter
81
+ # @api private
82
+ # @return [Log4r::Formatter]
83
+ attr_reader :formatter
84
+
85
+ # @!attribute [r] outputter
86
+ # @api private
87
+ # @return [Log4r::Outputter]
88
+ attr_reader :outputter
89
+
90
+ def default_formatter
91
+ Log4r::PatternFormatter.new(:pattern => '%l\t -> %m')
92
+ end
93
+
94
+ def debug_formatter
95
+ Log4r::PatternFormatter.new(:pattern => '[%d - %l] %m')
96
+ end
97
+
98
+ def default_outputter
99
+ R10K::Logging::TerminalOutputter.new('terminal', $stderr, :level => self.level, :formatter => formatter)
100
+ end
101
+ end
102
+
103
+ Log4r::Configurator.custom_levels(*LOG_LEVELS)
104
+ Log4r::Logger.global.level = Log4r::ALL
105
+
106
+ @level = Log4r::WARN
107
+ @formatter = default_formatter
108
+ @outputter = default_outputter
109
+ end