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,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
|
data/lib/r10k/logging.rb
ADDED
|
@@ -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
|