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:
parent
5e1632c1e2
commit
69bc0cbf67
@ -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-
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user