You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by ke...@apache.org on 2017/10/25 16:52:02 UTC

allura git commit: [#8168] remove TreesDoc (plural) model. Large space savings

Repository: allura
Updated Branches:
  refs/heads/master fa6e9ca8a -> 29aa52dc9


[#8168] remove TreesDoc (plural) model.  Large space savings


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/29aa52dc
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/29aa52dc
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/29aa52dc

Branch: refs/heads/master
Commit: 29aa52dc9d58ba2c814e8d74059ab767bdfb3e9e
Parents: fa6e9ca
Author: Dave Brondsema <da...@brondsema.net>
Authored: Tue Oct 17 16:30:01 2017 -0400
Committer: Kenton Taylor <kt...@slashdotmedia.com>
Committed: Wed Oct 25 13:00:53 2017 +0000

----------------------------------------------------------------------
 Allura/allura/model/repo.py                     |   4 +-
 Allura/allura/model/repo_refresh.py             | 167 +------------------
 Allura/allura/model/repository.py               |   9 +-
 Allura/allura/scripts/refresh_last_commits.py   |  22 ++-
 Allura/allura/scripts/refreshrepo.py            |  38 +----
 Allura/allura/tests/model/test_repo.py          |   8 -
 Allura/test-light.py                            |  49 ------
 ForgeSVN/forgesvn/model/svn.py                  |   4 -
 .../forgesvn/tests/model/test_repository.py     |   3 -
 .../tests/model/test_svnimplementation.py       |   4 +-
 10 files changed, 30 insertions(+), 278 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/allura/model/repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 6ba6633..4cbbea3 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -21,11 +21,11 @@
 
 from .repository import SUser, SObjType
 from .repository import QSIZE, README_RE, VIEWABLE_EXTENSIONS, PYPELINE_EXTENSIONS, DIFF_SIMILARITY_THRESHOLD
-from .repository import CommitDoc, TreeDoc, LastCommitDoc, TreesDoc, CommitRunDoc
+from .repository import CommitDoc, TreeDoc, LastCommitDoc, CommitRunDoc
 from .repository import RepoObject, Commit, Tree, Blob, LastCommit
 from .repository import ModelCache
 
 __all__ = [
     'SUser', 'SObjType', 'QSIZE', 'README_RE', 'VIEWABLE_EXTENSIONS', 'PYPELINE_EXTENSIONS',
-    'DIFF_SIMILARITY_THRESHOLD', 'CommitDoc', 'TreeDoc', 'LastCommitDoc', 'TreesDoc', 'CommitRunDoc', 'RepoObject',
+    'DIFF_SIMILARITY_THRESHOLD', 'CommitDoc', 'TreeDoc', 'LastCommitDoc', 'CommitRunDoc', 'RepoObject',
     'Commit', 'Tree', 'Blob', 'LastCommit', 'ModelCache']

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/allura/model/repo_refresh.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repo_refresh.py b/Allura/allura/model/repo_refresh.py
index 99fda0b..5d8415f 100644
--- a/Allura/allura/model/repo_refresh.py
+++ b/Allura/allura/model/repo_refresh.py
@@ -32,7 +32,7 @@ from ming.orm import mapper, session, ThreadLocalORMSession
 
 from allura.lib import utils
 from allura.lib import helpers as h
-from allura.model.repository import CommitDoc, TreeDoc, TreesDoc
+from allura.model.repository import CommitDoc
 from allura.model.repository import CommitRunDoc
 from allura.model.repository import Commit, Tree, LastCommit, ModelCache
 from allura.model.index import ArtifactReferenceDoc, ShortlinkDoc
@@ -98,33 +98,6 @@ def refresh_repo(repo, all_commits=False, notify=True, new_clone=False):
         rb.cleanup()
         log.info('Finished CommitRunBuilder for %s', repo.full_fs_path)
 
-    # Refresh trees
-    # Like diffs below, pre-computing trees for some SCMs is too expensive,
-    # so we skip it here, then do it on-demand later.
-    if repo._refresh_precompute:
-        cache = {}
-        for i, oid in enumerate(commit_ids):
-            ci = CommitDoc.m.find(dict(_id=oid), validate=False).next()
-            cache = refresh_commit_trees(ci, cache)
-            if (i + 1) % 100 == 0:
-                log.info('Refresh commit trees %d: %s', (i + 1), ci._id)
-
-    # Compute diffs
-    cache = {}
-    # For some SCMs, we don't want to pre-compute the LCDs because that
-    # would be too expensive, so we skip them here and do them on-demand
-    # with caching.
-    if repo._refresh_precompute:
-        model_cache = ModelCache()
-        lcid_cache = {}
-        for i, oid in enumerate(reversed(commit_ids)):
-            ci = model_cache.get(Commit, dict(_id=oid))
-            ci.set_context(repo)
-            compute_lcds(ci, model_cache, lcid_cache)
-            ThreadLocalORMSession.flush_all()
-            if (i + 1) % 100 == 0:
-                log.info('Compute last commit info %d: %s', (i + 1), ci._id)
-
     # Clear any existing caches for branches/tags
     if repo.cached_branches:
         repo.cached_branches = []
@@ -172,20 +145,6 @@ def refresh_repo(repo, all_commits=False, notify=True, new_clone=False):
         send_notifications(repo, reversed(commit_ids))
 
 
-def refresh_commit_trees(ci, cache):
-    '''Refresh the list of trees included withn a commit'''
-    if ci.tree_id is None:
-        return cache
-    trees_doc = TreesDoc(dict(
-        _id=ci._id,
-        tree_ids=list(trees(ci.tree_id, cache))))
-    trees_doc.m.save(safe=False)
-    new_cache = dict(
-        (oid, cache[oid])
-        for oid in trees_doc.tree_ids)
-    return new_cache
-
-
 def refresh_commit_repos(all_commit_ids, repo):
     '''Refresh the list of repositories within which a set of commits are
     contained'''
@@ -349,19 +308,6 @@ class CommitRunBuilder(object):
             del self.runs[p_run_id]
 
 
-def trees(id, cache):
-    '''Recursively generate the list of trees contained within a given tree ID'''
-    yield id
-    entries = cache.get(id, None)
-    if entries is None:
-        t = TreeDoc.m.get(_id=id)
-        entries = [o.id for o in t.tree_ids]
-        cache[id] = entries
-    for i in entries:
-        for x in trees(i, cache):
-            yield x
-
-
 def unknown_commit_ids(all_commit_ids):
     '''filter out all commit ids that have already been cached'''
     result = []
@@ -466,64 +412,6 @@ def _summarize(message):
     return ' '.join(summary)
 
 
-def _diff_trees(lhs, rhs, index, *path):
-    def _fq(name):
-        return '/'.join(reversed(
-            (name,) + path))
-    # Diff the trees (and keep deterministic order)
-    rhs_tree_ids = OrderedDict(
-        (o.name, o.id)
-        for o in rhs.tree_ids)
-    for o in lhs.tree_ids:
-        # remove so won't be picked up as added, below
-        rhs_id = rhs_tree_ids.pop(o.name, None)
-        if rhs_id == o.id:  # no change
-            continue
-        elif rhs_id is None:  # removed
-            yield (_fq(o.name), o.id, None)
-            rhs_tree = Object(_id=None, tree_ids=[], blob_ids=[], other_ids=[])
-        else:  # changed
-            rhs_tree = index[rhs_id]
-        for difference in _diff_trees(index[o.id], rhs_tree, index, o.name, *path):
-            yield difference
-    for name, id in rhs_tree_ids.items():  # added
-        yield (_fq(name), None, id)
-        lhs_tree = Object(_id=None, tree_ids=[], blob_ids=[], other_ids=[])
-        for difference in _diff_trees(lhs_tree, index[id], index, name, *path):
-            yield difference
-    # Diff the blobs (and keep deterministic order)
-    rhs_blob_ids = OrderedDict(
-        (o.name, o.id)
-        for o in rhs.blob_ids)
-    for o in lhs.blob_ids:
-        rhs_id = rhs_blob_ids.pop(o.name, None)
-        if rhs_id == o.id:
-            continue  # no change
-        elif rhs_id is None:
-            yield (_fq(o.name), o.id, None)
-        else:
-            yield (_fq(o.name), o.id, rhs_id)
-    for name, id in rhs_blob_ids.items():
-        yield (_fq(name), None, id)
-
-
-def get_commit_info(commit):
-    if not isinstance(commit, Commit):
-        commit = mapper(Commit).create(commit, dict(instrument=False))
-    sess = session(commit)
-    if sess:
-        sess.expunge(commit)
-    return dict(
-        id=commit._id,
-        author=commit.authored.name,
-        author_email=commit.authored.email,
-        date=commit.authored.date,
-        author_url=commit.author_url,
-        shortlink=commit.shorthand_id(),
-        summary=commit.summary
-    )
-
-
 def last_known_commit_id(all_commit_ids, new_commit_ids):
     """
     Return the newest "known" (cached in mongo) commit id.
@@ -541,59 +429,6 @@ def last_known_commit_id(all_commit_ids, new_commit_ids):
     return all_commit_ids[all_commit_ids.index(new_commit_ids[0]) - 1]
 
 
-def compute_lcds(commit, model_cache, lcid_cache):
-    '''
-    Compute LastCommit data for every Tree node under this tree.
-    '''
-    trees = model_cache.get(TreesDoc, dict(_id=commit._id))
-    if not trees:
-        log.error('Missing TreesDoc for %s; skipping compute_lcd' % commit)
-        return
-    with h.push_config(c, model_cache=model_cache, lcid_cache=lcid_cache):
-        _update_tree_cache(trees.tree_ids, model_cache)
-        tree = _pull_tree(model_cache, commit.tree_id, commit)
-        _compute_lcds(tree, model_cache)
-        for changed_path in tree.commit.changed_paths:
-            lcid_cache[changed_path] = tree.commit._id
-
-
-def _compute_lcds(tree, cache):
-    path = tree.path().strip('/')
-    if path not in tree.commit.changed_paths:
-        return
-    if not cache.get(LastCommit, dict(commit_id=tree.commit._id, path=path)):
-        lcd = LastCommit._build(tree)
-    for x in tree.tree_ids:
-        sub_tree = _pull_tree(cache, x.id, tree, x.name)
-        _compute_lcds(sub_tree, cache)
-
-
-def _pull_tree(cache, tree_id, *context):
-    '''
-    Since the Tree instances stick around in our cache,
-    subsequent calls to set_context are overwriting our
-    in-use copies and confusing the walk.  So, make an
-    memory-only copy for our use.
-    '''
-    cache_tree = cache.get(Tree, dict(_id=tree_id))
-    new_tree = Tree(
-        _id=cache_tree._id,
-        tree_ids=cache_tree.tree_ids,
-        blob_ids=cache_tree.blob_ids,
-        other_ids=cache_tree.other_ids,
-    )
-    session(new_tree).expunge(new_tree)
-    new_tree.set_context(*context)
-    return new_tree
-
-
-def _update_tree_cache(tree_ids, cache):
-    current_ids = set(tree_ids)
-    cached_ids = set(cache.instance_ids(Tree))
-    new_ids = current_ids - cached_ids
-    cache.batch_load(Tree, {'_id': {'$in': list(new_ids)}})
-
-
 def _group_commits(repo, commit_ids):
     by_branches = {}
     by_tags = {}

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 5386ae7..996b92f 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -981,7 +981,7 @@ CommitDoc = collection(
     Field('child_ids', [str], index=True),
     Field('repo_ids', [S.ObjectId()], index=True))
 
-# Basic tree information (also see TreesDoc)
+# Basic tree information
 TreeDoc = collection(
     'repo_tree', main_doc_session,
     Field('_id', str),
@@ -1000,13 +1000,6 @@ LastCommitDoc = collection(
         name=str,
         commit_id=str)]))
 
-# List of all trees contained within a commit
-# TreesDoc._id = CommitDoc._id
-# TreesDoc.tree_ids = [ TreeDoc._id, ... ]
-TreesDoc = collection(
-    'repo_trees', main_doc_session,
-    Field('_id', str),
-    Field('tree_ids', [str]))
 
 # List of commit runs (a run is a linear series of single-parent commits)
 # CommitRunDoc.commit_ids = [ CommitDoc._id, ... ]

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/allura/scripts/refresh_last_commits.py
----------------------------------------------------------------------
diff --git a/Allura/allura/scripts/refresh_last_commits.py b/Allura/allura/scripts/refresh_last_commits.py
index 095fafb..0dd7235 100644
--- a/Allura/allura/scripts/refresh_last_commits.py
+++ b/Allura/allura/scripts/refresh_last_commits.py
@@ -134,13 +134,11 @@ class RefreshLastCommits(ScriptTask):
 
     @classmethod
     def refresh_repo_lcds(cls, commit_ids, options):
-        tree_cache = {}
-        timings = []
         model_cache = M.repository.ModelCache(
             max_instances={M.repository.LastCommit: 4000},
             max_queries={M.repository.LastCommit: 4000},
         )
-        lcid_cache = {}
+        c.model_cache = model_cache
         timings = []
         print 'Processing last commits'
         for i, commit_id in enumerate(commit_ids):
@@ -150,7 +148,8 @@ class RefreshLastCommits(ScriptTask):
                 continue
             commit.set_context(c.app.repo)
             with time(timings):
-                M.repo_refresh.compute_lcds(commit, model_cache, lcid_cache)
+                tree = commit.tree
+                cls._get_lcds(tree, model_cache)
                 ThreadLocalORMSession.flush_all()
             if i % 100 == 0:
                 cls._print_stats(i, timings, 100)
@@ -159,6 +158,21 @@ class RefreshLastCommits(ScriptTask):
         ThreadLocalORMSession.flush_all()
 
     @classmethod
+    def _get_lcds(cls, tree, cache):
+        M.repository.LastCommit.get(tree)
+        """
+        FIXME: if its needed to recurse into subdirectories, and compute their LCDs as well, something along these
+        lines should be enabled.  This is not working as-is, and is not really necessary as this script doesn't
+        get used any more anyway.
+
+        for subtree in tree.tree_ids:
+            if subtree.name in tree.commit.changed_paths:
+                subtree_doc = cache.get(M.repository.Tree, dict(_id=subtree.id))
+                subtree_doc.set_context(tree)
+                cls._get_lcds(subtree_doc, cache)
+        """
+
+    @classmethod
     def _clean(cls, commit_ids):
         # delete LastCommitDocs
         i = M.repository.LastCommitDoc.m.find(

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/allura/scripts/refreshrepo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/scripts/refreshrepo.py b/Allura/allura/scripts/refreshrepo.py
index 115e5a4..81fdfc5 100644
--- a/Allura/allura/scripts/refreshrepo.py
+++ b/Allura/allura/scripts/refreshrepo.py
@@ -69,17 +69,10 @@ class RefreshRepo(ScriptTask):
                         ci_ids = list(c.app.repo.all_commit_ids())
                         log.info("Deleting mongo data for %i commits...",
                                  len(ci_ids))
-                        # like the tree_ids themselves below, we need to process these in
-                        # chunks to avoid hitting the BSON max size limit
-                        tree_ids = []
-                        for ci_ids_chunk in chunked_list(ci_ids, 3000):
-                            tree_ids.extend([
-                                tree_id for doc in
-                                M.repository.TreesDoc.m.find(
-                                    {"_id": {"$in": ci_ids_chunk}},
-                                    {"tree_ids": 1})
-                                for tree_id in doc.get("tree_ids", [])])
 
+                        # delete these in chunks, otherwise the query doc can
+                        # exceed the max BSON size limit (16MB at the moment)
+                        for ci_ids_chunk in chunked_list(ci_ids, 3000):
                             i = M.repository.CommitDoc.m.find(
                                 {"_id": {"$in": ci_ids_chunk}}).count()
                             if i:
@@ -87,34 +80,17 @@ class RefreshRepo(ScriptTask):
                                 M.repository.CommitDoc.m.remove(
                                     {"_id": {"$in": ci_ids_chunk}})
 
-                        # delete these in chunks, otherwise the query doc can
-                        # exceed the max BSON size limit (16MB at the moment)
-                        for tree_ids_chunk in chunked_list(tree_ids, 300000):
-                            i = M.repository.TreeDoc.m.find(
-                                {"_id": {"$in": tree_ids_chunk}}).count()
-                            if i:
-                                log.info("Deleting %i TreeDoc docs...", i)
-                                M.repository.TreeDoc.m.remove(
-                                    {"_id": {"$in": tree_ids_chunk}})
-                        del tree_ids
+                        # we used to have a TreesDoc (plural) collection to provide a mapping of commit_id to tree_id
+                        # so that we could clear the relevant TreeDoc records
+                        # its ok though, since they are created in refresh_tree_info() and overwrite existing records
 
-                        # delete these after TreeDoc and LastCommitDoc so that if
-                        # we crash, we don't lose the ability to delete those
                         for ci_ids_chunk in chunked_list(ci_ids, 3000):
-                            # delete TreesDocs
-                            i = M.repository.TreesDoc.m.find(
-                                {"_id": {"$in": ci_ids_chunk}}).count()
-                            if i:
-                                log.info("Deleting %i TreesDoc docs...", i)
-                                M.repository.TreesDoc.m.remove(
-                                    {"_id": {"$in": ci_ids_chunk}})
-
                             # delete LastCommitDocs
                             i = M.repository.LastCommitDoc.m.find(
                                 dict(commit_id={'$in': ci_ids_chunk})).count()
                             if i:
                                 log.info(
-                                    "Deleting %i remaining LastCommitDoc docs, by repo id...", i)
+                                    "Deleting %i LastCommitDoc docs...", i)
                                 M.repository.LastCommitDoc.m.remove(
                                     dict(commit_id={'$in': ci_ids_chunk}))
 

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/allura/tests/model/test_repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_repo.py b/Allura/allura/tests/model/test_repo.py
index 3761821..189fdf4 100644
--- a/Allura/allura/tests/model/test_repo.py
+++ b/Allura/allura/tests/model/test_repo.py
@@ -443,14 +443,6 @@ class TestModelCache(unittest.TestCase):
         tr_get.assert_called_once_with(_id='foo')
         self.assertEqual(val, tree1)
 
-    @mock.patch.object(M.repository.TreesDoc.m, 'get')
-    def test_get_doc(self, tr_get):
-        trees = tr_get.return_value = mock.Mock(
-            spec=['_id', 'val'], _id='foo', val='bar')
-        val = self.cache.get(M.repository.TreesDoc, {'_id': 'foo'})
-        tr_get.assert_called_once_with(_id='foo')
-        self.assertEqual(val, trees)
-
     def test_set(self):
         tree = mock.Mock(spec=['_id', 'test_set'], _id='foo', val='test_set')
         self.cache.set(M.repository.Tree, {'val': 'test_set'}, tree)

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/Allura/test-light.py
----------------------------------------------------------------------
diff --git a/Allura/test-light.py b/Allura/test-light.py
deleted file mode 100644
index f095214..0000000
--- a/Allura/test-light.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#       Licensed to the Apache Software Foundation (ASF) under one
-#       or more contributor license agreements.  See the NOTICE file
-#       distributed with this work for additional information
-#       regarding copyright ownership.  The ASF licenses this file
-#       to you under the Apache License, Version 2.0 (the
-#       "License"); you may not use this file except in compliance
-#       with the License.  You may obtain a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#       Unless required by applicable law or agreed to in writing,
-#       software distributed under the License is distributed on an
-#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#       KIND, either express or implied.  See the License for the
-#       specific language governing permissions and limitations
-#       under the License.
-
-import sys
-
-from pylons import tmpl_context as c
-
-from allura.lib import helpers as h
-from allura.model.repository import CommitDoc, TreeDoc, TreesDoc
-from allura.model.repository import LastCommitDoc, CommitRunDoc
-from allura.model.repo_refresh import refresh_repo
-
-
-def main():
-    if len(sys.argv) > 1:
-        h.set_context('test')
-        c.project.install_app('Git', 'code', 'Code',
-                              init_from_url='/home/rick446/src/forge')
-        c.project.install_app('Hg', 'code2', 'Code2',
-                              init_from_url='/home/rick446/src/Kajiki')
-    CommitDoc.m.remove({})
-    TreeDoc.m.remove({})
-    TreesDoc.m.remove({})
-    LastCommitDoc.m.remove({})
-    CommitRunDoc.m.remove({})
-
-    h.set_context('test', 'code')
-    refresh_repo(c.app.repo, notify=False)
-    h.set_context('test', 'code2')
-    refresh_repo(c.app.repo, notify=False)
-
-
-if __name__ == '__main__':
-    main()
-    # dolog()

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/ForgeSVN/forgesvn/model/svn.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index db52738..2aa2b40 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -439,10 +439,6 @@ class SVNImplementation(M.RepositoryImplementation):
         if is_new:
             commit_id = self._oid(infos[0][1].last_changed_rev.number)
             path = tree_path.strip('/')
-            RM.TreesDoc.m.update_partial(
-                {'_id': commit._id},
-                {'$addToSet': {'tree_ids': tree_id}},
-                upsert=True)
             RM.LastCommitDoc.m.update_partial(
                 {'commit_id': commit_id, 'path': path},
                 {'commit_id': commit_id, 'path':

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/ForgeSVN/forgesvn/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index 18ec0fa..38dc5fe 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -1002,7 +1002,6 @@ class TestCommit(_TestWithRepo):
             'removed': [],
             'total': 5,
         }
-        M.repo_refresh.refresh_commit_trees(self.ci, {})
         assert_equal(self.ci.diffs.added,
                      ['a', 'a/a', 'a/a/a', 'a/a/b', 'a/b'])
         assert (self.ci.diffs.copied
@@ -1027,7 +1026,6 @@ class TestCommit(_TestWithRepo):
             'removed': ['a', 'a/a', 'a/a/a', 'a/a/b', 'a/b'],
             'total': 10,
         }
-        M.repo_refresh.refresh_commit_trees(ci, {})
         assert_equal(ci.diffs.added, ['b', 'b/a', 'b/a/a', 'b/a/b', 'b/b'])
         assert_equal(ci.diffs.removed, ['a', 'a/a', 'a/a/a', 'a/a/b', 'a/b'])
         assert (ci.diffs.copied
@@ -1063,7 +1061,6 @@ class TestCommit(_TestWithRepo):
             'renamed': [],
             'total': 2
         }
-        M.repo_refresh.refresh_commit_trees(ci, {})
         assert_equal(ci.diffs.added, [u'b/a/z', u'b/c'])
         assert_equal(ci.diffs.changed, [])
         assert_equal(ci.diffs.removed, [u'/b/a/b', u'b/b'])

http://git-wip-us.apache.org/repos/asf/allura/blob/29aa52dc/ForgeSVN/forgesvn/tests/model/test_svnimplementation.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/tests/model/test_svnimplementation.py b/ForgeSVN/forgesvn/tests/model/test_svnimplementation.py
index c51cdce..216255d 100644
--- a/ForgeSVN/forgesvn/tests/model/test_svnimplementation.py
+++ b/ForgeSVN/forgesvn/tests/model/test_svnimplementation.py
@@ -36,10 +36,9 @@ class TestSVNImplementation(object):
         self._test_compute_tree_new('trunk/foo')
 
     @patch('allura.model.repository.LastCommitDoc.m.update_partial')
-    @patch('allura.model.repository.TreesDoc.m.update_partial')
     @patch('allura.model.repository.Tree.upsert')
     @patch('allura.model.repository.Tree.query.get')
-    def _test_compute_tree_new(self, path, tree_get, tree_upsert, treesdoc_partial, lcd_partial):
+    def _test_compute_tree_new(self, path, tree_get, tree_upsert, lcd_partial):
         repo = Mock(fs_path=g.tmpdir + '/')
         repo.name = 'code'
         impl = SVNImplementation(repo)
@@ -54,7 +53,6 @@ class TestSVNImplementation(object):
 
         assert_equal(impl._svn.info2.call_args[0]
                      [0], 'file://' + g.tmpdir + '/code/trunk/foo')
-        assert treesdoc_partial.called
         assert lcd_partial.called
 
     def test_last_commit_ids(self):