diff options
| author | Fergal Hainey | 2010-02-03 23:58:53 +0000 |
|---|---|---|
| committer | Adam Vandenberg | 2010-06-08 12:35:31 -0700 |
| commit | 42f5993fed385c2188f61a7afc04a938ddbfa18b (patch) | |
| tree | d81cbed18a0d4ce05f0156e5f185fec5e5938301 /Library | |
| parent | 012b834e3cbe725d6e4dc0bf7fe8f6046f6471c7 (diff) | |
| download | homebrew-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.rb | 46 |
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- |
