bruterebase.py
75 lines
| 2.2 KiB
| text/x-python
|
PythonLexer
/ tests / bruterebase.py
Jun Wu
|
r33674 | # bruterebase.py - brute force rebase testing | ||
# | ||||
# Copyright 2017 Facebook, Inc. | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
from __future__ import absolute_import | ||||
from mercurial import ( | ||||
error, | ||||
registrar, | ||||
revsetlang, | ||||
) | ||||
from hgext import rebase | ||||
Augie Fackler
|
r34201 | try: | ||
xrange | ||||
except NameError: | ||||
xrange = range | ||||
Jun Wu
|
r33674 | cmdtable = {} | ||
command = registrar.command(cmdtable) | ||||
Augie Fackler
|
r43346 | |||
Augie Fackler
|
r34201 | @command(b'debugbruterebase') | ||
Jun Wu
|
r33674 | def debugbruterebase(ui, repo, source, dest): | ||
"""for every non-empty subset of source, run rebase -r subset -d dest | ||||
Print one line summary for each subset. Assume obsstore is enabled. | ||||
""" | ||||
srevs = list(repo.revs(source)) | ||||
with repo.wlock(), repo.lock(): | ||||
repolen = len(repo) | ||||
cl = repo.changelog | ||||
def getdesc(rev): | ||||
result = cl.changelogrevision(rev).description | ||||
if rev >= repolen: | ||||
Augie Fackler
|
r34201 | result += b"'" | ||
Jun Wu
|
r33674 | return result | ||
for i in xrange(1, 2 ** len(srevs)): | ||||
subset = [rev for j, rev in enumerate(srevs) if i & (1 << j) != 0] | ||||
Augie Fackler
|
r34201 | spec = revsetlang.formatspec(b'%ld', subset) | ||
tr = repo.transaction(b'rebase') | ||||
Augie Fackler
|
r43346 | tr._report = lambda x: 0 # hide "transaction abort" | ||
Jun Wu
|
r33674 | |||
ui.pushbuffer() | ||||
try: | ||||
rebase.rebase(ui, repo, dest=dest, rev=[spec]) | ||||
except error.Abort as ex: | ||||
Martin von Zweigbergk
|
r46274 | summary = b'ABORT: %s' % ex.message | ||
Jun Wu
|
r33674 | except Exception as ex: | ||
Augie Fackler
|
r34201 | summary = b'CRASH: %s' % ex | ||
Jun Wu
|
r33674 | else: | ||
# short summary about new nodes | ||||
cl = repo.changelog | ||||
descs = [] | ||||
for rev in xrange(repolen, len(repo)): | ||||
Augie Fackler
|
r34201 | desc = b'%s:' % getdesc(rev) | ||
Jun Wu
|
r33674 | for prev in cl.parentrevs(rev): | ||
if prev > -1: | ||||
desc += getdesc(prev) | ||||
descs.append(desc) | ||||
descs.sort() | ||||
Pulkit Goyal
|
r36497 | summary = b' '.join(descs) | ||
Jun Wu
|
r33674 | ui.popbuffer() | ||
Augie Fackler
|
r34201 | repo.vfs.tryunlink(b'rebasestate') | ||
Jun Wu
|
r33674 | |||
Augie Fackler
|
r34201 | subsetdesc = b''.join(getdesc(rev) for rev in subset) | ||
Augie Fackler
|
r43346 | ui.write(b'%s: %s\n' % (subsetdesc.rjust(len(srevs)), summary)) | ||
Jun Wu
|
r33674 | tr.abort() | ||