aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorFergal Hainey2010-02-03 23:58:53 +0000
committerAdam Vandenberg2010-06-08 12:35:31 -0700
commit42f5993fed385c2188f61a7afc04a938ddbfa18b (patch)
treed81cbed18a0d4ce05f0156e5f185fec5e5938301 /Library
parent012b834e3cbe725d6e4dc0bf7fe8f6046f6471c7 (diff)
downloadhomebrew-42f5993fed385c2188f61a7afc04a938ddbfa18b.tar.bz2
More efficient SVN download that handles externals
Now makes use of `svn up` to make cache act like a cache. Externals without a revision specified are now checked out at HEAD, whereas before they were ignored. Escaping arguments to backticks. Making sure main repo is checked out before the externals. Signed-off-by: Adam Vandenberg <flangy@gmail.com>
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/download_strategy.rb46
1 files changed, 37 insertions, 9 deletions
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index aa60b3c49..8abbb5a54 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -126,7 +126,8 @@ end
class SubversionDownloadStrategy <AbstractDownloadStrategy
def initialize url, name, version, specs
super
- @co=HOMEBREW_CACHE+@unique_token
+ @name = name
+ @export = HOMEBREW_CACHE+@unique_token
end
def cached_location
@@ -134,20 +135,47 @@ class SubversionDownloadStrategy <AbstractDownloadStrategy
end
def fetch
+ # Looks like `svn up` is pretty cool, as it will save on bandwidth (makes
+ # cache actually a cache) and will have a similar effect to verifying the
+ # cache as it will make any changes to get the right revision.
ohai "Checking out #{@url}"
- unless @co.exist?
- quiet_safe_system svn, 'checkout', @url, @co
+ if @spec == :revision
+ svncommand = @export.exist? ? 'up' : 'checkout';
+ args = [svn, svncommand, '--force', @url, @export]
+ args << '-r' << @ref if @ref
+ quiet_safe_system *args
+ elsif @spec == :revisions
+ externals = Hash.new
+ # Oh god escaping shell args.
+ # See http://notetoself.vrensk.com/2008/08/escaping-single-quotes-in-ruby-harder-than-expected/
+ `'#{svn.gsub(/\\|'/) { |c| "\\#{c}" }}' propget svn:externals \
+ '#{@url.gsub(/\\|'/) { |c| "\\#{c}" }}'`.each_line do |external_line|
+ key, value = external_line.split /\s+/
+ externals[key] = value
+ end
+ fetch_repo = lambda do |external, uri|
+ if external.to_s == @name
+ path = ''
+ else
+ path = external.to_s
+ end
+ svncommand = (@export+path).exist? ? 'up' : 'checkout';
+ args = [svn, svncommand, '--force', '--ignore-externals', uri, @export+path]
+ args << '-r' << @ref[external] if @ref[external]
+ quiet_safe_system *args
+ end
+ fetch_repo.call @name, @url
+ externals.each_pair &fetch_repo
else
- puts "Updating #{@co}"
- quiet_safe_system svn, 'up', @co
+ svncommand = @export.exist? ? 'up' : 'checkout';
+ args = [svn, svncommand, '--force', @url, @export]
+ quiet_safe_system *args
end
end
def stage
- # Force the export, since the target directory will already exist
- args = [svn, 'export', '--force', @co, Dir.pwd]
- args << '-r' << @ref if @spec == :revision and @ref
- quiet_safe_system *args
+ # `svn export PATH1 PATH2` doesn't need network when no revision is given.
+ quiet_safe_system svn, 'export', '--force', @export, Dir.pwd
end
# Override this method in a DownloadStrategy to force the use of a non-