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.
This commit is contained in:
Fergal Hainey 2010-02-14 14:51:54 +00:00 committed by Adam Vandenberg
parent 5e1632c1e2
commit 69bc0cbf67

View File

@ -142,21 +142,47 @@ end
class SubversionDownloadStrategy <AbstractDownloadStrategy class SubversionDownloadStrategy <AbstractDownloadStrategy
def fetch 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}" ohai "Checking out #{@url}"
@co=HOMEBREW_CACHE+@unique_token if @spec == :revision
unless @co.exist? svncommand = @export.exist? ? 'up' : 'checkout';
quiet_safe_system svn, 'checkout', @url, @co 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 else
puts "Updating #{@co}" svncommand = @export.exist? ? 'up' : 'checkout';
quiet_safe_system svn, 'up', @co args = [svn, svncommand, '--force', @url, @export]
quiet_safe_system *args
end end
end end
def stage def stage
# Force the export, since the target directory will already exist # `svn export PATH1 PATH2` doesn't need network when no revision is given.
args = [svn, 'export', '--force', @co, Dir.pwd] quiet_safe_system svn, 'export', '--force', @export, Dir.pwd
args << '-r' << @ref if @spec == :revision and @ref
quiet_safe_system *args
end end
# Override this method in a DownloadStrategy to force the use of a non- # Override this method in a DownloadStrategy to force the use of a non-