bundler-prehistoric 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (284) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +100 -0
  5. data/CHANGELOG.md +1640 -0
  6. data/CONTRIBUTING.md +32 -0
  7. data/DEVELOPMENT.md +117 -0
  8. data/Gemfile +3 -0
  9. data/ISSUES.md +96 -0
  10. data/LICENSE.md +23 -0
  11. data/README.md +46 -0
  12. data/Rakefile +256 -0
  13. data/UPGRADING.md +103 -0
  14. data/bin/bundle +21 -0
  15. data/bin/bundle_ruby +56 -0
  16. data/bin/bundler +21 -0
  17. data/bundler.gemspec +33 -0
  18. data/lib/bundler.rb +442 -0
  19. data/lib/bundler/backports/time.rb +7 -0
  20. data/lib/bundler/capistrano.rb +16 -0
  21. data/lib/bundler/cli.rb +395 -0
  22. data/lib/bundler/cli/binstubs.rb +38 -0
  23. data/lib/bundler/cli/cache.rb +34 -0
  24. data/lib/bundler/cli/check.rb +35 -0
  25. data/lib/bundler/cli/clean.rb +19 -0
  26. data/lib/bundler/cli/common.rb +54 -0
  27. data/lib/bundler/cli/config.rb +84 -0
  28. data/lib/bundler/cli/console.rb +39 -0
  29. data/lib/bundler/cli/exec.rb +37 -0
  30. data/lib/bundler/cli/gem.rb +101 -0
  31. data/lib/bundler/cli/init.rb +33 -0
  32. data/lib/bundler/cli/inject.rb +33 -0
  33. data/lib/bundler/cli/install.rb +133 -0
  34. data/lib/bundler/cli/open.rb +23 -0
  35. data/lib/bundler/cli/outdated.rb +80 -0
  36. data/lib/bundler/cli/package.rb +36 -0
  37. data/lib/bundler/cli/platform.rb +43 -0
  38. data/lib/bundler/cli/show.rb +48 -0
  39. data/lib/bundler/cli/update.rb +73 -0
  40. data/lib/bundler/cli/viz.rb +27 -0
  41. data/lib/bundler/constants.rb +5 -0
  42. data/lib/bundler/current_ruby.rb +155 -0
  43. data/lib/bundler/definition.rb +604 -0
  44. data/lib/bundler/dep_proxy.rb +43 -0
  45. data/lib/bundler/dependency.rb +106 -0
  46. data/lib/bundler/deployment.rb +59 -0
  47. data/lib/bundler/deprecate.rb +15 -0
  48. data/lib/bundler/dsl.rb +305 -0
  49. data/lib/bundler/endpoint_specification.rb +76 -0
  50. data/lib/bundler/env.rb +56 -0
  51. data/lib/bundler/environment.rb +42 -0
  52. data/lib/bundler/fetcher.rb +396 -0
  53. data/lib/bundler/friendly_errors.rb +42 -0
  54. data/lib/bundler/gem_helper.rb +169 -0
  55. data/lib/bundler/gem_helpers.rb +25 -0
  56. data/lib/bundler/gem_installer.rb +9 -0
  57. data/lib/bundler/gem_path_manipulation.rb +8 -0
  58. data/lib/bundler/gem_tasks.rb +2 -0
  59. data/lib/bundler/graph.rb +169 -0
  60. data/lib/bundler/index.rb +184 -0
  61. data/lib/bundler/injector.rb +64 -0
  62. data/lib/bundler/installer.rb +332 -0
  63. data/lib/bundler/lazy_specification.rb +83 -0
  64. data/lib/bundler/lockfile_parser.rb +146 -0
  65. data/lib/bundler/match_platform.rb +13 -0
  66. data/lib/bundler/parallel_workers.rb +18 -0
  67. data/lib/bundler/parallel_workers/thread_worker.rb +30 -0
  68. data/lib/bundler/parallel_workers/unix_worker.rb +101 -0
  69. data/lib/bundler/parallel_workers/worker.rb +69 -0
  70. data/lib/bundler/psyched_yaml.rb +26 -0
  71. data/lib/bundler/remote_specification.rb +57 -0
  72. data/lib/bundler/resolver.rb +534 -0
  73. data/lib/bundler/retry.rb +60 -0
  74. data/lib/bundler/ruby_dsl.rb +11 -0
  75. data/lib/bundler/ruby_version.rb +117 -0
  76. data/lib/bundler/rubygems_ext.rb +171 -0
  77. data/lib/bundler/rubygems_integration.rb +578 -0
  78. data/lib/bundler/runtime.rb +310 -0
  79. data/lib/bundler/settings.rb +176 -0
  80. data/lib/bundler/setup.rb +23 -0
  81. data/lib/bundler/shared_helpers.rb +110 -0
  82. data/lib/bundler/similarity_detector.rb +63 -0
  83. data/lib/bundler/source.rb +29 -0
  84. data/lib/bundler/source/git.rb +289 -0
  85. data/lib/bundler/source/git/git_proxy.rb +158 -0
  86. data/lib/bundler/source/path.rb +225 -0
  87. data/lib/bundler/source/path/installer.rb +38 -0
  88. data/lib/bundler/source/rubygems.rb +334 -0
  89. data/lib/bundler/source/svn.rb +260 -0
  90. data/lib/bundler/source/svn/svn_proxy.rb +110 -0
  91. data/lib/bundler/spec_set.rb +154 -0
  92. data/lib/bundler/ssl_certs/.document +1 -0
  93. data/lib/bundler/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +14 -0
  94. data/lib/bundler/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +23 -0
  95. data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +28 -0
  96. data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +20 -0
  97. data/lib/bundler/ssl_certs/certificate_manager.rb +41 -0
  98. data/lib/bundler/templates/Executable +16 -0
  99. data/lib/bundler/templates/Executable.standalone +12 -0
  100. data/lib/bundler/templates/Gemfile +4 -0
  101. data/lib/bundler/templates/newgem/.travis.yml.tt +3 -0
  102. data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
  103. data/lib/bundler/templates/newgem/LICENSE.txt.tt +22 -0
  104. data/lib/bundler/templates/newgem/README.md.tt +31 -0
  105. data/lib/bundler/templates/newgem/Rakefile.tt +26 -0
  106. data/lib/bundler/templates/newgem/bin/newgem.tt +3 -0
  107. data/lib/bundler/templates/newgem/consolerc.tt +3 -0
  108. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +3 -0
  109. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  110. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  111. data/lib/bundler/templates/newgem/gitignore.tt +16 -0
  112. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +12 -0
  113. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
  114. data/lib/bundler/templates/newgem/newgem.gemspec.tt +38 -0
  115. data/lib/bundler/templates/newgem/rspec.tt +2 -0
  116. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +11 -0
  117. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -0
  118. data/lib/bundler/templates/newgem/test/minitest_helper.rb.tt +4 -0
  119. data/lib/bundler/templates/newgem/test/test_newgem.rb.tt +11 -0
  120. data/lib/bundler/ui.rb +7 -0
  121. data/lib/bundler/ui/rg_proxy.rb +21 -0
  122. data/lib/bundler/ui/shell.rb +98 -0
  123. data/lib/bundler/ui/silent.rb +44 -0
  124. data/lib/bundler/vendor/.document +0 -0
  125. data/lib/bundler/vendor/net/http/faster.rb +26 -0
  126. data/lib/bundler/vendor/net/http/persistent.rb +1230 -0
  127. data/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb +128 -0
  128. data/lib/bundler/vendor/thor.rb +480 -0
  129. data/lib/bundler/vendor/thor/actions.rb +319 -0
  130. data/lib/bundler/vendor/thor/actions/create_file.rb +103 -0
  131. data/lib/bundler/vendor/thor/actions/create_link.rb +59 -0
  132. data/lib/bundler/vendor/thor/actions/directory.rb +118 -0
  133. data/lib/bundler/vendor/thor/actions/empty_directory.rb +135 -0
  134. data/lib/bundler/vendor/thor/actions/file_manipulation.rb +316 -0
  135. data/lib/bundler/vendor/thor/actions/inject_into_file.rb +107 -0
  136. data/lib/bundler/vendor/thor/base.rb +656 -0
  137. data/lib/bundler/vendor/thor/command.rb +133 -0
  138. data/lib/bundler/vendor/thor/core_ext/hash_with_indifferent_access.rb +77 -0
  139. data/lib/bundler/vendor/thor/core_ext/io_binary_read.rb +10 -0
  140. data/lib/bundler/vendor/thor/core_ext/ordered_hash.rb +98 -0
  141. data/lib/bundler/vendor/thor/error.rb +32 -0
  142. data/lib/bundler/vendor/thor/group.rb +281 -0
  143. data/lib/bundler/vendor/thor/invocation.rb +173 -0
  144. data/lib/bundler/vendor/thor/line_editor.rb +17 -0
  145. data/lib/bundler/vendor/thor/line_editor/basic.rb +35 -0
  146. data/lib/bundler/vendor/thor/line_editor/readline.rb +88 -0
  147. data/lib/bundler/vendor/thor/parser.rb +4 -0
  148. data/lib/bundler/vendor/thor/parser/argument.rb +73 -0
  149. data/lib/bundler/vendor/thor/parser/arguments.rb +175 -0
  150. data/lib/bundler/vendor/thor/parser/option.rb +121 -0
  151. data/lib/bundler/vendor/thor/parser/options.rb +218 -0
  152. data/lib/bundler/vendor/thor/rake_compat.rb +71 -0
  153. data/lib/bundler/vendor/thor/runner.rb +322 -0
  154. data/lib/bundler/vendor/thor/shell.rb +81 -0
  155. data/lib/bundler/vendor/thor/shell/basic.rb +420 -0
  156. data/lib/bundler/vendor/thor/shell/color.rb +149 -0
  157. data/lib/bundler/vendor/thor/shell/html.rb +126 -0
  158. data/lib/bundler/vendor/thor/util.rb +267 -0
  159. data/lib/bundler/vendor/thor/version.rb +3 -0
  160. data/lib/bundler/vendored_persistent.rb +3 -0
  161. data/lib/bundler/vendored_thor.rb +8 -0
  162. data/lib/bundler/version.rb +6 -0
  163. data/lib/bundler/vlad.rb +11 -0
  164. data/man/bundle-config.ronn +155 -0
  165. data/man/bundle-exec.ronn +136 -0
  166. data/man/bundle-install.ronn +372 -0
  167. data/man/bundle-package.ronn +59 -0
  168. data/man/bundle-platform.ronn +42 -0
  169. data/man/bundle-update.ronn +179 -0
  170. data/man/bundle.ronn +92 -0
  171. data/man/gemfile.5.ronn +369 -0
  172. data/man/index.txt +7 -0
  173. data/spec/bundler/bundler_spec.rb +74 -0
  174. data/spec/bundler/cli_spec.rb +16 -0
  175. data/spec/bundler/definition_spec.rb +21 -0
  176. data/spec/bundler/dsl_spec.rb +108 -0
  177. data/spec/bundler/friendly_errors_spec.rb +13 -0
  178. data/spec/bundler/gem_helper_spec.rb +225 -0
  179. data/spec/bundler/psyched_yaml_spec.rb +8 -0
  180. data/spec/bundler/retry_spec.rb +59 -0
  181. data/spec/bundler/settings_spec.rb +13 -0
  182. data/spec/bundler/source_spec.rb +25 -0
  183. data/spec/cache/gems_spec.rb +316 -0
  184. data/spec/cache/git_spec.rb +188 -0
  185. data/spec/cache/path_spec.rb +121 -0
  186. data/spec/cache/platform_spec.rb +53 -0
  187. data/spec/cache/svn_spec.rb +82 -0
  188. data/spec/commands/binstubs_spec.rb +246 -0
  189. data/spec/commands/check_spec.rb +278 -0
  190. data/spec/commands/clean_spec.rb +652 -0
  191. data/spec/commands/config_spec.rb +227 -0
  192. data/spec/commands/console_spec.rb +102 -0
  193. data/spec/commands/exec_spec.rb +367 -0
  194. data/spec/commands/help_spec.rb +39 -0
  195. data/spec/commands/init_spec.rb +39 -0
  196. data/spec/commands/inject_spec.rb +78 -0
  197. data/spec/commands/licenses_spec.rb +31 -0
  198. data/spec/commands/newgem_spec.rb +451 -0
  199. data/spec/commands/open_spec.rb +80 -0
  200. data/spec/commands/outdated_spec.rb +168 -0
  201. data/spec/commands/package_spec.rb +128 -0
  202. data/spec/commands/show_spec.rb +152 -0
  203. data/spec/install/binstubs_spec.rb +24 -0
  204. data/spec/install/bundler_spec.rb +146 -0
  205. data/spec/install/deploy_spec.rb +237 -0
  206. data/spec/install/gemfile/gemspec_spec.rb +170 -0
  207. data/spec/install/gemfile/git_spec.rb +967 -0
  208. data/spec/install/gemfile/path_spec.rb +480 -0
  209. data/spec/install/gemfile/svn_spec.rb +582 -0
  210. data/spec/install/gemfile_spec.rb +44 -0
  211. data/spec/install/gems/c_ext_spec.rb +48 -0
  212. data/spec/install/gems/dependency_api_spec.rb +580 -0
  213. data/spec/install/gems/env_spec.rb +107 -0
  214. data/spec/install/gems/flex_spec.rb +314 -0
  215. data/spec/install/gems/groups_spec.rb +308 -0
  216. data/spec/install/gems/mirror_spec.rb +39 -0
  217. data/spec/install/gems/platform_spec.rb +221 -0
  218. data/spec/install/gems/post_install_spec.rb +121 -0
  219. data/spec/install/gems/resolving_spec.rb +124 -0
  220. data/spec/install/gems/simple_case_spec.rb +386 -0
  221. data/spec/install/gems/standalone_spec.rb +260 -0
  222. data/spec/install/gems/sudo_spec.rb +136 -0
  223. data/spec/install/gems/win32_spec.rb +26 -0
  224. data/spec/install/gemspecs_spec.rb +50 -0
  225. data/spec/install/path_spec.rb +150 -0
  226. data/spec/install/post_bundle_message_spec.rb +142 -0
  227. data/spec/install/prereleases_spec.rb +43 -0
  228. data/spec/install/security_policy_spec.rb +77 -0
  229. data/spec/install/upgrade_spec.rb +26 -0
  230. data/spec/lock/git_spec.rb +34 -0
  231. data/spec/lock/lockfile_spec.rb +912 -0
  232. data/spec/lock/svn_spec.rb +35 -0
  233. data/spec/other/bundle_ruby_spec.rb +142 -0
  234. data/spec/other/cli_dispatch_spec.rb +21 -0
  235. data/spec/other/ext_spec.rb +60 -0
  236. data/spec/other/platform_spec.rb +1285 -0
  237. data/spec/other/ssl_cert_spec.rb +10 -0
  238. data/spec/quality_spec.rb +88 -0
  239. data/spec/realworld/dependency_api_spec.rb +60 -0
  240. data/spec/realworld/edgecases_spec.rb +177 -0
  241. data/spec/realworld/parallel_spec.rb +69 -0
  242. data/spec/resolver/basic_spec.rb +66 -0
  243. data/spec/resolver/platform_spec.rb +88 -0
  244. data/spec/runtime/executable_spec.rb +149 -0
  245. data/spec/runtime/load_spec.rb +107 -0
  246. data/spec/runtime/platform_spec.rb +90 -0
  247. data/spec/runtime/require_spec.rb +332 -0
  248. data/spec/runtime/setup_spec.rb +856 -0
  249. data/spec/runtime/with_clean_env_spec.rb +91 -0
  250. data/spec/spec_helper.rb +114 -0
  251. data/spec/support/artifice/endopint_marshal_fail_basic_authentication.rb +13 -0
  252. data/spec/support/artifice/endpoint.rb +71 -0
  253. data/spec/support/artifice/endpoint_500.rb +37 -0
  254. data/spec/support/artifice/endpoint_api_missing.rb +16 -0
  255. data/spec/support/artifice/endpoint_basic_authentication.rb +13 -0
  256. data/spec/support/artifice/endpoint_creds_diff_host.rb +38 -0
  257. data/spec/support/artifice/endpoint_extra.rb +31 -0
  258. data/spec/support/artifice/endpoint_extra_missing.rb +15 -0
  259. data/spec/support/artifice/endpoint_fallback.rb +17 -0
  260. data/spec/support/artifice/endpoint_host_redirect.rb +15 -0
  261. data/spec/support/artifice/endpoint_marshal_fail.rb +11 -0
  262. data/spec/support/artifice/endpoint_redirect.rb +15 -0
  263. data/spec/support/artifice/endpoint_strict_basic_authentication.rb +18 -0
  264. data/spec/support/artifice/endpoint_timeout.rb +13 -0
  265. data/spec/support/builders.rb +748 -0
  266. data/spec/support/fakeweb/rack-1.0.0.marshal +2 -0
  267. data/spec/support/fakeweb/windows.rb +23 -0
  268. data/spec/support/hax.rb +22 -0
  269. data/spec/support/helpers.rb +348 -0
  270. data/spec/support/indexes.rb +280 -0
  271. data/spec/support/less_than_proc.rb +14 -0
  272. data/spec/support/matchers.rb +77 -0
  273. data/spec/support/path.rb +81 -0
  274. data/spec/support/permissions.rb +10 -0
  275. data/spec/support/platforms.rb +94 -0
  276. data/spec/support/ruby_ext.rb +20 -0
  277. data/spec/support/rubygems_ext.rb +39 -0
  278. data/spec/support/streams.rb +13 -0
  279. data/spec/support/sudo.rb +16 -0
  280. data/spec/update/gems_spec.rb +201 -0
  281. data/spec/update/git_spec.rb +236 -0
  282. data/spec/update/source_spec.rb +63 -0
  283. data/spec/update/svn_spec.rb +100 -0
  284. metadata +486 -0
@@ -0,0 +1,260 @@
1
+ require 'fileutils'
2
+ require 'uri'
3
+ require 'digest/sha1'
4
+
5
+ module Bundler
6
+ class Source
7
+
8
+ class SVN < Path
9
+ autoload :SVNProxy, 'bundler/source/svn/svn_proxy'
10
+
11
+ attr_reader :uri, :ref, :options
12
+
13
+ def initialize(options)
14
+ @options = options
15
+ @glob = options["glob"] || DEFAULT_GLOB
16
+
17
+ @allow_cached = false
18
+ @allow_remote = false
19
+
20
+ # Stringify options that could be set as symbols
21
+ %w(ref revision).each{|k| options[k] = options[k].to_s if options[k] }
22
+
23
+ @uri = options["uri"]
24
+ @ref = options["ref"] || 'HEAD'
25
+ @name = options["name"]
26
+ @version = options["version"]
27
+
28
+ @copied = false
29
+ @local = false
30
+ end
31
+
32
+ def self.from_lock(options)
33
+ new(options.merge("uri" => options.delete("remote")))
34
+ end
35
+
36
+ def to_lock
37
+ out = "SVN\n"
38
+ out << " remote: #{@uri}\n"
39
+ out << " revision: #{revision}\n"
40
+ out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
41
+ out << " specs:\n"
42
+ end
43
+
44
+ def eql?(o)
45
+ o.is_a?(SVN) &&
46
+ uri == o.uri &&
47
+ ref == o.ref &&
48
+ name == o.name &&
49
+ version == o.version
50
+ end
51
+
52
+ alias == eql?
53
+
54
+ def to_s
55
+ at = if local?
56
+ path
57
+ elsif options["ref"]
58
+ options["ref"]
59
+ else
60
+ ref
61
+ end
62
+ "#{uri} (at #{at})"
63
+ end
64
+
65
+ def name
66
+ File.basename(@uri, '.svn')
67
+ end
68
+
69
+ # This is the path which is going to contain a specific
70
+ # checkout of the svn repository. When using local svn
71
+ # repos, this is set to the local repo.
72
+ def install_path
73
+ @install_path ||= begin
74
+ svn_scope = "#{base_name}-#{revision}"
75
+
76
+ if Bundler.requires_sudo?
77
+ Bundler.user_bundle_path.join(Bundler.ruby_scope).join(svn_scope)
78
+ else
79
+ Bundler.install_path.join(svn_scope)
80
+ end
81
+ end
82
+ end
83
+
84
+ alias :path :install_path
85
+
86
+ def extension_dir_name
87
+ "#{base_name}-#{revision}"
88
+ end
89
+
90
+ def unlock!
91
+ svn_proxy.revision = nil
92
+ @unlocked = true
93
+ end
94
+
95
+ def local_override!(path)
96
+ return false if local?
97
+
98
+ path = Pathname.new(path)
99
+ path = path.expand_path(Bundler.root) unless path.relative?
100
+
101
+ if options["ref"]
102
+ raise SVNError, "Cannot use local override for #{name} at #{path} because " \
103
+ ":ref is specified in Gemfile. Don't specify a revision or use " \
104
+ "`bundle config --delete` to remove the local override"
105
+ end
106
+
107
+ unless path.exist?
108
+ raise SVNError, "Cannot use local override for #{name} because #{path} " \
109
+ "does not exist. Check `bundle config --delete` to remove the local override"
110
+ end
111
+
112
+ set_local!(path)
113
+
114
+ # Create a new svn proxy without the cached revision
115
+ # so the Gemfile.lock always picks up the new revision.
116
+ @svn_proxy = SVNProxy.new(path, uri, ref)
117
+ true
118
+ end
119
+
120
+ # TODO: actually cache svn specs
121
+ def specs(*)
122
+ if has_app_cache? && !local?
123
+ set_local!(app_cache_path)
124
+ end
125
+
126
+ if requires_checkout? && !@copied
127
+ svn_proxy.checkout
128
+ svn_proxy.copy_to(install_path)
129
+ serialize_gemspecs_in(install_path)
130
+ @copied = true
131
+ end
132
+
133
+ local_specs
134
+ end
135
+
136
+ def install(spec)
137
+ debug = nil
138
+ if requires_checkout? && !@copied
139
+ debug = " * Checking out revision: #{ref}"
140
+ svn_proxy.copy_to(install_path)
141
+ serialize_gemspecs_in(install_path)
142
+ @copied = true
143
+ end
144
+ generate_bin(spec)
145
+ if requires_checkout? && spec.post_install_message
146
+ Installer.post_install_messages[spec.name] = spec.post_install_message
147
+ end
148
+ ["Using #{version_message(spec)} from #{to_s}", nil, debug]
149
+ end
150
+
151
+ def cache(spec, custom_path = nil)
152
+ app_cache_path = app_cache_path(custom_path)
153
+ return unless Bundler.settings[:cache_all]
154
+ return if path == app_cache_path
155
+ cached!
156
+ FileUtils.rm_rf(app_cache_path)
157
+ svn_proxy.checkout if requires_checkout?
158
+ svn_proxy.copy_to(app_cache_path)
159
+ serialize_gemspecs_in(app_cache_path)
160
+ end
161
+
162
+ def load_spec_files
163
+ super
164
+ rescue PathError => e
165
+ Bundler.ui.trace e
166
+ raise SVNError, "#{to_s} is not yet checked out. Run `bundle install` first."
167
+ end
168
+
169
+ # This is the path which is going to contain a cache
170
+ # of the svn repository. When using the same svn repository
171
+ # across different projects, this cache will be shared.
172
+ # When using local svn repos, this is set to the local repo.
173
+ def cache_path
174
+ @cache_path ||= begin
175
+ svn_scope = "#{base_name}-#{uri_hash}"
176
+
177
+ if Bundler.requires_sudo?
178
+ Bundler.user_bundle_path.join("cache/svn", svn_scope)
179
+ else
180
+ Bundler.cache.join("svn", svn_scope)
181
+ end
182
+ end
183
+ end
184
+
185
+ def app_cache_dirname
186
+ "#{base_name}-#{(cached_revision || revision)}"
187
+ end
188
+
189
+ def revision
190
+ svn_proxy.revision
191
+ end
192
+
193
+ def allow_svn_ops?
194
+ @allow_remote || @allow_cached
195
+ end
196
+
197
+ private
198
+
199
+ def serialize_gemspecs_in(destination)
200
+ expanded_path = destination.expand_path(Bundler.root)
201
+ Dir["#{expanded_path}/#{@glob}"].each do |spec_path|
202
+ # Evaluate gemspecs and cache the result. Gemspecs
203
+ # in svn might require svn or other dependencies.
204
+ # The gemspecs we cache should already be evaluated.
205
+ spec = Bundler.load_gemspec(spec_path)
206
+ next unless spec
207
+ File.open(spec_path, 'wb') {|file| file.write(spec.to_ruby) }
208
+ end
209
+ end
210
+
211
+ def set_local!(path)
212
+ @local = true
213
+ @local_specs = @svn_proxy = nil
214
+ @cache_path = @install_path = path
215
+ end
216
+
217
+ def has_app_cache?
218
+ cached_revision && super
219
+ end
220
+
221
+ def local?
222
+ @local
223
+ end
224
+
225
+ def requires_checkout?
226
+ allow_svn_ops? && !local?
227
+ end
228
+
229
+ def base_name
230
+ File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*},''),".svn")
231
+ end
232
+
233
+ def uri_hash
234
+ if uri =~ %r{^\w+://(\w+@)?}
235
+ # Downcase the domain component of the URI
236
+ # and strip off a trailing slash, if one is present
237
+ input = URI.parse(uri).normalize.to_s.sub(%r{/$},'')
238
+ else
239
+ # If there is no URI scheme, assume it is an ssh/svn URI
240
+ input = uri
241
+ end
242
+ Digest::SHA1.hexdigest(input)
243
+ end
244
+
245
+ def cached_revision
246
+ options["revision"]
247
+ end
248
+
249
+ def cached?
250
+ cache_path.exist?
251
+ end
252
+
253
+ def svn_proxy
254
+ @svn_proxy ||= SVNProxy.new(cache_path, uri, ref, cached_revision, self)
255
+ end
256
+
257
+ end
258
+
259
+ end
260
+ end
@@ -0,0 +1,110 @@
1
+ module Bundler
2
+ class Source
3
+ class SVN < Path
4
+
5
+ class SVNNotInstalledError < SVNError
6
+ def initialize
7
+ msg = "You need to install svn to be able to use gems from svn repositories. "
8
+ msg << "For help installing svn, please refer to SVNook's tutorial at http://svnbook.red-bean.com/en/1.7/svn.intro.install.html"
9
+ super msg
10
+ end
11
+ end
12
+
13
+ class SVNNotAllowedError < SVNError
14
+ def initialize(command)
15
+ msg = "Bundler is trying to run a `svn #{command}` at runtime. You probably need to run `bundle install`. However, "
16
+ msg << "this error message could probably be more useful. Please submit a ticket at http://github.com/bundler/bundler/issues "
17
+ msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
18
+ super msg
19
+ end
20
+ end
21
+
22
+ class SVNCommandError < SVNError
23
+ def initialize(command, path = nil)
24
+ msg = "SVN error: command `svn #{command}` in directory #{Dir.pwd} has failed."
25
+ msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist?
26
+ super msg
27
+ end
28
+ end
29
+
30
+ # The SVNProxy is responsible to interact with svn repositories.
31
+ # All actions required by the SVN source is encapsulated in this
32
+ # object.
33
+ class SVNProxy
34
+ attr_accessor :path, :uri, :ref
35
+ attr_writer :revision
36
+
37
+ def initialize(path, uri, ref, revision = nil, svn = nil)
38
+ @path = path
39
+ @uri = uri
40
+ @ref = ref
41
+ @revision = revision
42
+ @svn = svn
43
+ raise SVNNotInstalledError.new if allow? && !Bundler.svn_present?
44
+ end
45
+
46
+ def revision
47
+ @revision ||= svn("info --revision #{ref} #{uri_escaped} | grep \"Revision\" | awk '{print $2}'").strip
48
+ end
49
+
50
+ def checkout
51
+ if path.exist?
52
+ Bundler.ui.confirm "Updating #{uri}"
53
+ in_path do
54
+ svn_retry %|update --force --quiet --revision #{revision}|
55
+ end
56
+ else
57
+ Bundler.ui.info "Fetching #{uri}"
58
+ FileUtils.mkdir_p(path.dirname)
59
+ svn_retry %|checkout --revision #{revision} #{uri_escaped} "#{path}"|
60
+ end
61
+ end
62
+
63
+ def copy_to(destination)
64
+ FileUtils.mkdir_p(destination.dirname)
65
+ FileUtils.rm_rf(destination)
66
+ FileUtils.cp_r(path, destination)
67
+ File.chmod((0777 & ~File.umask), destination)
68
+ end
69
+
70
+ private
71
+
72
+ def svn_retry(command)
73
+ Bundler::Retry.new("svn #{command}", SVNNotAllowedError).attempts do
74
+ svn(command)
75
+ end
76
+ end
77
+
78
+ def svn(command, check_errors=true)
79
+ raise SVNNotAllowedError.new(command) unless allow?
80
+ out = %x{svn #{command}}
81
+ raise SVNCommandError.new(command, path) if check_errors && !$?.success?
82
+ out
83
+ end
84
+
85
+ # Escape the URI for svn commands
86
+ def uri_escaped
87
+ if Bundler::WINDOWS
88
+ # Windows quoting requires double quotes only, with double quotes
89
+ # inside the string escaped by being doubled.
90
+ '"' + uri.gsub('"') {|s| '""'} + '"'
91
+ else
92
+ # Bash requires single quoted strings, with the single quotes escaped
93
+ # by ending the string, escaping the quote, and restarting the string.
94
+ "'" + uri.gsub("'") {|s| "'\\''"} + "'"
95
+ end
96
+ end
97
+
98
+ def allow?
99
+ @svn ? @svn.allow_svn_ops? : true
100
+ end
101
+
102
+ def in_path(&blk)
103
+ checkout unless path.exist?
104
+ SharedHelpers.chdir(path, &blk)
105
+ end
106
+ end
107
+
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,154 @@
1
+ require 'tsort'
2
+ require 'forwardable'
3
+
4
+ module Bundler
5
+ class SpecSet
6
+ extend Forwardable
7
+ include TSort, Enumerable
8
+
9
+ def_delegators :@specs, :<<, :length, :add, :remove
10
+ def_delegators :sorted, :each
11
+
12
+ def initialize(specs)
13
+ @specs = specs.sort_by { |s| s.name }
14
+ end
15
+
16
+ def for(dependencies, skip = [], check = false, match_current_platform = false)
17
+ handled, deps, specs = {}, dependencies.dup, []
18
+ skip << 'bundler'
19
+
20
+ until deps.empty?
21
+ dep = deps.shift
22
+ next if handled[dep] || skip.include?(dep.name)
23
+
24
+ spec = lookup[dep.name].find do |s|
25
+ if match_current_platform
26
+ Gem::Platform.match(s.platform)
27
+ else
28
+ s.match_platform(dep.__platform)
29
+ end
30
+ end
31
+
32
+ handled[dep] = true
33
+
34
+ if spec
35
+ specs << spec
36
+
37
+ spec.dependencies.each do |d|
38
+ next if d.type == :development
39
+ d = DepProxy.new(d, dep.__platform) unless match_current_platform
40
+ deps << d
41
+ end
42
+ elsif check
43
+ return false
44
+ end
45
+ end
46
+
47
+ if spec = lookup['bundler'].first
48
+ specs << spec
49
+ end
50
+
51
+ check ? true : SpecSet.new(specs)
52
+ end
53
+
54
+ def valid_for?(deps)
55
+ self.for(deps, [], true)
56
+ end
57
+
58
+ def [](key)
59
+ key = key.name if key.respond_to?(:name)
60
+ lookup[key].reverse
61
+ end
62
+
63
+ def []=(key, value)
64
+ @specs << value
65
+ @lookup = nil
66
+ @sorted = nil
67
+ value
68
+ end
69
+
70
+ def sort!
71
+ self
72
+ end
73
+
74
+ def to_a
75
+ sorted.dup
76
+ end
77
+
78
+ def to_hash
79
+ lookup.dup
80
+ end
81
+
82
+ def materialize(deps, missing_specs = nil)
83
+ materialized = self.for(deps, [], false, true).to_a
84
+ deps = materialized.map {|s| s.name }.uniq
85
+ materialized.map! do |s|
86
+ next s unless s.is_a?(LazySpecification)
87
+ s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
88
+ spec = s.__materialize__
89
+ if missing_specs
90
+ missing_specs << s unless spec
91
+ else
92
+ raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
93
+ end
94
+ spec if spec
95
+ end
96
+ SpecSet.new(materialized.compact)
97
+ end
98
+
99
+ def merge(set)
100
+ arr = sorted.dup
101
+ set.each do |s|
102
+ next if arr.any? { |s2| s2.name == s.name && s2.version == s.version && s2.platform == s.platform }
103
+ arr << s
104
+ end
105
+ SpecSet.new(arr)
106
+ end
107
+
108
+ private
109
+
110
+ def sorted
111
+ rake = @specs.find { |s| s.name == 'rake' }
112
+ begin
113
+ @sorted ||= ([rake] + tsort).compact.uniq
114
+ rescue TSort::Cyclic => error
115
+ cgems = extract_circular_gems(error)
116
+ raise CyclicDependencyError, "Your Gemfile requires gems that depend" \
117
+ " depend on each other, creating an infinite loop. Please remove" \
118
+ " either gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
119
+ end
120
+ end
121
+
122
+ def extract_circular_gems(error)
123
+ if Bundler.current_ruby.mri? && Bundler.current_ruby.on_19?
124
+ error.message.scan(/(\w+) \([^)]/).flatten
125
+ else
126
+ error.message.scan(/@name="(.*?)"/).flatten
127
+ end
128
+ end
129
+
130
+ def lookup
131
+ @lookup ||= begin
132
+ lookup = Hash.new { |h,k| h[k] = [] }
133
+ specs = @specs.sort_by do |s|
134
+ s.platform.to_s == 'ruby' ? "\0" : s.platform.to_s
135
+ end
136
+ specs.reverse_each do |s|
137
+ lookup[s.name] << s
138
+ end
139
+ lookup
140
+ end
141
+ end
142
+
143
+ def tsort_each_node
144
+ @specs.each { |s| yield s }
145
+ end
146
+
147
+ def tsort_each_child(s)
148
+ s.dependencies.sort_by { |d| d.name }.each do |d|
149
+ next if d.type == :development
150
+ lookup[d.name].each { |s2| yield s2 }
151
+ end
152
+ end
153
+ end
154
+ end