def history( paths=nil, options={}, &block )
      # if no paths were passed, but options were, then paths will be a hash
      if paths.is_a? Hash
        options = paths
        paths = nil
      end

      # ensure the options can be passed to C successfully
      paths_c_arr = AprArray.create_from( Array( paths ), :string )
      start_rev = (options[:start_rev] || 0).to_i
      end_rev = (options[:end_rev] || youngest).to_i
      limit = (options[:limit] || 0).to_i # 0 => all entries
      discover_changed_paths = ( options[:include_changes] ? 1 : 0 )
      strict_history = ( options[:cross_copies] ? 0 : 1 )
      include_merged = ( options[:include_merged] ? 1 : 0 )

      # collect the history entries
      history = []
      Error.check_and_raise( C.logs(
          self, paths_c_arr,
          start_rev, end_rev, limit,
          discover_changed_paths, strict_history, include_merged,
          nil, nil, nil,
          C::CollectHistory, Utils.wrap( history ),
          pool
        ) )

      # if the caller supplied a block, use it
      history.each( &block ) if block_given?

      history
    end
def history( paths=nil, options={}, &block )
      # if no paths were passed, but options were, then paths will be a hash
      if paths.is_a? Hash
        options = paths
        paths = nil
      end

      # ensure the options can be passed to C successfully
      paths_c_arr = AprArray.create_from( Array( paths ), :string )
      start_rev = (options[:start_rev] || 0).to_i
      end_rev = (options[:end_rev] || youngest).to_i
      limit = (options[:limit] || 0).to_i # 0 => all entries
      discover_changed_paths = ( options[:include_changes] ? 1 : 0 )
      strict_history = ( options[:cross_copies] ? 0 : 1 )
      include_merged = ( options[:include_merged] ? 1 : 0 )

      # collect the history entries
      history = []
      Error.check_and_raise( C.logs(
          self, paths_c_arr,
          start_rev, end_rev, limit,
          discover_changed_paths, strict_history, include_merged,
          nil, nil, nil,
          C::CollectHistory, Utils.wrap( history ),
          pool
        ) )

      # if the caller supplied a block, use it
      history.each( &block ) if block_given?

      history
    end
returns an array of log entry hashes for relevant revisions, containing:
 * revision number (+rev+), +log+, +author+, and +timestamp+

 if a block is given, each log entry hash will be yielded

 options:
 +start_rev+ :: restricts revisions to newer than :start_rev
 +end_rev+ :: restricts revisions to older than :end_rev
 +cross_copies+ :: continue history at filesystem copies?
 +include_merged+ :: include merged history?
 +include_changes+ :: include change info in +:changed_paths+?

 starting and ending revisions can be switched to reverse the final order