mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
9cadc95b28
* lib/rake: Update to rake 10.1.0 * bin/rake: ditto. * test/rake: ditto. * NEWS: Update NEWS to include rake 10.1.0 and links to release notes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43264 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
57 lines
1.2 KiB
Ruby
57 lines
1.2 KiB
Ruby
module Rake
|
|
|
|
####################################################################
|
|
# InvocationChain tracks the chain of task invocations to detect
|
|
# circular dependencies.
|
|
class InvocationChain < LinkedList
|
|
|
|
# Is the invocation already in the chain?
|
|
def member?(invocation)
|
|
head == invocation || tail.member?(invocation)
|
|
end
|
|
|
|
# Append an invocation to the chain of invocations. It is an error
|
|
# if the invocation already listed.
|
|
def append(invocation)
|
|
if member?(invocation)
|
|
fail RuntimeError, "Circular dependency detected: #{to_s} => #{invocation}"
|
|
end
|
|
conj(invocation)
|
|
end
|
|
|
|
# Convert to string, ie: TOP => invocation => invocation
|
|
def to_s
|
|
"#{prefix}#{head}"
|
|
end
|
|
|
|
# Class level append.
|
|
def self.append(invocation, chain)
|
|
chain.append(invocation)
|
|
end
|
|
|
|
private
|
|
|
|
def prefix
|
|
"#{tail.to_s} => "
|
|
end
|
|
|
|
# Null object for an empty chain.
|
|
class EmptyInvocationChain < LinkedList::EmptyLinkedList
|
|
@parent = InvocationChain
|
|
|
|
def member?(obj)
|
|
false
|
|
end
|
|
|
|
def append(invocation)
|
|
conj(invocation)
|
|
end
|
|
|
|
def to_s
|
|
"TOP"
|
|
end
|
|
end
|
|
|
|
EMPTY = EmptyInvocationChain.new
|
|
end
|
|
end
|