[#8375] fix py2 regression on unified_diff; apply similar fixes in ForgeUserStats

py2 unified_diff only works with str (bytes) filenames since it has within it:

    yield '+++ {}{}{}'.format(tofile, todate, lineterm)

py3 unified_diff only works with str (unicode) filenames
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 3104e07..5191413 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -919,7 +919,7 @@
                 hd = HtmlSideBySideDiff()
                 diff = hd.make_table(la, lb, adesc, bdesc)
         else:
-            diff = str('').join(difflib.unified_diff(la, lb, adesc, bdesc))
+            diff = str('').join(difflib.unified_diff(la, lb, six.ensure_str(adesc), six.ensure_str(bdesc)))
         return dict(a=a, b=b, diff=diff)
 
 
diff --git a/Allura/allura/model/stats.py b/Allura/allura/model/stats.py
index a153b68..80966b8 100644
--- a/Allura/allura/model/stats.py
+++ b/Allura/allura/model/stats.py
@@ -17,6 +17,8 @@
 
 from __future__ import unicode_literals
 from __future__ import absolute_import
+
+import six
 from datetime import datetime
 from tg import config
 from paste.deploy.converters import asbool
@@ -29,6 +31,7 @@
 import difflib
 
 from allura.model.session import main_orm_session
+from allura.lib import helpers as h
 from six.moves import range
 from functools import reduce
 
@@ -369,9 +372,10 @@
                 lines = len(listnew)
             elif newblob and newblob.has_html_view:
                 diff = difflib.unified_diff(
-                    listold, listnew,
-                    ('old' + oldblob.path()).encode('utf-8'),
-                    ('new' + newblob.path()).encode('utf-8'))
+                    [h.really_unicode(line) for line in listold],
+                    [h.really_unicode(line) for line in listnew],
+                    six.ensure_str('old' + oldblob.path()),
+                    six.ensure_str('new' + newblob.path()))
                 lines = len(
                     [l for l in diff if len(l) > 0 and l[0] == '+']) - 1
             else:
diff --git a/ForgeUserStats/forgeuserstats/tests/test_model.py b/ForgeUserStats/forgeuserstats/tests/test_model.py
index 308728e..7156bb9 100644
--- a/ForgeUserStats/forgeuserstats/tests/test_model.py
+++ b/ForgeUserStats/forgeuserstats/tests/test_model.py
@@ -463,12 +463,11 @@
         )
         unified_diff.return_value = ['+++', '---', '+line']
         newcommit.tree.get_blob_by_path.return_value = mock.MagicMock()
-        newcommit.tree.get_blob_by_path.return_value.__iter__.return_value = [
-            'one']
-        newcommit.repo.commit(
-        ).tree.get_blob_by_path.return_value = mock.MagicMock()
-        newcommit.repo.commit().tree.get_blob_by_path.return_value.__iter__.return_value = [
-            'two']
+        newcommit.tree.get_blob_by_path.return_value.__iter__.return_value = ['one']
+        newcommit.tree.get_blob_by_path.return_value.path.return_value = 'onepath'
+        newcommit.repo.commit().tree.get_blob_by_path.return_value = mock.MagicMock()
+        newcommit.repo.commit().tree.get_blob_by_path.return_value.__iter__.return_value = ['two']
+        newcommit.repo.commit().tree.get_blob_by_path.return_value.path.return_value = 'twopath'
         commit_datetime = datetime.utcnow()
         project = mock.Mock(
             trove_topic=[],