tests/drawdag.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 02 Oct 2021 11:39:57 +0200
changeset 48149 25836b0029f5
parent 47055 d55b71393907
child 48966 6000f5b25c9b
permissions -rw-r--r--
dirstatemap: drop legacy method on the dirstatemap wrapper They are no longer in use now that the Rust wrapper version of the Dirstatemap are back in line with the Python one. Differential Revision: https://phab.mercurial-scm.org/D11582
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30458
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.
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
    75
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
    76
Some special comments could have side effects:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
    77
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
    78
    - Create obsmarkers
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
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: 32376
diff changeset
    80
      # split: A -> B, C           # 1 to many
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
    81
      # prune: A, B, C             # many to nothing
30458
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
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
    87
import re
30458
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,
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
    93
    obsolete,
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
    94
    pycompat,
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32345
diff changeset
    95
    registrar,
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    96
    scmutil,
31676
d761ef24d6e1 drawdag: use 'tagsmod.tag' instead of 'repo.tag'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30458
diff changeset
    97
    tags as tagsmod,
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
    98
)
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
cmdtable = {}
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32345
diff changeset
   101
command = registrar.command(cmdtable)
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   102
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   103
_pipechars = b'\\/+-|'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   104
_nonpipechars = b''.join(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   105
    pycompat.bytechr(i)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   106
    for i in range(33, 127)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   107
    if pycompat.bytechr(i) not in _pipechars
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   108
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   109
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   110
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   111
def _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   112
    """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
   113
    otherwise"""
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   114
    return ch in _nonpipechars
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   115
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   116
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   117
def _parseasciigraph(text):
34213
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   118
    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: 34212
diff changeset
   119
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   120
    >>> import pprint
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   121
    >>> pprint.pprint({pycompat.sysstr(k): [pycompat.sysstr(vv) for vv in v]
34213
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   122
    ...  for k, v in _parseasciigraph(br'''
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   123
    ...        G
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   124
    ...        |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   125
    ...  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: 34212
diff changeset
   126
    ...   \ \| |   # replace: C -> D -> H
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   127
    ...    H B E   # prune: F, I
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   128
    ...     \|/
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   129
    ...      A
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   130
    ... ''').items()})
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   131
    {'A': [],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   132
     'B': ['A'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   133
     'C': ['B'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   134
     'D': ['B'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   135
     'E': ['A'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   136
     'F': ['E'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   137
     'G': ['F'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   138
     'H': ['A'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   139
     'I': ['H']}
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   140
    >>> pprint.pprint({pycompat.sysstr(k): [pycompat.sysstr(vv) for vv in v]
34213
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   141
    ...  for k, v in _parseasciigraph(br'''
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   142
    ...  o    foo
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   143
    ...  |\
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   144
    ...  +---o  bar
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   145
    ...  | | |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   146
    ...  | o |  baz
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   147
    ...  |  /
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   148
    ...  +---o  d
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   149
    ...  | |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   150
    ...  +---o  c
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   151
    ...  | |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   152
    ...  o |  b
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   153
    ...  |/
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   154
    ...  o  a
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   155
    ... ''').items()})
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   156
    {'a': [],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   157
     'b': ['a'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   158
     'bar': ['b', 'a'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   159
     'baz': [],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   160
     'c': ['b'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   161
     'd': ['b'],
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   162
     'foo': ['baz', 'b']}
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   163
    """
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   164
    lines = text.splitlines()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   165
    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
   166
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   167
    def get(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   168
        """(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
   169
        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
   170
        if x < 0 or y < 0:
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   171
            return b' '
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   172
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   173
            return lines[y][x : x + 1] or b' '
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   174
        except IndexError:
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   175
            return b' '
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   176
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   177
    def getname(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   178
        """(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
   179
        parts. if name is an 'o', try to replace it to the right"""
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   180
        result = b''
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   181
        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
   182
            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
   183
            if not _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   184
                break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   185
            result = ch + result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   186
        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
   187
            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
   188
            if not _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   189
                break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   190
            result += ch
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   191
        if result == b'o':
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   192
            # special handling, find the name to the right
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   193
            result = b''
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   194
            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
   195
                ch = get(y, x + i)
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   196
                if ch == b' ' or ch in _pipechars:
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   197
                    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
   198
                        break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   199
                else:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   200
                    result += ch
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   201
            return result or b'o'
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   202
        return result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   203
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   204
    def parents(y, x):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   205
        """(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
   206
        return a list of parents"""
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 31676
diff changeset
   207
        visited = {(y, x)}
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   208
        visit = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   209
        result = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   210
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   211
        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
   212
            """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
   213
            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
   214
            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
   215
            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
   216
            ch = get(y, x)
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   217
            if any(ch == c and c not in expected for c in (b'-', b'+')):
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   218
                y += 1
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   219
                return follow(y + 1, x, expected)
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   220
            if ch in expected or (b'o' in expected and _isname(ch)):
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   221
                visit.append((y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   222
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   223
        #  -o-  # starting point:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   224
        #  /|\ # follow '-' (horizontally), and '/|\' (to the bottom)
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   225
        follow(y + 1, x, b'|')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   226
        follow(y + 1, x - 1, b'/')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   227
        follow(y + 1, x + 1, b'\\')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   228
        follow(y, x - 1, b'-')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   229
        follow(y, x + 1, b'-')
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   230
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   231
        while visit:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   232
            y, x = visit.pop()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   233
            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
   234
                continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   235
            visited.add((y, x))
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   236
            ch = get(y, x)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   237
            if _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   238
                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
   239
                continue
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   240
            elif ch == b'|':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   241
                follow(y + 1, x, b'/|o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   242
                follow(y + 1, x - 1, b'/')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   243
                follow(y + 1, x + 1, b'\\')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   244
            elif ch == b'+':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   245
                follow(y, x - 1, b'-')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   246
                follow(y, x + 1, b'-')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   247
                follow(y + 1, x - 1, b'/')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   248
                follow(y + 1, x + 1, b'\\')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   249
                follow(y + 1, x, b'|')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   250
            elif ch == b'\\':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   251
                follow(y + 1, x + 1, b'\\|o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   252
            elif ch == b'/':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   253
                follow(y + 1, x - 1, b'/|o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   254
            elif ch == b'-':
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   255
                follow(y, x - 1, b'-+o')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   256
                follow(y, x + 1, b'-+o')
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   257
        return result
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   258
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   259
    for y, line in enumerate(lines):
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   260
        for x, ch in enumerate(pycompat.bytestr(line)):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   261
            if ch == b'#':  # comment
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   262
                break
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   263
            if _isname(ch):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   264
                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
   265
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   266
    return dict(edges)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   267
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   268
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   269
class simplefilectx(object):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   270
    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
   271
        self._data = data
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   272
        self._path = path
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   273
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   274
    def data(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   275
        return self._data
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   276
32345
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32331
diff changeset
   277
    def filenode(self):
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32331
diff changeset
   278
        return None
911057981ba4 drawdag: provide filenode for its dummy filectx
Jun Wu <quark@fb.com>
parents: 32331
diff changeset
   279
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   280
    def path(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   281
        return self._path
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   282
41783
2e2076c8c25f commit: migrate to new method for getting copy info
Martin von Zweigbergk <martinvonz@google.com>
parents: 41556
diff changeset
   283
    def copysource(self):
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   284
        return None
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   285
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   286
    def flags(self):
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   287
        return b''
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   288
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   289
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   290
class simplecommitctx(context.committablectx):
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   291
    def __init__(self, repo, name, parentctxs, added):
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   292
        opts = {
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   293
            'changes': scmutil.status([], list(added), [], [], [], [], []),
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   294
            'date': b'0 0',
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   295
            'extra': {b'branch': b'default'},
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   296
        }
39461
9a813e4c8406 drawdag: correctly pass repo to super constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 35838
diff changeset
   297
        super(simplecommitctx, self).__init__(repo, name, **opts)
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   298
        self._added = added
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   299
        self._parents = parentctxs
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   300
        while len(self._parents) < 2:
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46114
diff changeset
   301
            self._parents.append(repo[repo.nullid])
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   302
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   303
    def filectx(self, key):
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   304
        return simplefilectx(key, self._added[key])
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   305
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   306
    def commit(self):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   307
        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
   308
42521
15f04d652b62 drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 41783
diff changeset
   309
    def p1copies(self):
15f04d652b62 drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 41783
diff changeset
   310
        return {}
15f04d652b62 drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 41783
diff changeset
   311
15f04d652b62 drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 41783
diff changeset
   312
    def p2copies(self):
15f04d652b62 drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 41783
diff changeset
   313
        return {}
15f04d652b62 drawdag: don't crash when writing copy info to changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 41783
diff changeset
   314
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   315
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   316
def _walkgraph(edges):
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   317
    """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
   318
    visible = set(edges.keys())
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   319
    remaining = {}  # {str: [str]}
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   320
    for k, vs in edges.items():
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   321
        for v in vs:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   322
            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
   323
                remaining[v] = []
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   324
        remaining[k] = vs[:]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   325
    while remaining:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   326
        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
   327
        if not leafs:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   328
            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
   329
        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
   330
            if leaf in visible:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   331
                yield leaf, edges[leaf]
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   332
            del remaining[leaf]
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   333
            for k, v in remaining.items():
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   334
                if leaf in v:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   335
                    v.remove(leaf)
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   336
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   337
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   338
def _getcomments(text):
41556
8d4ee2d9ffb8 drawdag: use raw strings for docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39461
diff changeset
   339
    r"""
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   340
    >>> [pycompat.sysstr(s) for s in _getcomments(br'''
34213
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   341
    ...        G
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   342
    ...        |
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   343
    ...  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: 34212
diff changeset
   344
    ...   \ \| |   # replace: C -> D -> H
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   345
    ...    H B E   # prune: F, I
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   346
    ...     \|/
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   347
    ...      A
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   348
    ... ''')]
1e71dddc10a2 drawdag: add a couple of doctests to help with python3 porting
Augie Fackler <raf@durin42.com>
parents: 34212
diff changeset
   349
    ['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: 34212
diff changeset
   350
    """
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   351
    for line in text.splitlines():
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   352
        if b' # ' not in line:
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   353
            continue
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   354
        yield line.split(b' # ', 1)[1].split(b' # ')[0].strip()
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   355
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   356
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   357
@command(b'debugdrawdag', [])
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   358
def debugdrawdag(ui, repo, **opts):
41556
8d4ee2d9ffb8 drawdag: use raw strings for docstrings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39461
diff changeset
   359
    r"""read an ASCII graph from stdin and create changesets
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   360
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   361
    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
   362
    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
   363
    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
   364
    to.
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   365
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   366
    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
   367
    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
   368
    :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
   369
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   370
    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
   371
    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
   372
    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
   373
    """
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   374
    text = ui.fin.read()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   375
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   376
    # 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
   377
    edges = _parseasciigraph(text)
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   378
    for k, v in edges.items():
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   379
        if len(v) > 2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   380
            raise error.Abort(_('%s: too many parents: %s') % (k, b' '.join(v)))
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   381
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   382
    # parse comments to get extra file content instructions
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   383
    files = collections.defaultdict(dict)  # {(name, path): content}
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   384
    comments = list(_getcomments(text))
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   385
    filere = re.compile(br'^(\w+)/([\w/]+)\s*=\s*(.*)$', re.M)
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   386
    for name, path, content in filere.findall(b'\n'.join(comments)):
35838
4e41b59633fa lfs: add a test showing bundle application could be broken
Jun Wu <quark@fb.com>
parents: 34214
diff changeset
   387
        content = content.replace(br'\n', b'\n').replace(br'\1', b'\1')
4e41b59633fa lfs: add a test showing bundle application could be broken
Jun Wu <quark@fb.com>
parents: 34214
diff changeset
   388
        files[name][path] = content
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   389
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46114
diff changeset
   390
    committed = {None: repo.nullid}  # {name: node}
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   391
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   392
    # for leaf nodes, try to find existing nodes in repo
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   393
    for name, parents in edges.items():
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   394
        if len(parents) == 0:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   395
            try:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   396
                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
   397
            except error.RepoLookupError:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   398
                pass
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   399
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   400
    # commit in topological order
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   401
    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
   402
        if name in committed:
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   403
            continue
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   404
        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: 33174
diff changeset
   405
        pctxs.sort(key=lambda c: c.node())
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   406
        added = {}
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   407
        if len(parents) > 1:
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   408
            # 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: 33174
diff changeset
   409
            for f in pctxs[1].manifest():
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   410
                if f not in pctxs[0].manifest():
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   411
                    added[f] = pctxs[1][f].data()
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   412
        else:
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   413
            # 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: 33174
diff changeset
   414
            added[name] = name
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   415
        # add extra file contents in comments
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   416
        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
   417
            added[path] = content
33558
0103e7187237 drawdag: include files from both parents in merge commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 33174
diff changeset
   418
        ctx = simplecommitctx(repo, name, pctxs, added)
30458
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   419
        n = ctx.commit()
a31634336471 drawdag: update test repos by drawing the changelog DAG in ASCII
Jun Wu <quark@fb.com>
parents:
diff changeset
   420
        committed[name] = n
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   421
        tagsmod.tag(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   422
            repo, [name], n, message=None, user=None, date=None, local=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   423
        )
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   424
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   425
    # handle special comments
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   426
    with repo.wlock(), repo.lock(), repo.transaction(b'drawdag'):
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   427
        getctx = lambda x: repo.unfiltered()[committed[x.strip()]]
33809
0531ffd59a98 drawdag: allow override file contents via comments
Jun Wu <quark@fb.com>
parents: 33558
diff changeset
   428
        for comment in comments:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42521
diff changeset
   429
            rels = []  # obsolete relationships
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   430
            args = comment.split(b':', 1)
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   431
            if len(args) <= 1:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   432
                continue
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   433
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   434
            cmd = args[0].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   435
            arg = args[1].strip()
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   436
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   437
            if cmd in (b'replace', b'rebase', b'amend'):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   438
                nodes = [getctx(m) for m in arg.split(b'->')]
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   439
                for i in range(len(nodes) - 1):
44411
dda2341d6664 drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents: 43076
diff changeset
   440
                    rels.append(((nodes[i],), (nodes[i + 1],)))
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   441
            elif cmd in (b'split',):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   442
                pre, succs = arg.split(b'->')
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   443
                succs = succs.split(b',')
44411
dda2341d6664 drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents: 43076
diff changeset
   444
                rels.append(((getctx(pre),), (getctx(s) for s in succs)))
34214
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   445
            elif cmd in (b'prune',):
5a1b41268b7c drawdag: port to python 3
Augie Fackler <raf@durin42.com>
parents: 34213
diff changeset
   446
                for n in arg.split(b','):
44411
dda2341d6664 drawdag: abide by new createmarkers() API
Martin von Zweigbergk <martinvonz@google.com>
parents: 43076
diff changeset
   447
                    rels.append(((getctx(n),), ()))
33159
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   448
            if rels:
4d780d510b44 drawdag: support obsmarker creation in comments
Jun Wu <quark@fb.com>
parents: 32376
diff changeset
   449
                obsolete.createmarkers(repo, rels, date=(0, 0), operation=cmd)