]> granicus.if.org Git - graphviz/commit
fix edge attribute order confusion
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Wed, 5 Aug 2020 00:47:15 +0000 (17:47 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 11 Aug 2020 01:13:59 +0000 (18:13 -0700)
commit4e727ede4f5181c4650c4aa60427bef8b43d113d
tree11ee4075b7d7b1747ad2b9824096014af53244ee
parent6b631379920e4385f7ee918496e5913f51129612
fix edge attribute order confusion

Certain edge attributes are constructed in advance of their being seen in the
input because Graphviz knows it may need default values for them. Later, if seen
in the input, the values of these attributes are updated.

This all works fine unless the order in which these initially-defaulted edge
attributes appear in the input does not match the order in which the default
versions are constructed by Graphviz internally. In this case, the order in
which the attributes are seen in the input is used to construct a dictionary of
them, but the original copies are used to index into attribute values.

In the particular test case added in this commit,

  digraph {
    { rank=same; n1; n2 }

    n2 -> n1 [ headport=s, arrowhead=normal ]
  }

arrowhead was constructed with symbol ID 0 and headport was constructed with
symbol ID 1. But then the later parsing of these attributes resulted in a
dictionary where the headport value was in ID 0 and the arrowhead value was in
ID 1. Indexing into this dictionary with the initially constructed E_arrowhead
resulted in incorrectly returning the value "s". This caused a spurious error
'Arrow type "s" unknown' as well as incorrect graph output.

Fixes #1444. Note that this may just be one of several issues resulting from
using these initially constructed E_* symbols.
CHANGELOG.md
lib/common/arrows.c
rtest/1444-2.dot [new file with mode: 0644]
rtest/1444.dot [new file with mode: 0644]
rtest/test_regression.py