##// END OF EJS Templates
update: teach hg to override untracked dir with a tracked file on update...
update: teach hg to override untracked dir with a tracked file on update This is a fix to an old problem when Mercurial got confused by an untracked folder with the same name as one of the files in a commit hg was trying to update to. It is pretty safe to remove this folder if it is empty. Backing up an empty folder seems to go against Mercurial's "don't track dirs" philosophy.

File last commit:

r28801:441491ab default
r29480:1e4512ea default
Show More
test-ctxmanager.py
79 lines | 2.5 KiB | text/x-python | PythonLexer
/ tests / test-ctxmanager.py
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 from __future__ import absolute_import
import silenttestrunner
import unittest
Yuya Nishihara
test-ctxmanager: stop direct symbol import of mercurial.util
r28801 from mercurial import util
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703
class contextmanager(object):
def __init__(self, name, trace):
self.name = name
self.entered = False
self.exited = False
self.trace = trace
def __enter__(self):
self.entered = True
self.trace(('enter', self.name))
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.exited = exc_type, exc_val, exc_tb
self.trace(('exit', self.name))
def __repr__(self):
return '<ctx %r>' % self.name
class ctxerror(Exception):
pass
class raise_on_enter(contextmanager):
def __enter__(self):
self.trace(('raise', self.name))
raise ctxerror(self.name)
class raise_on_exit(contextmanager):
def __exit__(self, exc_type, exc_val, exc_tb):
self.trace(('raise', self.name))
raise ctxerror(self.name)
def ctxmgr(name, trace):
return lambda: contextmanager(name, trace)
class test_ctxmanager(unittest.TestCase):
def test_basics(self):
trace = []
addtrace = trace.append
Yuya Nishihara
test-ctxmanager: stop direct symbol import of mercurial.util
r28801 with util.ctxmanager(ctxmgr('a', addtrace), ctxmgr('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 a, b = c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 c.atexit(addtrace, ('atexit', 'x'))
c.atexit(addtrace, ('atexit', 'y'))
self.assertEqual(trace, [('enter', 'a'), ('enter', 'b'),
('atexit', 'y'), ('atexit', 'x'),
('exit', 'b'), ('exit', 'a')])
def test_raise_on_enter(self):
trace = []
addtrace = trace.append
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 def go():
Yuya Nishihara
test-ctxmanager: stop direct symbol import of mercurial.util
r28801 with util.ctxmanager(ctxmgr('a', addtrace),
lambda: raise_on_enter('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 addtrace('unreachable')
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 self.assertRaises(ctxerror, go)
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 self.assertEqual(trace, [('enter', 'a'), ('raise', 'b'), ('exit', 'a')])
def test_raise_on_exit(self):
trace = []
addtrace = trace.append
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 def go():
Yuya Nishihara
test-ctxmanager: stop direct symbol import of mercurial.util
r28801 with util.ctxmanager(ctxmgr('a', addtrace),
lambda: raise_on_exit('b', addtrace)) as c:
Bryan O'Sullivan
util: rename ctxmanager's __call__ method to enter
r27785 c.enter()
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 addtrace('running')
Bryan O'Sullivan
test-ctxmanager: fix Python 2.6 compatibility problem
r27786 self.assertRaises(ctxerror, go)
Bryan O'Sullivan
util: introduce ctxmanager, to avoid nested try/finally blocks...
r27703 self.assertEqual(trace, [('enter', 'a'), ('enter', 'b'), 'running',
('raise', 'b'), ('exit', 'a')])
if __name__ == '__main__':
silenttestrunner.main(__name__)