diff options
| author | Fergal Hainey | 2010-02-14 14:51:54 +0000 |
|---|---|---|
| committer | Adam Vandenberg | 2010-03-01 09:59:25 -0800 |
| commit | 45ce0c963a52293063432674d5c360ebe65254e2 (patch) | |
| tree | 7fc1931d1883b3d383330f796357c393ef8263c8 /Library | |
| parent | 2d0a7fb9e2e8569fcb8a161d373387e461cf0ad9 (diff) | |
| download | homebrew-45ce0c963a52293063432674d5c360ebe65254e2.tar.bz2 | |
Improvements to new SubversionDownloadStrategy
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.
Diffstat (limited to 'Library')
| -rw-r--r-- | Library/Homebrew/download_strategy.rb | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb index b49cf4d6e..5657924e6 100644 --- a/Library/Homebrew/download_strategy.rb +++ b/Library/Homebrew/download_strategy.rb @@ -142,21 +142,47 @@ end class SubversionDownloadStrategy <AbstractDownloadStrategy 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}" - @co=HOMEBREW_CACHE+@unique_token - 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- |
