bundler 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3111 -0
- data/LICENSE.md +23 -0
- data/README.md +63 -0
- data/bundler.gemspec +65 -0
- data/exe/bundle +31 -0
- data/exe/bundle_ruby +60 -0
- data/exe/bundler +4 -0
- data/lib/bundler.rb +567 -0
- data/lib/bundler/build_metadata.rb +53 -0
- data/lib/bundler/capistrano.rb +22 -0
- data/lib/bundler/cli.rb +792 -0
- data/lib/bundler/cli/add.rb +35 -0
- data/lib/bundler/cli/binstubs.rb +49 -0
- data/lib/bundler/cli/cache.rb +36 -0
- data/lib/bundler/cli/check.rb +38 -0
- data/lib/bundler/cli/clean.rb +25 -0
- data/lib/bundler/cli/common.rb +102 -0
- data/lib/bundler/cli/config.rb +119 -0
- data/lib/bundler/cli/console.rb +43 -0
- data/lib/bundler/cli/doctor.rb +140 -0
- data/lib/bundler/cli/exec.rb +105 -0
- data/lib/bundler/cli/gem.rb +252 -0
- data/lib/bundler/cli/info.rb +50 -0
- data/lib/bundler/cli/init.rb +47 -0
- data/lib/bundler/cli/inject.rb +60 -0
- data/lib/bundler/cli/install.rb +218 -0
- data/lib/bundler/cli/issue.rb +40 -0
- data/lib/bundler/cli/list.rb +58 -0
- data/lib/bundler/cli/lock.rb +63 -0
- data/lib/bundler/cli/open.rb +26 -0
- data/lib/bundler/cli/outdated.rb +266 -0
- data/lib/bundler/cli/package.rb +49 -0
- data/lib/bundler/cli/platform.rb +46 -0
- data/lib/bundler/cli/plugin.rb +24 -0
- data/lib/bundler/cli/pristine.rb +47 -0
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +75 -0
- data/lib/bundler/cli/update.rb +91 -0
- data/lib/bundler/cli/viz.rb +31 -0
- data/lib/bundler/compact_index_client.rb +109 -0
- data/lib/bundler/compact_index_client/cache.rb +118 -0
- data/lib/bundler/compact_index_client/updater.rb +116 -0
- data/lib/bundler/compatibility_guard.rb +13 -0
- data/lib/bundler/constants.rb +7 -0
- data/lib/bundler/current_ruby.rb +94 -0
- data/lib/bundler/definition.rb +995 -0
- data/lib/bundler/dep_proxy.rb +48 -0
- data/lib/bundler/dependency.rb +139 -0
- data/lib/bundler/deployment.rb +69 -0
- data/lib/bundler/deprecate.rb +44 -0
- data/lib/bundler/dsl.rb +615 -0
- data/lib/bundler/endpoint_specification.rb +141 -0
- data/lib/bundler/env.rb +149 -0
- data/lib/bundler/environment_preserver.rb +59 -0
- data/lib/bundler/errors.rb +158 -0
- data/lib/bundler/feature_flag.rb +75 -0
- data/lib/bundler/fetcher.rb +312 -0
- data/lib/bundler/fetcher/base.rb +52 -0
- data/lib/bundler/fetcher/compact_index.rb +126 -0
- data/lib/bundler/fetcher/dependency.rb +82 -0
- data/lib/bundler/fetcher/downloader.rb +84 -0
- data/lib/bundler/fetcher/index.rb +52 -0
- data/lib/bundler/friendly_errors.rb +131 -0
- data/lib/bundler/gem_helper.rb +217 -0
- data/lib/bundler/gem_helpers.rb +101 -0
- data/lib/bundler/gem_remote_fetcher.rb +43 -0
- data/lib/bundler/gem_tasks.rb +7 -0
- data/lib/bundler/gem_version_promoter.rb +190 -0
- data/lib/bundler/gemdeps.rb +29 -0
- data/lib/bundler/graph.rb +152 -0
- data/lib/bundler/index.rb +213 -0
- data/lib/bundler/injector.rb +253 -0
- data/lib/bundler/inline.rb +74 -0
- data/lib/bundler/installer.rb +318 -0
- data/lib/bundler/installer/gem_installer.rb +85 -0
- data/lib/bundler/installer/parallel_installer.rb +229 -0
- data/lib/bundler/installer/standalone.rb +53 -0
- data/lib/bundler/lazy_specification.rb +123 -0
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +256 -0
- data/lib/bundler/match_platform.rb +24 -0
- data/lib/bundler/mirror.rb +223 -0
- data/lib/bundler/plugin.rb +294 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/api/source.rb +306 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +165 -0
- data/lib/bundler/plugin/installer.rb +96 -0
- data/lib/bundler/plugin/installer/git.rb +38 -0
- data/lib/bundler/plugin/installer/rubygems.rb +27 -0
- data/lib/bundler/plugin/source_list.rb +27 -0
- data/lib/bundler/process_lock.rb +24 -0
- data/lib/bundler/psyched_yaml.rb +37 -0
- data/lib/bundler/remote_specification.rb +114 -0
- data/lib/bundler/resolver.rb +373 -0
- data/lib/bundler/resolver/spec_group.rb +106 -0
- data/lib/bundler/retry.rb +66 -0
- data/lib/bundler/ruby_dsl.rb +18 -0
- data/lib/bundler/ruby_version.rb +152 -0
- data/lib/bundler/rubygems_ext.rb +209 -0
- data/lib/bundler/rubygems_gem_installer.rb +99 -0
- data/lib/bundler/rubygems_integration.rb +915 -0
- data/lib/bundler/runtime.rb +322 -0
- data/lib/bundler/settings.rb +464 -0
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/setup.rb +28 -0
- data/lib/bundler/shared_helpers.rb +386 -0
- data/lib/bundler/similarity_detector.rb +63 -0
- data/lib/bundler/source.rb +94 -0
- data/lib/bundler/source/gemspec.rb +18 -0
- data/lib/bundler/source/git.rb +329 -0
- data/lib/bundler/source/git/git_proxy.rb +262 -0
- data/lib/bundler/source/metadata.rb +62 -0
- data/lib/bundler/source/path.rb +249 -0
- data/lib/bundler/source/path/installer.rb +74 -0
- data/lib/bundler/source/rubygems.rb +539 -0
- data/lib/bundler/source/rubygems/remote.rb +69 -0
- data/lib/bundler/source_list.rb +186 -0
- data/lib/bundler/spec_set.rb +208 -0
- data/lib/bundler/ssl_certs/.document +1 -0
- data/lib/bundler/ssl_certs/certificate_manager.rb +66 -0
- data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
- data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +23 -0
- data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +25 -0
- data/lib/bundler/stub_specification.rb +108 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +29 -0
- data/lib/bundler/templates/Executable.bundler +105 -0
- data/lib/bundler/templates/Executable.standalone +14 -0
- data/lib/bundler/templates/Gemfile +7 -0
- data/lib/bundler/templates/gems.rb +8 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +74 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
- data/lib/bundler/templates/newgem/README.md.tt +47 -0
- data/lib/bundler/templates/newgem/Rakefile.tt +29 -0
- data/lib/bundler/templates/newgem/bin/console.tt +14 -0
- data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
- data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
- data/lib/bundler/templates/newgem/gitignore.tt +20 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +13 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +50 -0
- data/lib/bundler/templates/newgem/rspec.tt +3 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +9 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -0
- data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +11 -0
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +8 -0
- data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
- data/lib/bundler/ui.rb +9 -0
- data/lib/bundler/ui/rg_proxy.rb +19 -0
- data/lib/bundler/ui/shell.rb +146 -0
- data/lib/bundler/ui/silent.rb +69 -0
- data/lib/bundler/uri_credentials_filter.rb +37 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1741 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +101 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +67 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +27 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1233 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +129 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +509 -0
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +331 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +104 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +60 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +118 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
- data/lib/bundler/vendor/thor/lib/thor/base.rb +678 -0
- data/lib/bundler/vendor/thor/lib/thor/command.rb +135 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +114 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +177 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +70 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +175 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +146 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +226 -0
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +71 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +324 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +482 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +149 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +126 -0
- data/lib/bundler/vendor/thor/lib/thor/util.rb +268 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/bundler/vendored_fileutils.rb +9 -0
- data/lib/bundler/vendored_molinillo.rb +4 -0
- data/lib/bundler/vendored_persistent.rb +52 -0
- data/lib/bundler/vendored_thor.rb +8 -0
- data/lib/bundler/version.rb +28 -0
- data/lib/bundler/version_ranges.rb +76 -0
- data/lib/bundler/vlad.rb +17 -0
- data/lib/bundler/worker.rb +106 -0
- data/lib/bundler/yaml_serializer.rb +90 -0
- data/man/bundle-add.1 +58 -0
- data/man/bundle-add.1.txt +52 -0
- data/man/bundle-add.ronn +40 -0
- data/man/bundle-binstubs.1 +40 -0
- data/man/bundle-binstubs.1.txt +48 -0
- data/man/bundle-binstubs.ronn +43 -0
- data/man/bundle-check.1 +31 -0
- data/man/bundle-check.1.txt +33 -0
- data/man/bundle-check.ronn +26 -0
- data/man/bundle-clean.1 +24 -0
- data/man/bundle-clean.1.txt +26 -0
- data/man/bundle-clean.ronn +18 -0
- data/man/bundle-config.1 +497 -0
- data/man/bundle-config.1.txt +529 -0
- data/man/bundle-config.ronn +397 -0
- data/man/bundle-doctor.1 +44 -0
- data/man/bundle-doctor.1.txt +44 -0
- data/man/bundle-doctor.ronn +33 -0
- data/man/bundle-exec.1 +165 -0
- data/man/bundle-exec.1.txt +178 -0
- data/man/bundle-exec.ronn +152 -0
- data/man/bundle-gem.1 +80 -0
- data/man/bundle-gem.1.txt +91 -0
- data/man/bundle-gem.ronn +78 -0
- data/man/bundle-info.1 +20 -0
- data/man/bundle-info.1.txt +21 -0
- data/man/bundle-info.ronn +17 -0
- data/man/bundle-init.1 +25 -0
- data/man/bundle-init.1.txt +34 -0
- data/man/bundle-init.ronn +29 -0
- data/man/bundle-inject.1 +33 -0
- data/man/bundle-inject.1.txt +32 -0
- data/man/bundle-inject.ronn +22 -0
- data/man/bundle-install.1 +308 -0
- data/man/bundle-install.1.txt +396 -0
- data/man/bundle-install.ronn +378 -0
- data/man/bundle-list.1 +50 -0
- data/man/bundle-list.1.txt +43 -0
- data/man/bundle-list.ronn +33 -0
- data/man/bundle-lock.1 +84 -0
- data/man/bundle-lock.1.txt +93 -0
- data/man/bundle-lock.ronn +94 -0
- data/man/bundle-open.1 +32 -0
- data/man/bundle-open.1.txt +29 -0
- data/man/bundle-open.ronn +19 -0
- data/man/bundle-outdated.1 +155 -0
- data/man/bundle-outdated.1.txt +131 -0
- data/man/bundle-outdated.ronn +111 -0
- data/man/bundle-package.1 +55 -0
- data/man/bundle-package.1.txt +79 -0
- data/man/bundle-package.ronn +72 -0
- data/man/bundle-platform.1 +61 -0
- data/man/bundle-platform.1.txt +57 -0
- data/man/bundle-platform.ronn +42 -0
- data/man/bundle-pristine.1 +34 -0
- data/man/bundle-pristine.1.txt +44 -0
- data/man/bundle-pristine.ronn +34 -0
- data/man/bundle-remove.1 +31 -0
- data/man/bundle-remove.1.txt +34 -0
- data/man/bundle-remove.ronn +23 -0
- data/man/bundle-show.1 +23 -0
- data/man/bundle-show.1.txt +27 -0
- data/man/bundle-show.ronn +21 -0
- data/man/bundle-update.1 +394 -0
- data/man/bundle-update.1.txt +391 -0
- data/man/bundle-update.ronn +350 -0
- data/man/bundle-viz.1 +39 -0
- data/man/bundle-viz.1.txt +39 -0
- data/man/bundle-viz.ronn +30 -0
- data/man/bundle.1 +136 -0
- data/man/bundle.1.txt +116 -0
- data/man/bundle.ronn +111 -0
- data/man/gemfile.5 +689 -0
- data/man/gemfile.5.ronn +521 -0
- data/man/gemfile.5.txt +653 -0
- data/man/index.txt +25 -0
- metadata +463 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
require "bundler/vendor/thor/lib/thor/actions/empty_directory"
|
2
|
+
|
3
|
+
class Bundler::Thor
|
4
|
+
module Actions
|
5
|
+
# Copies recursively the files from source directory to root directory.
|
6
|
+
# If any of the files finishes with .tt, it's considered to be a template
|
7
|
+
# and is placed in the destination without the extension .tt. If any
|
8
|
+
# empty directory is found, it's copied and all .empty_directory files are
|
9
|
+
# ignored. If any file name is wrapped within % signs, the text within
|
10
|
+
# the % signs will be executed as a method and replaced with the returned
|
11
|
+
# value. Let's suppose a doc directory with the following files:
|
12
|
+
#
|
13
|
+
# doc/
|
14
|
+
# components/.empty_directory
|
15
|
+
# README
|
16
|
+
# rdoc.rb.tt
|
17
|
+
# %app_name%.rb
|
18
|
+
#
|
19
|
+
# When invoked as:
|
20
|
+
#
|
21
|
+
# directory "doc"
|
22
|
+
#
|
23
|
+
# It will create a doc directory in the destination with the following
|
24
|
+
# files (assuming that the `app_name` method returns the value "blog"):
|
25
|
+
#
|
26
|
+
# doc/
|
27
|
+
# components/
|
28
|
+
# README
|
29
|
+
# rdoc.rb
|
30
|
+
# blog.rb
|
31
|
+
#
|
32
|
+
# <b>Encoded path note:</b> Since Bundler::Thor internals use Object#respond_to? to check if it can
|
33
|
+
# expand %something%, this `something` should be a public method in the class calling
|
34
|
+
# #directory. If a method is private, Bundler::Thor stack raises PrivateMethodEncodedError.
|
35
|
+
#
|
36
|
+
# ==== Parameters
|
37
|
+
# source<String>:: the relative path to the source root.
|
38
|
+
# destination<String>:: the relative path to the destination root.
|
39
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
40
|
+
# If :recursive => false, does not look for paths recursively.
|
41
|
+
# If :mode => :preserve, preserve the file mode from the source.
|
42
|
+
# If :exclude_pattern => /regexp/, prevents copying files that match that regexp.
|
43
|
+
#
|
44
|
+
# ==== Examples
|
45
|
+
#
|
46
|
+
# directory "doc"
|
47
|
+
# directory "doc", "docs", :recursive => false
|
48
|
+
#
|
49
|
+
def directory(source, *args, &block)
|
50
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
51
|
+
destination = args.first || source
|
52
|
+
action Directory.new(self, source, destination || source, config, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
class Directory < EmptyDirectory #:nodoc:
|
56
|
+
attr_reader :source
|
57
|
+
|
58
|
+
def initialize(base, source, destination = nil, config = {}, &block)
|
59
|
+
@source = File.expand_path(base.find_in_source_paths(source.to_s))
|
60
|
+
@block = block
|
61
|
+
super(base, destination, {:recursive => true}.merge(config))
|
62
|
+
end
|
63
|
+
|
64
|
+
def invoke!
|
65
|
+
base.empty_directory given_destination, config
|
66
|
+
execute!
|
67
|
+
end
|
68
|
+
|
69
|
+
def revoke!
|
70
|
+
execute!
|
71
|
+
end
|
72
|
+
|
73
|
+
protected
|
74
|
+
|
75
|
+
def execute!
|
76
|
+
lookup = Util.escape_globs(source)
|
77
|
+
lookup = config[:recursive] ? File.join(lookup, "**") : lookup
|
78
|
+
lookup = file_level_lookup(lookup)
|
79
|
+
|
80
|
+
files(lookup).sort.each do |file_source|
|
81
|
+
next if File.directory?(file_source)
|
82
|
+
next if config[:exclude_pattern] && file_source.match(config[:exclude_pattern])
|
83
|
+
file_destination = File.join(given_destination, file_source.gsub(source, "."))
|
84
|
+
file_destination.gsub!("/./", "/")
|
85
|
+
|
86
|
+
case file_source
|
87
|
+
when /\.empty_directory$/
|
88
|
+
dirname = File.dirname(file_destination).gsub(%r{/\.$}, "")
|
89
|
+
next if dirname == given_destination
|
90
|
+
base.empty_directory(dirname, config)
|
91
|
+
when /#{TEMPLATE_EXTNAME}$/
|
92
|
+
base.template(file_source, file_destination[0..-4], config, &@block)
|
93
|
+
else
|
94
|
+
base.copy_file(file_source, file_destination, config, &@block)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
if RUBY_VERSION < "2.0"
|
100
|
+
def file_level_lookup(previous_lookup)
|
101
|
+
File.join(previous_lookup, "{*,.[a-z]*}")
|
102
|
+
end
|
103
|
+
|
104
|
+
def files(lookup)
|
105
|
+
Dir[lookup]
|
106
|
+
end
|
107
|
+
else
|
108
|
+
def file_level_lookup(previous_lookup)
|
109
|
+
File.join(previous_lookup, "*")
|
110
|
+
end
|
111
|
+
|
112
|
+
def files(lookup)
|
113
|
+
Dir.glob(lookup, File::FNM_DOTMATCH)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
class Bundler::Thor
|
2
|
+
module Actions
|
3
|
+
# Creates an empty directory.
|
4
|
+
#
|
5
|
+
# ==== Parameters
|
6
|
+
# destination<String>:: the relative path to the destination root.
|
7
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
8
|
+
#
|
9
|
+
# ==== Examples
|
10
|
+
#
|
11
|
+
# empty_directory "doc"
|
12
|
+
#
|
13
|
+
def empty_directory(destination, config = {})
|
14
|
+
action EmptyDirectory.new(self, destination, config)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Class which holds create directory logic. This is the base class for
|
18
|
+
# other actions like create_file and directory.
|
19
|
+
#
|
20
|
+
# This implementation is based in Templater actions, created by Jonas Nicklas
|
21
|
+
# and Michael S. Klishin under MIT LICENSE.
|
22
|
+
#
|
23
|
+
class EmptyDirectory #:nodoc:
|
24
|
+
attr_reader :base, :destination, :given_destination, :relative_destination, :config
|
25
|
+
|
26
|
+
# Initializes given the source and destination.
|
27
|
+
#
|
28
|
+
# ==== Parameters
|
29
|
+
# base<Bundler::Thor::Base>:: A Bundler::Thor::Base instance
|
30
|
+
# source<String>:: Relative path to the source of this file
|
31
|
+
# destination<String>:: Relative path to the destination of this file
|
32
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
33
|
+
#
|
34
|
+
def initialize(base, destination, config = {})
|
35
|
+
@base = base
|
36
|
+
@config = {:verbose => true}.merge(config)
|
37
|
+
self.destination = destination
|
38
|
+
end
|
39
|
+
|
40
|
+
# Checks if the destination file already exists.
|
41
|
+
#
|
42
|
+
# ==== Returns
|
43
|
+
# Boolean:: true if the file exists, false otherwise.
|
44
|
+
#
|
45
|
+
def exists?
|
46
|
+
::File.exist?(destination)
|
47
|
+
end
|
48
|
+
|
49
|
+
def invoke!
|
50
|
+
invoke_with_conflict_check do
|
51
|
+
require "fileutils"
|
52
|
+
::FileUtils.mkdir_p(destination)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def revoke!
|
57
|
+
say_status :remove, :red
|
58
|
+
require "fileutils"
|
59
|
+
::FileUtils.rm_rf(destination) if !pretend? && exists?
|
60
|
+
given_destination
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
# Shortcut for pretend.
|
66
|
+
#
|
67
|
+
def pretend?
|
68
|
+
base.options[:pretend]
|
69
|
+
end
|
70
|
+
|
71
|
+
# Sets the absolute destination value from a relative destination value.
|
72
|
+
# It also stores the given and relative destination. Let's suppose our
|
73
|
+
# script is being executed on "dest", it sets the destination root to
|
74
|
+
# "dest". The destination, given_destination and relative_destination
|
75
|
+
# are related in the following way:
|
76
|
+
#
|
77
|
+
# inside "bar" do
|
78
|
+
# empty_directory "baz"
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# destination #=> dest/bar/baz
|
82
|
+
# relative_destination #=> bar/baz
|
83
|
+
# given_destination #=> baz
|
84
|
+
#
|
85
|
+
def destination=(destination)
|
86
|
+
return unless destination
|
87
|
+
@given_destination = convert_encoded_instructions(destination.to_s)
|
88
|
+
@destination = ::File.expand_path(@given_destination, base.destination_root)
|
89
|
+
@relative_destination = base.relative_to_original_destination_root(@destination)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Filenames in the encoded form are converted. If you have a file:
|
93
|
+
#
|
94
|
+
# %file_name%.rb
|
95
|
+
#
|
96
|
+
# It calls #file_name from the base and replaces %-string with the
|
97
|
+
# return value (should be String) of #file_name:
|
98
|
+
#
|
99
|
+
# user.rb
|
100
|
+
#
|
101
|
+
# The method referenced can be either public or private.
|
102
|
+
#
|
103
|
+
def convert_encoded_instructions(filename)
|
104
|
+
filename.gsub(/%(.*?)%/) do |initial_string|
|
105
|
+
method = $1.strip
|
106
|
+
base.respond_to?(method, true) ? base.send(method) : initial_string
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# Receives a hash of options and just execute the block if some
|
111
|
+
# conditions are met.
|
112
|
+
#
|
113
|
+
def invoke_with_conflict_check(&block)
|
114
|
+
if exists?
|
115
|
+
on_conflict_behavior(&block)
|
116
|
+
else
|
117
|
+
yield unless pretend?
|
118
|
+
say_status :create, :green
|
119
|
+
end
|
120
|
+
|
121
|
+
destination
|
122
|
+
rescue Errno::EISDIR, Errno::EEXIST
|
123
|
+
on_file_clash_behavior
|
124
|
+
end
|
125
|
+
|
126
|
+
def on_file_clash_behavior
|
127
|
+
say_status :file_clash, :red
|
128
|
+
end
|
129
|
+
|
130
|
+
# What to do when the destination file already exists.
|
131
|
+
#
|
132
|
+
def on_conflict_behavior
|
133
|
+
say_status :exist, :blue
|
134
|
+
end
|
135
|
+
|
136
|
+
# Shortcut to say_status shell method.
|
137
|
+
#
|
138
|
+
def say_status(status, color)
|
139
|
+
base.shell.say_status status, relative_destination, color if config[:verbose]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,373 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
class Bundler::Thor
|
4
|
+
module Actions
|
5
|
+
# Copies the file from the relative source to the relative destination. If
|
6
|
+
# the destination is not given it's assumed to be equal to the source.
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# source<String>:: the relative path to the source root.
|
10
|
+
# destination<String>:: the relative path to the destination root.
|
11
|
+
# config<Hash>:: give :verbose => false to not log the status, and
|
12
|
+
# :mode => :preserve, to preserve the file mode from the source.
|
13
|
+
|
14
|
+
#
|
15
|
+
# ==== Examples
|
16
|
+
#
|
17
|
+
# copy_file "README", "doc/README"
|
18
|
+
#
|
19
|
+
# copy_file "doc/README"
|
20
|
+
#
|
21
|
+
def copy_file(source, *args, &block)
|
22
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
23
|
+
destination = args.first || source
|
24
|
+
source = File.expand_path(find_in_source_paths(source.to_s))
|
25
|
+
|
26
|
+
create_file destination, nil, config do
|
27
|
+
content = File.binread(source)
|
28
|
+
content = yield(content) if block
|
29
|
+
content
|
30
|
+
end
|
31
|
+
if config[:mode] == :preserve
|
32
|
+
mode = File.stat(source).mode
|
33
|
+
chmod(destination, mode, config)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Links the file from the relative source to the relative destination. If
|
38
|
+
# the destination is not given it's assumed to be equal to the source.
|
39
|
+
#
|
40
|
+
# ==== Parameters
|
41
|
+
# source<String>:: the relative path to the source root.
|
42
|
+
# destination<String>:: the relative path to the destination root.
|
43
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
44
|
+
#
|
45
|
+
# ==== Examples
|
46
|
+
#
|
47
|
+
# link_file "README", "doc/README"
|
48
|
+
#
|
49
|
+
# link_file "doc/README"
|
50
|
+
#
|
51
|
+
def link_file(source, *args)
|
52
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
53
|
+
destination = args.first || source
|
54
|
+
source = File.expand_path(find_in_source_paths(source.to_s))
|
55
|
+
|
56
|
+
create_link destination, source, config
|
57
|
+
end
|
58
|
+
|
59
|
+
# Gets the content at the given address and places it at the given relative
|
60
|
+
# destination. If a block is given instead of destination, the content of
|
61
|
+
# the url is yielded and used as location.
|
62
|
+
#
|
63
|
+
# +get+ relies on open-uri, so passing application user input would provide
|
64
|
+
# a command injection attack vector.
|
65
|
+
#
|
66
|
+
# ==== Parameters
|
67
|
+
# source<String>:: the address of the given content.
|
68
|
+
# destination<String>:: the relative path to the destination root.
|
69
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
70
|
+
#
|
71
|
+
# ==== Examples
|
72
|
+
#
|
73
|
+
# get "http://gist.github.com/103208", "doc/README"
|
74
|
+
#
|
75
|
+
# get "http://gist.github.com/103208" do |content|
|
76
|
+
# content.split("\n").first
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
def get(source, *args, &block)
|
80
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
81
|
+
destination = args.first
|
82
|
+
|
83
|
+
if source =~ %r{^https?\://}
|
84
|
+
require "open-uri"
|
85
|
+
else
|
86
|
+
source = File.expand_path(find_in_source_paths(source.to_s))
|
87
|
+
end
|
88
|
+
|
89
|
+
render = open(source) { |input| input.binmode.read }
|
90
|
+
|
91
|
+
destination ||= if block_given?
|
92
|
+
block.arity == 1 ? yield(render) : yield
|
93
|
+
else
|
94
|
+
File.basename(source)
|
95
|
+
end
|
96
|
+
|
97
|
+
create_file destination, render, config
|
98
|
+
end
|
99
|
+
|
100
|
+
# Gets an ERB template at the relative source, executes it and makes a copy
|
101
|
+
# at the relative destination. If the destination is not given it's assumed
|
102
|
+
# to be equal to the source removing .tt from the filename.
|
103
|
+
#
|
104
|
+
# ==== Parameters
|
105
|
+
# source<String>:: the relative path to the source root.
|
106
|
+
# destination<String>:: the relative path to the destination root.
|
107
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
108
|
+
#
|
109
|
+
# ==== Examples
|
110
|
+
#
|
111
|
+
# template "README", "doc/README"
|
112
|
+
#
|
113
|
+
# template "doc/README"
|
114
|
+
#
|
115
|
+
def template(source, *args, &block)
|
116
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
117
|
+
destination = args.first || source.sub(/#{TEMPLATE_EXTNAME}$/, "")
|
118
|
+
|
119
|
+
source = File.expand_path(find_in_source_paths(source.to_s))
|
120
|
+
context = config.delete(:context) || instance_eval("binding")
|
121
|
+
|
122
|
+
create_file destination, nil, config do
|
123
|
+
match = ERB.version.match(/(\d+\.\d+\.\d+)/)
|
124
|
+
capturable_erb = if match && match[1] >= "2.2.0" # Ruby 2.6+
|
125
|
+
CapturableERB.new(::File.binread(source), :trim_mode => "-", :eoutvar => "@output_buffer")
|
126
|
+
else
|
127
|
+
CapturableERB.new(::File.binread(source), nil, "-", "@output_buffer")
|
128
|
+
end
|
129
|
+
content = capturable_erb.tap do |erb|
|
130
|
+
erb.filename = source
|
131
|
+
end.result(context)
|
132
|
+
content = yield(content) if block
|
133
|
+
content
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Changes the mode of the given file or directory.
|
138
|
+
#
|
139
|
+
# ==== Parameters
|
140
|
+
# mode<Integer>:: the file mode
|
141
|
+
# path<String>:: the name of the file to change mode
|
142
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
143
|
+
#
|
144
|
+
# ==== Example
|
145
|
+
#
|
146
|
+
# chmod "script/server", 0755
|
147
|
+
#
|
148
|
+
def chmod(path, mode, config = {})
|
149
|
+
return unless behavior == :invoke
|
150
|
+
path = File.expand_path(path, destination_root)
|
151
|
+
say_status :chmod, relative_to_original_destination_root(path), config.fetch(:verbose, true)
|
152
|
+
unless options[:pretend]
|
153
|
+
require "fileutils"
|
154
|
+
FileUtils.chmod_R(mode, path)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Prepend text to a file. Since it depends on insert_into_file, it's reversible.
|
159
|
+
#
|
160
|
+
# ==== Parameters
|
161
|
+
# path<String>:: path of the file to be changed
|
162
|
+
# data<String>:: the data to prepend to the file, can be also given as a block.
|
163
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
164
|
+
#
|
165
|
+
# ==== Example
|
166
|
+
#
|
167
|
+
# prepend_to_file 'config/environments/test.rb', 'config.gem "rspec"'
|
168
|
+
#
|
169
|
+
# prepend_to_file 'config/environments/test.rb' do
|
170
|
+
# 'config.gem "rspec"'
|
171
|
+
# end
|
172
|
+
#
|
173
|
+
def prepend_to_file(path, *args, &block)
|
174
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
175
|
+
config[:after] = /\A/
|
176
|
+
insert_into_file(path, *(args << config), &block)
|
177
|
+
end
|
178
|
+
alias_method :prepend_file, :prepend_to_file
|
179
|
+
|
180
|
+
# Append text to a file. Since it depends on insert_into_file, it's reversible.
|
181
|
+
#
|
182
|
+
# ==== Parameters
|
183
|
+
# path<String>:: path of the file to be changed
|
184
|
+
# data<String>:: the data to append to the file, can be also given as a block.
|
185
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
186
|
+
#
|
187
|
+
# ==== Example
|
188
|
+
#
|
189
|
+
# append_to_file 'config/environments/test.rb', 'config.gem "rspec"'
|
190
|
+
#
|
191
|
+
# append_to_file 'config/environments/test.rb' do
|
192
|
+
# 'config.gem "rspec"'
|
193
|
+
# end
|
194
|
+
#
|
195
|
+
def append_to_file(path, *args, &block)
|
196
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
197
|
+
config[:before] = /\z/
|
198
|
+
insert_into_file(path, *(args << config), &block)
|
199
|
+
end
|
200
|
+
alias_method :append_file, :append_to_file
|
201
|
+
|
202
|
+
# Injects text right after the class definition. Since it depends on
|
203
|
+
# insert_into_file, it's reversible.
|
204
|
+
#
|
205
|
+
# ==== Parameters
|
206
|
+
# path<String>:: path of the file to be changed
|
207
|
+
# klass<String|Class>:: the class to be manipulated
|
208
|
+
# data<String>:: the data to append to the class, can be also given as a block.
|
209
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
210
|
+
#
|
211
|
+
# ==== Examples
|
212
|
+
#
|
213
|
+
# inject_into_class "app/controllers/application_controller.rb", ApplicationController, " filter_parameter :password\n"
|
214
|
+
#
|
215
|
+
# inject_into_class "app/controllers/application_controller.rb", ApplicationController do
|
216
|
+
# " filter_parameter :password\n"
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
def inject_into_class(path, klass, *args, &block)
|
220
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
221
|
+
config[:after] = /class #{klass}\n|class #{klass} .*\n/
|
222
|
+
insert_into_file(path, *(args << config), &block)
|
223
|
+
end
|
224
|
+
|
225
|
+
# Injects text right after the module definition. Since it depends on
|
226
|
+
# insert_into_file, it's reversible.
|
227
|
+
#
|
228
|
+
# ==== Parameters
|
229
|
+
# path<String>:: path of the file to be changed
|
230
|
+
# module_name<String|Class>:: the module to be manipulated
|
231
|
+
# data<String>:: the data to append to the class, can be also given as a block.
|
232
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
233
|
+
#
|
234
|
+
# ==== Examples
|
235
|
+
#
|
236
|
+
# inject_into_module "app/helpers/application_helper.rb", ApplicationHelper, " def help; 'help'; end\n"
|
237
|
+
#
|
238
|
+
# inject_into_module "app/helpers/application_helper.rb", ApplicationHelper do
|
239
|
+
# " def help; 'help'; end\n"
|
240
|
+
# end
|
241
|
+
#
|
242
|
+
def inject_into_module(path, module_name, *args, &block)
|
243
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
244
|
+
config[:after] = /module #{module_name}\n|module #{module_name} .*\n/
|
245
|
+
insert_into_file(path, *(args << config), &block)
|
246
|
+
end
|
247
|
+
|
248
|
+
# Run a regular expression replacement on a file.
|
249
|
+
#
|
250
|
+
# ==== Parameters
|
251
|
+
# path<String>:: path of the file to be changed
|
252
|
+
# flag<Regexp|String>:: the regexp or string to be replaced
|
253
|
+
# replacement<String>:: the replacement, can be also given as a block
|
254
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
255
|
+
#
|
256
|
+
# ==== Example
|
257
|
+
#
|
258
|
+
# gsub_file 'app/controllers/application_controller.rb', /#\s*(filter_parameter_logging :password)/, '\1'
|
259
|
+
#
|
260
|
+
# gsub_file 'README', /rake/, :green do |match|
|
261
|
+
# match << " no more. Use thor!"
|
262
|
+
# end
|
263
|
+
#
|
264
|
+
def gsub_file(path, flag, *args, &block)
|
265
|
+
return unless behavior == :invoke
|
266
|
+
config = args.last.is_a?(Hash) ? args.pop : {}
|
267
|
+
|
268
|
+
path = File.expand_path(path, destination_root)
|
269
|
+
say_status :gsub, relative_to_original_destination_root(path), config.fetch(:verbose, true)
|
270
|
+
|
271
|
+
unless options[:pretend]
|
272
|
+
content = File.binread(path)
|
273
|
+
content.gsub!(flag, *args, &block)
|
274
|
+
File.open(path, "wb") { |file| file.write(content) }
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
# Uncomment all lines matching a given regex. It will leave the space
|
279
|
+
# which existed before the comment hash in tact but will remove any spacing
|
280
|
+
# between the comment hash and the beginning of the line.
|
281
|
+
#
|
282
|
+
# ==== Parameters
|
283
|
+
# path<String>:: path of the file to be changed
|
284
|
+
# flag<Regexp|String>:: the regexp or string used to decide which lines to uncomment
|
285
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
286
|
+
#
|
287
|
+
# ==== Example
|
288
|
+
#
|
289
|
+
# uncomment_lines 'config/initializers/session_store.rb', /active_record/
|
290
|
+
#
|
291
|
+
def uncomment_lines(path, flag, *args)
|
292
|
+
flag = flag.respond_to?(:source) ? flag.source : flag
|
293
|
+
|
294
|
+
gsub_file(path, /^(\s*)#[[:blank:]]*(.*#{flag})/, '\1\2', *args)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Comment all lines matching a given regex. It will leave the space
|
298
|
+
# which existed before the beginning of the line in tact and will insert
|
299
|
+
# a single space after the comment hash.
|
300
|
+
#
|
301
|
+
# ==== Parameters
|
302
|
+
# path<String>:: path of the file to be changed
|
303
|
+
# flag<Regexp|String>:: the regexp or string used to decide which lines to comment
|
304
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
305
|
+
#
|
306
|
+
# ==== Example
|
307
|
+
#
|
308
|
+
# comment_lines 'config/initializers/session_store.rb', /cookie_store/
|
309
|
+
#
|
310
|
+
def comment_lines(path, flag, *args)
|
311
|
+
flag = flag.respond_to?(:source) ? flag.source : flag
|
312
|
+
|
313
|
+
gsub_file(path, /^(\s*)([^#\n]*#{flag})/, '\1# \2', *args)
|
314
|
+
end
|
315
|
+
|
316
|
+
# Removes a file at the given location.
|
317
|
+
#
|
318
|
+
# ==== Parameters
|
319
|
+
# path<String>:: path of the file to be changed
|
320
|
+
# config<Hash>:: give :verbose => false to not log the status.
|
321
|
+
#
|
322
|
+
# ==== Example
|
323
|
+
#
|
324
|
+
# remove_file 'README'
|
325
|
+
# remove_file 'app/controllers/application_controller.rb'
|
326
|
+
#
|
327
|
+
def remove_file(path, config = {})
|
328
|
+
return unless behavior == :invoke
|
329
|
+
path = File.expand_path(path, destination_root)
|
330
|
+
|
331
|
+
say_status :remove, relative_to_original_destination_root(path), config.fetch(:verbose, true)
|
332
|
+
if !options[:pretend] && File.exist?(path)
|
333
|
+
require "fileutils"
|
334
|
+
::FileUtils.rm_rf(path)
|
335
|
+
end
|
336
|
+
end
|
337
|
+
alias_method :remove_dir, :remove_file
|
338
|
+
|
339
|
+
attr_accessor :output_buffer
|
340
|
+
private :output_buffer, :output_buffer=
|
341
|
+
|
342
|
+
private
|
343
|
+
|
344
|
+
def concat(string)
|
345
|
+
@output_buffer.concat(string)
|
346
|
+
end
|
347
|
+
|
348
|
+
def capture(*args)
|
349
|
+
with_output_buffer { yield(*args) }
|
350
|
+
end
|
351
|
+
|
352
|
+
def with_output_buffer(buf = "".dup) #:nodoc:
|
353
|
+
raise ArgumentError, "Buffer can not be a frozen object" if buf.frozen?
|
354
|
+
old_buffer = output_buffer
|
355
|
+
self.output_buffer = buf
|
356
|
+
yield
|
357
|
+
output_buffer
|
358
|
+
ensure
|
359
|
+
self.output_buffer = old_buffer
|
360
|
+
end
|
361
|
+
|
362
|
+
# Bundler::Thor::Actions#capture depends on what kind of buffer is used in ERB.
|
363
|
+
# Thus CapturableERB fixes ERB to use String buffer.
|
364
|
+
class CapturableERB < ERB
|
365
|
+
def set_eoutvar(compiler, eoutvar = "_erbout")
|
366
|
+
compiler.put_cmd = "#{eoutvar}.concat"
|
367
|
+
compiler.insert_cmd = "#{eoutvar}.concat"
|
368
|
+
compiler.pre_cmd = ["#{eoutvar} = ''.dup"]
|
369
|
+
compiler.post_cmd = [eoutvar]
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|