Merge pull request #8455 from reitermarkus/document-svn

Refactor and document `Svn`.
This commit is contained in:
Markus Reiter 2020-08-24 00:03:21 +02:00 committed by GitHub
commit 4465a1f6fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 47 deletions

View File

@ -60,7 +60,7 @@ class DependencyCollector
end end
def subversion_dep_if_needed(tags) def subversion_dep_if_needed(tags)
return if Utils.svn_available? return if Utils::Svn.available?
Dependency.new("subversion", tags) Dependency.new("subversion", tags)
end end

View File

@ -1088,9 +1088,9 @@ module Homebrew
problem "The URL #{url} is not a valid git URL" unless Utils::Git.remote_exists? url problem "The URL #{url} is not a valid git URL" unless Utils::Git.remote_exists? url
elsif strategy <= SubversionDownloadStrategy elsif strategy <= SubversionDownloadStrategy
next unless DevelopmentTools.subversion_handles_most_https_certificates? next unless DevelopmentTools.subversion_handles_most_https_certificates?
next unless Utils.svn_available? next unless Utils::Svn.available?
problem "The URL #{url} is not a valid svn URL" unless Utils.svn_remote_exists? url problem "The URL #{url} is not a valid svn URL" unless Utils::Svn.remote_exists? url
end end
end end
end end

View File

@ -523,7 +523,7 @@ class SubversionDownloadStrategy < VCSDownloadStrategy
end end
def source_modified_time def source_modified_time
time = if Version.create(Utils.svn_version) >= Version.create("1.9") time = if Version.create(Utils::Svn.version) >= Version.create("1.9")
out, = system_command("svn", args: ["info", "--show-item", "last-changed-date"], chdir: cached_location) out, = system_command("svn", args: ["info", "--show-item", "last-changed-date"], chdir: cached_location)
out out
else else

View File

@ -2,49 +2,48 @@
require "utils/svn" require "utils/svn"
describe Utils do describe Utils::Svn do
describe "#self.svn_available?" do
before do before do
described_class.clear_svn_version_cache described_class.clear_version_cache
end end
describe "::available?" do
it "returns svn version if svn available" do it "returns svn version if svn available" do
if quiet_system "#{HOMEBREW_SHIMS_PATH}/scm/svn", "--version" if quiet_system "#{HOMEBREW_SHIMS_PATH}/scm/svn", "--version"
expect(described_class).to be_svn_available expect(described_class).to be_available
else else
expect(described_class).not_to be_svn_available expect(described_class).not_to be_available
end end
end end
end end
describe "#self.svn_version" do describe "::version" do
before do it "returns svn version if svn available" do
described_class.clear_svn_version_cache if quiet_system "#{HOMEBREW_SHIMS_PATH}/scm/svn", "--version"
expect(described_class.version).to match(/^\d+\.\d+\.\d+$/)
else
expect(described_class.version).to be_nil
end end
it "returns nil when svn is not available" do
allow(described_class).to receive(:svn_available?).and_return(false)
expect(described_class.svn_version).to eq(nil)
end end
it "returns version of svn when svn is available", :needs_svn do it "returns version of svn when svn is available", :needs_svn do
expect(described_class.svn_version).not_to be_nil expect(described_class.version).not_to be_nil
end end
end end
describe "#self.svn_remote_exists?" do describe "::remote_exists?" do
it "returns true when svn is not available" do it "returns true when svn is not available" do
allow(described_class).to receive(:svn_available?).and_return(false) allow(described_class).to receive(:available?).and_return(false)
expect(described_class).to be_svn_remote_exists("blah") expect(described_class).to be_remote_exists("blah")
end end
context "when svn is available" do context "when svn is available" do
before do before do
allow(described_class).to receive(:svn_available?).and_return(true) allow(described_class).to receive(:available?).and_return(true)
end end
it "returns false when remote does not exist" do it "returns false when remote does not exist" do
expect(described_class).not_to be_svn_remote_exists(HOMEBREW_CACHE/"install") expect(described_class).not_to be_remote_exists(HOMEBREW_CACHE/"install")
end end
it "returns true when remote exists", :needs_network, :needs_svn do it "returns true when remote exists", :needs_network, :needs_svn do
@ -54,7 +53,7 @@ describe Utils do
"https://github.com/Homebrew/install" "https://github.com/Homebrew/install"
end end
expect(described_class).to be_svn_remote_exists(HOMEBREW_CACHE/"install") expect(described_class).to be_remote_exists(HOMEBREW_CACHE/"install")
end end
end end
end end

View File

@ -1,32 +1,36 @@
# frozen_string_literal: true # frozen_string_literal: true
require "system_command"
module Utils module Utils
def self.clear_svn_version_cache # Helper functions for querying SVN information.
remove_instance_variable(:@svn_available) if defined?(@svn_available) #
remove_instance_variable(:@svn_version) if defined?(@svn_version) # @api private
module Svn
module_function
def available?
version.present?
end end
def self.svn_available? def version
return @svn_available if defined?(@svn_available) return @version if defined?(@version)
@svn_available = quiet_system HOMEBREW_SHIMS_PATH/"scm/svn", "--version" stdout, _, status = system_command(HOMEBREW_SHIMS_PATH/"scm/svn", args: ["--version"], print_stderr: false)
@version = status.success? ? stdout.chomp[/svn, version (\d+(?:\.\d+)*)/, 1] : nil
end end
def self.svn_version def remote_exists?(url)
return unless svn_available? return true unless available?
return @svn_version if defined?(@svn_version)
@svn_version = Utils.popen_read(
HOMEBREW_SHIMS_PATH/"scm/svn", "--version"
).chomp[/svn, version (\d+(?:\.\d+)*)/, 1]
end
def self.svn_remote_exists?(url)
return true unless svn_available?
# OK to unconditionally trust here because we're just checking if # OK to unconditionally trust here because we're just checking if
# a URL exists. # a URL exists.
quiet_system "svn", "ls", url, "--depth", "empty", quiet_system "svn", "ls", url, "--depth", "empty",
"--non-interactive", "--trust-server-cert" "--non-interactive", "--trust-server-cert"
end end
def clear_version_cache
remove_instance_variable(:@version) if defined?(@version)
end
end
end end