puppet 6.12.0-x64-mingw32 → 6.17.0-x64-mingw32
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.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -7
- data/CONTRIBUTING.md +7 -13
- data/Gemfile +4 -2
- data/Gemfile.lock +39 -36
- data/README.md +18 -25
- data/ext/project_data.yaml +1 -1
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +52 -13
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/application/agent.rb +26 -17
- data/lib/puppet/application/describe.rb +7 -5
- data/lib/puppet/application/device.rb +2 -2
- data/lib/puppet/application/filebucket.rb +19 -15
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/application/ssl.rb +4 -4
- data/lib/puppet/configurer.rb +65 -69
- data/lib/puppet/configurer/plugin_handler.rb +10 -1
- data/lib/puppet/confine.rb +1 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +154 -58
- data/lib/puppet/environments.rb +27 -20
- data/lib/puppet/face/facts.rb +8 -5
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/plugin.rb +2 -2
- data/lib/puppet/file_serving/http_metadata.rb +14 -2
- data/lib/puppet/file_serving/metadata.rb +4 -1
- data/lib/puppet/file_serving/terminus_selector.rb +7 -8
- data/lib/puppet/file_system/file_impl.rb +14 -10
- data/lib/puppet/file_system/memory_file.rb +6 -0
- data/lib/puppet/file_system/memory_impl.rb +13 -0
- data/lib/puppet/file_system/uniquefile.rb +12 -16
- data/lib/puppet/file_system/windows.rb +7 -10
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/repository.rb +4 -7
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +5 -0
- data/lib/puppet/http/client.rb +293 -73
- data/lib/puppet/http/errors.rb +2 -0
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +43 -7
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +76 -16
- data/lib/puppet/http/resolver/settings.rb +23 -3
- data/lib/puppet/http/resolver/srv.rb +29 -3
- data/lib/puppet/http/response.rb +87 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +151 -7
- data/lib/puppet/http/service/ca.rb +76 -14
- data/lib/puppet/http/service/compiler.rb +319 -0
- data/lib/puppet/http/service/file_server.rb +206 -0
- data/lib/puppet/http/service/report.rb +49 -23
- data/lib/puppet/http/session.rb +103 -7
- data/lib/puppet/indirector.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +10 -0
- data/lib/puppet/indirector/catalog/rest.rb +34 -0
- data/lib/puppet/indirector/facts/rest.rb +42 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_content/http.rb +5 -0
- data/lib/puppet/indirector/file_content/rest.rb +30 -0
- data/lib/puppet/indirector/file_metadata/http.rb +27 -8
- data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/node/rest.rb +24 -0
- data/lib/puppet/indirector/report/rest.rb +19 -0
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/request.rb +1 -1
- data/lib/puppet/indirector/rest.rb +12 -0
- data/lib/puppet/indirector/status/rest.rb +18 -0
- data/lib/puppet/loaders.rb +6 -0
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/base_pool.rb +7 -2
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +6 -0
- data/lib/puppet/network/http/connection_adapter.rb +184 -0
- data/lib/puppet/network/http/nocache_pool.rb +2 -0
- data/lib/puppet/network/http/pool.rb +13 -6
- data/lib/puppet/network/http_pool.rb +2 -1
- data/lib/puppet/node/environment.rb +11 -1
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +4 -29
- data/lib/puppet/parser/ast/leaf.rb +5 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
- data/lib/puppet/parser/compiler.rb +43 -33
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +4 -1
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
- data/lib/puppet/pops/types/type_calculator.rb +24 -0
- data/lib/puppet/pops/validation/checker4_0.rb +11 -1
- data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/provider/aix_object.rb +4 -2
- data/lib/puppet/provider/group/aix.rb +1 -0
- data/lib/puppet/provider/group/groupadd.rb +57 -24
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +78 -4
- data/lib/puppet/provider/package/aptitude.rb +1 -1
- data/lib/puppet/provider/package/dnfmodule.rb +69 -15
- data/lib/puppet/provider/package/dpkg.rb +14 -7
- data/lib/puppet/provider/package/fink.rb +20 -3
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/openbsd.rb +13 -1
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +143 -48
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkg.rb +18 -5
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/portage.rb +2 -2
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +109 -25
- data/lib/puppet/provider/package/zypper.rb +59 -1
- data/lib/puppet/provider/service/systemd.rb +22 -4
- data/lib/puppet/provider/service/windows.rb +23 -7
- data/lib/puppet/provider/user/aix.rb +1 -0
- data/lib/puppet/provider/user/directoryservice.rb +30 -5
- data/lib/puppet/provider/user/useradd.rb +22 -12
- data/lib/puppet/reports/http.rb +15 -9
- data/lib/puppet/reports/store.rb +1 -1
- data/lib/puppet/resource.rb +2 -1
- data/lib/puppet/resource/type.rb +8 -0
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/runtime.rb +31 -1
- data/lib/puppet/settings.rb +4 -0
- data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/certificate.rb +2 -1
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/ssl_context.rb +2 -2
- data/lib/puppet/ssl/ssl_provider.rb +20 -1
- data/lib/puppet/ssl/state_machine.rb +81 -35
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +15 -11
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/trusted_external.rb +29 -1
- data/lib/puppet/type.rb +18 -6
- data/lib/puppet/type/file.rb +51 -13
- data/lib/puppet/type/file/checksum.rb +4 -4
- data/lib/puppet/type/file/source.rb +51 -60
- data/lib/puppet/type/group.rb +2 -2
- data/lib/puppet/type/package.rb +102 -10
- data/lib/puppet/type/service.rb +55 -8
- data/lib/puppet/type/user.rb +3 -28
- data/lib/puppet/util.rb +39 -15
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +4 -18
- data/lib/puppet/util/checksums.rb +19 -4
- data/lib/puppet/util/fileparsing.rb +2 -2
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +2 -11
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +53 -0
- data/lib/puppet/util/package/version/range/eq.rb +14 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +36 -10
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/storage.rb +0 -1
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/api_types.rb +45 -32
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/registry.rb +11 -11
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/service.rb +43 -26
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/windows/user.rb +23 -8
- data/lib/puppet/util/yaml.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +707 -574
- data/man/man5/puppet.conf.5 +74 -14
- data/man/man8/puppet-agent.8 +7 -7
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +17 -2
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +2 -2
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
- data/spec/integration/application/agent_spec.rb +483 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +73 -0
- data/spec/integration/configurer_spec.rb +26 -7
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/http/client_spec.rb +47 -37
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +2 -15
- data/spec/integration/network/http_pool_spec.rb +93 -20
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/integration/util/windows/user_spec.rb +40 -5
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +16 -7
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/unit/agent_spec.rb +80 -26
- data/spec/unit/application/agent_spec.rb +9 -5
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/application/describe_spec.rb +88 -50
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/application/resource_spec.rb +2 -2
- data/spec/unit/configurer/fact_handler_spec.rb +4 -8
- data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
- data/spec/unit/configurer_spec.rb +17 -18
- data/spec/unit/context/trusted_information_spec.rb +25 -2
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +25 -2
- data/spec/unit/environments_spec.rb +65 -28
- data/spec/unit/face/facts_spec.rb +24 -20
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/plugin_spec.rb +12 -10
- data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
- data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
- data/spec/unit/file_system/uniquefile_spec.rb +11 -0
- data/spec/unit/file_system_spec.rb +26 -2
- data/spec/unit/functions/lookup_spec.rb +13 -0
- data/spec/unit/http/client_spec.rb +327 -35
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +34 -2
- data/spec/unit/http/response_spec.rb +75 -0
- data/spec/unit/http/service/ca_spec.rb +53 -11
- data/spec/unit/http/service/compiler_spec.rb +627 -0
- data/spec/unit/http/service/file_server_spec.rb +308 -0
- data/spec/unit/http/service/report_spec.rb +27 -9
- data/spec/unit/http/service_spec.rb +98 -5
- data/spec/unit/http/session_spec.rb +190 -7
- data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
- data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
- data/spec/unit/indirector/facts/rest_spec.rb +79 -24
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
- data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
- data/spec/unit/indirector/node/rest_spec.rb +57 -2
- data/spec/unit/indirector/report/rest_spec.rb +58 -51
- data/spec/unit/indirector/request_spec.rb +1 -1
- data/spec/unit/indirector/resource/ral_spec.rb +7 -8
- data/spec/unit/indirector/rest_spec.rb +13 -0
- data/spec/unit/indirector/status/rest_spec.rb +43 -2
- data/spec/unit/interface_spec.rb +3 -3
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/connection_spec.rb +559 -175
- data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
- data/spec/unit/network/http/pool_spec.rb +89 -11
- data/spec/unit/network/http_pool_spec.rb +63 -57
- data/spec/unit/network/http_spec.rb +1 -1
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/node/facts_spec.rb +2 -1
- data/spec/unit/node_spec.rb +7 -4
- data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
- data/spec/unit/pops/validator/validator_spec.rb +7 -2
- data/spec/unit/provider/aix_object_spec.rb +16 -2
- data/spec/unit/provider/group/groupadd_spec.rb +181 -56
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/apt_spec.rb +43 -2
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
- data/spec/unit/provider/package/dpkg_spec.rb +28 -6
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/openbsd_spec.rb +17 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +68 -19
- data/spec/unit/provider/package/pkg_spec.rb +15 -1
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/portage_spec.rb +5 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +292 -0
- data/spec/unit/provider/package/zypper_spec.rb +84 -0
- data/spec/unit/provider/service/init_spec.rb +1 -0
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openwrt_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +9 -0
- data/spec/unit/provider/service/systemd_spec.rb +92 -12
- data/spec/unit/provider/service/windows_spec.rb +22 -14
- data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +43 -24
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -26
- data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
- data/spec/unit/puppet_spec.rb +47 -0
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/resource_spec.rb +3 -3
- data/spec/unit/settings/autosign_setting_spec.rb +1 -1
- data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
- data/spec/unit/ssl/state_machine_spec.rb +99 -13
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction/persistence_spec.rb +1 -10
- data/spec/unit/transaction/report_spec.rb +5 -1
- data/spec/unit/transaction_spec.rb +0 -2
- data/spec/unit/type/file/ensure_spec.rb +1 -2
- data/spec/unit/type/file/source_spec.rb +89 -38
- data/spec/unit/type/file_spec.rb +122 -96
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/service_spec.rb +185 -8
- data/spec/unit/type/user_spec.rb +1 -2
- data/spec/unit/type_spec.rb +50 -0
- data/spec/unit/util/at_fork_spec.rb +3 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/checksums_spec.rb +16 -0
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +175 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +112 -42
- data/spec/unit/util/plist_spec.rb +20 -0
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/storage_spec.rb +1 -8
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/util_spec.rb +3 -3
- data/spec/unit/x509/cert_provider_spec.rb +1 -1
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +5 -35
- metadata +73 -12
- data/COMMITTERS.md +0 -244
- data/spec/integration/faces/plugin_spec.rb +0 -61
- data/spec/integration/test/test_helper_spec.rb +0 -31
    
        data/lib/puppet/util/at_fork.rb
    CHANGED
    
    | @@ -13,7 +13,7 @@ require 'puppet' | |
| 13 13 | 
             
            #   service.
         | 
| 14 14 | 
             
            module Puppet::Util::AtFork
         | 
| 15 15 | 
             
              @handler_class = loop do
         | 
| 16 | 
            -
                if  | 
| 16 | 
            +
                if Puppet::Util::Platform.solaris?
         | 
| 17 17 | 
             
                  begin
         | 
| 18 18 | 
             
                    require 'puppet/util/at_fork/solaris'
         | 
| 19 19 | 
             
                    # using break to return a value from the loop block
         | 
    
        data/lib/puppet/util/autoload.rb
    CHANGED
    
    | @@ -2,6 +2,7 @@ require 'pathname' | |
| 2 2 | 
             
            require 'puppet/util/rubygems'
         | 
| 3 3 | 
             
            require 'puppet/util/warnings'
         | 
| 4 4 | 
             
            require 'puppet/pops/adaptable'
         | 
| 5 | 
            +
            require 'puppet/concurrent/synchronized'
         | 
| 5 6 |  | 
| 6 7 | 
             
            # An adapter that ties the module_directories cache to the environment where the modules are parsed. This
         | 
| 7 8 | 
             
            # adapter ensures that the life-cycle of this cache doesn't exceed  the life-cycle of the environment.
         | 
| @@ -13,6 +14,9 @@ end | |
| 13 14 |  | 
| 14 15 | 
             
            # Autoload paths, either based on names or all at once.
         | 
| 15 16 | 
             
            class Puppet::Util::Autoload
         | 
| 17 | 
            +
              include Puppet::Concurrent::Synchronized
         | 
| 18 | 
            +
              extend Puppet::Concurrent::Synchronized
         | 
| 19 | 
            +
             | 
| 16 20 | 
             
              @loaded = {}
         | 
| 17 21 |  | 
| 18 22 | 
             
              class << self
         | 
| @@ -124,19 +128,6 @@ class Puppet::Util::Autoload | |
| 124 128 | 
             
                  end.directories
         | 
| 125 129 | 
             
                end
         | 
| 126 130 |  | 
| 127 | 
            -
                # @api private
         | 
| 128 | 
            -
                def vendored_modules
         | 
| 129 | 
            -
                  dir = Puppet[:vendormoduledir]
         | 
| 130 | 
            -
                  if dir && File.directory?(dir)
         | 
| 131 | 
            -
                    Dir.entries(dir)
         | 
| 132 | 
            -
                      .reject { |f| f =~ /^\./ }
         | 
| 133 | 
            -
                      .collect { |f| File.join(dir, f, "lib") }
         | 
| 134 | 
            -
                      .find_all { |d| FileTest.directory?(d) }
         | 
| 135 | 
            -
                  else
         | 
| 136 | 
            -
                    []
         | 
| 137 | 
            -
                  end
         | 
| 138 | 
            -
                end
         | 
| 139 | 
            -
             | 
| 140 131 | 
             
                # @api private
         | 
| 141 132 | 
             
                def gem_directories
         | 
| 142 133 | 
             
                  gem_source.directories
         | 
| @@ -164,11 +155,6 @@ class Puppet::Util::Autoload | |
| 164 155 | 
             
                  # "app_defaults_initialized?" method on the main puppet Settings object.
         | 
| 165 156 | 
             
                  # --cprice 2012-03-16
         | 
| 166 157 | 
             
                  if Puppet.settings.app_defaults_initialized?
         | 
| 167 | 
            -
                    unless @initialized
         | 
| 168 | 
            -
                      $LOAD_PATH.unshift(Puppet[:libdir])
         | 
| 169 | 
            -
                      $LOAD_PATH.concat(vendored_modules)
         | 
| 170 | 
            -
                      @initialized = true
         | 
| 171 | 
            -
                    end
         | 
| 172 158 | 
             
                    gem_directories + module_directories(env) + $LOAD_PATH
         | 
| 173 159 | 
             
                  else
         | 
| 174 160 | 
             
                    gem_directories + $LOAD_PATH
         | 
| @@ -7,11 +7,26 @@ require 'time' | |
| 7 7 | 
             
            module Puppet::Util::Checksums
         | 
| 8 8 | 
             
              module_function
         | 
| 9 9 |  | 
| 10 | 
            +
              KNOWN_CHECKSUMS = [
         | 
| 11 | 
            +
                :sha256, :sha256lite,
         | 
| 12 | 
            +
                :md5, :md5lite,
         | 
| 13 | 
            +
                :sha1, :sha1lite,
         | 
| 14 | 
            +
                :sha512,
         | 
| 15 | 
            +
                :sha384,
         | 
| 16 | 
            +
                :sha224,
         | 
| 17 | 
            +
                :mtime, :ctime, :none
         | 
| 18 | 
            +
              ].freeze
         | 
| 19 | 
            +
             | 
| 10 20 | 
             
              # It's not a good idea to use some of these in some contexts: for example, I
         | 
| 11 21 | 
             
              # wouldn't try bucketing a file using the :none checksum type.
         | 
| 12 22 | 
             
              def known_checksum_types
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
             | 
| 23 | 
            +
                KNOWN_CHECKSUMS
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def valid_checksum?(type, value)
         | 
| 27 | 
            +
                !!send("#{type}?", value)
         | 
| 28 | 
            +
              rescue NoMethodError
         | 
| 29 | 
            +
                false
         | 
| 15 30 | 
             
              end
         | 
| 16 31 |  | 
| 17 32 | 
             
              class FakeChecksum
         | 
| @@ -223,7 +238,7 @@ module Puppet::Util::Checksums | |
| 223 238 |  | 
| 224 239 | 
             
              # Return the :mtime timestamp of a file.
         | 
| 225 240 | 
             
              def mtime_file(filename)
         | 
| 226 | 
            -
                Puppet::FileSystem.stat(filename). | 
| 241 | 
            +
                Puppet::FileSystem.stat(filename).mtime
         | 
| 227 242 | 
             
              end
         | 
| 228 243 |  | 
| 229 244 | 
             
              # by definition this doesn't exist
         | 
| @@ -293,7 +308,7 @@ module Puppet::Util::Checksums | |
| 293 308 |  | 
| 294 309 | 
             
              # Return the :ctime of a file.
         | 
| 295 310 | 
             
              def ctime_file(filename)
         | 
| 296 | 
            -
                Puppet::FileSystem.stat(filename). | 
| 311 | 
            +
                Puppet::FileSystem.stat(filename).ctime
         | 
| 297 312 | 
             
              end
         | 
| 298 313 |  | 
| 299 314 | 
             
              def ctime_stream(&block)
         | 
| @@ -300,7 +300,7 @@ module Puppet::Util::FileParsing | |
| 300 300 | 
             
              def record_line(name, options, &block)
         | 
| 301 301 | 
             
                raise ArgumentError, _("Must include a list of fields") unless options.include?(:fields)
         | 
| 302 302 |  | 
| 303 | 
            -
                record = FileRecord.new(:record, options, &block)
         | 
| 303 | 
            +
                record = FileRecord.new(:record, **options, &block)
         | 
| 304 304 | 
             
                record.name = name.intern
         | 
| 305 305 |  | 
| 306 306 | 
             
                new_line_type(record)
         | 
| @@ -315,7 +315,7 @@ module Puppet::Util::FileParsing | |
| 315 315 | 
             
              def text_line(name, options, &block)
         | 
| 316 316 | 
             
                raise ArgumentError, _("You must provide a :match regex for text lines") unless options.include?(:match)
         | 
| 317 317 |  | 
| 318 | 
            -
                record = FileRecord.new(:text, options, &block)
         | 
| 318 | 
            +
                record = FileRecord.new(:text, **options, &block)
         | 
| 319 319 | 
             
                record.name = name.intern
         | 
| 320 320 |  | 
| 321 321 | 
             
                new_line_type(record)
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'puppet/util/autoload'
         | 
| 2 2 | 
             
            require 'puppet/util'
         | 
| 3 | 
            +
            require 'puppet/concurrent/lock'
         | 
| 3 4 |  | 
| 4 5 | 
             
            # A module that can easily autoload things for us.  Uses an instance
         | 
| 5 6 | 
             
            # of Puppet::Util::Autoload
         | 
| @@ -18,6 +19,7 @@ module Puppet::Util::InstanceLoader | |
| 18 19 | 
             
                type = type.intern
         | 
| 19 20 | 
             
                @instances[type] = {}
         | 
| 20 21 | 
             
                @autoloaders[type] = Puppet::Util::Autoload.new(self, path)
         | 
| 22 | 
            +
                @instance_loader_lock = Puppet::Concurrent::Lock.new
         | 
| 21 23 |  | 
| 22 24 | 
             
                # Now define our new simple methods
         | 
| 23 25 | 
             
                unless respond_to?(type)
         | 
| @@ -44,19 +46,21 @@ module Puppet::Util::InstanceLoader | |
| 44 46 |  | 
| 45 47 | 
             
              # Retrieve an already-loaded instance, or attempt to load our instance.
         | 
| 46 48 | 
             
              def loaded_instance(type, name)
         | 
| 47 | 
            -
                 | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
                   | 
| 52 | 
            -
                     | 
| 53 | 
            -
                       | 
| 49 | 
            +
                @instance_loader_lock.synchronize do
         | 
| 50 | 
            +
                  name = name.intern
         | 
| 51 | 
            +
                  instances = instance_hash(type)
         | 
| 52 | 
            +
                  return nil unless instances
         | 
| 53 | 
            +
                  unless instances.include? name
         | 
| 54 | 
            +
                    if instance_loader(type).load(name, Puppet.lookup(:current_environment))
         | 
| 55 | 
            +
                      unless instances.include? name
         | 
| 56 | 
            +
                        Puppet.warning(_("Loaded %{type} file for %{name} but %{type} was not defined") % { type: type, name: name })
         | 
| 57 | 
            +
                        return nil
         | 
| 58 | 
            +
                      end
         | 
| 59 | 
            +
                    else
         | 
| 54 60 | 
             
                      return nil
         | 
| 55 61 | 
             
                    end
         | 
| 56 | 
            -
                  else
         | 
| 57 | 
            -
                    return nil
         | 
| 58 62 | 
             
                  end
         | 
| 63 | 
            +
                  instances[name]
         | 
| 59 64 | 
             
                end
         | 
| 60 | 
            -
                instances[name]
         | 
| 61 65 | 
             
              end
         | 
| 62 66 | 
             
            end
         | 
| @@ -47,7 +47,7 @@ Puppet::Util::Log.newdesttype :file do | |
| 47 47 | 
             
              require 'fileutils'
         | 
| 48 48 |  | 
| 49 49 | 
             
              def self.match?(obj)
         | 
| 50 | 
            -
                Puppet::Util.absolute_path?(obj)
         | 
| 50 | 
            +
                obj.is_a?(String) && Puppet::Util.absolute_path?(obj)
         | 
| 51 51 | 
             
              end
         | 
| 52 52 |  | 
| 53 53 | 
             
              def close
         | 
| @@ -91,18 +91,9 @@ Puppet::Util::Log.newdesttype :file do | |
| 91 91 | 
             
                  end
         | 
| 92 92 | 
             
                end
         | 
| 93 93 |  | 
| 94 | 
            -
                file = File.open(path, | 
| 94 | 
            +
                file = File.open(path, File::WRONLY|File::CREAT|File::APPEND)
         | 
| 95 95 | 
             
                file.puts('[') if need_array_start
         | 
| 96 96 |  | 
| 97 | 
            -
                # Give ownership to the user and group puppet will run as
         | 
| 98 | 
            -
                if Puppet.features.root? && !Puppet::Util::Platform.windows? && !file_exists
         | 
| 99 | 
            -
                  begin
         | 
| 100 | 
            -
                    FileUtils.chown(Puppet[:user], Puppet[:group], path)
         | 
| 101 | 
            -
                  rescue ArgumentError, Errno::EPERM
         | 
| 102 | 
            -
                    Puppet.err _("Unable to set ownership to %{user}:%{group} for log file: %{path}") % { user: Puppet[:user], group: Puppet[:group], path: path }
         | 
| 103 | 
            -
                  end
         | 
| 104 | 
            -
                end
         | 
| 105 | 
            -
             | 
| 106 97 | 
             
                @file = file
         | 
| 107 98 |  | 
| 108 99 | 
             
                @autoflush = Puppet[:autoflush]
         | 
| @@ -0,0 +1,175 @@ | |
| 1 | 
            +
            module Puppet::Util::Package::Version
         | 
| 2 | 
            +
              class Debian < Numeric
         | 
| 3 | 
            +
                include Comparable
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # Version string matching regexes
         | 
| 6 | 
            +
                REGEX_EPOCH   = '(?:([0-9]+):)?'
         | 
| 7 | 
            +
                # alphanumerics and the characters . + - ~ , starts with a digit, ~ only of debian_revision is present
         | 
| 8 | 
            +
                REGEX_UPSTREAM_VERSION = '([\.\+~0-9a-zA-Z-]+?)'
         | 
| 9 | 
            +
                #alphanumerics and the characters + . ~
         | 
| 10 | 
            +
                REGEX_DEBIAN_REVISION = '(?:-([\.\+~0-9a-zA-Z]*))?'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                REGEX_FULL    = REGEX_EPOCH + REGEX_UPSTREAM_VERSION + REGEX_DEBIAN_REVISION.freeze
         | 
| 13 | 
            +
                REGEX_FULL_RX = /\A#{REGEX_FULL}\Z/
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                class ValidationFailure < ArgumentError; end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def self.parse(ver)
         | 
| 18 | 
            +
                  raise ValidationFailure, "Unable to parse '#{ver}' as a string" unless ver.is_a?(String)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  match, epoch, upstream_version, debian_revision = *ver.match(REGEX_FULL_RX)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  raise ValidationFailure, "Unable to parse '#{ver}' as a debian version identifier" unless match
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  new(epoch.to_i, upstream_version, debian_revision).freeze
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def to_s
         | 
| 28 | 
            +
                  s = @upstream_version
         | 
| 29 | 
            +
                  s = "#{@epoch}:#{s}" if @epoch != 0
         | 
| 30 | 
            +
                  s = "#{s}-#{@debian_revision}" if @debian_revision
         | 
| 31 | 
            +
                  s
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
                alias inspect to_s
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def eql?(other)
         | 
| 36 | 
            +
                  other.is_a?(self.class) &&
         | 
| 37 | 
            +
                    @epoch.eql?(other.epoch) &&
         | 
| 38 | 
            +
                    @upstream_version.eql?(other.upstream_version) &&
         | 
| 39 | 
            +
                    @debian_revision.eql?(other.debian_revision)
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
                alias == eql?
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def <=>(other)
         | 
| 44 | 
            +
                  return nil unless other.is_a?(self.class)
         | 
| 45 | 
            +
                  cmp = @epoch <=> other.epoch
         | 
| 46 | 
            +
                  if cmp == 0
         | 
| 47 | 
            +
                    cmp = compare_upstream_version(other)
         | 
| 48 | 
            +
                    if cmp == 0
         | 
| 49 | 
            +
                      cmp = compare_debian_revision(other)
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                  cmp
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                attr_reader :epoch, :upstream_version, :debian_revision
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                private
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                def initialize(epoch, upstream_version, debian_revision)
         | 
| 60 | 
            +
                  @epoch            = epoch
         | 
| 61 | 
            +
                  @upstream_version = upstream_version
         | 
| 62 | 
            +
                  @debian_revision  = debian_revision
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def compare_upstream_version(other)
         | 
| 66 | 
            +
                  mine = @upstream_version
         | 
| 67 | 
            +
                  yours = other.upstream_version
         | 
| 68 | 
            +
                  compare_debian_versions(mine, yours)
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                def compare_debian_revision(other)
         | 
| 72 | 
            +
                  mine = @debian_revision
         | 
| 73 | 
            +
                  yours = other.debian_revision
         | 
| 74 | 
            +
                  compare_debian_versions(mine, yours)
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def compare_debian_versions(mine, yours)
         | 
| 78 | 
            +
                  #   First the initial part of each string consisting entirely of non-digit characters is determined.
         | 
| 79 | 
            +
                  # These two parts (one of which may be empty) are compared lexically. If a difference is found it is
         | 
| 80 | 
            +
                  # returned. The lexical comparison is a comparison of ASCII values modified so that all the letters
         | 
| 81 | 
            +
                  # sort earlier than all the non-letters and so that a tilde sorts before anything, even the end of a
         | 
| 82 | 
            +
                  # part. For example, the following parts are in sorted order from earliest to latest: ~~, ~~a, ~, the
         | 
| 83 | 
            +
                  # empty part, a.
         | 
| 84 | 
            +
                  #
         | 
| 85 | 
            +
                  #   Then the initial part of the remainder of each string which consists entirely of digit characters
         | 
| 86 | 
            +
                  # is determined. The numerical values of these two parts are compared, and any difference found is
         | 
| 87 | 
            +
                  # returned as the result of the comparison. For these purposes an empty string (which can only occur
         | 
| 88 | 
            +
                  # at the end of one or both version strings being compared) counts as zero.
         | 
| 89 | 
            +
                  #
         | 
| 90 | 
            +
                  #   These two steps (comparing and removing initial non-digit strings and initial digit strings) are
         | 
| 91 | 
            +
                  # repeated until a difference is found or both strings are exhausted.
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  mine_index = 0
         | 
| 94 | 
            +
                  yours_index = 0
         | 
| 95 | 
            +
                  cmp = 0
         | 
| 96 | 
            +
                  mine ||= ''
         | 
| 97 | 
            +
                  yours ||= ''
         | 
| 98 | 
            +
                  while mine_index < mine.length && yours_index < yours.length && cmp == 0
         | 
| 99 | 
            +
                    #handle ~
         | 
| 100 | 
            +
                    _mymatch, mytilde = *match_tildes(mine.slice(mine_index..-1))
         | 
| 101 | 
            +
                    mytilde ||= ''
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    _yoursmatch, yourstilde = *match_tildes(yours.slice(yours_index..-1))
         | 
| 104 | 
            +
                    yourstilde ||= ''
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    cmp = -1 * (mytilde.length <=> yourstilde.length)
         | 
| 107 | 
            +
                    mine_index += mytilde.length
         | 
| 108 | 
            +
                    yours_index += yourstilde.length
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    if cmp == 0 # handle letters
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                      _mymatch, myletters = *match_letters(mine.slice(mine_index..-1))
         | 
| 113 | 
            +
                      myletters ||= ''
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                      _yoursmatch, yoursletters = *match_letters(yours.slice(yours_index..-1))
         | 
| 116 | 
            +
                      yoursletters ||= ''
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                      cmp = myletters <=> yoursletters
         | 
| 119 | 
            +
                      mine_index += myletters.length
         | 
| 120 | 
            +
                      yours_index += yoursletters.length
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                      if cmp == 0 # handle nonletters except tilde
         | 
| 123 | 
            +
                        _mymatch, mynon_letters = *match_non_letters(mine.slice(mine_index..-1))
         | 
| 124 | 
            +
                        mynon_letters ||= ''
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                        _yoursmatch, yoursnon_letters = *match_non_letters(yours.slice(yours_index..-1))
         | 
| 127 | 
            +
                        yoursnon_letters ||= ''
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                        cmp = mynon_letters <=> yoursnon_letters
         | 
| 130 | 
            +
                        mine_index += mynon_letters.length
         | 
| 131 | 
            +
                        yours_index += yoursnon_letters.length
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                        if cmp == 0 # handle digits
         | 
| 134 | 
            +
                          _mymatch, mydigits = *match_digits(mine.slice(mine_index..-1))
         | 
| 135 | 
            +
                          mydigits ||= ''
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                          _yoursmatch, yoursdigits = *match_digits(yours.slice(yours_index..-1))
         | 
| 138 | 
            +
                          yoursdigits ||= ''
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                          cmp = mydigits.to_i <=> yoursdigits.to_i
         | 
| 141 | 
            +
                          mine_index += mydigits.length
         | 
| 142 | 
            +
                          yours_index += yoursdigits.length
         | 
| 143 | 
            +
                        end
         | 
| 144 | 
            +
                      end
         | 
| 145 | 
            +
                    end
         | 
| 146 | 
            +
                  end
         | 
| 147 | 
            +
                  if cmp == 0
         | 
| 148 | 
            +
                    if mine_index < mine.length && match_tildes(mine[mine_index])
         | 
| 149 | 
            +
                      cmp = -1
         | 
| 150 | 
            +
                    elsif yours_index < yours.length && match_tildes(yours[yours_index])
         | 
| 151 | 
            +
                      cmp = 1
         | 
| 152 | 
            +
                    else
         | 
| 153 | 
            +
                      cmp = mine.length <=> yours.length
         | 
| 154 | 
            +
                    end
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
                  cmp
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                def match_digits(a)
         | 
| 160 | 
            +
                  a.match(/^([0-9]+)/)
         | 
| 161 | 
            +
                end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                def match_non_letters(a)
         | 
| 164 | 
            +
                  a.match(/^([\.\+-]+)/)
         | 
| 165 | 
            +
                end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                def match_tildes(a)
         | 
| 168 | 
            +
                  a.match(/^(~+)/)
         | 
| 169 | 
            +
                end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                def match_letters(a)
         | 
| 172 | 
            +
                  a.match(/^([A-Za-z]+)/)
         | 
| 173 | 
            +
                end
         | 
| 174 | 
            +
              end
         | 
| 175 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            module Puppet::Util::Package::Version
         | 
| 2 | 
            +
              class Gem < ::Gem::Version
         | 
| 3 | 
            +
                def self.parse(version)
         | 
| 4 | 
            +
                  raise ValidationFailure, version unless version.is_a? String
         | 
| 5 | 
            +
                  raise ValidationFailure, version unless version =~ ANCHORED_VERSION_PATTERN
         | 
| 6 | 
            +
                  new(version)
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                class ValidationFailure < ArgumentError
         | 
| 10 | 
            +
                  def initialize(version)
         | 
| 11 | 
            +
                    super("#{version} is not a valid ruby gem version.")
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,167 @@ | |
| 1 | 
            +
            module Puppet::Util::Package::Version
         | 
| 2 | 
            +
              class Pip
         | 
| 3 | 
            +
                include Comparable
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                VERSION_PATTERN = "
         | 
| 6 | 
            +
                  v?
         | 
| 7 | 
            +
                  (?:
         | 
| 8 | 
            +
                    (?:(?<epoch>[0-9]+)!)?                              # epoch
         | 
| 9 | 
            +
                    (?<release>[0-9]+(?:\\.[0-9]+)*)                    # release segment
         | 
| 10 | 
            +
                    (?<pre>                                             # pre-release
         | 
| 11 | 
            +
                      [-_\\.]?
         | 
| 12 | 
            +
                      (?<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
         | 
| 13 | 
            +
                      [-_\\.]?
         | 
| 14 | 
            +
                      (?<pre_n>[0-9]+)?
         | 
| 15 | 
            +
                    )?
         | 
| 16 | 
            +
                    (?<post>                                            # post release
         | 
| 17 | 
            +
                      (?:-(?<post_n1>[0-9]+))
         | 
| 18 | 
            +
                      |
         | 
| 19 | 
            +
                      (?:
         | 
| 20 | 
            +
                        [-_\\.]?
         | 
| 21 | 
            +
                        (?<post_l>post|rev|r)
         | 
| 22 | 
            +
                        [-_\\.]?
         | 
| 23 | 
            +
                        (?<post_n2>[0-9]+)?
         | 
| 24 | 
            +
                      )
         | 
| 25 | 
            +
                    )?
         | 
| 26 | 
            +
                    (?<dev>                                             # dev release
         | 
| 27 | 
            +
                      [-_\\.]?
         | 
| 28 | 
            +
                      (?<dev_l>dev)
         | 
| 29 | 
            +
                      [-_\\.]?
         | 
| 30 | 
            +
                      (?<dev_n>[0-9]+)?
         | 
| 31 | 
            +
                    )?
         | 
| 32 | 
            +
                  )
         | 
| 33 | 
            +
                  (?:\\+(?<local>[a-z0-9]+(?:[-_\\.][a-z0-9]+)*))?      # local version
         | 
| 34 | 
            +
                ".freeze
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def self.parse(version)
         | 
| 37 | 
            +
                  raise ValidationFailure, version.to_s unless version.is_a? String
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  matched = version.match(Regexp.new(("^\\s*") + VERSION_PATTERN + ("\\s*$"), Regexp::EXTENDED | Regexp::MULTILINE | Regexp::IGNORECASE))
         | 
| 40 | 
            +
                  raise ValidationFailure, version unless matched
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  new(matched)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def self.compare(version_a, version_b)
         | 
| 46 | 
            +
                  version_a = parse(version_a) unless version_a.is_a?(self)
         | 
| 47 | 
            +
                  version_b = parse(version_b) unless version_b.is_a?(self)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  version_a <=> version_b
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def to_s
         | 
| 53 | 
            +
                  parts = []
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  parts.push("#{@epoch_data}!")           if @epoch_data && @epoch_data != 0
         | 
| 56 | 
            +
                  parts.push(@release_data.join("."))     if @release_data
         | 
| 57 | 
            +
                  parts.push(@pre_data.join)              if @pre_data
         | 
| 58 | 
            +
                  parts.push(".post#{@post_data[1]}")     if @post_data
         | 
| 59 | 
            +
                  parts.push(".dev#{@dev_data[1]}")       if @dev_data
         | 
| 60 | 
            +
                  parts.push("+#{@local_data.join(".")}") if @local_data
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  parts.join
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                alias inspect to_s
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def eql?(other)
         | 
| 67 | 
            +
                  other.is_a?(self.class) && key.eql?(other.key)
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
                alias == eql?
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                def <=>(other)
         | 
| 72 | 
            +
                  raise ValidationFailure, other.to_s unless other.is_a?(self.class)
         | 
| 73 | 
            +
                  compare(key, other.key)
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                attr_reader :key
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                private
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def initialize(matched)
         | 
| 81 | 
            +
                  @epoch_data   = matched[:epoch].to_i
         | 
| 82 | 
            +
                  @release_data = matched[:release].split('.').map(&:to_i)                                       if matched[:release]
         | 
| 83 | 
            +
                  @pre_data     = parse_letter_version(matched[:pre_l], matched[:pre_n])                         if matched[:pre_l]  || matched[:pre_n]
         | 
| 84 | 
            +
                  @post_data    = parse_letter_version(matched[:post_l], matched[:post_n1] || matched[:post_n2]) if matched[:post_l] || matched[:post_n1] || matched[:post_n2]
         | 
| 85 | 
            +
                  @dev_data     = parse_letter_version(matched[:dev_l], matched[:dev_n])                         if matched[:dev_l]  || matched[:dev_n]
         | 
| 86 | 
            +
                  @local_data   = parse_local_version(matched[:local])                                           if matched[:local]
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  @key = compose_key(@epoch_data, @release_data, @pre_data, @post_data, @dev_data, @local_data)
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                def parse_letter_version(letter, number)
         | 
| 92 | 
            +
                  if letter
         | 
| 93 | 
            +
                    number = 0 if !number
         | 
| 94 | 
            +
                    letter.downcase!
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    if letter == "alpha"
         | 
| 97 | 
            +
                      letter = "a"
         | 
| 98 | 
            +
                    elsif letter == "beta"
         | 
| 99 | 
            +
                      letter = "b"
         | 
| 100 | 
            +
                    elsif ["c", "pre", "preview"].include?(letter)
         | 
| 101 | 
            +
                      letter = "rc"
         | 
| 102 | 
            +
                    elsif ["rev", "r"].include?(letter)
         | 
| 103 | 
            +
                      letter = "post"
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    return [letter, number.to_i]
         | 
| 107 | 
            +
                  end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                  ["post", number.to_i] if !letter && number
         | 
| 110 | 
            +
                end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                def parse_local_version(local_version)
         | 
| 113 | 
            +
                  local_version.split(/[\\._-]/).map{|part| part =~ /[0-9]+/ && part !~ /[a-zA-Z]+/ ? part.to_i : part.downcase} if local_version
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                def compose_key(epoch, release, pre, post, dev, local)
         | 
| 117 | 
            +
                  release_key = release.reverse
         | 
| 118 | 
            +
                  release_key.each_with_index do |element, index|
         | 
| 119 | 
            +
                    break unless element == 0
         | 
| 120 | 
            +
                    release_key.delete_at(index) unless release_key.at(index + 1) != 0
         | 
| 121 | 
            +
                  end
         | 
| 122 | 
            +
                  release_key.reverse!
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                  if !pre && !post && dev
         | 
| 125 | 
            +
                    pre_key = -Float::INFINITY
         | 
| 126 | 
            +
                  else
         | 
| 127 | 
            +
                    pre_key = pre || Float::INFINITY
         | 
| 128 | 
            +
                  end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                  post_key = post || -Float::INFINITY
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                  dev_key = dev || Float::INFINITY
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                  if !local
         | 
| 135 | 
            +
                    local_key = [[-Float::INFINITY, ""]]
         | 
| 136 | 
            +
                  else
         | 
| 137 | 
            +
                    local_key = local.map{|i| (i.is_a? Integer) ? [i, ""] : [-Float::INFINITY, i]}
         | 
| 138 | 
            +
                  end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                  [epoch, release_key, pre_key, post_key, dev_key, local_key]
         | 
| 141 | 
            +
                end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                def compare(this, other)
         | 
| 144 | 
            +
                  if (this.is_a? Array) && (other.is_a? Array)
         | 
| 145 | 
            +
                    this  << -Float::INFINITY if this.length < other.length
         | 
| 146 | 
            +
                    other << -Float::INFINITY if this.length > other.length
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                    this.each_with_index do |element, index|
         | 
| 149 | 
            +
                      return compare(element, other.at(index)) if element != other.at(index)
         | 
| 150 | 
            +
                    end
         | 
| 151 | 
            +
                  elsif (this.is_a? Array) && !(other.is_a? Array)
         | 
| 152 | 
            +
                    raise Puppet::Error, 'Cannot compare #{this} (Array) with #{other} (#{other.class}). Only ±Float::INFINITY accepted.' unless other.abs == Float::INFINITY
         | 
| 153 | 
            +
                    return other == -Float::INFINITY ? 1 : -1
         | 
| 154 | 
            +
                  elsif !(this.is_a? Array) && (other.is_a? Array)
         | 
| 155 | 
            +
                    raise Puppet::Error, 'Cannot compare #{this} (#{this.class}) with #{other} (Array). Only ±Float::INFINITY accepted.' unless this.abs == Float::INFINITY
         | 
| 156 | 
            +
                    return this == -Float::INFINITY ? -1 : 1
         | 
| 157 | 
            +
                  end
         | 
| 158 | 
            +
                  this <=> other
         | 
| 159 | 
            +
                end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                class ValidationFailure < ArgumentError
         | 
| 162 | 
            +
                  def initialize(version)
         | 
| 163 | 
            +
                    super("#{version} is not a valid python package version. Please refer to https://www.python.org/dev/peps/pep-0440/.")
         | 
| 164 | 
            +
                  end
         | 
| 165 | 
            +
                end
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
            end
         |