aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bundler/source/svn.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bundler/source/svn.rb')
-rw-r--r--lib/bundler/source/svn.rb259
1 files changed, 0 insertions, 259 deletions
diff --git a/lib/bundler/source/svn.rb b/lib/bundler/source/svn.rb
deleted file mode 100644
index a7a42ecf..00000000
--- a/lib/bundler/source/svn.rb
+++ /dev/null
@@ -1,259 +0,0 @@
-require 'fileutils'
-require 'uri'
-require 'digest/sha1'
-
-module Bundler
- class Source
-
- class SVN < Path
- autoload :SVNProxy, 'bundler/source/svn/svn_proxy'
-
- attr_reader :uri, :ref, :options
-
- def initialize(options)
- @options = options
- @glob = options["glob"] || DEFAULT_GLOB
-
- @allow_cached = false
- @allow_remote = false
-
- # Stringify options that could be set as symbols
- %w(ref revision).each{|k| options[k] = options[k].to_s if options[k] }
-
- @uri = options["uri"]
- @ref = options["ref"] || 'HEAD'
- @name = options["name"]
- @version = options["version"]
-
- @copied = false
- @local = false
- end
-
- def self.from_lock(options)
- new(options.merge("uri" => options.delete("remote")))
- end
-
- def to_lock
- out = "SVN\n"
- out << " remote: #{@uri}\n"
- out << " revision: #{revision}\n"
- out << " ref: #{ref}\n"
- out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
- out << " specs:\n"
- end
-
- def hash
- [self.class, uri, ref, name, version].hash
- end
-
- def eql?(o)
- o.is_a?(SVN) &&
- uri == o.uri &&
- ref == o.ref &&
- name == o.name &&
- version == o.version
- end
-
- alias == eql?
-
- def to_s
- at = if local?
- path
- elsif options["ref"]
- options["ref"]
- else
- ref
- end
- "#{uri} (at #{at})"
- end
-
- def name
- File.basename(@uri, '.svn')
- end
-
- # This is the path which is going to contain a specific
- # checkout of the svn repository. When using local svn
- # repos, this is set to the local repo.
- def install_path
- @install_path ||= begin
- svn_scope = "#{base_name}-#{revision}"
-
- if Bundler.requires_sudo?
- Bundler.user_bundle_path.join(Bundler.ruby_scope).join(svn_scope)
- else
- Bundler.install_path.join(svn_scope)
- end
- end
- end
-
- alias :path :install_path
-
- def extension_dir_name
- "#{base_name}-#{revision}"
- end
-
- def unlock!
- svn_proxy.revision = nil
- @unlocked = true
- end
-
- def local_override!(path)
- return false if local?
-
- path = Pathname.new(path)
- path = path.expand_path(Bundler.root) unless path.relative?
-
- unless path.exist?
- raise SVNError, "Cannot use local override for #{name} because #{path} " \
- "does not exist. Check `bundle config --delete` to remove the local override"
- end
-
- set_local!(path)
-
- # Create a new svn proxy without the cached revision
- # so the Gemfile.lock always picks up the new revision.
- @svn_proxy = SVNProxy.new(path, uri, ref)
- true
- end
-
- # TODO: actually cache svn specs
- def specs(*)
- if has_app_cache? && !local?
- set_local!(app_cache_path)
- end
-
- if requires_checkout? && !@copied
- svn_proxy.checkout
- svn_proxy.copy_to(install_path)
- serialize_gemspecs_in(install_path)
- @copied = true
- end
-
- local_specs
- end
-
- def install(spec)
- debug = nil
- if requires_checkout? && !@copied
- debug = " * Checking out revision: #{ref}"
- svn_proxy.copy_to(install_path)
- serialize_gemspecs_in(install_path)
- @copied = true
- end
- generate_bin(spec)
- if requires_checkout? && spec.post_install_message
- Installer.post_install_messages[spec.name] = spec.post_install_message
- end
- ["Using #{version_message(spec)} from #{to_s}", nil, debug]
- end
-
- def cache(spec, custom_path = nil)
- app_cache_path = app_cache_path(custom_path)
- return unless Bundler.settings[:cache_all]
- return if path == app_cache_path
- cached!
- FileUtils.rm_rf(app_cache_path)
- svn_proxy.checkout if requires_checkout?
- svn_proxy.copy_to(app_cache_path)
- serialize_gemspecs_in(app_cache_path)
- end
-
- def load_spec_files
- super
- rescue PathError => e
- Bundler.ui.trace e
- raise SVNError, "#{to_s} is not yet checked out. Run `bundle install` first."
- end
-
- # This is the path which is going to contain a cache
- # of the svn repository. When using the same svn repository
- # across different projects, this cache will be shared.
- # When using local svn repos, this is set to the local repo.
- def cache_path
- @cache_path ||= begin
- svn_scope = "#{base_name}-#{uri_hash}"
-
- if Bundler.requires_sudo?
- Bundler.user_bundle_path.join("cache/svn", svn_scope)
- else
- Bundler.cache.join("svn", svn_scope)
- end
- end
- end
-
- def app_cache_dirname
- "#{base_name}-#{(cached_revision || revision)}"
- end
-
- def revision
- svn_proxy.revision
- end
-
- def allow_svn_ops?
- @allow_remote || @allow_cached
- end
-
- private
-
- def serialize_gemspecs_in(destination)
- expanded_path = destination.expand_path(Bundler.root)
- Dir["#{expanded_path}/#{@glob}"].each do |spec_path|
- # Evaluate gemspecs and cache the result. Gemspecs
- # in svn might require svn or other dependencies.
- # The gemspecs we cache should already be evaluated.
- spec = Bundler.load_gemspec(spec_path)
- next unless spec
- File.open(spec_path, 'wb') {|file| file.write(spec.to_ruby) }
- end
- end
-
- def set_local!(path)
- @local = true
- @local_specs = @svn_proxy = nil
- @cache_path = @install_path = path
- end
-
- def has_app_cache?
- cached_revision && super
- end
-
- def local?
- @local
- end
-
- def requires_checkout?
- allow_svn_ops? && !local?
- end
-
- def base_name
- File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*},''),".svn")
- end
-
- def uri_hash
- if uri =~ %r{^\w+://(\w+@)?}
- # Downcase the domain component of the URI
- # and strip off a trailing slash, if one is present
- input = URI.parse(uri).normalize.to_s.sub(%r{/$},'')
- else
- # If there is no URI scheme, assume it is an ssh/svn URI
- input = uri
- end
- Digest::SHA1.hexdigest(input)
- end
-
- def cached_revision
- options["revision"]
- end
-
- def cached?
- cache_path.exist?
- end
-
- def svn_proxy
- @svn_proxy ||= SVNProxy.new(cache_path, uri, ref, cached_revision, self)
- end
-
- end
-
- end
-end