Skip to content
Snippets Groups Projects
Commit 0531ffd5 authored by Jun Wu's avatar Jun Wu
Browse files

drawdag: allow override file contents via comments

This makes drawdag more flexible, and allow us to create non-clean merges in
test cases.

Differential Revision: https://phab.mercurial-scm.org/D385
parent fa3aa6c9
No related branches found
No related tags found
No related merge requests found
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
import collections import collections
import itertools import itertools
import re
from mercurial.i18n import _ from mercurial.i18n import _
from mercurial import ( from mercurial import (
...@@ -275,6 +276,12 @@ ...@@ -275,6 +276,12 @@
if leaf in v: if leaf in v:
v.remove(leaf) 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', []) @command('debugdrawdag', [])
def debugdrawdag(ui, repo, **opts): def debugdrawdag(ui, repo, **opts):
"""read an ASCII graph from stdin and create changesets """read an ASCII graph from stdin and create changesets
...@@ -301,6 +308,13 @@ ...@@ -301,6 +308,13 @@
raise error.Abort(_('%s: too many parents: %s') raise error.Abort(_('%s: too many parents: %s')
% (k, ' '.join(v))) % (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} committed = {None: node.nullid} # {name: node}
# for leaf nodes, try to find existing nodes in repo # for leaf nodes, try to find existing nodes in repo
...@@ -326,6 +340,9 @@ ...@@ -326,6 +340,9 @@
else: else:
# If it's not a merge, add a single file # If it's not a merge, add a single file
added[name] = name 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) ctx = simplecommitctx(repo, name, pctxs, added)
n = ctx.commit() n = ctx.commit()
committed[name] = n committed[name] = n
...@@ -335,8 +352,5 @@ ...@@ -335,8 +352,5 @@
# handle special comments # handle special comments
with repo.wlock(), repo.lock(), repo.transaction('drawdag'): with repo.wlock(), repo.lock(), repo.transaction('drawdag'):
getctx = lambda x: repo.unfiltered()[committed[x.strip()]] getctx = lambda x: repo.unfiltered()[committed[x.strip()]]
for line in text.splitlines(): for comment in comments:
if ' # ' not in line:
continue
rels = [] # obsolete relationships rels = [] # obsolete relationships
...@@ -342,5 +356,4 @@ ...@@ -342,5 +356,4 @@
rels = [] # obsolete relationships rels = [] # obsolete relationships
comment = line.split(' # ', 1)[1].split(' # ')[0].strip()
args = comment.split(':', 1) args = comment.split(':', 1)
if len(args) <= 1: if len(args) <= 1:
continue continue
......
...@@ -232,3 +232,41 @@ ...@@ -232,3 +232,41 @@
be0ef73c17ade3fc89dc41701eb9fc3a91b58282 575c4b5ec114d64b681d33f8792853568bfb2b2c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} 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'} 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'} 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment