##// END OF EJS Templates
transplant: restore dirstate correctly at unexpected failure...
transplant: restore dirstate correctly at unexpected failure Before this patch, transplant can't restore dirstate as expected at failure other than one while patching. This causes: - unexpected file status - dirstate refers already rollback-ed parent (only at failure of transplanting the 2nd or later revision) To restore dirstate correctly also at unexpected failure, this patch encloses scope of store lock and transaction by 'dirstateguard'. This is temporary fixing for stable branch. See DirstateTransactionPlan wiki page for detail about the future plan to treat dirstate consistently around scope boundary of transaction. https://mercurial.selenic.com/wiki/DirstateTransactionPlan This patch also adds 'if lock' examination for safety 'lock.release()', because creating 'dirstateguard' object may fail unexpectedly (e.g. IOError for saving dirstate). BTW, in the test script, putting section header '[extensions]' into '.hg/hgrc' is needed to fix incomplete disabling 'abort' extension at 4d1382fd96ff.

File last commit:

r24180:d8e0c591 default
r25879:99e88320 stable
Show More
test-context.py
138 lines | 4.1 KiB | text/x-python | PythonLexer
Thomas Arendsen Hein
Fixed workingfilectx.date() (found by Thomas Waldmann) with test.
r4110 import os
Martin Geisler
changelog: convert user and desc from local encoding early...
r14379 from mercurial import hg, ui, context, encoding
Thomas Arendsen Hein
Fixed workingfilectx.date() (found by Thomas Waldmann) with test.
r4110
u = ui.ui()
repo = hg.repository(u, 'test1', create=1)
os.chdir('test1')
# create 'foo' with fixed time stamp
FUJIWARA Katsunori
tests: open file in binary mode to use POSIX end-of-line style anywhere...
r23060 f = open('foo', 'wb')
Thomas Arendsen Hein
Fixed workingfilectx.date() (found by Thomas Waldmann) with test.
r4110 f.write('foo\n')
f.close()
os.utime('foo', (1000, 1000))
# add+commit 'foo'
Dirkjan Ochtman
move working dir/dirstate methods from localrepo to workingctx
r11303 repo[None].add(['foo'])
Thomas Arendsen Hein
Fixed workingfilectx.date() (found by Thomas Waldmann) with test.
r4110 repo.commit(text='commit1', date="0 0")
Matt Mackall
use repo[changeid] to get a changectx
r6747 print "workingfilectx.date =", repo[None]['foo'].date()
Martin Geisler
changelog: convert user and desc from local encoding early...
r14379
# test memctx with non-ASCII commit message
def filectxfn(repo, memctx, path):
Sean Farley
memfilectx: call super.__init__ instead of duplicating code...
r21689 return context.memfilectx(repo, "foo", "")
Martin Geisler
changelog: convert user and desc from local encoding early...
r14379
ctx = context.memctx(repo, ['tip', None],
encoding.tolocal("Gr\xc3\xbcezi!"),
["foo"], filectxfn)
ctx.commit()
for enc in "ASCII", "Latin-1", "UTF-8":
encoding.encoding = enc
print "%-8s: %s" % (enc, repo["tip"].description())
Sean Farley
test-context: add test for memctx status
r21836
# test performing a status
def getfilectx(repo, memctx, f):
fctx = memctx.parents()[0][f]
data, flags = fctx.data(), fctx.flags()
if f == 'foo':
data += 'bar\n'
return context.memfilectx(repo, f, data, 'l' in flags, 'x' in flags)
ctxa = repo.changectx(0)
Sean Farley
test-context: add test for performing a diff on a memctx...
r21837 ctxb = context.memctx(repo, [ctxa.node(), None], "test diff", ["foo"],
getfilectx, ctxa.user(), ctxa.date())
Sean Farley
test-context: add test for memctx status
r21836
print ctxb.status(ctxa)
Sean Farley
test-context: add test for performing a diff on a memctx...
r21837
# test performing a diff on a memctx
for d in ctxb.diff(ctxa, git=True):
print d
FUJIWARA Katsunori
context: cache self._status correctly at workingctx.status...
r23700
Mads Kiilerich
spelling: fixes from proofreading of spell checker issues
r24180 # test safeness and correctness of "ctx.status()"
FUJIWARA Katsunori
context: cache self._status correctly at workingctx.status...
r23700 print '= checking context.status():'
# ancestor "wcctx ~ 2"
actx2 = repo['.']
repo.wwrite('bar-m', 'bar-m\n', '')
repo.wwrite('bar-r', 'bar-r\n', '')
repo[None].add(['bar-m', 'bar-r'])
repo.commit(text='add bar-m, bar-r', date="0 0")
# ancestor "wcctx ~ 1"
actx1 = repo['.']
repo.wwrite('bar-m', 'bar-m bar-m\n', '')
repo.wwrite('bar-a', 'bar-a\n', '')
repo[None].add(['bar-a'])
repo[None].forget(['bar-r'])
# status at this point:
# M bar-m
# A bar-a
# R bar-r
# C foo
from mercurial import scmutil
print '== checking workingctx.status:'
wctx = repo[None]
print 'wctx._status=%s' % (str(wctx._status))
FUJIWARA Katsunori
context: make unknown/ignored/clean of cached status empty for equivalence...
r23709 print '=== with "pattern match":'
FUJIWARA Katsunori
context: cache self._status correctly at workingctx.status...
r23700 print actx1.status(other=wctx,
match=scmutil.matchfiles(repo, ['bar-m', 'foo']))
print 'wctx._status=%s' % (str(wctx._status))
print actx2.status(other=wctx,
match=scmutil.matchfiles(repo, ['bar-m', 'foo']))
print 'wctx._status=%s' % (str(wctx._status))
FUJIWARA Katsunori
context: make unknown/ignored/clean of cached status empty for equivalence...
r23709
print '=== with "always match" and "listclean=True":'
print actx1.status(other=wctx, listclean=True)
print 'wctx._status=%s' % (str(wctx._status))
print actx2.status(other=wctx, listclean=True)
print 'wctx._status=%s' % (str(wctx._status))
FUJIWARA Katsunori
context: avoid breaking already fixed self._status at ctx.status()...
r23711
print "== checking workingcommitctx.status:"
wcctx = context.workingcommitctx(repo,
scmutil.status(['bar-m'],
['bar-a'],
[],
[], [], [], []),
text='', date='0 0')
print 'wcctx._status=%s' % (str(wcctx._status))
print '=== with "always match":'
FUJIWARA Katsunori
context: override _dirstatestatus in workingcommitctx for correct matching...
r23712 print actx1.status(other=wcctx)
FUJIWARA Katsunori
context: avoid breaking already fixed self._status at ctx.status()...
r23711 print 'wcctx._status=%s' % (str(wcctx._status))
FUJIWARA Katsunori
context: override _dirstatestatus in workingcommitctx for correct matching...
r23712 print actx2.status(other=wcctx)
FUJIWARA Katsunori
context: avoid breaking already fixed self._status at ctx.status()...
r23711 print 'wcctx._status=%s' % (str(wcctx._status))
print '=== with "always match" and "listclean=True":'
FUJIWARA Katsunori
context: override _dirstatestatus in workingcommitctx for correct matching...
r23712 print actx1.status(other=wcctx, listclean=True)
print 'wcctx._status=%s' % (str(wcctx._status))
print actx2.status(other=wcctx, listclean=True)
print 'wcctx._status=%s' % (str(wcctx._status))
print '=== with "pattern match":'
print actx1.status(other=wcctx,
match=scmutil.matchfiles(repo, ['bar-m', 'foo']))
FUJIWARA Katsunori
context: avoid breaking already fixed self._status at ctx.status()...
r23711 print 'wcctx._status=%s' % (str(wcctx._status))
FUJIWARA Katsunori
context: override _dirstatestatus in workingcommitctx for correct matching...
r23712 print actx2.status(other=wcctx,
match=scmutil.matchfiles(repo, ['bar-m', 'foo']))
FUJIWARA Katsunori
context: avoid breaking already fixed self._status at ctx.status()...
r23711 print 'wcctx._status=%s' % (str(wcctx._status))
FUJIWARA Katsunori
context: override _dirstatestatus in workingcommitctx for correct matching...
r23712
print '=== with "pattern match" and "listclean=True":'
print actx1.status(other=wcctx,
match=scmutil.matchfiles(repo, ['bar-r', 'foo']),
listclean=True)
print 'wcctx._status=%s' % (str(wcctx._status))
print actx2.status(other=wcctx,
match=scmutil.matchfiles(repo, ['bar-r', 'foo']),
listclean=True)
print 'wcctx._status=%s' % (str(wcctx._status))