def diff(*args)
      options = args.last.is_a?(Hash) ? args.pop : {}
      other   = args.shift

      case other
      when nil
        diff_index_to_workdir options
      when ::Rugged::Commit
        diff_tree_to_index other.tree, options
      when ::Rugged::Tree
        diff_tree_to_index other, options
      else
        raise TypeError, "A Rugged::Commit or Rugged::Tree instance is required"
      end
    end
def diff(*args)
      options = args.last.is_a?(Hash) ? args.pop : {}
      other   = args.shift

      case other
      when nil
        diff_index_to_workdir options
      when ::Rugged::Commit
        diff_tree_to_index other.tree, options
      when ::Rugged::Tree
        diff_tree_to_index other, options
      else
        raise TypeError, "A Rugged::Commit or Rugged::Tree instance is required"
      end
    end
call-seq:
   index.diff([options]) -> diff
   index.diff(diffable[, options]) -> diff

 The first form returns a diff between the index and the current working
 directory.

 The second form returns a diff between the index and the given diffable object.
 +diffable+ can either be a +Rugged::Commit+ or a +Rugged::Tree+.

 The index will be used as the "old file" side of the diff, while the working
 directory or the +diffable+ will be used for the "new file" side.

 The following options can be passed in the +options+ Hash:

 :paths ::
   An array of paths / fnmatch patterns to constrain the diff to a specific
   set of files. Also see +:disable_pathspec_match+.

 :max_size ::
   An integer specifying the maximum byte size of a file before a it will
   be treated as binary. The default value is 512MB.

 :context_lines ::
   The number of unchanged lines that define the boundary of a hunk (and
   to display before and after the actual changes). The default is 3.

 :interhunk_lines ::
   The maximum number of unchanged lines between hunk boundaries before the hunks
   will be merged into a one. The default is 0.

 :reverse ::
   If true, the sides of the diff will be reversed.

 :force_text ::
   If true, all files will be treated as text, disabling binary attributes & detection.

 :ignore_whitespace ::
   If true, all whitespace will be ignored.

 :ignore_whitespace_change ::
   If true, changes in amount of whitespace will be ignored.

 :ignore_whitespace_eol ::
   If true, whitespace at end of line will be ignored.

 :ignore_submodules ::
   if true, submodules will be excluded from the diff completely.

 :patience ::
   If true, the "patience diff" algorithm will be used (currenlty unimplemented).

 :include_ignored ::
   If true, ignored files will be included in the diff.

 :include_untracked ::
  If true, untracked files will be included in the diff.

 :include_unmodified ::
   If true, unmodified files will be included in the diff.

 :recurse_untracked_dirs ::
   Even if +:include_untracked+ is true, untracked directories will only be
   marked with a single entry in the diff. If this flag is set to true,
   all files under ignored directories will be included in the diff, too.

 :disable_pathspec_match ::
   If true, the given +:paths+ will be applied as exact matches, instead of
   as fnmatch patterns.

 :deltas_are_icase ::
   If true, filename comparisons will be made with case-insensitivity.

 :include_untracked_content ::
   if true, untracked content will be contained in the the diff patch text.

 :skip_binary_check ::
   If true, diff deltas will be generated without spending time on binary
   detection. This is useful to improve performance in cases where the actual
   file content difference is not needed.

 :include_typechange ::
   If true, type changes for files will not be interpreted as deletion of
   the "old file" and addition of the "new file", but will generate
   typechange records.

 :include_typechange_trees ::
   Even if +:include_typechange+ is true, blob -> tree changes will still
   usually be handled as a deletion of the blob. If this flag is set to true,
   blob -> tree changes will be marked as typechanges.

 :ignore_filemode ::
   If true, file mode changes will be ignored.

 :recurse_ignored_dirs ::
   Even if +:include_ignored+ is true, ignored directories will only be
   marked with a single entry in the diff. If this flag is set to true,
   all files under ignored directories will be included in the diff, too.