Mercurial > hgsubversion
view tests/test_svn_pre_commit_hooks.py @ 1550:67b28d657f62
sqliterevmap: break ".hashes()" cycle in a safer way
The `fromsvn()` revset implementation could cause weakref error when using
sqliterevmap like:
File "hgsubversion/util.py", line 357, in <lambda>
return subset.filter(lambda r: tonode(r) in hashes)
File "hgsubversion/maps.py", line 542, in __contains__
return self.get(key) != None
File "hgsubversion/maps.py", line 533, in get
for row in self.revmap._query(
ReferenceError: weakly-referenced object no longer exists
Basically the seemingly harmless assignment could break surprisingly:
# dangerous: `hashes` does not have a reference of `meta.revmap` and may
# become unavailable after `meta`, `revmap` being released by refcount.
hashes = meta.revmap.hashes()
The above syntax is nice to support while avoiding cycles is also nice.
This patch removes `revmap._hashes` so the revmap no longer owns a reference
of a `ReverseRevMap` object so the `ReverseRevMap` object no longer needs to
use weakref for `self.revmap`.
This could actually be caught by `comprehensive/test_sqlite_revmap.py`.
I was not careful enough verifying the "fromsvn()" patch.
author | Jun Wu <quark@fb.com> |
---|---|
date | Thu, 21 Dec 2017 17:39:52 -0800 |
parents | d741f536f23a |
children | cff81f35b31e |
line wrap: on
line source
import os import sys import test_util import unittest from mercurial import hg from mercurial import commands from mercurial import util class TestSvnPreCommitHooks(test_util.TestBase): def setUp(self): super(TestSvnPreCommitHooks, self).setUp() self.repo_path = self.load_and_fetch('single_rev.svndump')[1] # creating pre-commit hook that doesn't allow any commit hook_file_name = os.path.join( self.repo_path, 'hooks', 'pre-commit' ) hook_file = open(hook_file_name, 'w') hook_file.write( '#!/bin/sh\n' 'echo "Commits are not allowed" >&2; exit 1;\n' ) hook_file.close() os.chmod(hook_file_name, 0755) def test_push_with_pre_commit_hooks(self): changes = [('narf/a', 'narf/a', 'ohai',), ] self.commitchanges(changes) self.assertRaises(util.Abort, self.pushrevisions)