From 8287581afce60aa9b6f4a9ea123594c8a2cebb53 Mon Sep 17 00:00:00 2001 From: nobu Date: Sun, 18 Jan 2015 02:22:50 +0000 Subject: vcs.rb: export without remote svn * tool/vcs.rb (VCS::SVN#export): export without access to the remote server. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49314 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- tool/vcs.rb | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/tool/vcs.rb b/tool/vcs.rb index d4b87ec781..90aaf6f061 100644 --- a/tool/vcs.rb +++ b/tool/vcs.rb @@ -1,4 +1,5 @@ # vcs +require 'fileutils' ENV.delete('PWD') @@ -132,21 +133,33 @@ class VCS if srcdir and (String === path or path.respond_to?(:to_path)) path = File.join(srcdir, path) end - info_xml = IO.pread(%W"svn info --xml #{path}") + if srcdir + info_xml = IO.pread(%W"svn info --xml #{srcdir}") + info_xml = nil unless info_xml[/(.*)<\/url>/, 1] == path.to_s + end + info_xml ||= IO.pread(%W"svn info --xml #{path}") _, last, _, changed, _ = info_xml.split(/revision="(\d+)"/) modified = info_xml[/([^<>]*)/, 1] branch = info_xml[%r'\^/(?:branches/|tags/)?([^<>]+)', 1] [last, changed, modified, branch] end + def get_info + @info ||= IO.pread(%W"svn info --xml #{@srcdir}") + end + def url - unless defined?(@url) - url = IO.pread(%W"svn info --xml #{@srcdir}")[/(.*)<\/root>/, 1] + unless @url + url = get_info[/(.*)<\/root>/, 1] @url = URI.parse(url+"/") if url end @url end + def wcroot + @wcroot ||= get_info[/(.*)<\/wcroot-abspath>/, 1] + end + def branch(name) url + "branches/#{name}" end @@ -182,6 +195,29 @@ class VCS end def export(revision, url, dir) + if @srcdir + srcdir = File.realpath(@srcdir) + rootdir = wcroot+"/" + if srcdir.start_with?(rootdir) + subdir = srcdir[rootdir.size..-1] + subdir = nil if subdir.empty? + FileUtils.mkdir_p(svndir = dir+"/.svn") + FileUtils.ln_s(Dir.glob(rootdir+"/.svn/*"), svndir) + system("svn", "-q", "revert", "-R", subdir || ".", :chdir => dir) or return false + FileUtils.rm_rf(svndir) + if subdir + tmpdir = Dir.mktmpdir("tmp-co.", "#{dir}/#{subdir}") + File.rename(tmpdir, tmpdir = "#{dir}/#{File.basename(tmpdir)}") + FileUtils.mv(Dir.glob("#{dir}/#{subdir}/{.[^.]*,..?*,*}"), tmpdir) + begin + Dir.rmdir("#{dir}/#{subdir}") + end until (subdir = File.dirname(subdir)) == '.' + FileUtils.mv(Dir.glob("#{tmpdir}/#{subdir}/{.[^.]*,..?*,*}"), dir) + Dir.rmdir(tmpdir) + end + return true + end + end IO.popen(%W"svn export -r #{revision} #{url} #{dir}") do |pipe| pipe.each {|line| /^A/ =~ line or yield line} end -- cgit v1.2.3