class Mercurial::NodeFactory
This class represents a factory for {Mercurial::Node Node} instances.
Attributes
repository[R]
Instance of a {Mercurial::Repository Repository}.
Public Class Methods
new(repository)
click to toggle source
# File lib/mercurial-ruby/factories/node_factory.rb, line 12 def initialize(repository) @repository = repository end
Public Instance Methods
entries_for(path, revision=nil, parent=nil)
click to toggle source
Find all entries (files and directories) inside a specified path and revision. Returns an array of {Mercurial::Node Node} instances.
Will find node in the latest version of repo if revision is ommitted.
Example:¶ ↑
repository.nodes.entries_for('/') repository.nodes.entries_for('some-fancy-directory/subdirectory/', '291a498f04e9')
# File lib/mercurial-ruby/factories/node_factory.rb, line 65 def entries_for(path, revision=nil, parent=nil) revision ||= 'tip' [].tap do |entries| manifest_entries = repository.manifest.scan_for_path(path, revision) manifest_entries.each do |me| path_without_source = me[3].gsub(/^#{ Regexp.escape(path.without_trailing_slash) }\//, '') entry_name = path_without_source.split('/').first entry_path = File.join(path, entry_name).gsub(/^\//, '') dir = me[3].scan(/^(#{ Regexp.escape(entry_path) }\/)/).flatten.first ? true : false entry_name << '/' if dir if entries.select{|item| item.name == entry_name}.size == 0 entries << build( :path => entry_path, :name => entry_name, :revision => revision, :nodeid => (me[0] unless dir), :fmode => dir ? nil : me[1], :exec => dir ? nil : me[2], :parent => parent ) end end end end
find(path, revision=nil)
click to toggle source
Finds a specified file or a directory in the repository at a specified revision. Returns an instance of {Mercurial::Node Node}.
Will find node in the latest version of repo if revision is ommitted. Will return nil if node wasn't found.
Example:¶ ↑
repository.nodes.find('/') repository.nodes.find('some-fancy-directory/Weird File Name.pdf', '291a498f04e9') repository.nodes.find('some-fancy-directory/subdirectory/', '291a498f04e9')
# File lib/mercurial-ruby/factories/node_factory.rb, line 27 def find(path, revision=nil) revision ||= 'tip' return RootNode.new(:repository => repository, :revision => revision) if path == '/' entry = repository.manifest.scan_for_path(path, revision).first return unless entry if exact_path = entry[3].scan(/^(#{ Regexp.escape(path.without_trailing_slash) }\/)/).flatten.first name = exact_path.split('/').last + '/' build( :path => exact_path, :name => name, :revision => revision ) else build( :path => entry[3], :name => entry[3].split('/').last, :revision => revision, :nodeid => entry[0], :fmode => entry[1], :exec => entry[2] ) end end
find!(path, revision=nil)
click to toggle source
Same as find
but will raise a NodeMissing
exception if node wasn't found.
# File lib/mercurial-ruby/factories/node_factory.rb, line 52 def find!(path, revision=nil) find(path, revision) || raise(NodeMissing, "#{ path } at revision #{ revision }") end
Private Instance Methods
build(opts={})
click to toggle source
# File lib/mercurial-ruby/factories/node_factory.rb, line 93 def build(opts={}) Mercurial::Node.new( :repository => repository, :path => opts[:path], :name => opts[:name], :revision => opts[:revision], :nodeid => opts[:nodeid], :fmode => opts[:fmode], :executable => opts[:exec], :parent => opts[:parent] ) end