# File lib/grit/git-ruby/repository.rb, line 477
      def quick_diff(tree1, tree2, path = '.', recurse = true)
        # handle empty trees
        changed = []
        return changed if tree1 == tree2

        t1 = list_tree(tree1) if tree1
        t2 = list_tree(tree2) if tree2

        # finding files that are different
        t1['blob'].each do |file, hsh|
          t2_file = t2['blob'][file] rescue nil
          full = File.join(path, file)
          if !t2_file
            changed << [full, 'added', hsh[:sha], nil]      # not in parent
          elsif (hsh[:sha] != t2_file[:sha])
            changed << [full, 'modified', hsh[:sha], t2_file[:sha]]   # file changed
          end
        end if t1
        t2['blob'].each do |file, hsh|
          if !t1 || !t1['blob'][file]
            changed << [File.join(path, file), 'removed', nil, hsh[:sha]]
          end
        end if t2

        t1['tree'].each do |dir, hsh|
          t2_tree = t2['tree'][dir] rescue nil
          full = File.join(path, dir)
          if !t2_tree
            if recurse
              changed += quick_diff(hsh[:sha], nil, full, true)
            else
              changed << [full, 'added', hsh[:sha], nil]      # not in parent
            end
          elsif (hsh[:sha] != t2_tree[:sha])
            if recurse
              changed += quick_diff(hsh[:sha], t2_tree[:sha], full, true)
            else
              changed << [full, 'modified', hsh[:sha], t2_tree[:sha]]   # file changed
            end
          end
        end if t1
        t2['tree'].each do |dir, hsh|
          t1_tree = t1['tree'][dir] rescue nil
          full = File.join(path, dir)
          if !t1_tree
            if recurse
              changed += quick_diff(nil, hsh[:sha], full, true)
            else
              changed << [full, 'removed', nil, hsh[:sha]]
            end
          end
        end if t2

        changed
      end