Mercurial > hg
view tests/test-contrib-check-code.t @ 28600:0d6137891114
graphmod: allow for different styles for different edge types
Rather than draw all edges as solid lines, allow for using different styles for
different edge types. For example you could use dotted lines for edges that
do not connect to a parent, and dashed lines when connecting to a grandparent
(implying missing nodes in between).
For example, setting the following configuration:
[ui]
graphstyle.grandparent = :
graphstyle.missing = .
would result in a graph like this:
o changeset: 32:d06dffa21a31
|\ parent: 27:886ed638191b
| : parent: 31:621d83e11f67
| :
o : changeset: 31:621d83e11f67
|\: parent: 21:d42a756af44d
| : parent: 30:6e11cd4b648f
| :
o : changeset: 30:6e11cd4b648f
|\ \ parent: 28:44ecd0b9ae99
| . : parent: 29:cd9bb2be7593
| . :
o . : changeset: 28:44ecd0b9ae99
|\ \ \ parent: 1:6db2ef61d156
| . . : parent: 26:7f25b6c2f0b9
| . . :
o . . : changeset: 26:7f25b6c2f0b9
|\ \ \ \ parent: 18:1aa84d96232a
| | . . : parent: 25:91da8ed57247
| | . . :
| o-----+ changeset: 25:91da8ed57247
| | . . : parent: 21:d42a756af44d
| | . . : parent: 24:a9c19a3d96b7
| | . . :
| o . . : changeset: 24:a9c19a3d96b7
| |\ \ \ \ parent: 0:e6eb3150255d
| | . . . : parent: 23:a01cddf0766d
| | . . . :
| o---+ . : changeset: 23:a01cddf0766d
| | . . . : parent: 1:6db2ef61d156
| | . . . : parent: 22:e0d9cccacb5d
| | . . . :
| o-------+ changeset: 22:e0d9cccacb5d
| . . . . : parent: 18:1aa84d96232a
|/ / / / / parent: 21:d42a756af44d
| . . . :
| . . . o changeset: 21:d42a756af44d
| . . . |\ parent: 19:31ddc2c1573b
| . . . | | parent: 20:d30ed6450e32
| . . . | |
+-+-------o changeset: 20:d30ed6450e32
| . . . | parent: 0:e6eb3150255d
| . . . | parent: 18:1aa84d96232a
| . . . |
| . . . o changeset: 19:31ddc2c1573b
| . . . .\ parent: 15:1dda3f72782d
| . . . . | parent: 17:44765d7c06e0
| . . . . |
o---+---+ | changeset: 18:1aa84d96232a
. . . . | parent: 1:6db2ef61d156
/ / / / / parent: 15:1dda3f72782d
. . . . .
Edge styles can be altered by setting the following one-character config options::
[ui]
graphstyle.parent = |
graphstyle.grandparent = :
graphstyle.missing = .
The default configuration leaves all 3 types set to |, leaving graph styles
unaffected.
This is part of the work towards moving smartlog upstream; currently smartlog
injects extra nodes into the graph to indicate grandparent relationships (nodes
elided).
author | Martijn Pieters <mjpieters@fb.com> |
---|---|
date | Sat, 19 Mar 2016 16:46:15 -0700 |
parents | d3990da51637 |
children | 4dd530df4742 |
line wrap: on
line source
$ cat > correct.py <<EOF > def toto(arg1, arg2): > del arg2 > return (5 + 6, 9) > EOF $ cat > wrong.py <<EOF > def toto( arg1, arg2): > del(arg2) > return ( 5+6, 9) > EOF $ cat > quote.py <<EOF > # let's use quote in comments > (''' ( 4x5 ) > but """\\''' and finally''', > """let's fool checkpatch""", '1+2', > '"""', 42+1, """and > ( 4-1 ) """, "( 1+1 )\" and ") > a, '\\\\\\\\', "\\\\\\" x-2", "c-1" > EOF $ cat > classstyle.py <<EOF > class newstyle_class(object): > pass > > class oldstyle_class: > pass > > class empty(): > pass > > no_class = 1: > pass > EOF $ check_code="$TESTDIR"/../contrib/check-code.py $ "$check_code" ./wrong.py ./correct.py ./quote.py ./classstyle.py ./wrong.py:1: > def toto( arg1, arg2): gratuitous whitespace in () or [] ./wrong.py:2: > del(arg2) Python keyword is not a function ./wrong.py:3: > return ( 5+6, 9) gratuitous whitespace in () or [] missing whitespace in expression ./quote.py:5: > '"""', 42+1, """and missing whitespace in expression ./classstyle.py:4: > class oldstyle_class: old-style class, use class foo(object) ./classstyle.py:7: > class empty(): class foo() creates old style object, use class foo(object) [1] $ cat > python3-compat.py << EOF > foo <> bar > reduce(lambda a, b: a + b, [1, 2, 3, 4]) > dict(key=value) > EOF $ "$check_code" python3-compat.py python3-compat.py:1: > foo <> bar <> operator is not available in Python 3+, use != python3-compat.py:2: > reduce(lambda a, b: a + b, [1, 2, 3, 4]) reduce is not available in Python 3+ python3-compat.py:3: > dict(key=value) dict() is different in Py2 and 3 and is slower than {} [1] $ cat > foo.c <<EOF > void narf() { > strcpy(foo, bar); > // strcpy_s is okay, but this comment is not > strcpy_s(foo, bar); > } > EOF $ "$check_code" ./foo.c ./foo.c:2: > strcpy(foo, bar); don't use strcpy, use strlcpy or memcpy ./foo.c:3: > // strcpy_s is okay, but this comment is not don't use //-style comments [1] $ cat > is-op.py <<EOF > # is-operator comparing number or string literal > x = None > y = x is 'foo' > y = x is "foo" > y = x is 5346 > y = x is -6 > y = x is not 'foo' > y = x is not "foo" > y = x is not 5346 > y = x is not -6 > EOF $ "$check_code" ./is-op.py ./is-op.py:3: > y = x is 'foo' object comparison with literal ./is-op.py:4: > y = x is "foo" object comparison with literal ./is-op.py:5: > y = x is 5346 object comparison with literal ./is-op.py:6: > y = x is -6 object comparison with literal ./is-op.py:7: > y = x is not 'foo' object comparison with literal ./is-op.py:8: > y = x is not "foo" object comparison with literal ./is-op.py:9: > y = x is not 5346 object comparison with literal ./is-op.py:10: > y = x is not -6 object comparison with literal [1] $ cat > for-nolineno.py <<EOF > except: > EOF $ "$check_code" for-nolineno.py --nolineno for-nolineno.py:0: > except: naked except clause [1] $ cat > warning.t <<EOF > $ function warnonly { > > } > $ diff -N aaa > $ function onwarn {} > EOF $ "$check_code" warning.t $ "$check_code" --warn warning.t warning.t:1: > $ function warnonly { warning: don't use 'function', use old style warning.t:3: > $ diff -N aaa warning: don't use 'diff -N' warning.t:4: > $ function onwarn {} warning: don't use 'function', use old style [1] $ cat > raise-format.py <<EOF > raise SomeException, message > # this next line is okay > raise SomeException(arg1, arg2) > EOF $ "$check_code" not-existing.py raise-format.py Skipping*not-existing.py* (glob) raise-format.py:1: > raise SomeException, message don't use old-style two-argument raise, use Exception(message) [1] $ cat > rst.py <<EOF > """problematic rst text > > .. note:: > wrong > """ > > ''' > > .. note:: > > valid > > new text > > .. note:: > > also valid > ''' > > """mixed > > .. note:: > > good > > .. note:: > plus bad > """ > EOF $ $check_code -w rst.py rst.py:3: > .. note:: warning: add two newlines after '.. note::' rst.py:26: > .. note:: warning: add two newlines after '.. note::' [1] $ cat > ./map-inside-gettext.py <<EOF > print _("map inside gettext %s" % v) > > print _("concatenating " " by " " space %s" % v) > print _("concatenating " + " by " + " '+' %s" % v) > > print _("mapping operation in different line %s" > % v) > > print _( > "leading spaces inside of '(' %s" % v) > EOF $ "$check_code" ./map-inside-gettext.py ./map-inside-gettext.py:1: > print _("map inside gettext %s" % v) don't use % inside _() ./map-inside-gettext.py:3: > print _("concatenating " " by " " space %s" % v) don't use % inside _() ./map-inside-gettext.py:4: > print _("concatenating " + " by " + " '+' %s" % v) don't use % inside _() ./map-inside-gettext.py:6: > print _("mapping operation in different line %s" don't use % inside _() ./map-inside-gettext.py:9: > print _( don't use % inside _() [1] web templates $ mkdir -p mercurial/templates $ cat > mercurial/templates/example.tmpl <<EOF > {desc} > {desc|escape} > {desc|firstline} > {desc|websub} > EOF $ "$check_code" --warnings mercurial/templates/example.tmpl mercurial/templates/example.tmpl:2: > {desc|escape} warning: follow desc keyword with either firstline or websub [1]