{ "info": { "author": "Ivan Simonini", "author_email": "drachlyznardh@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "githistorian\n=============\n\nAlternative layout for git log --graph, inspired by\n[this GIST thread](https://gist.github.com/datagrok/4221767).\n\nDependencies\n------------\n\n - bintrees 2.0.1\n\nUsage\n-----\n\n [options] [target\u2026]\n\nDisplays the targets history. If no target is given, HEAD is selected. Each\ntarget is assigned its own column, in the specified order\n\n### Options\n\n- -v, --verbose : prints some stats before showing history\n- -n, --limit= : cuts the history at N commits\n- -p, --pretty= : format string, passed to `git log --pretty`\n- -a, --all, --heads : appends all local branches to the target list\n- -t, --tags : appends all tags to the target list\n- -r, --remotes : appends all remote branches to the target list\n- -f, --file : loads preferences from \n\nPreferences\n-----------\n\nPreferences are loaded from the .githistorian file (or from the file specified\nby -f,--file) if present. This file can contain options and arguments, one per\nline. Command line arguments override those written on file.\n\nInvocation\n----------\n\nSince 0.0-j, githistorian is a proper Python module, this it can be invoked as\n\n\t\tpython -m githistorian\n\nonce it is installed on your system. You can test it before installation by\n\n\t\tPYTHONPATH=src python -m githistorian\n\nor by simply calling make in this directory.\n\nConcept\n-------\n\nThe long-term goal of this project is to provide an alternative layout for `git\nlog --graph`; the short-term goal is to display the history of a Git repo using\nstraight lines to represent long-lived branches. The user can specify how\nbranches are ordered, thus having specific branches on specific columns.\n\nProof of existence\n------------------\n\nThis whole project exists only to prove that a different, more readable layout\nfor the graph of a repo is possible, and that I could actually write it. It is\nnow fairly functional, but vastly slower than invoking Git itself and it is a\nstandalone application.\n\nImplementation\n--------------\n\nIt is a Python script, which queries the Git repo for all its history (commit\nrelations) and crunches it to build a graph, then it spreads the commits on a\ngrid and dumps it all on the terminal.\n\n### Vertical spread\n\nEach line can contain but a single commit. No commit can be displayed before its\nchild(ren), and no commit can displayed after its parent(s); commit with no\nrelation at all (heads with completely independent chunks of history) appear in\norder, as specified.\n\n### Horizontal spread\n\nHeads appear in order, as specified, or in alphabetical order by default.\nCommits in the same branch appear in the same column as long as there is no\noverlapping with arrows.\n\nRelationship between commit may be:\n\n - implied, when parent and child are directly one over the other, in the same\n column and in two consecutive rows;\n - highlighted with a vertical line, when parent and cihld are directly one over\n the other, but with one or more row in between them;\n - highlighted with an arrow, which moves horizontally (left or right) from the\n parent until it reaches the child's column, bends at a right angle and moves\n up until it reaches the child\n\n### Display\n\nEach commit is displayed as a white bullet character '\u2b24' (\\u2022). Arrows take\nthe color of their destination column and are drawn with unicode box chars.\n\nAs each merge commit receives all its incoming arrows from the bottom, there is\nno indication of the original order of parents. You cannot infere which parent\nwas merged into which, as the relative row and column of each parent depends on\nthe whole layout.\n\nAt the end of its row, each commit is resented with its equivalent `git show -s\n--pretty='' ` output. You can specify the format string with options `-p,\n--pretty`, otherwise my own default will be used instead.\n\nDue to the cut at N commits, some merge commits may loose some children. To\nprevent the drawing from missing these relation, cut commits are replaced with\nplaceholders. These fake nodes do not have children, they do not display a\nmessage and they have no label. A special '[\u2026]' marker appears beside their\nbullet.\n\nTesting\n-------\n\nFor testing, I used a bunch of repos. First, this one; in addition, I built a\nseries of artificial repos with different histories, to check the behaviour with\noctopus merges, crossing branches, multiple heads, multiple bases, a copy of the\ngit-flow sample image.\n\nI tested it against some other projects of mine, and also against the Git repo\nitself (commit 96db324a73fdada6fbe7b63221986f8f18cc63b0): it took almost 6m to\nrender 146M of text with ~37k rows and 632 columns, but it worked. Version 0.1\ntook 5m27.876s to do the same.\n\nTODO\n====\n\n**Display options**: the layout could be mirrored both vertically and\nhorizontally, the charset could be different (for those terminals / fonts\nwithout full unicode support), colors could be optional, there could be more\ncolors (with fade and bold modes, or with full 256 color if supported), map-only\ndisplay mode could ignore any non-merge / non-fork commit\u2026\n\n**Efficency**: there are no intermediate steps in the layout computation, no\ncheckpoints, no nothing. Even with no change in the repo, each invocation must\nread the whole history, rebuild the graph and recompute the column for each\ncommit. I am not sure how I could keep the graph in memory (or on file) and add\na single commit (or arrow) to it without starting from scratch.\n\n**Standalone**: there is no integration with Git, for a number of reasons.\n\n - Git integration is hard. I have been using Git for years, but I have no\n experience with its source, its internal structure and its community. I took\n a look at the graph's sourcecode and then I ran away;\n - I don't know what I want, nor what people would like; the GIST thread I\n mentioned as inspiration gave me some ideas, but many more details need to be\n established before the project \u201cgets serious\u201d;\n - the resulting layout takes a very wide space to display, much more than the\n default Git graph; this whole project may be nearly-unusable on repos with\n very long histories, or with a great deal of open branches;\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/drachlyznardh/githistorian", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "githistorian", "package_url": "https://pypi.org/project/githistorian/", "platform": "", "project_url": "https://pypi.org/project/githistorian/", "project_urls": { "Homepage": "https://github.com/drachlyznardh/githistorian" }, "release_url": "https://pypi.org/project/githistorian/0.1.3/", "requires_dist": [ "bintrees" ], "requires_python": "", "summary": "Graph visualizer for git history", "version": "0.1.3" }, "last_serial": 5273530, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "e641ccb33895c4c5383ee83f270e4663", "sha256": "ff2e872ec76e34c103d103067e4825b78fc60750c7005d19f5280bcb146f9381" }, "downloads": -1, "filename": "githistorian-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "e641ccb33895c4c5383ee83f270e4663", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17464, "upload_time": "2019-05-14T18:13:17", "url": "https://files.pythonhosted.org/packages/39/be/0eac766d13217cb59c6afc9ced32d565e1fa7f687e5994c51403965f612b/githistorian-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "00f7da5ff0621c64ed9510303cde587d", "sha256": "3b5607c42b22101a02fa9a4f709616636583bf0fbd4241ed4e1f33616b977b6c" }, "downloads": -1, "filename": "githistorian-0.1.2.tar.gz", "has_sig": false, "md5_digest": "00f7da5ff0621c64ed9510303cde587d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15824, "upload_time": "2019-05-14T18:13:19", "url": "https://files.pythonhosted.org/packages/9a/bb/c50aa873c1046f119b34c8ff348c9b876a6266bf293c379ba864400158f0/githistorian-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "05f645fb0736418b8da7da1ce043de30", "sha256": "8cd896fd31dcc5bbf7cd9a2a7424e2ec90a5ec7098a8dfa2a74ca4ebf5afa766" }, "downloads": -1, "filename": "githistorian-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "05f645fb0736418b8da7da1ce043de30", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17464, "upload_time": "2019-05-15T17:21:31", "url": "https://files.pythonhosted.org/packages/dc/b0/87cf2947195607144e3f254f358ea763db8b56edea59832d511e1b876e8f/githistorian-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "80ae3a39c5a8d3e5f023dc9626ded6bd", "sha256": "0546e865e8dd78aa31f4e79c24d7508bc79458fc0dfd7784f35215cdf1c31d2f" }, "downloads": -1, "filename": "githistorian-0.1.3.tar.gz", "has_sig": false, "md5_digest": "80ae3a39c5a8d3e5f023dc9626ded6bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15906, "upload_time": "2019-05-15T17:21:32", "url": "https://files.pythonhosted.org/packages/e7/5c/027608ba3ed4a9d9d7cbbcf405d554c4b7835b21762697be5fb905c2ab80/githistorian-0.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "05f645fb0736418b8da7da1ce043de30", "sha256": "8cd896fd31dcc5bbf7cd9a2a7424e2ec90a5ec7098a8dfa2a74ca4ebf5afa766" }, "downloads": -1, "filename": "githistorian-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "05f645fb0736418b8da7da1ce043de30", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17464, "upload_time": "2019-05-15T17:21:31", "url": "https://files.pythonhosted.org/packages/dc/b0/87cf2947195607144e3f254f358ea763db8b56edea59832d511e1b876e8f/githistorian-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "80ae3a39c5a8d3e5f023dc9626ded6bd", "sha256": "0546e865e8dd78aa31f4e79c24d7508bc79458fc0dfd7784f35215cdf1c31d2f" }, "downloads": -1, "filename": "githistorian-0.1.3.tar.gz", "has_sig": false, "md5_digest": "80ae3a39c5a8d3e5f023dc9626ded6bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15906, "upload_time": "2019-05-15T17:21:32", "url": "https://files.pythonhosted.org/packages/e7/5c/027608ba3ed4a9d9d7cbbcf405d554c4b7835b21762697be5fb905c2ab80/githistorian-0.1.3.tar.gz" } ] }