evolve: use cmdrewrite.amend() instead of creating a new commit
This patch backs out changeset 88601e1cd5d8.
We replaced cmdrewrite.amend() with creating new commit because using amend(), a
high level function was not good and creating a new commit gave us more control
over things.
**HOWEVER** to get more control, you need to get arrange all the pieces together
perfectly. Creating a new commit, the existing logic has some bugs around
dirstate handling, the `repo.dirstate.setparents()` call especially. Sometimes
this fixes the dirstate correctly sometimes not.
As Pierre-Yves David said, "Having a "clumsy" implementation with the right
behavior is usually a good first step. So having an amend based implementation
seems like a good first step.", let's take a step back and get back using amend
so that we can have a correct basic implementation which is bug free.
#!/usr/bin/env python
import re
import os
import os.path as op
import sys
INDEX = '''
Mercurial tests
===============
.. toctree::
:maxdepth: 1
'''
ignored_patterns = [
re.compile('^#if'),
re.compile('^#else'),
re.compile('^#endif'),
re.compile('#rest-ignore$'),
]
def rstify(orig, name):
newlines = []
code_block_mode = False
sphinx_directive_mode = False
for line in orig.splitlines():
# Emtpy lines doesn't change output
if not line:
newlines.append(line)
code_block_mode = False
sphinx_directive_mode = False
continue
ignored = False
for pattern in ignored_patterns:
if pattern.search(line):
ignored = True
break
if ignored:
continue
# Sphinx directives mode
if line.startswith(' .. '):
# Insert a empty line to makes sphinx happy
newlines.append("")
# And unindent the directive
line = line[2:]
sphinx_directive_mode = True
# Code mode
codeline = line.startswith(' ')
if codeline and not sphinx_directive_mode:
if code_block_mode is False:
newlines.extend(['::', ''])
code_block_mode = True
newlines.append(line)
return "\n".join(newlines)
def main(base):
if os.path.isdir(base):
one_dir(base)
else:
one_file(base)
def one_dir(base):
index = INDEX
# doc = lambda x: op.join(op.dirname(__file__), 'docs', x)
for fn in sorted(os.listdir(base)):
if not fn.endswith('.t'):
continue
name = os.path.splitext(fn)[0]
content = one_file(op.join(base, fn))
target = op.join(base, name + '.rst')
# with file(doc(name + '.rst'), 'w') as f:
with open(target, 'w') as f:
f.write(content)
index += '\n ' + name
# with file(doc('index.rst'), 'w') as f:
# f.write(index)
def one_file(path):
name = os.path.basename(path)[:-2]
return rstify(open(path).read(), name)
if __name__ == '__main__':
if len(sys.argv) != 2:
print('Please supply a path to tests dir as parameter')
sys.exit()
main(sys.argv[1])