test-context.py
193 lines
| 5.7 KiB
| text/x-python
|
PythonLexer
/ tests / test-context.py
Robert Stanca
|
r28738 | from __future__ import absolute_import, print_function | ||
Thomas Arendsen Hein
|
r4110 | import os | ||
Augie Fackler
|
r36799 | import stat | ||
Jun Wu
|
r32518 | from mercurial.node import hex | ||
Robert Stanca
|
r28735 | from mercurial import ( | ||
Robert Stanca
|
r28738 | context, | ||
encoding, | ||||
Robert Stanca
|
r28735 | hg, | ||
Jun Wu
|
r32518 | scmutil, | ||
Yuya Nishihara
|
r28775 | ui as uimod, | ||
Robert Stanca
|
r28735 | ) | ||
Thomas Arendsen Hein
|
r4110 | |||
Yuya Nishihara
|
r30559 | u = uimod.ui.load() | ||
Thomas Arendsen Hein
|
r4110 | |||
repo = hg.repository(u, 'test1', create=1) | ||||
os.chdir('test1') | ||||
# create 'foo' with fixed time stamp | ||||
FUJIWARA Katsunori
|
r23060 | f = open('foo', 'wb') | ||
timeless
|
r29187 | f.write(b'foo\n') | ||
Thomas Arendsen Hein
|
r4110 | f.close() | ||
os.utime('foo', (1000, 1000)) | ||||
# add+commit 'foo' | ||||
Dirkjan Ochtman
|
r11303 | repo[None].add(['foo']) | ||
Thomas Arendsen Hein
|
r4110 | repo.commit(text='commit1', date="0 0") | ||
Tristan Seligmann
|
r33797 | d = repo[None]['foo'].date() | ||
Matt Harbison
|
r27056 | if os.name == 'nt': | ||
Tristan Seligmann
|
r33797 | d = d[:2] | ||
print("workingfilectx.date = (%d, %d)" % d) | ||||
Martin Geisler
|
r14379 | |||
# test memctx with non-ASCII commit message | ||||
def filectxfn(repo, memctx, path): | ||||
Martin von Zweigbergk
|
r35401 | return context.memfilectx(repo, memctx, "foo", "") | ||
Martin Geisler
|
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 | ||||
Robert Stanca
|
r28738 | print("%-8s: %s" % (enc, repo["tip"].description())) | ||
Sean Farley
|
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' | ||||
Martin von Zweigbergk
|
r35401 | return context.memfilectx(repo, memctx, f, data, 'l' in flags, 'x' in flags) | ||
Sean Farley
|
r21836 | |||
ctxa = repo.changectx(0) | ||||
Sean Farley
|
r21837 | ctxb = context.memctx(repo, [ctxa.node(), None], "test diff", ["foo"], | ||
getfilectx, ctxa.user(), ctxa.date()) | ||||
Sean Farley
|
r21836 | |||
Robert Stanca
|
r28738 | print(ctxb.status(ctxa)) | ||
Sean Farley
|
r21837 | |||
# test performing a diff on a memctx | ||||
for d in ctxb.diff(ctxa, git=True): | ||||
Denis Laxalde
|
r31270 | print(d, end='') | ||
FUJIWARA Katsunori
|
r23700 | |||
Mads Kiilerich
|
r24180 | # test safeness and correctness of "ctx.status()" | ||
Robert Stanca
|
r28738 | print('= checking context.status():') | ||
FUJIWARA Katsunori
|
r23700 | |||
# 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 | ||||
Robert Stanca
|
r28738 | print('== checking workingctx.status:') | ||
FUJIWARA Katsunori
|
r23700 | |||
wctx = repo[None] | ||||
Robert Stanca
|
r28738 | print('wctx._status=%s' % (str(wctx._status))) | ||
FUJIWARA Katsunori
|
r23700 | |||
Robert Stanca
|
r28738 | print('=== with "pattern match":') | ||
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
|
r23709 | |||
Robert Stanca
|
r28738 | 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
|
r23711 | |||
Robert Stanca
|
r28738 | print("== checking workingcommitctx.status:") | ||
FUJIWARA Katsunori
|
r23711 | |||
wcctx = context.workingcommitctx(repo, | ||||
scmutil.status(['bar-m'], | ||||
['bar-a'], | ||||
[], | ||||
[], [], [], []), | ||||
text='', date='0 0') | ||||
Robert Stanca
|
r28738 | print('wcctx._status=%s' % (str(wcctx._status))) | ||
FUJIWARA Katsunori
|
r23711 | |||
Robert Stanca
|
r28738 | print('=== with "always match":') | ||
print(actx1.status(other=wcctx)) | ||||
print('wcctx._status=%s' % (str(wcctx._status))) | ||||
print(actx2.status(other=wcctx)) | ||||
print('wcctx._status=%s' % (str(wcctx._status))) | ||||
FUJIWARA Katsunori
|
r23711 | |||
Robert Stanca
|
r28738 | print('=== with "always match" and "listclean=True":') | ||
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))) | ||||
FUJIWARA Katsunori
|
r23712 | |||
Robert Stanca
|
r28738 | print('=== with "pattern match":') | ||
print(actx1.status(other=wcctx, | ||||
match=scmutil.matchfiles(repo, ['bar-m', 'foo']))) | ||||
print('wcctx._status=%s' % (str(wcctx._status))) | ||||
print(actx2.status(other=wcctx, | ||||
match=scmutil.matchfiles(repo, ['bar-m', 'foo']))) | ||||
print('wcctx._status=%s' % (str(wcctx._status))) | ||||
FUJIWARA Katsunori
|
r23712 | |||
Robert Stanca
|
r28738 | print('=== with "pattern match" and "listclean=True":') | ||
print(actx1.status(other=wcctx, | ||||
FUJIWARA Katsunori
|
r23712 | match=scmutil.matchfiles(repo, ['bar-r', 'foo']), | ||
Robert Stanca
|
r28738 | listclean=True)) | ||
print('wcctx._status=%s' % (str(wcctx._status))) | ||||
print(actx2.status(other=wcctx, | ||||
FUJIWARA Katsunori
|
r23712 | match=scmutil.matchfiles(repo, ['bar-r', 'foo']), | ||
Robert Stanca
|
r28738 | listclean=True)) | ||
print('wcctx._status=%s' % (str(wcctx._status))) | ||||
Jun Wu
|
r32518 | |||
os.chdir('..') | ||||
# test manifestlog being changed | ||||
print('== commit with manifestlog invalidated') | ||||
repo = hg.repository(u, 'test2', create=1) | ||||
os.chdir('test2') | ||||
# make some commits | ||||
for i in [b'1', b'2', b'3']: | ||||
with open(i, 'wb') as f: | ||||
f.write(i) | ||||
status = scmutil.status([], [i], [], [], [], [], []) | ||||
ctx = context.workingcommitctx(repo, status, text=i, user=b'test@test.com', | ||||
date=(0, 0)) | ||||
ctx.p1().manifest() # side effect: cache manifestctx | ||||
n = repo.commitctx(ctx) | ||||
print('commit %s: %s' % (i, hex(n))) | ||||
# touch 00manifest.i mtime so storecache could expire. | ||||
# repo.__dict__['manifestlog'] is deleted by transaction releasefn. | ||||
st = repo.svfs.stat('00manifest.i') | ||||
Augie Fackler
|
r36799 | repo.svfs.utime('00manifest.i', | ||
(st[stat.ST_MTIME] + 1, st[stat.ST_MTIME] + 1)) | ||||
Jun Wu
|
r32518 | |||
# read the file just committed | ||||
try: | ||||
if repo[n][i].data() != i: | ||||
print('data mismatch') | ||||
except Exception as ex: | ||||
print('cannot read data: %r' % ex) | ||||
Martin von Zweigbergk
|
r33672 | |||
with repo.wlock(), repo.lock(), repo.transaction('test'): | ||||
with open(b'4', 'wb') as f: | ||||
f.write(b'4') | ||||
repo.dirstate.normal('4') | ||||
repo.commit('4') | ||||
revsbefore = len(repo.changelog) | ||||
repo.invalidate(clearfilecache=True) | ||||
revsafter = len(repo.changelog) | ||||
if revsbefore != revsafter: | ||||
print('changeset lost by repo.invalidate()') | ||||