# HG changeset patch # User Mads Kiilerich # Date 1456171667 -3600 # Node ID 05a85a6cecba5c8caeb7996590365d5d9bc523c9 # Parent ea9604ceaf558978cf62752c25bf0c93c70adf82 graph: detect git branches and colourise them properly without rainbow effect (Issue #188) This is based on research and patches by Andrew Shadura. When using Git, only commits pointed to by branch references have their branches set. In general, there's no way in Git to find out which branch a commit belongs to, so we can try to deduce that from the merge topology. In other words, if we know the branch name, we know it's a different colour than any different branch. If we don't (it is None), we guesstimate the first parent is probably on the same branch. The relevant part of the code before 2da0dc09 used a similar, yet simpler, algorithm. diff -r ea9604ceaf55 -r 05a85a6cecba kallithea/lib/graphmod.py --- a/kallithea/lib/graphmod.py Sun Feb 21 16:36:54 2016 +0100 +++ b/kallithea/lib/graphmod.py Mon Feb 22 21:07:47 2016 +0100 @@ -146,7 +146,7 @@ searching = True for p in reversed(addparents): obs[p] = int(repo[p].obsolete) - if searching and branch(abs(p)) == b: + if searching and branch(abs(p)) in [b, None]: # This is the first parent on the same branch - inherit the color colors[p] = color searching = False # make sure we don't give the color away twice diff -r ea9604ceaf55 -r 05a85a6cecba kallithea/tests/functional/test_changelog.py --- a/kallithea/tests/functional/test_changelog.py Sun Feb 21 16:36:54 2016 +0100 +++ b/kallithea/tests/functional/test_changelog.py Mon Feb 22 21:07:47 2016 +0100 @@ -70,7 +70,7 @@ response.mustcontain("""fixing stupid typo in context for mercurial""") - response.mustcontain("""var jsdata = [[[0, 1], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 1, 3, 0], [0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 3, 0]], 0, 0], [[0, 2], [[0, 0, 3, 0], [1, 0, 3, 0]], 0, 0], [[0, 3], [[0, 1, 4, 0], [0, 0, 3, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 4, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 3, 0], [1, 0, 3, 0]], 0, 0], [[0, 3], [[0, 1, 5, 0], [0, 0, 3, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0], [1, 0, 3, 0]], 0, 0], [[0, 3], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 3, 0], [1, 1, 5, 0]], 0, 0], [[0, 3], [[0, 0, 5, 0], [1, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 1, 6, 0], [0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 6, 0]], 0, 0], [[1, 6], [[0, 0, 5, 0], [1, 1, 6, 0]], 0, 0], [[1, 6], [[0, 0, 5, 0], [1, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 1, 7, 0], [0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 7, 0]], 0, 0], [[1, 7], [[0, 0, 5, 0], [1, 1, 7, 0]], 0, 0], [[1, 7], [[0, 0, 5, 0], [1, 1, 7, 0], [1, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 7, 0]], 0, 0], [[1, 7], [[0, 0, 5, 0], [1, 0, 5, 0]], 0, 0], [[0, 5], [[0, 1, 8, 0], [0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 8, 0]], 0, 0], [[1, 8], [[0, 0, 5, 0], [1, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 1, 9, 0], [0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 9, 0]], 0, 0], [[1, 9], [[0, 0, 5, 0], [1, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 1, 10, 0], [0, 0, 5, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[1, 10], [[0, 0, 5, 0], [1, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[1, 10], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 5, 0], [1, 1, 10, 0]], 0, 0], [[0, 5], [[0, 0, 10, 0], [1, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 1, 11, 0], [0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 1, 12, 0], [0, 0, 10, 0], [1, 2, 11, 0]], 0, 0], [[2, 11], [[0, 0, 10, 0], [1, 1, 12, 0], [2, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[1, 12], [[0, 0, 10, 0], [1, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[1, 12], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 1, 12, 0], [0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0], [1, 1, 12, 0]], 0, 0], [[1, 12], [[0, 0, 10, 0], [1, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0], [[0, 10], [[0, 0, 10, 0]], 0, 0]];""") + response.mustcontain("""var jsdata = [[[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 1, 2, 0], [0, 0, 1, 0]], 0, 0], [[0, 1], [[0, 0, 1, 0], [1, 1, 2, 0]], 0, 0], [[0, 1], [[0, 0, 2, 0], [1, 0, 2, 0]], 0, 0], [[0, 2], [[0, 1, 3, 0], [0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 3, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 3, 0]], 0, 0], [[1, 3], [[0, 0, 2, 0], [1, 0, 2, 0]], 0, 0], [[0, 2], [[0, 1, 4, 0], [0, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0], [1, 0, 2, 0]], 0, 0], [[0, 2], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[1, 4], [[0, 0, 2, 0], [1, 1, 4, 0]], 0, 0], [[0, 2], [[0, 0, 4, 0], [1, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 1, 5, 0], [0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 4, 0], [1, 1, 5, 0]], 0, 0], [[1, 5], [[0, 0, 4, 0], [1, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 1, 6, 0], [0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 6, 0]], 0, 0], [[1, 6], [[0, 0, 4, 0], [1, 1, 6, 0]], 0, 0], [[1, 6], [[0, 0, 4, 0], [1, 1, 6, 0], [1, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 6, 0]], 0, 0], [[1, 6], [[0, 0, 4, 0], [1, 0, 4, 0]], 0, 0], [[0, 4], [[0, 1, 7, 0], [0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 7, 0]], 0, 0], [[1, 7], [[0, 0, 4, 0], [1, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 1, 8, 0], [0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 8, 0]], 0, 0], [[1, 8], [[0, 0, 4, 0], [1, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 1, 9, 0], [0, 0, 4, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[1, 9], [[0, 0, 4, 0], [1, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[1, 9], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 4, 0], [1, 1, 9, 0]], 0, 0], [[0, 4], [[0, 0, 9, 0], [1, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 1, 10, 0], [0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 1, 11, 0], [0, 0, 9, 0], [1, 2, 10, 0]], 0, 0], [[2, 10], [[0, 0, 9, 0], [1, 1, 11, 0], [2, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[1, 11], [[0, 0, 9, 0], [1, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[1, 11], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 1, 11, 0], [0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0], [1, 1, 11, 0]], 0, 0], [[1, 11], [[0, 0, 9, 0], [1, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0], [[0, 9], [[0, 0, 9, 0]], 0, 0]];""") # response.mustcontain( # """