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.
- checksums.yaml +7 -0
- data/.gitattributes +1 -0
- data/.github/pull_request_template.md +1 -0
- data/.github/workflows/docker.yml +56 -0
- data/.github/workflows/release.yml +36 -0
- data/.gitignore +9 -0
- data/.travis.yml +45 -0
- data/CHANGELOG.mkd +1759 -0
- data/CODEOWNERS +2 -0
- data/CONTRIBUTING.mkd +105 -0
- data/Gemfile +15 -0
- data/LICENSE +14 -0
- data/README.mkd +118 -0
- data/Rakefile +3 -0
- data/azure-pipelines.yml +86 -0
- data/bin/r10k +17 -0
- data/doc/common-patterns.mkd +44 -0
- data/doc/dynamic-environments.mkd +31 -0
- data/doc/dynamic-environments/configuration.mkd +669 -0
- data/doc/dynamic-environments/git-environments.mkd +75 -0
- data/doc/dynamic-environments/introduction.mkd +69 -0
- data/doc/dynamic-environments/master-configuration.mkd +40 -0
- data/doc/dynamic-environments/quickstart.mkd +201 -0
- data/doc/dynamic-environments/svn-environments.mkd +45 -0
- data/doc/dynamic-environments/usage.mkd +132 -0
- data/doc/dynamic-environments/workflow-guide.mkd +247 -0
- data/doc/faq.mkd +164 -0
- data/doc/git/cloning-and-mirroring.mkd +60 -0
- data/doc/git/providers.mkd +111 -0
- data/doc/puppetfile.mkd +309 -0
- data/doc/updating-your-puppetfile.mkd +38 -0
- data/docker/.gitignore +1 -0
- data/docker/.rspec +4 -0
- data/docker/Gemfile +11 -0
- data/docker/Makefile +89 -0
- data/docker/README.md +28 -0
- data/docker/r10k/Dockerfile +67 -0
- data/docker/r10k/adduser.sh +13 -0
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
- data/docker/r10k/docker-entrypoint.sh +11 -0
- data/docker/r10k/release.Dockerfile +54 -0
- data/docker/spec/dockerfile_spec.rb +43 -0
- data/docker/spec/fixtures/Puppetfile +2 -0
- data/integration/Gemfile +19 -0
- data/integration/README.mkd +29 -0
- data/integration/Rakefile +77 -0
- data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
- data/integration/files/README.mkd +4 -0
- data/integration/files/hiera.yaml +8 -0
- data/integration/files/modules/helloworld/manifests/init.pp +3 -0
- data/integration/files/modules/hieratest/manifests/init.pp +3 -0
- data/integration/files/modules/unicode/files/pretend_unicode +1 -0
- data/integration/files/modules/unicode/manifests/init.pp +6 -0
- data/integration/files/pre-suite/git_config.pp.erb +19 -0
- data/integration/files/pre-suite/prod_env.config +3 -0
- data/integration/files/r10k_conf.yaml.erb +9 -0
- data/integration/lib/README.mkd +4 -0
- data/integration/lib/git_utils.rb +205 -0
- data/integration/lib/master_manipulator.rb +205 -0
- data/integration/lib/r10k_utils.rb +222 -0
- data/integration/manifests/README.mkd +4 -0
- data/integration/pre-suite/00_pe_install.rb +6 -0
- data/integration/pre-suite/10_git_config.rb +48 -0
- data/integration/pre-suite/20_pe_r10k.rb +55 -0
- data/integration/pre-suite/README.mkd +5 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
- data/integration/tests/README.mkd +4 -0
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
- data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
- data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
- data/integration/tests/git_source/git_source_git.rb +128 -0
- data/integration/tests/git_source/git_source_ssh.rb +87 -0
- data/integration/tests/git_source/git_source_submodule.rb +70 -0
- data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
- data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
- data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
- data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
- data/integration/tests/purging/default_purging.rb +125 -0
- data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
- data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
- data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
- data/lib/r10k.rb +11 -0
- data/lib/r10k/action/base.rb +31 -0
- data/lib/r10k/action/cri_runner.rb +72 -0
- data/lib/r10k/action/deploy.rb +9 -0
- data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
- data/lib/r10k/action/deploy/display.rb +89 -0
- data/lib/r10k/action/deploy/environment.rb +196 -0
- data/lib/r10k/action/deploy/module.rb +84 -0
- data/lib/r10k/action/puppetfile.rb +10 -0
- data/lib/r10k/action/puppetfile/check.rb +31 -0
- data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
- data/lib/r10k/action/puppetfile/install.rb +45 -0
- data/lib/r10k/action/puppetfile/purge.rb +28 -0
- data/lib/r10k/action/runner.rb +96 -0
- data/lib/r10k/action/visitor.rb +31 -0
- data/lib/r10k/cli.rb +51 -0
- data/lib/r10k/cli/deploy.rb +114 -0
- data/lib/r10k/cli/ext/logging.rb +15 -0
- data/lib/r10k/cli/help.rb +7 -0
- data/lib/r10k/cli/puppetfile.rb +74 -0
- data/lib/r10k/cli/version.rb +31 -0
- data/lib/r10k/deployment.rb +132 -0
- data/lib/r10k/deployment/config.rb +56 -0
- data/lib/r10k/environment.rb +37 -0
- data/lib/r10k/environment/bare.rb +16 -0
- data/lib/r10k/environment/base.rb +150 -0
- data/lib/r10k/environment/git.rb +81 -0
- data/lib/r10k/environment/name.rb +86 -0
- data/lib/r10k/environment/svn.rb +91 -0
- data/lib/r10k/environment/with_modules.rb +139 -0
- data/lib/r10k/errors.rb +61 -0
- data/lib/r10k/errors/formatting.rb +28 -0
- data/lib/r10k/feature.rb +56 -0
- data/lib/r10k/feature/collection.rb +23 -0
- data/lib/r10k/features.rb +20 -0
- data/lib/r10k/forge/module_release.rb +228 -0
- data/lib/r10k/git.rb +196 -0
- data/lib/r10k/git/alternates.rb +63 -0
- data/lib/r10k/git/cache.rb +108 -0
- data/lib/r10k/git/errors.rb +34 -0
- data/lib/r10k/git/rugged.rb +17 -0
- data/lib/r10k/git/rugged/bare_repository.rb +85 -0
- data/lib/r10k/git/rugged/base_repository.rb +93 -0
- data/lib/r10k/git/rugged/cache.rb +11 -0
- data/lib/r10k/git/rugged/credentials.rb +91 -0
- data/lib/r10k/git/rugged/thin_repository.rb +89 -0
- data/lib/r10k/git/rugged/working_repository.rb +145 -0
- data/lib/r10k/git/shellgit.rb +9 -0
- data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
- data/lib/r10k/git/shellgit/base_repository.rb +137 -0
- data/lib/r10k/git/shellgit/cache.rb +11 -0
- data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
- data/lib/r10k/git/shellgit/working_repository.rb +111 -0
- data/lib/r10k/git/stateful_repository.rb +95 -0
- data/lib/r10k/initializers.rb +67 -0
- data/lib/r10k/instance_cache.rb +32 -0
- data/lib/r10k/keyed_factory.rb +39 -0
- data/lib/r10k/logging.rb +109 -0
- data/lib/r10k/logging/terminaloutputter.rb +36 -0
- data/lib/r10k/module.rb +38 -0
- data/lib/r10k/module/base.rb +113 -0
- data/lib/r10k/module/forge.rb +177 -0
- data/lib/r10k/module/git.rb +109 -0
- data/lib/r10k/module/local.rb +36 -0
- data/lib/r10k/module/metadata_file.rb +31 -0
- data/lib/r10k/module/svn.rb +112 -0
- data/lib/r10k/puppetfile.rb +286 -0
- data/lib/r10k/settings.rb +194 -0
- data/lib/r10k/settings/collection.rb +123 -0
- data/lib/r10k/settings/container.rb +97 -0
- data/lib/r10k/settings/definition.rb +124 -0
- data/lib/r10k/settings/enum_definition.rb +30 -0
- data/lib/r10k/settings/helpers.rb +38 -0
- data/lib/r10k/settings/list.rb +107 -0
- data/lib/r10k/settings/loader.rb +99 -0
- data/lib/r10k/settings/mixin.rb +54 -0
- data/lib/r10k/settings/uri_definition.rb +19 -0
- data/lib/r10k/source.rb +42 -0
- data/lib/r10k/source/base.rb +74 -0
- data/lib/r10k/source/exec.rb +51 -0
- data/lib/r10k/source/git.rb +142 -0
- data/lib/r10k/source/hash.rb +182 -0
- data/lib/r10k/source/svn.rb +136 -0
- data/lib/r10k/source/yaml.rb +20 -0
- data/lib/r10k/source/yamldir.rb +32 -0
- data/lib/r10k/svn.rb +6 -0
- data/lib/r10k/svn/remote.rb +68 -0
- data/lib/r10k/svn/working_dir.rb +125 -0
- data/lib/r10k/util/attempt.rb +84 -0
- data/lib/r10k/util/basedir.rb +65 -0
- data/lib/r10k/util/commands.rb +31 -0
- data/lib/r10k/util/exec_env.rb +36 -0
- data/lib/r10k/util/license.rb +24 -0
- data/lib/r10k/util/platform.rb +42 -0
- data/lib/r10k/util/purgeable.rb +88 -0
- data/lib/r10k/util/setopts.rb +55 -0
- data/lib/r10k/util/subprocess.rb +84 -0
- data/lib/r10k/util/subprocess/result.rb +56 -0
- data/lib/r10k/util/subprocess/runner.rb +26 -0
- data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
- data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
- data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
- data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
- data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
- data/lib/r10k/util/symbolize_keys.rb +35 -0
- data/lib/r10k/version.rb +6 -0
- data/locales/config.yaml +21 -0
- data/locales/r10k.pot +545 -0
- data/r10k.gemspec +50 -0
- data/r10k.yaml.example +112 -0
- data/spec/fixtures/empty/.empty +0 -0
- data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
- data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
- data/spec/fixtures/unit/action/r10k.yaml +5 -0
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
- data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
- data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
- data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
- data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
- data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
- data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
- data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
- data/spec/integration/git/stateful_repository_spec.rb +159 -0
- data/spec/matchers/exit_with.rb +28 -0
- data/spec/matchers/match_realpath.rb +18 -0
- data/spec/r10k-mocks.rb +3 -0
- data/spec/r10k-mocks/mock_config.rb +33 -0
- data/spec/r10k-mocks/mock_env.rb +15 -0
- data/spec/r10k-mocks/mock_source.rb +13 -0
- data/spec/shared-contexts/git-fixtures.rb +55 -0
- data/spec/shared-examples/deploy-actions.rb +69 -0
- data/spec/shared-examples/git-repository.rb +38 -0
- data/spec/shared-examples/git/bare_repository.rb +132 -0
- data/spec/shared-examples/git/thin_repository.rb +26 -0
- data/spec/shared-examples/git/working_repository.rb +207 -0
- data/spec/shared-examples/puppetfile-action.rb +39 -0
- data/spec/shared-examples/settings/ancestry.rb +44 -0
- data/spec/shared-examples/subprocess-runner.rb +83 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/unit/action/cri_runner_spec.rb +72 -0
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
- data/spec/unit/action/deploy/display_spec.rb +31 -0
- data/spec/unit/action/deploy/environment_spec.rb +395 -0
- data/spec/unit/action/deploy/module_spec.rb +139 -0
- data/spec/unit/action/puppetfile/check_spec.rb +41 -0
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
- data/spec/unit/action/puppetfile/install_spec.rb +84 -0
- data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
- data/spec/unit/action/runner_spec.rb +213 -0
- data/spec/unit/action/visitor_spec.rb +39 -0
- data/spec/unit/cli_spec.rb +9 -0
- data/spec/unit/deployment/config_spec.rb +33 -0
- data/spec/unit/deployment_spec.rb +162 -0
- data/spec/unit/environment/base_spec.rb +109 -0
- data/spec/unit/environment/git_spec.rb +97 -0
- data/spec/unit/environment/name_spec.rb +135 -0
- data/spec/unit/environment/svn_spec.rb +133 -0
- data/spec/unit/errors/formatting_spec.rb +84 -0
- data/spec/unit/feature_spec.rb +50 -0
- data/spec/unit/forge/module_release_spec.rb +213 -0
- data/spec/unit/git/alternates_spec.rb +116 -0
- data/spec/unit/git/cache_spec.rb +55 -0
- data/spec/unit/git/rugged/cache_spec.rb +29 -0
- data/spec/unit/git/rugged/credentials_spec.rb +109 -0
- data/spec/unit/git/shellgit/cache_spec.rb +27 -0
- data/spec/unit/git/stateful_repository_spec.rb +40 -0
- data/spec/unit/git_spec.rb +102 -0
- data/spec/unit/initializers_spec.rb +68 -0
- data/spec/unit/instance_cache_spec.rb +78 -0
- data/spec/unit/keyed_factory_spec.rb +51 -0
- data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
- data/spec/unit/logging_spec.rb +68 -0
- data/spec/unit/module/base_spec.rb +72 -0
- data/spec/unit/module/forge_spec.rb +207 -0
- data/spec/unit/module/git_spec.rb +274 -0
- data/spec/unit/module/metadata_file_spec.rb +68 -0
- data/spec/unit/module/svn_spec.rb +178 -0
- data/spec/unit/module_spec.rb +29 -0
- data/spec/unit/puppetfile_spec.rb +300 -0
- data/spec/unit/settings/collection_spec.rb +123 -0
- data/spec/unit/settings/container_spec.rb +92 -0
- data/spec/unit/settings/definition_spec.rb +79 -0
- data/spec/unit/settings/enum_definition_spec.rb +20 -0
- data/spec/unit/settings/inheritance_spec.rb +38 -0
- data/spec/unit/settings/list_spec.rb +88 -0
- data/spec/unit/settings/loader_spec.rb +110 -0
- data/spec/unit/settings/uri_definition_spec.rb +23 -0
- data/spec/unit/settings_spec.rb +246 -0
- data/spec/unit/source/base_spec.rb +31 -0
- data/spec/unit/source/exec_spec.rb +81 -0
- data/spec/unit/source/git_spec.rb +185 -0
- data/spec/unit/source/hash_spec.rb +54 -0
- data/spec/unit/source/svn_spec.rb +196 -0
- data/spec/unit/source/yaml_spec.rb +42 -0
- data/spec/unit/source_spec.rb +10 -0
- data/spec/unit/svn/remote_spec.rb +21 -0
- data/spec/unit/svn/working_dir_spec.rb +56 -0
- data/spec/unit/util/attempt_spec.rb +82 -0
- data/spec/unit/util/commands_spec.rb +61 -0
- data/spec/unit/util/exec_env_spec.rb +56 -0
- data/spec/unit/util/purgeable_spec.rb +230 -0
- data/spec/unit/util/setopts_spec.rb +59 -0
- data/spec/unit/util/subprocess/result_spec.rb +36 -0
- data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
- data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
- data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
- data/spec/unit/util/subprocess_spec.rb +65 -0
- data/spec/unit/util/symbolize_keys_spec.rb +67 -0
- metadata +582 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
class R10K::Source::Yaml < R10K::Source::Hash
|
|
2
|
+
R10K::Source.register(:yaml, self)
|
|
3
|
+
|
|
4
|
+
def initialize(name, basedir, options = {})
|
|
5
|
+
config = options[:config] || '/etc/puppetlabs/r10k/environments.yaml'
|
|
6
|
+
|
|
7
|
+
begin
|
|
8
|
+
contents = ::YAML.load_file(config)
|
|
9
|
+
rescue => e
|
|
10
|
+
raise ConfigError, _("Couldn't open environments file %{file}: %{err}") % {file: config, err: e.message}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Set the environments key for the parent class to consume
|
|
14
|
+
options[:environments] = contents
|
|
15
|
+
|
|
16
|
+
# All we need to do is supply options with the :environments hash.
|
|
17
|
+
# The R10K::Source::Hash parent class takes care of the rest.
|
|
18
|
+
super(name, basedir, options)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class R10K::Source::Yamldir < R10K::Source::Hash
|
|
2
|
+
R10K::Source.register(:yamldir, self)
|
|
3
|
+
|
|
4
|
+
def initialize(name, basedir, options = {})
|
|
5
|
+
config = options[:config] || '/etc/puppetlabs/r10k/environments.d'
|
|
6
|
+
|
|
7
|
+
unless File.directory?(config)
|
|
8
|
+
raise R10K::Deployment::Config::ConfigError, _("Error opening %{dir}: config must be a directory") % {dir: config}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
unless File.readable?(config)
|
|
12
|
+
raise R10K::Deployment::Config::ConfigError, _("Error opening %{dir}: permission denied") % {dir: config}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
environment_data = Dir.glob(File.join(config, '*.yaml')).reduce({}) do |memo,path|
|
|
16
|
+
name = File.basename(path, '.yaml')
|
|
17
|
+
begin
|
|
18
|
+
contents = ::YAML.load_file(path)
|
|
19
|
+
rescue => e
|
|
20
|
+
raise R10K::Deployment::Config::ConfigError, _("Error loading %{path}: %{err}") % {path: path, err: e.message}
|
|
21
|
+
end
|
|
22
|
+
memo.merge({name => contents })
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Set the environments key for the parent class to consume
|
|
26
|
+
options[:environments] = environment_data
|
|
27
|
+
|
|
28
|
+
# All we need to do is supply options with the :environments hash.
|
|
29
|
+
# The R10K::Source::Hash parent class takes care of the rest.
|
|
30
|
+
super(name, basedir, options)
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/r10k/svn.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'r10k/util/subprocess'
|
|
2
|
+
require 'r10k/util/setopts'
|
|
3
|
+
|
|
4
|
+
# Inspect and interact with SVN remote repositories
|
|
5
|
+
#
|
|
6
|
+
# @api private
|
|
7
|
+
# @since 1.3.0
|
|
8
|
+
class R10K::SVN::Remote
|
|
9
|
+
|
|
10
|
+
include R10K::Util::Setopts
|
|
11
|
+
|
|
12
|
+
def initialize(baseurl, opts = {})
|
|
13
|
+
@baseurl = baseurl
|
|
14
|
+
setopts(opts, {:username => :self, :password => :self})
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @todo validate that the path to trunk exists in the remote
|
|
18
|
+
def trunk
|
|
19
|
+
"#{@baseurl}/trunk"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @todo gracefully handle cases where no branches exist
|
|
23
|
+
def branches
|
|
24
|
+
argv = ['ls', "#{@baseurl}/branches"]
|
|
25
|
+
argv.concat(auth)
|
|
26
|
+
text = svn(argv)
|
|
27
|
+
text.lines.map do |line|
|
|
28
|
+
line.chomp!
|
|
29
|
+
line.gsub!(%r[/$], '')
|
|
30
|
+
line
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# Format authentication information for SVN command args, if applicable
|
|
37
|
+
def auth
|
|
38
|
+
auth = []
|
|
39
|
+
if @username
|
|
40
|
+
auth << "--username" << @username
|
|
41
|
+
auth << "--password" << @password
|
|
42
|
+
end
|
|
43
|
+
auth
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
include R10K::Logging
|
|
47
|
+
|
|
48
|
+
# Wrap SVN commands
|
|
49
|
+
#
|
|
50
|
+
# @param argv [Array<String>]
|
|
51
|
+
# @param opts [Hash]
|
|
52
|
+
#
|
|
53
|
+
# @option opts [Pathname] :cwd The directory to run the command in
|
|
54
|
+
#
|
|
55
|
+
# @return [String] The stdout from the given command
|
|
56
|
+
def svn(argv, opts = {})
|
|
57
|
+
argv.unshift('svn', '--non-interactive')
|
|
58
|
+
|
|
59
|
+
subproc = R10K::Util::Subprocess.new(argv)
|
|
60
|
+
subproc.raise_on_fail = true
|
|
61
|
+
subproc.logger = self.logger
|
|
62
|
+
|
|
63
|
+
subproc.cwd = opts[:cwd]
|
|
64
|
+
result = subproc.execute
|
|
65
|
+
|
|
66
|
+
result.stdout
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'r10k/util/subprocess'
|
|
2
|
+
require 'r10k/util/setopts'
|
|
3
|
+
|
|
4
|
+
module R10K
|
|
5
|
+
module SVN
|
|
6
|
+
|
|
7
|
+
# Manage an SVN working copy.
|
|
8
|
+
#
|
|
9
|
+
# If SVN authentication is required, both username and password must be specified.
|
|
10
|
+
#
|
|
11
|
+
# @api private
|
|
12
|
+
# @since 1.2.0
|
|
13
|
+
class WorkingDir
|
|
14
|
+
|
|
15
|
+
include R10K::Util::Setopts
|
|
16
|
+
|
|
17
|
+
# @attribute [r] path
|
|
18
|
+
# @return [Pathname] The full path to the SVN working directory
|
|
19
|
+
# @api private
|
|
20
|
+
attr_reader :path
|
|
21
|
+
|
|
22
|
+
# @!attribute [r] username
|
|
23
|
+
# @return [String, nil] The SVN username, if provided
|
|
24
|
+
# @api private
|
|
25
|
+
attr_reader :username
|
|
26
|
+
|
|
27
|
+
# @!attribute [r] password
|
|
28
|
+
# @return [String, nil] The SVN password, if provided
|
|
29
|
+
# @api private
|
|
30
|
+
attr_reader :password
|
|
31
|
+
|
|
32
|
+
# @param path [Pathname]
|
|
33
|
+
# @param opts [Hash]
|
|
34
|
+
#
|
|
35
|
+
# @option opts [String] :username
|
|
36
|
+
# @option opts [String] :password
|
|
37
|
+
def initialize(path, opts = {})
|
|
38
|
+
@path = path
|
|
39
|
+
|
|
40
|
+
setopts(opts, {:username => :self, :password => :self})
|
|
41
|
+
|
|
42
|
+
if !!(@username) ^ !!(@password)
|
|
43
|
+
raise ArgumentError, _("Both username and password must be specified")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Is the directory at this path actually an SVN repository?
|
|
48
|
+
def is_svn?
|
|
49
|
+
dot_svn = @path + '.svn'
|
|
50
|
+
dot_svn.exist?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def revision
|
|
54
|
+
info.slice(/^Revision: (\d+)$/, 1)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def url
|
|
58
|
+
info.slice(/^URL: (.*)$/, 1)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def root
|
|
62
|
+
info.slice(/^Repository Root: (.*)$/, 1)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def update(revision = nil)
|
|
66
|
+
argv = %w[update]
|
|
67
|
+
argv << '-r' << revision if revision
|
|
68
|
+
argv.concat(auth)
|
|
69
|
+
|
|
70
|
+
svn(argv, :cwd => @path)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def checkout(url, revision = nil)
|
|
74
|
+
argv = ['checkout', url]
|
|
75
|
+
argv << '-r' << revision if revision
|
|
76
|
+
argv << @path.basename.to_s
|
|
77
|
+
argv.concat(auth)
|
|
78
|
+
argv << '-q'
|
|
79
|
+
|
|
80
|
+
svn(argv, :cwd => @path.parent)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def info
|
|
86
|
+
argv = %w[info]
|
|
87
|
+
argv.concat(auth)
|
|
88
|
+
svn(argv, :cwd => @path)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Format authentication information for SVN command args, if applicable
|
|
92
|
+
def auth
|
|
93
|
+
auth = []
|
|
94
|
+
if @username
|
|
95
|
+
auth << "--username" << @username
|
|
96
|
+
auth << "--password" << @password
|
|
97
|
+
end
|
|
98
|
+
auth
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
include R10K::Logging
|
|
102
|
+
|
|
103
|
+
# Wrap SVN commands
|
|
104
|
+
#
|
|
105
|
+
# @param argv [Array<String>]
|
|
106
|
+
# @param opts [Hash]
|
|
107
|
+
#
|
|
108
|
+
# @option opts [Pathname] :cwd The directory to run the command in
|
|
109
|
+
#
|
|
110
|
+
# @return [String] The stdout from the given command
|
|
111
|
+
def svn(argv, opts = {})
|
|
112
|
+
argv.unshift('svn', '--non-interactive')
|
|
113
|
+
|
|
114
|
+
subproc = R10K::Util::Subprocess.new(argv)
|
|
115
|
+
subproc.raise_on_fail = true
|
|
116
|
+
subproc.logger = self.logger
|
|
117
|
+
|
|
118
|
+
subproc.cwd = opts[:cwd]
|
|
119
|
+
result = subproc.execute
|
|
120
|
+
|
|
121
|
+
result.stdout
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'r10k/logging'
|
|
2
|
+
require 'r10k/errors/formatting'
|
|
3
|
+
require 'r10k/util/setopts'
|
|
4
|
+
require 'colored2'
|
|
5
|
+
|
|
6
|
+
module R10K
|
|
7
|
+
module Util
|
|
8
|
+
|
|
9
|
+
# Attempt a series of dependent nested tasks and cleanly handle errors.
|
|
10
|
+
#
|
|
11
|
+
# @api private
|
|
12
|
+
class Attempt
|
|
13
|
+
|
|
14
|
+
include R10K::Logging
|
|
15
|
+
include R10K::Util::Setopts
|
|
16
|
+
|
|
17
|
+
# @!attribute [r] status
|
|
18
|
+
# @return [Symbol] The status of this task
|
|
19
|
+
attr_reader :status
|
|
20
|
+
|
|
21
|
+
def initialize(initial, opts = {})
|
|
22
|
+
@initial = initial
|
|
23
|
+
@tries = []
|
|
24
|
+
@status = :notrun
|
|
25
|
+
setopts(opts, {:trace => :self})
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Run this attempt to completion.
|
|
29
|
+
#
|
|
30
|
+
# @todo determine the structure of the ret
|
|
31
|
+
# @return [Object] The aggregate result of all work performed.
|
|
32
|
+
def run
|
|
33
|
+
@status = :running
|
|
34
|
+
result = apply(@initial, @tries)
|
|
35
|
+
@status = :ok if @status == :running
|
|
36
|
+
result
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Add another action to take for this attempt
|
|
40
|
+
#
|
|
41
|
+
# @yieldparam [Object] The result of the previous action.
|
|
42
|
+
# @yieldreturn [Object, Array<Object>, NilClass] The result of this action.
|
|
43
|
+
# If the value is an object, it will be passed to the next attempt. If
|
|
44
|
+
# the value is an Array then each element will be individually passed
|
|
45
|
+
# to the next try. If the value is false or nil then no further action
|
|
46
|
+
# will be taken.
|
|
47
|
+
def try(&block)
|
|
48
|
+
@tries << block
|
|
49
|
+
self
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def ok?
|
|
53
|
+
@status == :ok
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def apply(input, tries)
|
|
59
|
+
return input if tries.empty?
|
|
60
|
+
|
|
61
|
+
case input
|
|
62
|
+
when Array
|
|
63
|
+
apply_all(input, tries)
|
|
64
|
+
when NilClass, FalseClass
|
|
65
|
+
input
|
|
66
|
+
else
|
|
67
|
+
apply_one(input, tries)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def apply_all(values, tries)
|
|
72
|
+
values.map { |v| apply_one(v, tries) }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def apply_one(value, tries)
|
|
76
|
+
apply(tries.first.call(value), tries.drop(1))
|
|
77
|
+
rescue => e
|
|
78
|
+
@status = :failed
|
|
79
|
+
logger.error R10K::Errors::Formatting.format_exception(e, @trace)
|
|
80
|
+
e
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'r10k/deployment'
|
|
2
|
+
require 'r10k/logging'
|
|
3
|
+
require 'r10k/util/purgeable'
|
|
4
|
+
|
|
5
|
+
module R10K
|
|
6
|
+
module Util
|
|
7
|
+
|
|
8
|
+
# Represents a directory that can purge unmanaged contents
|
|
9
|
+
#
|
|
10
|
+
# @todo pick a better name than basedir. Expect this class to be renamed.
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
class Basedir
|
|
14
|
+
|
|
15
|
+
include R10K::Util::Purgeable
|
|
16
|
+
include R10K::Logging
|
|
17
|
+
|
|
18
|
+
# Create a new Basedir by selecting sources from a deployment that match
|
|
19
|
+
# the specified path.
|
|
20
|
+
#
|
|
21
|
+
# @param path [String]
|
|
22
|
+
# @param deployment [R10K::Deployment]
|
|
23
|
+
#
|
|
24
|
+
# @return [R10K::Util::Basedir]
|
|
25
|
+
def self.from_deployment(path, deployment)
|
|
26
|
+
sources = deployment.sources.select { |source| source.managed_directory == path }
|
|
27
|
+
new(path, sources)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @param path [String] The path to the directory to manage
|
|
31
|
+
# @param sources [Array<#desired_contents>] A list of objects that may create filesystem entries
|
|
32
|
+
def initialize(path, sources)
|
|
33
|
+
if sources.is_a? R10K::Deployment
|
|
34
|
+
raise ArgumentError, _("Expected Array<#desired_contents>, got R10K::Deployment")
|
|
35
|
+
end
|
|
36
|
+
@path = path
|
|
37
|
+
@sources = sources
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Return the path of the basedir
|
|
41
|
+
# @note This implements a required method for the Purgeable mixin
|
|
42
|
+
# @return [Array]
|
|
43
|
+
def managed_directories
|
|
44
|
+
[@path]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# List all environments that should exist in this basedir
|
|
48
|
+
# @note This implements a required method for the Purgeable mixin
|
|
49
|
+
# @return [Array<String>]
|
|
50
|
+
def desired_contents
|
|
51
|
+
@sources.flat_map do |src|
|
|
52
|
+
src.desired_contents.collect { |env| File.join(@path, env) }
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def purge!
|
|
57
|
+
@sources.each do |source|
|
|
58
|
+
logger.debug1 _("Source %{source_name} in %{path} manages contents %{contents}") % {source_name: source.name, path: @path, contents: source.desired_contents.inspect}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
super
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module R10K
|
|
2
|
+
module Util
|
|
3
|
+
module Commands
|
|
4
|
+
module_function
|
|
5
|
+
|
|
6
|
+
# Find the full path of a shell command.
|
|
7
|
+
#
|
|
8
|
+
# On POSIX platforms, the PATHEXT environment variable will be unset, so
|
|
9
|
+
# the first command named 'cmd' will be returned.
|
|
10
|
+
#
|
|
11
|
+
# On Windows platforms, the PATHEXT environment variable will contain a
|
|
12
|
+
# semicolon delimited list of executable file extensions, so the first
|
|
13
|
+
# command with a matching path extension will be returned.
|
|
14
|
+
#
|
|
15
|
+
# @param cmd [String] The name of the command to search for
|
|
16
|
+
# @return [String, nil] The path to the file if found, nil otherwise
|
|
17
|
+
def which(cmd)
|
|
18
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
|
19
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
|
|
20
|
+
exts.each do |ext|
|
|
21
|
+
path = File.join(dir, "#{cmd}#{ext}")
|
|
22
|
+
if File.executable?(path) && File.file?(path)
|
|
23
|
+
return path
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
nil
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module R10K
|
|
2
|
+
module Util
|
|
3
|
+
|
|
4
|
+
# Utility methods for dealing with environment variables
|
|
5
|
+
module ExecEnv
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
# Swap out all environment settings
|
|
9
|
+
#
|
|
10
|
+
# @param env [Hash] The new environment to use
|
|
11
|
+
# @return [void]
|
|
12
|
+
def reset(env)
|
|
13
|
+
env.each_pair do |key, value|
|
|
14
|
+
ENV[key] = value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
(ENV.keys - env.keys).each do |key|
|
|
18
|
+
ENV.delete(key)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Add the specified settings to the env for the supplied block
|
|
23
|
+
#
|
|
24
|
+
# @param env [Hash] The values to add to the environment
|
|
25
|
+
# @param block [Proc] The code to call with the modified environnment
|
|
26
|
+
# @return [void]
|
|
27
|
+
def withenv(env, &block)
|
|
28
|
+
original = ENV.to_hash
|
|
29
|
+
reset(original.merge(env))
|
|
30
|
+
block.call
|
|
31
|
+
ensure
|
|
32
|
+
reset(original)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|