From 71f49866e9b8e917b6c9d8e256ca399e768b5c34 Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Thu, 3 Jan 2019 14:50:02 +0100 Subject: [PATCH] [py] better color function --- git-log-to-tikz.py | 12 ++++++--- git1.tex | 63 +++++++++++++++++++++++++-------------------- text-output.pdf | Bin 100686 -> 101045 bytes 3 files changed, 43 insertions(+), 32 deletions(-) diff --git a/git-log-to-tikz.py b/git-log-to-tikz.py index 876f25b..629a1ac 100755 --- a/git-log-to-tikz.py +++ b/git-log-to-tikz.py @@ -8,7 +8,11 @@ from re import compile, match hashpat = compile(r"[a-f0-9]{7}") linepat = compile(r'[^|\/\\]') -colors = ["black", "blue", "brown", "cyan", "darkgray", "gray", "green", "lightgray", "lime", "magenta", "olive", "orange", "pink", "purple", "red", "teal", "violet", "white", "yellow"] + +def color(numb): + colors = ["black", "blue", "brown", "cyan", "darkgray", "gray", "green", "lightgray", "lime", "magenta", "olive", "orange", "pink", "purple", "red", "teal", "violet", "white", "yellow"] + return colors[numb % colors.__len__()] + class Commit: def __init__(self,line): @@ -46,7 +50,7 @@ class Commit: child._children[self._hash] = self def export_to_tikz(self, ypos): - print("\\node[commit, " + colors[self._node_pos] + ", fill=" + colors[self._node_pos] + "] (" + self._hash + ") at (" + str(.5 * self._node_pos) + "," + str(ypos) + ") {};") + print("\\node[commit, " + color(self._node_pos) + ", fill=" + color(self._node_pos) + "] (" + self._hash + ") at (" + str(.5 * self._node_pos) + "," + str(ypos) + ") {};") print("\\node[right,xshift=10] (label_" + self._hash + ") at (" + self._hash + ".east) {\\verb!" + self._hash + ": " + self._message + "!};") #for child in self._children.itervalues(): # print("\\path[" + "blue" +"] (" + self._hash + ") to[out=90,in=-90] (" + child._hash + ");") @@ -102,7 +106,7 @@ class Repo: for commit in self._commits.values(): for child in commit._children.values(): - print("\\path[" + colors[commit._node_pos] +"] (" + commit._hash + ") to[out=90,in=-90] (" + child._hash + ");") + print("\\path[" + color(commit._node_pos) +"] (" + commit._hash + ") to[out=90,in=-90] (" + child._hash + ");") for branch in self._branches: print("\\node[branch,right,xshift=10] (" + branch._name + ") at (label_" + branch._hash + ".east) {\\lstinline{" + branch._name +"}};") @@ -136,4 +140,4 @@ for line in return_output.split("\n"): if not line == "": r.add_branch(Branch(line)) -r.export_to_tikz() \ No newline at end of file +r.export_to_tikz() diff --git a/git1.tex b/git1.tex index 84ff713..9a6c263 100644 --- a/git1.tex +++ b/git1.tex @@ -28,47 +28,54 @@ \node[right,xshift=10] (label_2256509) at (2256509.east) {\verb!2256509: [py] fixed automatic colors!}; \node[commit, black, fill=black] (6e41ab0) at (0.0,6.0) {}; \node[right,xshift=10] (label_6e41ab0) at (6e41ab0.east) {\verb!6e41ab0: [py] fixed order!}; -\node[commit, black, fill=black] (53e02cf) at (0.0,6.5) {}; +\node[commit, blue, fill=blue] (53e02cf) at (0.5,6.5) {}; \node[right,xshift=10] (label_53e02cf) at (53e02cf.east) {\verb!53e02cf: [doc] test!}; -\node[commit, black, fill=black] (8dde7ec) at (0.0,7.0) {}; +\node[commit, blue, fill=blue] (8dde7ec) at (0.5,7.0) {}; \node[right,xshift=10] (label_8dde7ec) at (8dde7ec.east) {\verb!8dde7ec: [doc] neues Hooks!}; -\node[commit, black, fill=black] (8024ece) at (0.0,7.5) {}; +\node[commit, blue, fill=blue] (8024ece) at (0.5,7.5) {}; \node[right,xshift=10] (label_8024ece) at (8024ece.east) {\verb!8024ece: [doc] hook test!}; -\node[commit, black, fill=black] (7ef61eb) at (0.0,8.0) {}; +\node[commit, blue, fill=blue] (7ef61eb) at (0.5,8.0) {}; \node[right,xshift=10] (label_7ef61eb) at (7ef61eb.east) {\verb!7ef61eb: [doc] hooktest 2!}; \node[commit, brown, fill=brown] (d477a13) at (1.0,8.5) {}; \node[right,xshift=10] (label_d477a13) at (d477a13.east) {\verb!d477a13: [doc] neuer Branch!}; -\node[commit, blue, fill=blue] (16d4f59) at (0.5,9.0) {}; +\node[commit, black, fill=black] (16d4f59) at (0.0,9.0) {}; \node[right,xshift=10] (label_16d4f59) at (16d4f59.east) {\verb!16d4f59: [doc] test!}; -\node[commit, black, fill=black] (d2bf877) at (0.0,9.5) {}; +\node[commit, blue, fill=blue] (d2bf877) at (0.5,9.5) {}; \node[right,xshift=10] (label_d2bf877) at (d2bf877.east) {\verb!d2bf877: [py] new git order!}; -\node[commit, black, fill=black] (6b30984) at (0.0,10.0) {}; +\node[commit, blue, fill=blue] (6b30984) at (0.5,10.0) {}; \node[right,xshift=10] (label_6b30984) at (6b30984.east) {\verb!6b30984: [py] 2new git order!}; -\node[commit, blue, fill=blue] (feccffc) at (0.5,10.5) {}; +\node[commit, black, fill=black] (feccffc) at (0.0,10.5) {}; \node[right,xshift=10] (label_feccffc) at (feccffc.east) {\verb!feccffc: Merge branch 'develop'!}; -\node[commit, blue, fill=blue] (1b6432e) at (0.5,11.0) {}; +\node[commit, black, fill=black] (1b6432e) at (0.0,11.0) {}; \node[right,xshift=10] (label_1b6432e) at (1b6432e.east) {\verb!1b6432e: merge successful!}; -\node[commit, black, fill=black] (827f503) at (0.0,11.5) {}; +\node[commit, blue, fill=blue] (827f503) at (0.5,11.5) {}; \node[right,xshift=10] (label_827f503) at (827f503.east) {\verb!827f503: [doc] Features/Bugs [py] reversed changed!}; -\node[commit, black, fill=black] (0ee95d1) at (0.0,12.0) {}; +\node[commit, blue, fill=blue] (0ee95d1) at (0.5,12.0) {}; \node[right,xshift=10] (label_0ee95d1) at (0ee95d1.east) {\verb!0ee95d1: [doc] Hook test!}; -\node[commit, black, fill=black] (0009b09) at (0.0,12.5) {}; +\node[commit, blue, fill=blue] (0009b09) at (0.5,12.5) {}; \node[right,xshift=10] (label_0009b09) at (0009b09.east) {\verb!0009b09: [doc] Hook2 test!}; -\node[commit, black, fill=black] (494a6ba) at (0.0,13.0) {}; +\node[commit, blue, fill=blue] (494a6ba) at (0.5,13.0) {}; \node[right,xshift=10] (label_494a6ba) at (494a6ba.east) {\verb!494a6ba: [doc] Hook2 test!}; -\path[black] (0009b09) to[out=90,in=-90] (494a6ba); -\path[black] (0ee95d1) to[out=90,in=-90] (0009b09); -\path[black] (827f503) to[out=90,in=-90] (0ee95d1); -\path[blue] (feccffc) to[out=90,in=-90] (1b6432e); -\path[black] (6b30984) to[out=90,in=-90] (827f503); -\path[black] (6b30984) to[out=90,in=-90] (feccffc); -\path[black] (d2bf877) to[out=90,in=-90] (6b30984); -\path[blue] (16d4f59) to[out=90,in=-90] (feccffc); -\path[black] (7ef61eb) to[out=90,in=-90] (d477a13); -\path[black] (7ef61eb) to[out=90,in=-90] (d2bf877); -\path[black] (8024ece) to[out=90,in=-90] (7ef61eb); -\path[black] (8dde7ec) to[out=90,in=-90] (8024ece); -\path[black] (53e02cf) to[out=90,in=-90] (8dde7ec); +\node[commit, blue, fill=blue] (ddec20f) at (0.5,13.5) {}; +\node[right,xshift=10] (label_ddec20f) at (ddec20f.east) {\verb!ddec20f: [doc] lsting Hooks!}; +\node[commit, black, fill=black] (65dae54) at (0.0,14.0) {}; +\node[right,xshift=10] (label_65dae54) at (65dae54.east) {\verb!65dae54: Merge branch 'develop'!}; +\path[blue] (ddec20f) to[out=90,in=-90] (65dae54); +\path[blue] (494a6ba) to[out=90,in=-90] (ddec20f); +\path[blue] (0009b09) to[out=90,in=-90] (494a6ba); +\path[blue] (0ee95d1) to[out=90,in=-90] (0009b09); +\path[blue] (827f503) to[out=90,in=-90] (0ee95d1); +\path[black] (1b6432e) to[out=90,in=-90] (65dae54); +\path[black] (feccffc) to[out=90,in=-90] (1b6432e); +\path[blue] (6b30984) to[out=90,in=-90] (827f503); +\path[blue] (6b30984) to[out=90,in=-90] (feccffc); +\path[blue] (d2bf877) to[out=90,in=-90] (6b30984); +\path[black] (16d4f59) to[out=90,in=-90] (feccffc); +\path[blue] (7ef61eb) to[out=90,in=-90] (d477a13); +\path[blue] (7ef61eb) to[out=90,in=-90] (d2bf877); +\path[blue] (8024ece) to[out=90,in=-90] (7ef61eb); +\path[blue] (8dde7ec) to[out=90,in=-90] (8024ece); +\path[blue] (53e02cf) to[out=90,in=-90] (8dde7ec); \path[black] (6e41ab0) to[out=90,in=-90] (16d4f59); \path[black] (6e41ab0) to[out=90,in=-90] (53e02cf); \path[black] (2256509) to[out=90,in=-90] (6e41ab0); @@ -84,8 +91,8 @@ \path[black] (e5c3cd5) to[out=90,in=-90] (9ebee64); \path[black] (d78896f) to[out=90,in=-90] (e5c3cd5); \path[black] (a6f6d74) to[out=90,in=-90] (d78896f); -\node[branch,right,xshift=10] (develop) at (label_494a6ba.east) {\lstinline{develop}}; +\node[branch,right,xshift=10] (develop) at (label_ddec20f.east) {\lstinline{develop}}; \node[branch,right,xshift=10] (feature/python) at (label_6b30984.east) {\lstinline{feature/python}}; \node[branch,right,xshift=10] (feature/python2) at (label_d477a13.east) {\lstinline{feature/python2}}; -\node[branch,right,xshift=10] (master) at (label_1b6432e.east) {\lstinline{master}}; +\node[branch,right,xshift=10] (master) at (label_65dae54.east) {\lstinline{master}}; \end{tikzpicture} diff --git a/text-output.pdf b/text-output.pdf index 356f3364201c1a5c19e6f89705f9a257fb6b328e..4c9b99ed3a972a110eb08f5761b90df56087c498 100644 GIT binary patch delta 5998 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