r10k 3.14.1 → 5.0.1
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 +4 -4
- data/.github/dependabot.yml +17 -0
- data/.github/workflows/docker.yml +9 -4
- data/.github/workflows/release.yml +3 -2
- data/.github/workflows/rspec_tests.yml +8 -10
- data/CHANGELOG.mkd +100 -0
- data/CODEOWNERS +1 -2
- data/Gemfile +2 -2
- data/README.mkd +18 -19
- data/doc/common-patterns.mkd +1 -2
- data/doc/dynamic-environments/configuration.mkd +91 -12
- data/doc/dynamic-environments/usage.mkd +4 -0
- data/doc/dynamic-environments/workflow-guide.mkd +3 -3
- data/doc/faq.mkd +1 -1
- data/doc/puppetfile.mkd +9 -3
- data/integration/Gemfile +3 -4
- data/integration/Rakefile +58 -23
- data/integration/files/pre-suite/git_config.pp.erb +1 -1
- data/integration/pre-suite/00_pe_install.rb +3 -0
- data/integration/pre-suite/10_git_config.rb +1 -3
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +5 -4
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +1 -1
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +2 -2
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +2 -2
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +3 -3
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +3 -3
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +0 -3
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +0 -3
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +5 -10
- data/integration/tests/git_source/git_source_git.rb +1 -4
- data/integration/tests/git_source/git_source_repeated_remote.rb +2 -5
- data/integration/tests/git_source/git_source_submodule.rb +1 -1
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +1 -1
- data/integration/tests/purging/content_not_purged_at_root.rb +2 -5
- data/integration/tests/purging/default_purging.rb +0 -3
- data/integration/tests/purging/{does_not_purge_files_on_white_list.rb → does_not_purge_files_on_allowlist.rb} +2 -5
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +3 -2
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +1 -5
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +1 -1
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +0 -3
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +1 -4
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +0 -3
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +0 -3
- data/lib/r10k/action/deploy/environment.rb +2 -19
- data/lib/r10k/action/deploy/module.rb +1 -0
- data/lib/r10k/action/puppetfile/check.rb +7 -0
- data/lib/r10k/action/puppetfile/install.rb +3 -1
- data/lib/r10k/cli/deploy.rb +15 -1
- data/lib/r10k/cli/puppetfile.rb +1 -0
- data/lib/r10k/content_synchronizer.rb +7 -2
- data/lib/r10k/environment/with_modules.rb +24 -1
- data/lib/r10k/environment.rb +0 -1
- data/lib/r10k/git/rugged/bare_repository.rb +5 -4
- data/lib/r10k/git/rugged/thin_repository.rb +7 -0
- data/lib/r10k/git/rugged/working_repository.rb +13 -7
- data/lib/r10k/git/shellgit/thin_repository.rb +5 -1
- data/lib/r10k/git/shellgit/working_repository.rb +5 -4
- data/lib/r10k/git/stateful_repository.rb +4 -4
- data/lib/r10k/module/base.rb +3 -3
- data/lib/r10k/module/git.rb +19 -5
- data/lib/r10k/module_loader/puppetfile/dsl.rb +4 -0
- data/lib/r10k/module_loader/puppetfile.rb +22 -14
- data/lib/r10k/puppetfile.rb +1 -1
- data/lib/r10k/settings/container.rb +1 -0
- data/lib/r10k/settings.rb +6 -7
- data/lib/r10k/tarball.rb +1 -1
- data/lib/r10k/version.rb +1 -1
- data/locales/r10k.pot +34 -82
- data/r10k.gemspec +8 -18
- metadata +40 -213
- data/.github/workflows/stale.yml +0 -21
- data/.travis.yml +0 -42
- data/docker/.gitignore +0 -1
- data/docker/.rspec +0 -4
- data/docker/Gemfile +0 -11
- data/docker/Makefile +0 -92
- data/docker/README.md +0 -28
- data/docker/docker-compose.yml +0 -18
- data/docker/r10k/Dockerfile +0 -68
- data/docker/r10k/adduser.sh +0 -13
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +0 -30
- data/docker/r10k/docker-entrypoint.sh +0 -10
- data/docker/r10k/release.Dockerfile +0 -55
- data/docker/spec/dockerfile_spec.rb +0 -37
- data/docker/spec/fixtures/Puppetfile +0 -2
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +0 -83
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +0 -128
- data/integration/tests/purging/invalid_whitelist_types.rb +0 -63
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +0 -49
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +0 -68
- data/lib/r10k/environment/bare.rb +0 -13
- 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 +0 -1
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +0 -8
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +0 -19
- data/spec/fixtures/tarball/tarball.tar.gz +0 -0
- data/spec/fixtures/unit/action/r10k.yaml +0 -5
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +0 -2
- data/spec/fixtures/unit/action/r10k_creds.yaml +0 -9
- data/spec/fixtures/unit/action/r10k_forge_auth.yaml +0 -4
- data/spec/fixtures/unit/action/r10k_forge_auth_no_url.yaml +0 -3
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +0 -3
- data/spec/fixtures/unit/action/r10k_logging.yaml +0 -12
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +0 -3
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +0 -5
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +0 -10
- data/spec/fixtures/unit/puppetfile/forge-override/Puppetfile +0 -8
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +0 -1
- data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile +0 -10
- data/spec/fixtures/unit/puppetfile/various-modules/Puppetfile.new +0 -10
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/managed_symlink_file +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_allowlisted_2/ignored_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/managed_subdir_1/unmanaged_symlink_dir +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_symlink_dir +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_symlink_file +0 -1
- data/spec/fixtures/unit/util/purgeable/managed_two/.hidden/unmanaged_3 +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 +0 -3
- data/spec/integration/git/rugged/bare_repository_spec.rb +0 -13
- data/spec/integration/git/rugged/cache_spec.rb +0 -33
- data/spec/integration/git/rugged/thin_repository_spec.rb +0 -14
- data/spec/integration/git/rugged/working_repository_spec.rb +0 -48
- data/spec/integration/git/shellgit/bare_repository_spec.rb +0 -13
- data/spec/integration/git/shellgit/thin_repository_spec.rb +0 -14
- data/spec/integration/git/shellgit/working_repository_spec.rb +0 -13
- data/spec/integration/git/stateful_repository_spec.rb +0 -159
- data/spec/integration/util/purageable_spec.rb +0 -41
- data/spec/matchers/exit_with.rb +0 -28
- data/spec/matchers/match_realpath.rb +0 -18
- data/spec/r10k-mocks/mock_config.rb +0 -33
- data/spec/r10k-mocks/mock_env.rb +0 -18
- data/spec/r10k-mocks/mock_source.rb +0 -17
- data/spec/r10k-mocks.rb +0 -3
- data/spec/shared-contexts/git-fixtures.rb +0 -55
- data/spec/shared-contexts/tarball.rb +0 -32
- data/spec/shared-examples/deploy-actions.rb +0 -69
- data/spec/shared-examples/git/bare_repository.rb +0 -132
- data/spec/shared-examples/git/thin_repository.rb +0 -26
- data/spec/shared-examples/git/working_repository.rb +0 -207
- data/spec/shared-examples/git-repository.rb +0 -38
- data/spec/shared-examples/puppetfile-action.rb +0 -39
- data/spec/shared-examples/settings/ancestry.rb +0 -44
- data/spec/shared-examples/subprocess-runner.rb +0 -89
- data/spec/spec_helper.rb +0 -41
- data/spec/unit/action/cri_runner_spec.rb +0 -72
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +0 -38
- data/spec/unit/action/deploy/display_spec.rb +0 -61
- data/spec/unit/action/deploy/environment_spec.rb +0 -640
- data/spec/unit/action/deploy/module_spec.rb +0 -476
- data/spec/unit/action/puppetfile/check_spec.rb +0 -53
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +0 -47
- data/spec/unit/action/puppetfile/install_spec.rb +0 -112
- data/spec/unit/action/puppetfile/purge_spec.rb +0 -60
- data/spec/unit/action/runner_spec.rb +0 -407
- data/spec/unit/action/visitor_spec.rb +0 -39
- data/spec/unit/cli_spec.rb +0 -9
- data/spec/unit/deployment/config_spec.rb +0 -33
- data/spec/unit/deployment_spec.rb +0 -162
- data/spec/unit/environment/bare_spec.rb +0 -13
- data/spec/unit/environment/base_spec.rb +0 -122
- data/spec/unit/environment/git_spec.rb +0 -114
- data/spec/unit/environment/name_spec.rb +0 -181
- data/spec/unit/environment/plain_spec.rb +0 -8
- data/spec/unit/environment/svn_spec.rb +0 -146
- data/spec/unit/environment/tarball_spec.rb +0 -45
- data/spec/unit/environment/with_modules_spec.rb +0 -75
- data/spec/unit/errors/formatting_spec.rb +0 -84
- data/spec/unit/feature_spec.rb +0 -50
- data/spec/unit/forge/module_release_spec.rb +0 -213
- data/spec/unit/git/alternates_spec.rb +0 -116
- data/spec/unit/git/cache_spec.rb +0 -66
- data/spec/unit/git/rugged/cache_spec.rb +0 -48
- data/spec/unit/git/rugged/credentials_spec.rb +0 -215
- data/spec/unit/git/shellgit/cache_spec.rb +0 -27
- data/spec/unit/git/stateful_repository_spec.rb +0 -45
- data/spec/unit/git_spec.rb +0 -102
- data/spec/unit/initializers_spec.rb +0 -68
- data/spec/unit/instance_cache_spec.rb +0 -78
- data/spec/unit/keyed_factory_spec.rb +0 -51
- data/spec/unit/logging/terminaloutputter_spec.rb +0 -53
- data/spec/unit/logging_spec.rb +0 -68
- data/spec/unit/module/base_spec.rb +0 -118
- data/spec/unit/module/forge_spec.rb +0 -271
- data/spec/unit/module/git_spec.rb +0 -387
- data/spec/unit/module/metadata_file_spec.rb +0 -68
- data/spec/unit/module/svn_spec.rb +0 -208
- data/spec/unit/module/tarball_spec.rb +0 -70
- data/spec/unit/module_loader/puppetfile_spec.rb +0 -421
- data/spec/unit/module_spec.rb +0 -114
- data/spec/unit/puppetfile_spec.rb +0 -304
- data/spec/unit/settings/collection_spec.rb +0 -123
- data/spec/unit/settings/container_spec.rb +0 -92
- data/spec/unit/settings/definition_spec.rb +0 -79
- data/spec/unit/settings/enum_definition_spec.rb +0 -20
- data/spec/unit/settings/inheritance_spec.rb +0 -38
- data/spec/unit/settings/list_spec.rb +0 -88
- data/spec/unit/settings/loader_spec.rb +0 -110
- data/spec/unit/settings/uri_definition_spec.rb +0 -23
- data/spec/unit/settings_spec.rb +0 -303
- data/spec/unit/source/base_spec.rb +0 -31
- data/spec/unit/source/exec_spec.rb +0 -81
- data/spec/unit/source/git_spec.rb +0 -233
- data/spec/unit/source/hash_spec.rb +0 -54
- data/spec/unit/source/svn_spec.rb +0 -196
- data/spec/unit/source/yaml_spec.rb +0 -42
- data/spec/unit/source_spec.rb +0 -10
- data/spec/unit/svn/remote_spec.rb +0 -21
- data/spec/unit/svn/working_dir_spec.rb +0 -56
- data/spec/unit/tarball_spec.rb +0 -57
- data/spec/unit/util/attempt_spec.rb +0 -82
- data/spec/unit/util/cacheable_spec.rb +0 -23
- data/spec/unit/util/commands_spec.rb +0 -61
- data/spec/unit/util/downloader_spec.rb +0 -98
- data/spec/unit/util/exec_env_spec.rb +0 -56
- data/spec/unit/util/purgeable_spec.rb +0 -267
- data/spec/unit/util/setopts_spec.rb +0 -83
- data/spec/unit/util/subprocess/result_spec.rb +0 -36
- data/spec/unit/util/subprocess/runner/posix_spec.rb +0 -7
- data/spec/unit/util/subprocess/runner/pump_spec.rb +0 -79
- data/spec/unit/util/subprocess/runner/windows_spec.rb +0 -7
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +0 -26
- data/spec/unit/util/subprocess_spec.rb +0 -65
- data/spec/unit/util/symbolize_keys_spec.rb +0 -67
@@ -1,233 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/source'
|
3
|
-
|
4
|
-
describe R10K::Source::Git do
|
5
|
-
|
6
|
-
subject do
|
7
|
-
described_class.new('mysource', '/some/nonexistent/dir',
|
8
|
-
{:remote => 'https://git-server/repo.git'})
|
9
|
-
end
|
10
|
-
|
11
|
-
it "stores the name" do
|
12
|
-
expect(subject.name).to eq 'mysource'
|
13
|
-
end
|
14
|
-
|
15
|
-
it "stores the basedir" do
|
16
|
-
expect(subject.basedir).to eq '/some/nonexistent/dir'
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "preloading" do
|
20
|
-
it "fetches the git cache" do
|
21
|
-
expect(subject.cache).to receive(:sync)
|
22
|
-
subject.preload!
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "lazily generating environments" do
|
27
|
-
it "returns an empty list of environments when the cache has not been created" do
|
28
|
-
allow(subject.cache).to receive(:cached?).and_return false
|
29
|
-
expect(subject.environments).to be_empty
|
30
|
-
end
|
31
|
-
|
32
|
-
it "generates environments when the cache is present and environments have not been loaded" do
|
33
|
-
allow(subject.cache).to receive(:cached?).and_return true
|
34
|
-
allow(subject).to receive(:generate_environments).and_return %w[hi]
|
35
|
-
expect(subject.environments.size).to eq(1)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "doesn't recreate environments if they have already been loaded" do
|
39
|
-
allow(subject.cache).to receive(:cached?).and_return true
|
40
|
-
allow(subject).to receive(:generate_environments).once.and_return %w[hi]
|
41
|
-
expect(subject.environments.size).to eq(1)
|
42
|
-
expect(subject.environments.size).to eq(1)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "eagerly generating environments" do
|
47
|
-
before do
|
48
|
-
allow(subject.cache).to receive(:branches).and_return %w[master]
|
49
|
-
end
|
50
|
-
|
51
|
-
let(:master_env) { subject.generate_environments.first }
|
52
|
-
|
53
|
-
it "creates an environment for each branch" do
|
54
|
-
expect(subject.generate_environments.size).to eq(1)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "copies the source remote to the environment" do
|
58
|
-
expect(master_env.remote).to eq subject.remote
|
59
|
-
end
|
60
|
-
|
61
|
-
it "uses the branch name as the directory by default" do
|
62
|
-
expect(master_env.dirname).to eq 'master'
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
describe "generate_environments respects ignore_branch_prefixes setting" do
|
67
|
-
before do
|
68
|
-
allow(subject.cache).to receive(:branches).and_return ['master', 'development', 'production', 'not_dev_test_me', 'dev_test', 'dev', 'test_2']
|
69
|
-
subject.instance_variable_set(:@ignore_branch_prefixes, ['dev', 'test'])
|
70
|
-
end
|
71
|
-
|
72
|
-
let(:environments) { subject.generate_environments }
|
73
|
-
|
74
|
-
it "creates an environment for each branch not in ignore_branch_prefixes" do
|
75
|
-
expect(subject.generate_environments.size).to eq(3)
|
76
|
-
end
|
77
|
-
|
78
|
-
it "copies the source remote to the environment" do
|
79
|
-
expect(environments[0].remote).to eq subject.remote
|
80
|
-
expect(environments[1].remote).to eq subject.remote
|
81
|
-
expect(environments[2].remote).to eq subject.remote
|
82
|
-
end
|
83
|
-
|
84
|
-
it "uses the branch name as the directory by default" do
|
85
|
-
expect(environments[0].dirname).to eq 'master'
|
86
|
-
expect(environments[1].dirname).to eq 'production'
|
87
|
-
expect(environments[2].dirname).to eq 'not_dev_test_me'
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe "filtering branches with ignore prefixes" do
|
92
|
-
let(:branches) { ['master', 'development', 'production', 'not_dev_test_me', 'dev_test', 'dev', 'test_2'] }
|
93
|
-
let(:ignore_prefixes) { ['dev', 'test'] }
|
94
|
-
|
95
|
-
it "filters branches" do
|
96
|
-
expect(subject.filter_branches_by_regexp(branches, ignore_prefixes)).to eq(['master', 'production', 'not_dev_test_me'])
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
describe "filtering branches with command" do
|
101
|
-
let(:branches) { ['master', 'development', 'production'] }
|
102
|
-
if R10K::Util::Platform.windows?
|
103
|
-
let(:filter_command) { 'powershell.exe if ($env:R10K_BRANCH.equals(\"development\")) {exit 1} else {exit 0}' }
|
104
|
-
else
|
105
|
-
let(:filter_command) { 'sh -c "[ $R10K_BRANCH != development ]"' }
|
106
|
-
end
|
107
|
-
|
108
|
-
it "filters branches" do
|
109
|
-
expect(subject.filter_branches_by_command(branches, filter_command)).to eq(['master', 'production'])
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe "generate_environments respects filter_command setting" do
|
114
|
-
before do
|
115
|
-
allow(subject.cache).to receive(:branches).and_return ['master', 'development', 'production']
|
116
|
-
if R10K::Util::Platform.windows?
|
117
|
-
subject.instance_variable_set(:@filter_command, 'powershell.exe if ($env:R10K_BRANCH.equals(\"master\")) {exit 1} else {exit 0}')
|
118
|
-
else
|
119
|
-
subject.instance_variable_set(:@filter_command, '[ $R10K_BRANCH != master ]')
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
let(:environments) { subject.generate_environments }
|
124
|
-
|
125
|
-
it "creates an environment for each branch not filtered by filter_command" do
|
126
|
-
expect(subject.generate_environments.size).to eq(2)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
describe "generate_environments respects filter_command setting and name" do
|
131
|
-
before do
|
132
|
-
allow(subject.cache).to receive(:branches).and_return ['master', 'development', 'production']
|
133
|
-
if R10K::Util::Platform.windows?
|
134
|
-
subject.instance_variable_set(:@filter_command, 'powershell.exe if ($env:R10K_NAME.equals(\"mysource\")) {exit 0} else {exit 1}')
|
135
|
-
else
|
136
|
-
subject.instance_variable_set(:@filter_command, '[ $R10K_NAME = mysource ]')
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
let(:environments) { subject.generate_environments }
|
141
|
-
|
142
|
-
it "creates an environment for each branch not filtered by filter_command" do
|
143
|
-
expect(subject.generate_environments.size).to eq(3)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
describe R10K::Source::Git, "handling invalid branch names" do
|
150
|
-
%w[correct_and_warn correct].each do |setting|
|
151
|
-
describe "when invalid is #{setting}" do
|
152
|
-
subject do
|
153
|
-
described_class.new('/some/nonexistent/dir', 'mysource', {
|
154
|
-
:remote => 'https://git-server/repo.git',
|
155
|
-
:invalid_branches => setting
|
156
|
-
})
|
157
|
-
end
|
158
|
-
|
159
|
-
before do
|
160
|
-
allow(subject.cache).to receive(:branches).and_return ['master', 'invalid-branch']
|
161
|
-
end
|
162
|
-
|
163
|
-
it "creates an environment for each branch" do
|
164
|
-
expect(subject.generate_environments.size).to eq(2)
|
165
|
-
end
|
166
|
-
|
167
|
-
it "removes invalid characters from branch names" do
|
168
|
-
invalid_env = subject.generate_environments.last
|
169
|
-
expect(invalid_env.dirname).to eq 'invalid_branch'
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
describe "when invalid is 'error'" do
|
175
|
-
subject do
|
176
|
-
described_class.new('/some/nonexistent/dir', 'mysource', {
|
177
|
-
:remote => 'https://git-server/repo.git',
|
178
|
-
:invalid_branches => 'error',
|
179
|
-
})
|
180
|
-
end
|
181
|
-
|
182
|
-
before do
|
183
|
-
allow(subject.cache).to receive(:branches).and_return ['master', 'invalid-branch']
|
184
|
-
end
|
185
|
-
|
186
|
-
it "only creates an environment for valid branches" do
|
187
|
-
expect(subject.generate_environments.size).to eq(1)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
# Since prefixing is an immutable property of a source, it's easier to create
|
193
|
-
# a new context and duplicate stubs in a single location rather than packing a
|
194
|
-
# single test with all the stubs that entirely recreate the source.
|
195
|
-
describe R10K::Source::Git, 'when prefixing is enabled' do
|
196
|
-
subject do
|
197
|
-
described_class.new(
|
198
|
-
'prefixed',
|
199
|
-
'/some/nonexistent/dir',
|
200
|
-
{
|
201
|
-
:prefix => true,
|
202
|
-
:remote => 'https://git-server/repo.git',
|
203
|
-
})
|
204
|
-
end
|
205
|
-
|
206
|
-
describe "generating prefixed environments" do
|
207
|
-
before do
|
208
|
-
allow(subject.cache).to receive(:cached?).and_return true
|
209
|
-
allow(subject.cache).to receive(:branches).and_return %w[master other]
|
210
|
-
end
|
211
|
-
|
212
|
-
let(:environments) { subject.environments }
|
213
|
-
|
214
|
-
it "creates an environment for each branch" do
|
215
|
-
expect(subject.environments.size).to eq(2)
|
216
|
-
end
|
217
|
-
|
218
|
-
it "prefixes the source name to environments when prefixing is enabled" do
|
219
|
-
expect(environments[0].dirname).to eq 'prefixed_master'
|
220
|
-
expect(environments[1].dirname).to eq 'prefixed_other'
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
describe R10K::Source::Git, 'registering as a source' do
|
226
|
-
it "registers with the :git key" do
|
227
|
-
expect(R10K::Source.retrieve(:git)).to eq described_class
|
228
|
-
end
|
229
|
-
|
230
|
-
it "registers with the nil key" do
|
231
|
-
expect(R10K::Source.retrieve(nil)).to eq described_class
|
232
|
-
end
|
233
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/source'
|
3
|
-
|
4
|
-
describe R10K::Source::Hash do
|
5
|
-
|
6
|
-
describe '.valid_environments_hash?' do
|
7
|
-
it "rejects strings" do
|
8
|
-
expect(R10K::Source::Hash.valid_environments_hash?('200 OK'))
|
9
|
-
.to eq false
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:environments_hash) do
|
14
|
-
{
|
15
|
-
'production' => {
|
16
|
-
'remote' => 'https://git.example.com/puppet/control-repo.git',
|
17
|
-
'ref' => 'release-141',
|
18
|
-
'modules' => {
|
19
|
-
'puppetlabs-stdlib' => '6.1.0',
|
20
|
-
'puppetlabs-ntp' => '8.1.0',
|
21
|
-
'example-myapp1' => {
|
22
|
-
'git' => 'https://git.example.com/puppet/example-myapp1.git',
|
23
|
-
'ref' => 'v1.3.0'
|
24
|
-
}
|
25
|
-
}
|
26
|
-
},
|
27
|
-
'development' => {
|
28
|
-
'remote' => 'https://git.example.com/puppet/control-repo.git',
|
29
|
-
'ref' => 'master',
|
30
|
-
'modules' => {
|
31
|
-
'puppetlabs-stdlib' => '6.1.0',
|
32
|
-
'puppetlabs-ntp' => '8.1.0',
|
33
|
-
'example-myapp1' => {
|
34
|
-
'git' => 'https://git.example.com/puppet/example-myapp1.git',
|
35
|
-
'ref' => 'v1.3.1'
|
36
|
-
}
|
37
|
-
}
|
38
|
-
}
|
39
|
-
}
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "with a prefix" do
|
43
|
-
subject do
|
44
|
-
described_class.new('hashsource', '/some/nonexistent/dir',
|
45
|
-
prefix: 'prefixed', environments: environments_hash)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "prepends environment names with a prefix" do
|
49
|
-
environments = subject.environments
|
50
|
-
expect(environments[0].dirname).to eq 'prefixed_production'
|
51
|
-
expect(environments[1].dirname).to eq 'prefixed_development'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,196 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/source'
|
3
|
-
|
4
|
-
describe R10K::Source::SVN do
|
5
|
-
|
6
|
-
subject do
|
7
|
-
described_class.new('mysource', '/some/nonexistent/dir',
|
8
|
-
{:remote => 'https://svn-server.site/repo'})
|
9
|
-
end
|
10
|
-
|
11
|
-
it "stores the name" do
|
12
|
-
expect(subject.name).to eq 'mysource'
|
13
|
-
end
|
14
|
-
|
15
|
-
it "stores the basedir" do
|
16
|
-
expect(subject.basedir).to eq '/some/nonexistent/dir'
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
describe "lazily generating environments" do
|
21
|
-
it "generates environments when they have not been loaded" do
|
22
|
-
expect(subject).to receive(:generate_environments).and_return %w[hi]
|
23
|
-
expect(subject.environments).to eq %w[hi]
|
24
|
-
end
|
25
|
-
|
26
|
-
it "doesn't recreate environments if they have already been loaded" do
|
27
|
-
expect(subject).to receive(:generate_environments).once.and_return %w[hi]
|
28
|
-
subject.environments
|
29
|
-
subject.environments
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe "eagerly generating environments" do
|
34
|
-
before do
|
35
|
-
allow(subject.svn_remote).to receive(:branches).and_return %w[apache dns robobutler]
|
36
|
-
end
|
37
|
-
|
38
|
-
let(:environments) { subject.generate_environments }
|
39
|
-
|
40
|
-
it "creates an environment for each branch and the trunk" do
|
41
|
-
expect(environments[0].name).to eq 'production'
|
42
|
-
expect(environments[1].name).to eq 'apache'
|
43
|
-
expect(environments[2].name).to eq 'dns'
|
44
|
-
expect(environments[3].name).to eq 'robobutler'
|
45
|
-
end
|
46
|
-
|
47
|
-
it "maps trunk to production" do
|
48
|
-
expect(environments[0].remote).to eq 'https://svn-server.site/repo/trunk'
|
49
|
-
end
|
50
|
-
|
51
|
-
it "sets the remote for branch environments to subdirectories of the branches/ directory" do
|
52
|
-
expect(environments[1].remote).to eq 'https://svn-server.site/repo/branches/apache'
|
53
|
-
expect(environments[2].remote).to eq 'https://svn-server.site/repo/branches/dns'
|
54
|
-
expect(environments[3].remote).to eq 'https://svn-server.site/repo/branches/robobutler'
|
55
|
-
end
|
56
|
-
|
57
|
-
it "uses the branch name as the directory by default" do
|
58
|
-
expect(environments[0].dirname).to eq 'production'
|
59
|
-
expect(environments[1].dirname).to eq 'apache'
|
60
|
-
expect(environments[2].dirname).to eq 'dns'
|
61
|
-
expect(environments[3].dirname).to eq 'robobutler'
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe "generate_environments respects ignore_branch_prefixes setting" do
|
66
|
-
before do
|
67
|
-
allow(subject.svn_remote).to receive(:branches).and_return ['master', 'development', 'not_dev_test_me', 'dev_test', 'dev', 'test_2']
|
68
|
-
subject.instance_variable_set(:@ignore_branch_prefixes, ['dev', 'test'])
|
69
|
-
end
|
70
|
-
|
71
|
-
let(:environments) { subject.generate_environments }
|
72
|
-
|
73
|
-
it "creates an environment for each branch not in ignore_branch_prefixes" do
|
74
|
-
expect(subject.generate_environments.size).to eq(3)
|
75
|
-
end
|
76
|
-
|
77
|
-
it "uses the branch name as the directory by default" do
|
78
|
-
expect(environments[0].name).to eq 'production'
|
79
|
-
expect(environments[1].name).to eq 'master'
|
80
|
-
expect(environments[2].name).to eq 'not_dev_test_me'
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
describe "filtering branches with ignore prefixes" do
|
85
|
-
let(:branches) { ['master', 'development', 'production', 'not_dev_test_me', 'dev_test', 'dev', 'test_2'] }
|
86
|
-
let(:ignore_prefixes) { ['dev', 'test'] }
|
87
|
-
|
88
|
-
it "filters branches" do
|
89
|
-
expect(subject.filter_branches(branches, ignore_prefixes)).to eq(['master', 'production', 'not_dev_test_me'])
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
describe R10K::Source::SVN, 'when prefixing is enabled' do
|
95
|
-
subject do
|
96
|
-
described_class.new(
|
97
|
-
'mysource',
|
98
|
-
'/some/nonexistent/dir',
|
99
|
-
{
|
100
|
-
:remote => 'https://svn-server.site/repo',
|
101
|
-
:prefix => true
|
102
|
-
}
|
103
|
-
)
|
104
|
-
end
|
105
|
-
|
106
|
-
describe "generating prefixed environments" do
|
107
|
-
before do
|
108
|
-
allow(subject.svn_remote).to receive(:branches).and_return %w[apache dns robobutler]
|
109
|
-
end
|
110
|
-
|
111
|
-
let(:environments) { subject.generate_environments }
|
112
|
-
|
113
|
-
it "creates an environment for each branch and the trunk" do
|
114
|
-
expect(environments.size).to eq(4)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "prefixes the source name to environments" do
|
118
|
-
expect(environments[0].dirname).to eq 'mysource_production'
|
119
|
-
expect(environments[1].dirname).to eq 'mysource_apache'
|
120
|
-
expect(environments[2].dirname).to eq 'mysource_dns'
|
121
|
-
expect(environments[3].dirname).to eq 'mysource_robobutler'
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe R10K::Source::SVN, 'when prefixing is disabled' do
|
127
|
-
subject do
|
128
|
-
described_class.new(
|
129
|
-
'mysource',
|
130
|
-
'/some/nonexistent/dir',
|
131
|
-
{
|
132
|
-
:remote => 'https://svn-server.site/repo',
|
133
|
-
:prefix => false
|
134
|
-
}
|
135
|
-
)
|
136
|
-
end
|
137
|
-
|
138
|
-
describe "generating environments" do
|
139
|
-
before do
|
140
|
-
allow(subject.svn_remote).to receive(:branches).and_return %w[apache dns robobutler]
|
141
|
-
end
|
142
|
-
|
143
|
-
let(:environments) { subject.generate_environments }
|
144
|
-
|
145
|
-
it "creates an environment for each branch and the trunk" do
|
146
|
-
expect(environments.size).to eq(4)
|
147
|
-
end
|
148
|
-
|
149
|
-
it "does not prefix environments" do
|
150
|
-
expect(environments[0].dirname).to eq 'production'
|
151
|
-
expect(environments[1].dirname).to eq 'apache'
|
152
|
-
expect(environments[2].dirname).to eq 'dns'
|
153
|
-
expect(environments[3].dirname).to eq 'robobutler'
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
|
-
describe R10K::Source::SVN, 'when prefixing is overridden' do
|
160
|
-
subject do
|
161
|
-
described_class.new(
|
162
|
-
'mysource',
|
163
|
-
'/some/nonexistent/dir',
|
164
|
-
{
|
165
|
-
:remote => 'https://svn-server.site/repo',
|
166
|
-
:prefix => "tenant1"
|
167
|
-
}
|
168
|
-
)
|
169
|
-
end
|
170
|
-
|
171
|
-
describe "generating prefixed environments" do
|
172
|
-
before do
|
173
|
-
allow(subject.svn_remote).to receive(:branches).and_return %w[apache dns robobutler]
|
174
|
-
end
|
175
|
-
|
176
|
-
let(:environments) { subject.generate_environments }
|
177
|
-
|
178
|
-
it "creates an environment for each branch and the trunk" do
|
179
|
-
expect(environments.size).to eq(4)
|
180
|
-
end
|
181
|
-
|
182
|
-
it "prefixes the prefix name to environments" do
|
183
|
-
expect(environments[0].dirname).to eq 'tenant1_production'
|
184
|
-
expect(environments[1].dirname).to eq 'tenant1_apache'
|
185
|
-
expect(environments[2].dirname).to eq 'tenant1_dns'
|
186
|
-
expect(environments[3].dirname).to eq 'tenant1_robobutler'
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
|
192
|
-
describe R10K::Source::SVN, 'registering as a source' do
|
193
|
-
it "registers with the :svn key" do
|
194
|
-
expect(R10K::Source.retrieve(:svn)).to eq described_class
|
195
|
-
end
|
196
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/source'
|
3
|
-
|
4
|
-
describe R10K::Source::Yaml do
|
5
|
-
|
6
|
-
let(:environments_hash) do
|
7
|
-
{
|
8
|
-
'production' => {
|
9
|
-
'remote' => 'https://git.example.com/puppet/control-repo.git',
|
10
|
-
'ref' => 'release-141',
|
11
|
-
'modules' => {
|
12
|
-
'puppetlabs-stdlib' => '6.1.0',
|
13
|
-
'puppetlabs-ntp' => '8.1.0',
|
14
|
-
'example-myapp1' => {
|
15
|
-
'git' => 'https://git.example.com/puppet/example-myapp1.git',
|
16
|
-
'ref' => 'v1.3.0'
|
17
|
-
}
|
18
|
-
}
|
19
|
-
},
|
20
|
-
'development' => {
|
21
|
-
'remote' => 'https://git.example.com/puppet/control-repo.git',
|
22
|
-
'ref' => 'master',
|
23
|
-
'modules' => {
|
24
|
-
'puppetlabs-stdlib' => '6.1.0',
|
25
|
-
'puppetlabs-ntp' => '8.1.0',
|
26
|
-
'example-myapp1' => {
|
27
|
-
'git' => 'https://git.example.com/puppet/example-myapp1.git',
|
28
|
-
'ref' => 'v1.3.1'
|
29
|
-
}
|
30
|
-
}
|
31
|
-
}
|
32
|
-
}
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "with valid yaml file" do
|
36
|
-
it "produces environments" do
|
37
|
-
allow(YAML).to receive(:load_file).with('/envs.yaml').and_return(environments_hash)
|
38
|
-
source = described_class.new('yamlsource', '/some/nonexistent/dir', config: '/envs.yaml')
|
39
|
-
expect(source.environments.map(&:name)).to contain_exactly('production', 'development')
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/spec/unit/source_spec.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/source'
|
3
|
-
|
4
|
-
describe R10K::Source do
|
5
|
-
it "implementds methods for a keyed factory" do
|
6
|
-
expect(described_class).to respond_to :register
|
7
|
-
expect(described_class).to respond_to :retrieve
|
8
|
-
expect(described_class).to respond_to :generate
|
9
|
-
end
|
10
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'r10k'
|
2
|
-
require 'r10k/svn'
|
3
|
-
|
4
|
-
describe R10K::SVN::Remote do
|
5
|
-
subject { described_class.new('https://svn-server.site/repo') }
|
6
|
-
|
7
|
-
it "generates the trunk URL by appending '/trunk' to the base URL" do
|
8
|
-
expect(subject.trunk).to eq 'https://svn-server.site/repo/trunk'
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "retrieving branches" do
|
12
|
-
let(:branches) do
|
13
|
-
%[apache/\ndns/\nrobobutler/\nstaging/\n]
|
14
|
-
end
|
15
|
-
|
16
|
-
it "enumerates the /branches directory of the base URL" do
|
17
|
-
allow(subject).to receive(:svn).with(['ls', 'https://svn-server.site/repo/branches']).and_return(branches)
|
18
|
-
expect(subject.branches).to eq(%w[apache dns robobutler staging])
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/svn/working_dir'
|
3
|
-
|
4
|
-
describe R10K::SVN::WorkingDir, "initializing" do
|
5
|
-
let(:pathname) { Pathname.new("/some/imaginary/path") }
|
6
|
-
it "stores the provided path" do
|
7
|
-
subject = described_class.new(pathname)
|
8
|
-
expect(subject.path).to eq Pathname.new("/some/imaginary/path")
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "when auth is provided" do
|
12
|
-
it "raises an error when only the username is provided" do
|
13
|
-
expect {
|
14
|
-
described_class.new(pathname, :username => "root")
|
15
|
-
}.to raise_error(ArgumentError, "Both username and password must be specified")
|
16
|
-
end
|
17
|
-
|
18
|
-
it "raises an error when only the password is provided" do
|
19
|
-
expect {
|
20
|
-
described_class.new(pathname, :password => "hunter2")
|
21
|
-
}.to raise_error(ArgumentError, "Both username and password must be specified")
|
22
|
-
end
|
23
|
-
|
24
|
-
it "does not raise an error when both username and password are provided" do
|
25
|
-
o = described_class.new(pathname, :username => "root", :password => "hunter2")
|
26
|
-
expect(o.username).to eq("root")
|
27
|
-
expect(o.password).to eq("hunter2")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe R10K::SVN::WorkingDir, "when authentication credentials are given" do
|
33
|
-
let(:pathname) { Pathname.new("/some/imaginary/path") }
|
34
|
-
subject { described_class.new(pathname, :username => "root", :password => "hunter2") }
|
35
|
-
|
36
|
-
def check_args(args)
|
37
|
-
expect(args).to include("--username")
|
38
|
-
expect(args).to include("root")
|
39
|
-
expect(args).to include("--password")
|
40
|
-
expect(args).to include("hunter2")
|
41
|
-
end
|
42
|
-
|
43
|
-
it "invokes 'svn checkout' with the given credentials" do
|
44
|
-
expect(subject).to receive(:svn) do |args, _|
|
45
|
-
check_args(args)
|
46
|
-
end
|
47
|
-
subject.checkout('https://some.svn.url/trunk')
|
48
|
-
end
|
49
|
-
|
50
|
-
it "invokes 'svn update' with the given credentials" do
|
51
|
-
expect(subject).to receive(:svn) do |args, _|
|
52
|
-
check_args(args)
|
53
|
-
end
|
54
|
-
subject.update
|
55
|
-
end
|
56
|
-
end
|
data/spec/unit/tarball_spec.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'r10k/tarball'
|
3
|
-
|
4
|
-
describe R10K::Tarball do
|
5
|
-
include_context 'Tarball'
|
6
|
-
|
7
|
-
subject { described_class.new('fixture-tarball', fixture_tarball, checksum: fixture_checksum) }
|
8
|
-
|
9
|
-
describe 'initialization' do
|
10
|
-
it 'initializes' do
|
11
|
-
expect(subject).to be_kind_of(described_class)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'downloading and caching' do
|
16
|
-
it 'downloads the source to the cache' do
|
17
|
-
# No cache present initially
|
18
|
-
expect(File.exist?(subject.cache_path)).to be(false)
|
19
|
-
expect(subject.cache_valid?).to be(false)
|
20
|
-
|
21
|
-
subject.get
|
22
|
-
|
23
|
-
expect(subject.cache_valid?).to be(true)
|
24
|
-
expect(File.exist?(subject.cache_path)).to be(true)
|
25
|
-
end
|
26
|
-
|
27
|
-
let(:raw_content) {[
|
28
|
-
'./',
|
29
|
-
'./Puppetfile',
|
30
|
-
'./metadata.json',
|
31
|
-
'./spec/',
|
32
|
-
'./environment.conf',
|
33
|
-
'./spec/1',
|
34
|
-
]}
|
35
|
-
|
36
|
-
let(:clean_content) {[
|
37
|
-
'Puppetfile',
|
38
|
-
'metadata.json',
|
39
|
-
'spec',
|
40
|
-
'environment.conf',
|
41
|
-
'spec/1',
|
42
|
-
]}
|
43
|
-
|
44
|
-
it 'returns clean paths when listing cached tarball content' do
|
45
|
-
iterator = allow(subject).to receive(:each_tarball_entry)
|
46
|
-
raw_content.each { |entry| iterator.and_yield(entry) }
|
47
|
-
|
48
|
-
expect(subject.paths).to eq(clean_content)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe 'http sources'
|
53
|
-
|
54
|
-
describe 'file sources'
|
55
|
-
|
56
|
-
describe 'syncing'
|
57
|
-
end
|