晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/alt/ruby27/share/rubygems/rubygems/resolver/ |
| Current File : //opt/alt/ruby27/share/rubygems/rubygems/resolver/conflict.rb |
# frozen_string_literal: true
##
# Used internally to indicate that a dependency conflicted
# with a spec that would be activated.
class Gem::Resolver::Conflict
##
# The specification that was activated prior to the conflict
attr_reader :activated
##
# The dependency that is in conflict with the activated gem.
attr_reader :dependency
attr_reader :failed_dep # :nodoc:
##
# Creates a new resolver conflict when +dependency+ is in conflict with an
# already +activated+ specification.
def initialize(dependency, activated, failed_dep=dependency)
@dependency = dependency
@activated = activated
@failed_dep = failed_dep
end
def ==(other) # :nodoc:
self.class === other and
@dependency == other.dependency and
@activated == other.activated and
@failed_dep == other.failed_dep
end
##
# A string explanation of the conflict.
def explain
"<Conflict wanted: #{@failed_dep}, had: #{activated.spec.full_name}>"
end
##
# Return the 2 dependency objects that conflicted
def conflicting_dependencies
[@failed_dep.dependency, @activated.request.dependency]
end
##
# Explanation of the conflict used by exceptions to print useful messages
def explanation
activated = @activated.spec.full_name
dependency = @failed_dep.dependency
requirement = dependency.requirement
alternates = dependency.matching_specs.map { |spec| spec.full_name }
unless alternates.empty?
matching = <<-MATCHING.chomp
Gems matching %s:
%s
MATCHING
matching = matching % [
dependency,
alternates.join(', '),
]
end
explanation = <<-EXPLANATION
Activated %s
which does not match conflicting dependency (%s)
Conflicting dependency chains:
%s
versus:
%s
%s
EXPLANATION
explanation % [
activated, requirement,
request_path(@activated).reverse.join(", depends on\n "),
request_path(@failed_dep).reverse.join(", depends on\n "),
matching,
]
end
##
# Returns true if the conflicting dependency's name matches +spec+.
def for_spec?(spec)
@dependency.name == spec.name
end
def pretty_print(q) # :nodoc:
q.group 2, '[Dependency conflict: ', ']' do
q.breakable
q.text 'activated '
q.pp @activated
q.breakable
q.text ' dependency '
q.pp @dependency
q.breakable
if @dependency == @failed_dep
q.text ' failed'
else
q.text ' failed dependency '
q.pp @failed_dep
end
end
end
##
# Path of activations from the +current+ list.
def request_path(current)
path = []
while current do
case current
when Gem::Resolver::ActivationRequest then
path <<
"#{current.request.dependency}, #{current.spec.version} activated"
current = current.parent
when Gem::Resolver::DependencyRequest then
path << "#{current.dependency}"
current = current.requester
else
raise Gem::Exception, "[BUG] unknown request class #{current.class}"
end
end
path = ['user request (gem command or Gemfile)'] if path.empty?
path
end
##
# Return the Specification that listed the dependency
def requester
@failed_dep.requester
end
end
|