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,81 @@
|
|
|
1
|
+
require 'r10k/logging'
|
|
2
|
+
require 'r10k/puppetfile'
|
|
3
|
+
require 'r10k/git/stateful_repository'
|
|
4
|
+
require 'forwardable'
|
|
5
|
+
|
|
6
|
+
# This class implements an environment based on a Git branch.
|
|
7
|
+
#
|
|
8
|
+
# @since 1.3.0
|
|
9
|
+
class R10K::Environment::Git < R10K::Environment::WithModules
|
|
10
|
+
|
|
11
|
+
include R10K::Logging
|
|
12
|
+
|
|
13
|
+
R10K::Environment.register(:git, self)
|
|
14
|
+
# Register git as the default environment type
|
|
15
|
+
R10K::Environment.register(nil, self)
|
|
16
|
+
|
|
17
|
+
# @!attribute [r] remote
|
|
18
|
+
# @return [String] The URL to the remote git repository
|
|
19
|
+
attr_reader :remote
|
|
20
|
+
|
|
21
|
+
# @!attribute [r] ref
|
|
22
|
+
# @return [String] The git reference to use for this environment
|
|
23
|
+
attr_reader :ref
|
|
24
|
+
|
|
25
|
+
# @!attribute [r] repo
|
|
26
|
+
# @api private
|
|
27
|
+
# @return [R10K::Git::StatefulRepository] The git repo backing this environment
|
|
28
|
+
attr_reader :repo
|
|
29
|
+
|
|
30
|
+
# Initialize the given Git environment.
|
|
31
|
+
#
|
|
32
|
+
# @param name [String] The unique name describing this environment.
|
|
33
|
+
# @param basedir [String] The base directory where this environment will be created.
|
|
34
|
+
# @param dirname [String] The directory name for this environment.
|
|
35
|
+
# @param options [Hash] An additional set of options for this environment.
|
|
36
|
+
#
|
|
37
|
+
# @param options [String] :remote The URL to the remote git repository
|
|
38
|
+
# @param options [String] :ref The git reference to use for this environment
|
|
39
|
+
def initialize(name, basedir, dirname, options = {})
|
|
40
|
+
super
|
|
41
|
+
@remote = options[:remote]
|
|
42
|
+
@ref = options[:ref]
|
|
43
|
+
|
|
44
|
+
@repo = R10K::Git::StatefulRepository.new(@remote, @basedir, @dirname)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Clone or update the given Git environment.
|
|
48
|
+
#
|
|
49
|
+
# If the environment is being created for the first time, it will
|
|
50
|
+
# automatically update all modules to ensure that the environment is complete.
|
|
51
|
+
#
|
|
52
|
+
# @api public
|
|
53
|
+
# @return [void]
|
|
54
|
+
def sync
|
|
55
|
+
@repo.sync(@ref)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def status
|
|
59
|
+
@repo.status(@ref)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Return a sting which uniquely identifies (per source) the current state of the
|
|
63
|
+
# environment.
|
|
64
|
+
#
|
|
65
|
+
# @api public
|
|
66
|
+
# @return [String]
|
|
67
|
+
def signature
|
|
68
|
+
@repo.head
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
include R10K::Util::Purgeable
|
|
72
|
+
|
|
73
|
+
# Returns an array of the full paths to all the content being managed.
|
|
74
|
+
# @note This implements a required method for the Purgeable mixin
|
|
75
|
+
# @return [Array<String>]
|
|
76
|
+
def desired_contents
|
|
77
|
+
desired = [File.join(@full_path, '.git')]
|
|
78
|
+
desired += @repo.tracked_paths.map { |entry| File.join(@full_path, entry) }
|
|
79
|
+
desired += super
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module R10K
|
|
2
|
+
module Environment
|
|
3
|
+
# Handle environment name validation and modification.
|
|
4
|
+
#
|
|
5
|
+
# @api private
|
|
6
|
+
class Name
|
|
7
|
+
|
|
8
|
+
# @!attribute [r] name
|
|
9
|
+
# @return [String] The unmodified name of the environment
|
|
10
|
+
attr_reader :name
|
|
11
|
+
|
|
12
|
+
INVALID_CHARACTERS = %r[\W]
|
|
13
|
+
|
|
14
|
+
def initialize(name, opts)
|
|
15
|
+
@name = name
|
|
16
|
+
@opts = opts
|
|
17
|
+
|
|
18
|
+
@source = opts[:source]
|
|
19
|
+
@prefix = opts[:prefix]
|
|
20
|
+
@invalid = opts[:invalid]
|
|
21
|
+
|
|
22
|
+
case @invalid
|
|
23
|
+
when 'correct_and_warn'
|
|
24
|
+
@validate = true
|
|
25
|
+
@correct = true
|
|
26
|
+
when 'correct'
|
|
27
|
+
@validate = false
|
|
28
|
+
@correct = true
|
|
29
|
+
when 'error'
|
|
30
|
+
@validate = true
|
|
31
|
+
@correct = false
|
|
32
|
+
when NilClass
|
|
33
|
+
@validate = opts[:validate]
|
|
34
|
+
@correct = opts[:correct]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Should the environment name have invalid characters removed?
|
|
39
|
+
def correct?
|
|
40
|
+
@correct
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def validate?
|
|
44
|
+
@validate
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def valid?
|
|
48
|
+
if @validate
|
|
49
|
+
! @name.match(INVALID_CHARACTERS)
|
|
50
|
+
else
|
|
51
|
+
true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The directory name for the environment, modified as necessary to remove
|
|
56
|
+
# invalid characters.
|
|
57
|
+
#
|
|
58
|
+
# @return [String]
|
|
59
|
+
def dirname
|
|
60
|
+
dir = @name.dup
|
|
61
|
+
|
|
62
|
+
prefix = derive_prefix(@source,@prefix)
|
|
63
|
+
|
|
64
|
+
if @correct
|
|
65
|
+
dir.gsub!(INVALID_CHARACTERS, '_')
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
"#{prefix}#{dir}"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def derive_prefix(source,prefix)
|
|
75
|
+
|
|
76
|
+
if prefix == true
|
|
77
|
+
"#{source}_"
|
|
78
|
+
elsif prefix.is_a? String
|
|
79
|
+
"#{prefix}_"
|
|
80
|
+
else
|
|
81
|
+
nil
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'r10k/puppetfile'
|
|
2
|
+
require 'r10k/svn/working_dir'
|
|
3
|
+
require 'r10k/util/setopts'
|
|
4
|
+
|
|
5
|
+
# This class implements an environment based on an SVN branch.
|
|
6
|
+
#
|
|
7
|
+
# @since 1.3.0
|
|
8
|
+
class R10K::Environment::SVN < R10K::Environment::Base
|
|
9
|
+
|
|
10
|
+
include R10K::Logging
|
|
11
|
+
|
|
12
|
+
R10K::Environment.register(:svn, self)
|
|
13
|
+
|
|
14
|
+
# @!attribute [r] remote
|
|
15
|
+
# @return [String] The URL to the remote SVN branch to check out
|
|
16
|
+
attr_reader :remote
|
|
17
|
+
|
|
18
|
+
# @!attribute [r] working_dir
|
|
19
|
+
# @api private
|
|
20
|
+
# @return [R10K::SVN::WorkingDir] The SVN working directory backing this environment
|
|
21
|
+
attr_reader :working_dir
|
|
22
|
+
|
|
23
|
+
# @!attribute [r] username
|
|
24
|
+
# @return [String, nil] The SVN username to be passed to the underlying SVN commands
|
|
25
|
+
# @api private
|
|
26
|
+
attr_reader :username
|
|
27
|
+
|
|
28
|
+
# @!attribute [r] password
|
|
29
|
+
# @return [String, nil] The SVN password to be passed to the underlying SVN commands
|
|
30
|
+
# @api private
|
|
31
|
+
attr_reader :password
|
|
32
|
+
|
|
33
|
+
include R10K::Util::Setopts
|
|
34
|
+
|
|
35
|
+
# Initialize the given SVN environment.
|
|
36
|
+
#
|
|
37
|
+
# @param name [String] The unique name describing this environment.
|
|
38
|
+
# @param basedir [String] The base directory where this environment will be created.
|
|
39
|
+
# @param dirname [String] The directory name for this environment.
|
|
40
|
+
# @param options [Hash] An additional set of options for this environment.
|
|
41
|
+
#
|
|
42
|
+
# @option options [String] :remote The URL to the remote SVN branch to check out
|
|
43
|
+
# @option options [String] :username The SVN username
|
|
44
|
+
# @option options [String] :password The SVN password
|
|
45
|
+
def initialize(name, basedir, dirname, options = {})
|
|
46
|
+
super
|
|
47
|
+
|
|
48
|
+
setopts(options, {:remote => :self, :username => :self, :password => :self, :puppetfile_name => :self })
|
|
49
|
+
|
|
50
|
+
@working_dir = R10K::SVN::WorkingDir.new(Pathname.new(@full_path), :username => @username, :password => @password)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Perform an initial checkout of the SVN repository or update the repository.
|
|
54
|
+
#
|
|
55
|
+
# If the environment is being created for the first time, it will
|
|
56
|
+
# automatically update all modules to ensure that the environment is complete.
|
|
57
|
+
#
|
|
58
|
+
# @api public
|
|
59
|
+
# @return [void]
|
|
60
|
+
def sync
|
|
61
|
+
if @working_dir.is_svn?
|
|
62
|
+
@working_dir.update
|
|
63
|
+
else
|
|
64
|
+
@working_dir.checkout(@remote)
|
|
65
|
+
end
|
|
66
|
+
@synced = true
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Return a sting which uniquely identifies (per source) the current state of the
|
|
70
|
+
# environment.
|
|
71
|
+
#
|
|
72
|
+
# @api public
|
|
73
|
+
# @return [String]
|
|
74
|
+
def signature
|
|
75
|
+
@working_dir.revision
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def status
|
|
79
|
+
if !@path.exist?
|
|
80
|
+
:absent
|
|
81
|
+
elsif !@working_dir.is_svn?
|
|
82
|
+
:mismatched
|
|
83
|
+
elsif !(@remote == @working_dir.url)
|
|
84
|
+
:mismatched
|
|
85
|
+
elsif !@synced
|
|
86
|
+
:outdated
|
|
87
|
+
else
|
|
88
|
+
:insync
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require 'r10k/logging'
|
|
2
|
+
require 'r10k/util/purgeable'
|
|
3
|
+
|
|
4
|
+
# This abstract base class implements an environment that can include module
|
|
5
|
+
# content
|
|
6
|
+
#
|
|
7
|
+
# @since 3.4.0
|
|
8
|
+
class R10K::Environment::WithModules < R10K::Environment::Base
|
|
9
|
+
|
|
10
|
+
include R10K::Logging
|
|
11
|
+
|
|
12
|
+
# @!attribute [r] moduledir
|
|
13
|
+
# @return [String] The directory to install environment-defined modules
|
|
14
|
+
# into (default: #{basedir}/modules)
|
|
15
|
+
attr_reader :moduledir
|
|
16
|
+
|
|
17
|
+
# Initialize the given environment.
|
|
18
|
+
#
|
|
19
|
+
# @param name [String] The unique name describing this environment.
|
|
20
|
+
# @param basedir [String] The base directory where this environment will be created.
|
|
21
|
+
# @param dirname [String] The directory name for this environment.
|
|
22
|
+
# @param options [Hash] An additional set of options for this environment.
|
|
23
|
+
#
|
|
24
|
+
# @param options [String] :moduledir The path to install modules to
|
|
25
|
+
# @param options [Hash] :modules Modules to add to the environment
|
|
26
|
+
def initialize(name, basedir, dirname, options = {})
|
|
27
|
+
super(name, basedir, dirname, options)
|
|
28
|
+
|
|
29
|
+
@managed_content = {}
|
|
30
|
+
@modules = []
|
|
31
|
+
@moduledir = case options[:moduledir]
|
|
32
|
+
when nil
|
|
33
|
+
File.join(@basedir, @dirname, 'modules')
|
|
34
|
+
when File.absolute_path(options[:moduledir])
|
|
35
|
+
options.delete(:moduledir)
|
|
36
|
+
else
|
|
37
|
+
File.join(@basedir, @dirname, options.delete(:moduledir))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
modhash = options.delete(:modules)
|
|
41
|
+
load_modules(modhash) unless modhash.nil?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @return [Array<R10K::Module::Base>] All modules associated with this environment.
|
|
45
|
+
# Modules may originate from either:
|
|
46
|
+
# - The r10k environment object
|
|
47
|
+
# - A Puppetfile in the environment's content
|
|
48
|
+
def modules
|
|
49
|
+
return @modules if @puppetfile.nil?
|
|
50
|
+
|
|
51
|
+
@puppetfile.load unless @puppetfile.loaded?
|
|
52
|
+
@modules + @puppetfile.modules
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def accept(visitor)
|
|
56
|
+
visitor.visit(:environment, self) do
|
|
57
|
+
@modules.each do |mod|
|
|
58
|
+
mod.accept(visitor)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
puppetfile.accept(visitor)
|
|
62
|
+
validate_no_module_conflicts
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def load_modules(module_hash)
|
|
67
|
+
module_hash.each do |name, args|
|
|
68
|
+
add_module(name, args)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @param [String] name
|
|
73
|
+
# @param [*Object] args
|
|
74
|
+
def add_module(name, args)
|
|
75
|
+
if args.is_a?(Hash)
|
|
76
|
+
# symbolize keys in the args hash
|
|
77
|
+
args = args.inject({}) { |memo,(k,v)| memo[k.to_sym] = v; memo }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if args.is_a?(Hash) && install_path = args.delete(:install_path)
|
|
81
|
+
install_path = resolve_install_path(install_path)
|
|
82
|
+
validate_install_path(install_path, name)
|
|
83
|
+
else
|
|
84
|
+
install_path = @moduledir
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Keep track of all the content this environment is managing to enable purging.
|
|
88
|
+
@managed_content[install_path] = Array.new unless @managed_content.has_key?(install_path)
|
|
89
|
+
|
|
90
|
+
mod = R10K::Module.new(name, install_path, args, self.name)
|
|
91
|
+
mod.origin = 'Environment'
|
|
92
|
+
|
|
93
|
+
@managed_content[install_path] << mod.name
|
|
94
|
+
@modules << mod
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def validate_no_module_conflicts
|
|
98
|
+
@puppetfile.load unless @puppetfile.loaded?
|
|
99
|
+
conflicts = (@modules + @puppetfile.modules)
|
|
100
|
+
.group_by { |mod| mod.name }
|
|
101
|
+
.select { |_, v| v.size > 1 }
|
|
102
|
+
.map(&:first)
|
|
103
|
+
unless conflicts.empty?
|
|
104
|
+
msg = _('Puppetfile cannot contain module names defined by environment %{name}') % {name: self.name}
|
|
105
|
+
msg += ' '
|
|
106
|
+
msg += _("Remove the conflicting definitions of the following modules: %{conflicts}" % { conflicts: conflicts.join(' ') })
|
|
107
|
+
raise R10K::Error.new(msg)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
include R10K::Util::Purgeable
|
|
112
|
+
|
|
113
|
+
# Returns an array of the full paths that can be purged.
|
|
114
|
+
# @note This implements a required method for the Purgeable mixin
|
|
115
|
+
# @return [Array<String>]
|
|
116
|
+
def managed_directories
|
|
117
|
+
[@full_path]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Returns an array of the full paths of filenames that should exist. Files
|
|
121
|
+
# inside managed_directories that are not listed in desired_contents will
|
|
122
|
+
# be purged.
|
|
123
|
+
# @note This implements a required method for the Purgeable mixin
|
|
124
|
+
# @return [Array<String>]
|
|
125
|
+
def desired_contents
|
|
126
|
+
list = @managed_content.keys
|
|
127
|
+
list += @managed_content.flat_map do |install_path, modnames|
|
|
128
|
+
modnames.collect { |name| File.join(install_path, name) }
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def purge_exclusions
|
|
133
|
+
super + @managed_content.flat_map do |install_path, modnames|
|
|
134
|
+
modnames.map do |name|
|
|
135
|
+
File.join(install_path, name, '**', '*')
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
data/lib/r10k/errors.rb
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'r10k'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
|
|
5
|
+
# An error class that accepts an optional hash and wrapped error message
|
|
6
|
+
#
|
|
7
|
+
class Error < StandardError
|
|
8
|
+
attr_accessor :original
|
|
9
|
+
|
|
10
|
+
# Generate a wrapped exception
|
|
11
|
+
#
|
|
12
|
+
# @param original [Exception] The exception to wrap
|
|
13
|
+
# @param mesg [String]
|
|
14
|
+
# @param options [Hash]
|
|
15
|
+
#
|
|
16
|
+
# @return [R10K::Error]
|
|
17
|
+
def self.wrap(original, mesg, options = {})
|
|
18
|
+
new(mesg, options).tap do |e|
|
|
19
|
+
e.set_backtrace(caller(4))
|
|
20
|
+
e.original = original
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @overload initialize(mesg)
|
|
25
|
+
# @param mesg [String] The exception mesg
|
|
26
|
+
#
|
|
27
|
+
# @overload initialize(mesg, options)
|
|
28
|
+
# @param mesg [String] The exception mesg
|
|
29
|
+
# @param options [Hash] A set of options to store on the exception
|
|
30
|
+
#
|
|
31
|
+
# @options options [Array<String>] :backtrace
|
|
32
|
+
def initialize(mesg, options = {})
|
|
33
|
+
super(mesg)
|
|
34
|
+
|
|
35
|
+
bt = options.delete(:backtrace)
|
|
36
|
+
if bt
|
|
37
|
+
set_backtrace(bt)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
@options = options
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
protected
|
|
44
|
+
|
|
45
|
+
def structure_exception(name, exc)
|
|
46
|
+
struct = []
|
|
47
|
+
struct << "#{name}:"
|
|
48
|
+
if exc.respond_to?(:format)
|
|
49
|
+
struct << indent(exc.format)
|
|
50
|
+
else
|
|
51
|
+
struct << indent(exc.message)
|
|
52
|
+
end
|
|
53
|
+
struct.join("\n")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def indent(str, level = 4)
|
|
57
|
+
prefix = ' ' * level
|
|
58
|
+
str.gsub(/^/, prefix)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|