tests/drawdag.py
author Pulkit Goyal <7895pulkit@gmail.com>
Fri, 19 Jan 2018 14:10:18 +0530
changeset 35727 05c70675e5b9
parent 34207 5a1b41268b7c
child 36742 4e41b59633fa
permissions -rw-r--r--
blackbox: don't unpack the list while passing into str.join() The current state may result in error TypeError. Caught using evolve-tests.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     1
# drawdag.py - convert ASCII revision DAG to actual changesets
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     2
#
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     3
# Copyright 2016 Facebook, Inc.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     4
#
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     7
"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     8
create changesets from an ASCII graph for testing purpose.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
     9
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    10
For example, given the following input::
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    11
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    12
    c d
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    13
    |/
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    14
    b
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    15
    |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    16
    a
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    17
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    18
4 changesets and 4 local tags will be created.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    19
`hg log -G -T "{rev} {desc} (tag: {tags})"` will output::
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    20
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    21
    o  3 d (tag: d tip)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    22
    |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    23
    | o  2 c (tag: c)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    24
    |/
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    25
    o  1 b (tag: b)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    26
    |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    27
    o  0 a (tag: a)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    28
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    29
For root nodes (nodes without parents) in the graph, they can be revsets
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    30
pointing to existing nodes.  The ASCII graph could also have disconnected
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    31
components with same names referring to the same changeset.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    32
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    33
Therefore, given the repo having the 4 changesets (and tags) above, with the
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    34
following ASCII graph as input::
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    35
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    36
    foo    bar       bar  foo
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    37
     |     /          |    |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    38
    ancestor(c,d)     a   baz
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    39
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    40
The result (`hg log -G -T "{desc}"`) will look like::
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    41
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    42
    o    foo
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    43
    |\
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    44
    +---o  bar
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    45
    | | |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    46
    | o |  baz
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    47
    |  /
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    48
    +---o  d
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    49
    | |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    50
    +---o  c
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    51
    | |
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    52
    o |  b
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    53
    |/
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    54
    o  a
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    55
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    56
Note that if you take the above `hg log` output directly as input. It will work
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    57
as expected - the result would be an isomorphic graph::
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    58
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    59
    o    foo
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    60
    |\
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    61
    | | o  d
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    62
    | |/
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    63
    | | o  c
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    64
    | |/
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    65
    | | o  bar
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    66
    | |/|
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    67
    | o |  b
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    68
    | |/
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    69
    o /  baz
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    70
     /
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    71
    o  a
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    72
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    73
This is because 'o' is specially handled in the input: instead of using 'o' as
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    74
the node name, the word to the right will be used.
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    75
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    76
Some special comments could have side effects:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    77
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    78
    - Create obsmarkers
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    79
      # replace: A -> B -> C -> D  # chained 1 to 1 replacements
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    80
      # split: A -> B, C           # 1 to many
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    81
      # prune: A, B, C             # many to nothing
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    82
"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    83
from __future__ import absolute_import, print_function
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    84
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    85
import collections
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    86
import itertools
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
    87
import re
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    88
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    89
from mercurial.i18n import _
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    90
from mercurial import (
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    91
    context,
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    92
    error,
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    93
    node,
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
    94
    obsolete,
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
    95
    pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32305
diff changeset
    96
    registrar,
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    97
    scmutil,
31671
d761ef24d6e1 drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30449
diff changeset
    98
    tags as tagsmod,
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    99
)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   100
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   101
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32305
diff changeset
   102
command = registrar.command(cmdtable)
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   103
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   104
_pipechars = b'\\/+-|'
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   105
_nonpipechars = b''.join(pycompat.bytechr(i) for i in range(33, 127)
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   106
                         if pycompat.bytechr(i) not in _pipechars)
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   107
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   108
def _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   109
    """char -> bool. return True if ch looks like part of a name, False
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   110
    otherwise"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   111
    return ch in _nonpipechars
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   112
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   113
def _parseasciigraph(text):
34206
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   114
    r"""str -> {str : [str]}. convert the ASCII graph to edges
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   115
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   116
    >>> import pprint
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   117
    >>> pprint.pprint({pycompat.sysstr(k): [pycompat.sysstr(vv) for vv in v]
34206
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   118
    ...  for k, v in _parseasciigraph(br'''
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   119
    ...        G
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   120
    ...        |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   121
    ...  I D C F   # split: B -> E, F, G
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   122
    ...   \ \| |   # replace: C -> D -> H
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   123
    ...    H B E   # prune: F, I
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   124
    ...     \|/
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   125
    ...      A
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   126
    ... ''').items()})
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   127
    {'A': [],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   128
     'B': ['A'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   129
     'C': ['B'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   130
     'D': ['B'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   131
     'E': ['A'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   132
     'F': ['E'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   133
     'G': ['F'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   134
     'H': ['A'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   135
     'I': ['H']}
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   136
    >>> pprint.pprint({pycompat.sysstr(k): [pycompat.sysstr(vv) for vv in v]
34206
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   137
    ...  for k, v in _parseasciigraph(br'''
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   138
    ...  o    foo
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   139
    ...  |\
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   140
    ...  +---o  bar
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   141
    ...  | | |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   142
    ...  | o |  baz
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   143
    ...  |  /
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   144
    ...  +---o  d
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   145
    ...  | |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   146
    ...  +---o  c
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   147
    ...  | |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   148
    ...  o |  b
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   149
    ...  |/
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   150
    ...  o  a
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   151
    ... ''').items()})
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   152
    {'a': [],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   153
     'b': ['a'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   154
     'bar': ['b', 'a'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   155
     'baz': [],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   156
     'c': ['b'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   157
     'd': ['b'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   158
     'foo': ['baz', 'b']}
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   159
    """
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   160
    lines = text.splitlines()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   161
    edges = collections.defaultdict(list)  # {node: []}
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   162
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   163
    def get(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   164
        """(int, int) -> char. give a coordinate, return the char. return a
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   165
        space for anything out of range"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   166
        if x < 0 or y < 0:
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   167
            return b' '
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   168
        try:
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   169
            return lines[y][x:x + 1] or b' '
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   170
        except IndexError:
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   171
            return b' '
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   172
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   173
    def getname(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   174
        """(int, int) -> str. like get(y, x) but concatenate left and right
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   175
        parts. if name is an 'o', try to replace it to the right"""
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   176
        result = b''
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   177
        for i in itertools.count(0):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   178
            ch = get(y, x - i)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   179
            if not _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   180
                break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   181
            result = ch + result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   182
        for i in itertools.count(1):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   183
            ch = get(y, x + i)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   184
            if not _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   185
                break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   186
            result += ch
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   187
        if result == b'o':
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   188
            # special handling, find the name to the right
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   189
            result = b''
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   190
            for i in itertools.count(2):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   191
                ch = get(y, x + i)
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   192
                if ch == b' ' or ch in _pipechars:
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   193
                    if result or x + i >= len(lines[y]):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   194
                        break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   195
                else:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   196
                    result += ch
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   197
            return result or b'o'
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   198
        return result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   199
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   200
    def parents(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   201
        """(int, int) -> [str]. follow the ASCII edges at given position,
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   202
        return a list of parents"""
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 31671
diff changeset
   203
        visited = {(y, x)}
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   204
        visit = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   205
        result = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   206
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   207
        def follow(y, x, expected):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   208
            """conditionally append (y, x) to visit array, if it's a char
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   209
            in excepted. 'o' in expected means an '_isname' test.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   210
            if '-' (or '+') is not in excepted, and get(y, x) is '-' (or '+'),
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   211
            the next line (y + 1, x) will be checked instead."""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   212
            ch = get(y, x)
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   213
            if any(ch == c and c not in expected for c in (b'-', b'+')):
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   214
                y += 1
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   215
                return follow(y + 1, x, expected)
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   216
            if ch in expected or (b'o' in expected and _isname(ch)):
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   217
                visit.append((y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   218
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   219
        #  -o-  # starting point:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   220
        #  /|\ # follow '-' (horizontally), and '/|\' (to the bottom)
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   221
        follow(y + 1, x, b'|')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   222
        follow(y + 1, x - 1, b'/')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   223
        follow(y + 1, x + 1, b'\\')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   224
        follow(y, x - 1, b'-')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   225
        follow(y, x + 1, b'-')
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   226
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   227
        while visit:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   228
            y, x = visit.pop()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   229
            if (y, x) in visited:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   230
                continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   231
            visited.add((y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   232
            ch = get(y, x)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   233
            if _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   234
                result.append(getname(y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   235
                continue
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   236
            elif ch == b'|':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   237
                follow(y + 1, x, b'/|o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   238
                follow(y + 1, x - 1, b'/')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   239
                follow(y + 1, x + 1, b'\\')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   240
            elif ch == b'+':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   241
                follow(y, x - 1, b'-')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   242
                follow(y, x + 1, b'-')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   243
                follow(y + 1, x - 1, b'/')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   244
                follow(y + 1, x + 1, b'\\')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   245
                follow(y + 1, x, b'|')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   246
            elif ch == b'\\':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   247
                follow(y + 1, x + 1, b'\\|o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   248
            elif ch == b'/':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   249
                follow(y + 1, x - 1, b'/|o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   250
            elif ch == b'-':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   251
                follow(y, x - 1, b'-+o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   252
                follow(y, x + 1, b'-+o')
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   253
        return result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   254
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   255
    for y, line in enumerate(lines):
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   256
        for x, ch in enumerate(pycompat.bytestr(line)):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   257
            if ch == b'#':  # comment
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   258
                break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   259
            if _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   260
                edges[getname(y, x)] += parents(y, x)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   261
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   262
    return dict(edges)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   263
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   264
class simplefilectx(object):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   265
    def __init__(self, path, data):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   266
        self._data = data
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   267
        self._path = path
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   268
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   269
    def data(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   270
        return self._data
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   271
32305
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32291
diff changeset
   272
    def filenode(self):
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32291
diff changeset
   273
        return None
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32291
diff changeset
   274
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   275
    def path(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   276
        return self._path
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   277
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   278
    def renamed(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   279
        return None
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   280
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   281
    def flags(self):
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   282
        return b''
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   283
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   284
class simplecommitctx(context.committablectx):
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   285
    def __init__(self, repo, name, parentctxs, added):
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   286
        opts = {
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   287
            'changes': scmutil.status([], list(added), [], [], [], [], []),
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   288
            'date': b'0 0',
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   289
            'extra': {b'branch': b'default'},
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   290
        }
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   291
        super(simplecommitctx, self).__init__(self, name, **opts)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   292
        self._repo = repo
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   293
        self._added = added
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   294
        self._parents = parentctxs
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   295
        while len(self._parents) < 2:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   296
            self._parents.append(repo[node.nullid])
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   297
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   298
    def filectx(self, key):
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   299
        return simplefilectx(key, self._added[key])
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   300
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   301
    def commit(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   302
        return self._repo.commitctx(self)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   303
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   304
def _walkgraph(edges):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   305
    """yield node, parents in topologically order"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   306
    visible = set(edges.keys())
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   307
    remaining = {}  # {str: [str]}
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   308
    for k, vs in edges.items():
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   309
        for v in vs:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   310
            if v not in remaining:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   311
                remaining[v] = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   312
        remaining[k] = vs[:]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   313
    while remaining:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   314
        leafs = [k for k, v in remaining.items() if not v]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   315
        if not leafs:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   316
            raise error.Abort(_('the graph has cycles'))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   317
        for leaf in sorted(leafs):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   318
            if leaf in visible:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   319
                yield leaf, edges[leaf]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   320
            del remaining[leaf]
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   321
            for k, v in remaining.items():
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   322
                if leaf in v:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   323
                    v.remove(leaf)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   324
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   325
def _getcomments(text):
34206
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   326
    """
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   327
    >>> [pycompat.sysstr(s) for s in _getcomments(br'''
34206
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   328
    ...        G
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   329
    ...        |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   330
    ...  I D C F   # split: B -> E, F, G
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   331
    ...   \ \| |   # replace: C -> D -> H
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   332
    ...    H B E   # prune: F, I
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   333
    ...     \|/
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   334
    ...      A
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   335
    ... ''')]
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   336
    ['split: B -> E, F, G', 'replace: C -> D -> H', 'prune: F, I']
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34205
diff changeset
   337
    """
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   338
    for line in text.splitlines():
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   339
        if b' # ' not in line:
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   340
            continue
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   341
        yield line.split(b' # ', 1)[1].split(b' # ')[0].strip()
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   342
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   343
@command(b'debugdrawdag', [])
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   344
def debugdrawdag(ui, repo, **opts):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   345
    """read an ASCII graph from stdin and create changesets
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   346
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   347
    The ASCII graph is like what :hg:`log -G` outputs, with each `o` replaced
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   348
    to the name of the node. The command will create dummy changesets and local
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   349
    tags with those names to make the dummy changesets easier to be referred
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   350
    to.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   351
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   352
    If the name of a node is a single character 'o', It will be replaced by the
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   353
    word to the right. This makes it easier to reuse
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   354
    :hg:`log -G -T '{desc}'` outputs.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   355
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   356
    For root (no parents) nodes, revset can be used to query existing repo.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   357
    Note that the revset cannot have confusing characters which can be seen as
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   358
    the part of the graph edges, like `|/+-\`.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   359
    """
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   360
    text = ui.fin.read()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   361
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   362
    # parse the graph and make sure len(parents) <= 2 for each node
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   363
    edges = _parseasciigraph(text)
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   364
    for k, v in edges.items():
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   365
        if len(v) > 2:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   366
            raise error.Abort(_('%s: too many parents: %s')
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   367
                              % (k, b' '.join(v)))
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   368
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   369
    # parse comments to get extra file content instructions
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   370
    files = collections.defaultdict(dict) # {(name, path): content}
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   371
    comments = list(_getcomments(text))
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   372
    filere = re.compile(br'^(\w+)/([\w/]+)\s*=\s*(.*)$', re.M)
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   373
    for name, path, content in filere.findall(b'\n'.join(comments)):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   374
        files[name][path] = content.replace(br'\n', b'\n')
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   375
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   376
    committed = {None: node.nullid}  # {name: node}
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   377
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   378
    # for leaf nodes, try to find existing nodes in repo
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   379
    for name, parents in edges.items():
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   380
        if len(parents) == 0:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   381
            try:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   382
                committed[name] = scmutil.revsingle(repo, name)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   383
            except error.RepoLookupError:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   384
                pass
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   385
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   386
    # commit in topological order
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   387
    for name, parents in _walkgraph(edges):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   388
        if name in committed:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   389
            continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   390
        pctxs = [repo[committed[n]] for n in parents]
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   391
        pctxs.sort(key=lambda c: c.node())
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   392
        added = {}
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   393
        if len(parents) > 1:
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   394
            # If it's a merge, take the files and contents from the parents
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   395
            for f in pctxs[1].manifest():
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   396
                if f not in pctxs[0].manifest():
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   397
                    added[f] = pctxs[1][f].data()
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   398
        else:
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   399
            # If it's not a merge, add a single file
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   400
            added[name] = name
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   401
        # add extra file contents in comments
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   402
        for path, content in files.get(name, {}).items():
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   403
            added[path] = content
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33172
diff changeset
   404
        ctx = simplecommitctx(repo, name, pctxs, added)
30449
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   405
        n = ctx.commit()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   406
        committed[name] = n
34205
6c408bfa2dab drawdag: tagsmod.tag() takes a list of names, not a single name
Augie Fackler <raf@durin42.com>
parents: 33788
diff changeset
   407
        tagsmod.tag(repo, [name], n, message=None, user=None, date=None,
31671
d761ef24d6e1 drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30449
diff changeset
   408
                    local=True)
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   409
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   410
    # handle special comments
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   411
    with repo.wlock(), repo.lock(), repo.transaction(b'drawdag'):
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   412
        getctx = lambda x: repo.unfiltered()[committed[x.strip()]]
33788
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   413
        for comment in comments:
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   414
            rels = [] # obsolete relationships
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   415
            args = comment.split(b':', 1)
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   416
            if len(args) <= 1:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   417
                continue
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   418
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   419
            cmd = args[0].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   420
            arg = args[1].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   421
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   422
            if cmd in (b'replace', b'rebase', b'amend'):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   423
                nodes = [getctx(m) for m in arg.split(b'->')]
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   424
                for i in range(len(nodes) - 1):
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   425
                    rels.append((nodes[i], (nodes[i + 1],)))
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   426
            elif cmd in (b'split',):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   427
                pre, succs = arg.split(b'->')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   428
                succs = succs.split(b',')
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   429
                rels.append((getctx(pre), (getctx(s) for s in succs)))
34207
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   430
            elif cmd in (b'prune',):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34206
diff changeset
   431
                for n in arg.split(b','):
33153
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   432
                    rels.append((getctx(n), ()))
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   433
            if rels:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32337
diff changeset
   434
                obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd)