diff --git a/tests/drawdag.py b/tests/drawdag.py --- a/tests/drawdag.py +++ b/tests/drawdag.py @@ -84,6 +84,7 @@ from __future__ import absolute_import, import collections import itertools +import re from mercurial.i18n import _ from mercurial import ( @@ -275,6 +276,12 @@ def _walkgraph(edges): if leaf in v: v.remove(leaf) +def _getcomments(text): + for line in text.splitlines(): + if ' # ' not in line: + continue + yield line.split(' # ', 1)[1].split(' # ')[0].strip() + @command('debugdrawdag', []) def debugdrawdag(ui, repo, **opts): """read an ASCII graph from stdin and create changesets @@ -301,6 +308,13 @@ def debugdrawdag(ui, repo, **opts): raise error.Abort(_('%s: too many parents: %s') % (k, ' '.join(v))) + # parse comments to get extra file content instructions + files = collections.defaultdict(dict) # {(name, path): content} + comments = list(_getcomments(text)) + filere = re.compile(r'^(\w+)/([\w/]+)\s*=\s*(.*)$', re.M) + for name, path, content in filere.findall('\n'.join(comments)): + files[name][path] = content.replace(r'\n', '\n') + committed = {None: node.nullid} # {name: node} # for leaf nodes, try to find existing nodes in repo @@ -326,6 +340,9 @@ def debugdrawdag(ui, repo, **opts): else: # If it's not a merge, add a single file added[name] = name + # add extra file contents in comments + for path, content in files.get(name, {}).items(): + added[path] = content ctx = simplecommitctx(repo, name, pctxs, added) n = ctx.commit() committed[name] = n @@ -335,12 +352,8 @@ def debugdrawdag(ui, repo, **opts): # handle special comments with repo.wlock(), repo.lock(), repo.transaction('drawdag'): getctx = lambda x: repo.unfiltered()[committed[x.strip()]] - for line in text.splitlines(): - if ' # ' not in line: - continue - + for comment in comments: rels = [] # obsolete relationships - comment = line.split(' # ', 1)[1].split(' # ')[0].strip() args = comment.split(':', 1) if len(args) <= 1: continue diff --git a/tests/test-drawdag.t b/tests/test-drawdag.t --- a/tests/test-drawdag.t +++ b/tests/test-drawdag.t @@ -232,3 +232,41 @@ Create obsmarkers via comments be0ef73c17ade3fc89dc41701eb9fc3a91b58282 575c4b5ec114d64b681d33f8792853568bfb2b2c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} 64a8289d249234b9886244d379f15e6b650b28e3 0 {7fb047a69f220c21711122dfd94305a9efb60cba} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} 58e6b987bf7045fcd9c54f496396ca1d1fc81047 0 {575c4b5ec114d64b681d33f8792853568bfb2b2c} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} + +Change file contents via comments + + $ reinit + $ hg debugdrawdag <<'EOS' + > C # A/dir1/a = 1\n2 + > |\ # B/dir2/b = 34 + > A B # C/dir1/c = 5 + > # C/dir2/c = 6 + > # C/A = a + > # C/B = b + > EOS + + $ hg log -G -T '{desc} {files}' + o C A B dir1/c dir2/c + |\ + | o B B dir2/b + | + o A A dir1/a + + $ for f in `hg files -r C`; do + > echo FILE "$f" + > hg cat -r C "$f" + > echo + > done + FILE A + a + FILE B + b + FILE dir1/a + 1 + 2 + FILE dir1/c + 5 + FILE dir2/b + 34 + FILE dir2/c + 6