{"id":16484406,"url":"https://github.com/fabricesalvaire/codereview","last_synced_at":"2025-04-04T13:11:25.987Z","repository":{"id":15677330,"uuid":"18414836","full_name":"FabriceSalvaire/CodeReview","owner":"FabriceSalvaire","description":"CodeReview is a Git GUI tool to perform code review (Diff Viewer) written in Python3 and Qt5.","archived":false,"fork":false,"pushed_at":"2023-07-20T11:52:41.000Z","size":4615,"stargazers_count":408,"open_issues_count":27,"forks_count":95,"subscribers_count":40,"default_branch":"master","last_synced_at":"2024-10-12T13:16:52.107Z","etag":null,"topics":["diff-viewer","git","git-gui","pyqt5","python3"],"latest_commit_sha":null,"homepage":"http://fabricesalvaire.github.io/CodeReview","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FabriceSalvaire.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2014-04-03T19:10:32.000Z","updated_at":"2024-09-17T15:48:36.000Z","dependencies_parsed_at":"2022-08-07T08:01:16.599Z","dependency_job_id":"b2d5e873-348b-428a-82a6-fb6790940e46","html_url":"https://github.com/FabriceSalvaire/CodeReview","commit_stats":{"total_commits":264,"total_committers":1,"mean_commits":264.0,"dds":0.0,"last_synced_commit":"c0c6fcbb60b0a422761a89890a9babee66efb56c"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabriceSalvaire%2FCodeReview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabriceSalvaire%2FCodeReview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabriceSalvaire%2FCodeReview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabriceSalvaire%2FCodeReview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FabriceSalvaire","download_url":"https://codeload.github.com/FabriceSalvaire/CodeReview/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247182399,"owners_count":20897381,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diff-viewer","git","git-gui","pyqt5","python3"],"created_at":"2024-10-11T13:17:00.016Z","updated_at":"2025-04-04T13:11:25.971Z","avatar_url":"https://github.com/FabriceSalvaire.png","language":"Python","readme":"\u003c?xml version=\"1.0\" encoding=\"utf-8\" ?\u003e\n\u003c!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"\u003e\n\u003chtml xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"\u003e\n\u003chead\u003e\n\u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /\u003e\n\u003cmeta name=\"generator\" content=\"Docutils 0.16: http://docutils.sourceforge.net/\" /\u003e\n\u003ctitle\u003eREADME.rst\u003c/title\u003e\n\u003cstyle type=\"text/css\"\u003e\n\n/*\n:Author: David Goodger (goodger@python.org)\n:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $\n:Copyright: This stylesheet has been placed in the public domain.\n\nDefault cascading style sheet for the HTML output of Docutils.\n\nSee http://docutils.sf.net/docs/howto/html-stylesheets.html for how to\ncustomize this style sheet.\n*/\n\n/* used to remove borders from tables and images */\n.borderless, table.borderless td, table.borderless th {\n  border: 0 }\n\ntable.borderless td, table.borderless th {\n  /* Override padding for \"table.docutils td\" with \"! important\".\n     The right padding separates the table cells. */\n  padding: 0 0.5em 0 0 ! important }\n\n.first {\n  /* Override more specific margin styles with \"! important\". */\n  margin-top: 0 ! important }\n\n.last, .with-subtitle {\n  margin-bottom: 0 ! important }\n\n.hidden {\n  display: none }\n\n.subscript {\n  vertical-align: sub;\n  font-size: smaller }\n\n.superscript {\n  vertical-align: super;\n  font-size: smaller }\n\na.toc-backref {\n  text-decoration: none ;\n  color: black }\n\nblockquote.epigraph {\n  margin: 2em 5em ; }\n\ndl.docutils dd {\n  margin-bottom: 0.5em }\n\nobject[type=\"image/svg+xml\"], object[type=\"application/x-shockwave-flash\"] {\n  overflow: hidden;\n}\n\n/* Uncomment (and remove this text!) to get bold-faced definition list terms\ndl.docutils dt {\n  font-weight: bold }\n*/\n\ndiv.abstract {\n  margin: 2em 5em }\n\ndiv.abstract p.topic-title {\n  font-weight: bold ;\n  text-align: center }\n\ndiv.admonition, div.attention, div.caution, div.danger, div.error,\ndiv.hint, div.important, div.note, div.tip, div.warning {\n  margin: 2em ;\n  border: medium outset ;\n  padding: 1em }\n\ndiv.admonition p.admonition-title, div.hint p.admonition-title,\ndiv.important p.admonition-title, div.note p.admonition-title,\ndiv.tip p.admonition-title {\n  font-weight: bold ;\n  font-family: sans-serif }\n\ndiv.attention p.admonition-title, div.caution p.admonition-title,\ndiv.danger p.admonition-title, div.error p.admonition-title,\ndiv.warning p.admonition-title, .code .error {\n  color: red ;\n  font-weight: bold ;\n  font-family: sans-serif }\n\n/* Uncomment (and remove this text!) to get reduced vertical space in\n   compound paragraphs.\ndiv.compound .compound-first, div.compound .compound-middle {\n  margin-bottom: 0.5em }\n\ndiv.compound .compound-last, div.compound .compound-middle {\n  margin-top: 0.5em }\n*/\n\ndiv.dedication {\n  margin: 2em 5em ;\n  text-align: center ;\n  font-style: italic }\n\ndiv.dedication p.topic-title {\n  font-weight: bold ;\n  font-style: normal }\n\ndiv.figure {\n  margin-left: 2em ;\n  margin-right: 2em }\n\ndiv.footer, div.header {\n  clear: both;\n  font-size: smaller }\n\ndiv.line-block {\n  display: block ;\n  margin-top: 1em ;\n  margin-bottom: 1em }\n\ndiv.line-block div.line-block {\n  margin-top: 0 ;\n  margin-bottom: 0 ;\n  margin-left: 1.5em }\n\ndiv.sidebar {\n  margin: 0 0 0.5em 1em ;\n  border: medium outset ;\n  padding: 1em ;\n  background-color: #ffffee ;\n  width: 40% ;\n  float: right ;\n  clear: right }\n\ndiv.sidebar p.rubric {\n  font-family: sans-serif ;\n  font-size: medium }\n\ndiv.system-messages {\n  margin: 5em }\n\ndiv.system-messages h1 {\n  color: red }\n\ndiv.system-message {\n  border: medium outset ;\n  padding: 1em }\n\ndiv.system-message p.system-message-title {\n  color: red ;\n  font-weight: bold }\n\ndiv.topic {\n  margin: 2em }\n\nh1.section-subtitle, h2.section-subtitle, h3.section-subtitle,\nh4.section-subtitle, h5.section-subtitle, h6.section-subtitle {\n  margin-top: 0.4em }\n\nh1.title {\n  text-align: center }\n\nh2.subtitle {\n  text-align: center }\n\nhr.docutils {\n  width: 75% }\n\nimg.align-left, .figure.align-left, object.align-left, table.align-left {\n  clear: left ;\n  float: left ;\n  margin-right: 1em }\n\nimg.align-right, .figure.align-right, object.align-right, table.align-right {\n  clear: right ;\n  float: right ;\n  margin-left: 1em }\n\nimg.align-center, .figure.align-center, object.align-center {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\ntable.align-center {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.align-left {\n  text-align: left }\n\n.align-center {\n  clear: both ;\n  text-align: center }\n\n.align-right {\n  text-align: right }\n\n/* reset inner alignment in figures */\ndiv.align-right {\n  text-align: inherit }\n\n/* div.align-center * { */\n/*   text-align: left } */\n\n.align-top    {\n  vertical-align: top }\n\n.align-middle {\n  vertical-align: middle }\n\n.align-bottom {\n  vertical-align: bottom }\n\nol.simple, ul.simple {\n  margin-bottom: 1em }\n\nol.arabic {\n  list-style: decimal }\n\nol.loweralpha {\n  list-style: lower-alpha }\n\nol.upperalpha {\n  list-style: upper-alpha }\n\nol.lowerroman {\n  list-style: lower-roman }\n\nol.upperroman {\n  list-style: upper-roman }\n\np.attribution {\n  text-align: right ;\n  margin-left: 50% }\n\np.caption {\n  font-style: italic }\n\np.credits {\n  font-style: italic ;\n  font-size: smaller }\n\np.label {\n  white-space: nowrap }\n\np.rubric {\n  font-weight: bold ;\n  font-size: larger ;\n  color: maroon ;\n  text-align: center }\n\np.sidebar-title {\n  font-family: sans-serif ;\n  font-weight: bold ;\n  font-size: larger }\n\np.sidebar-subtitle {\n  font-family: sans-serif ;\n  font-weight: bold }\n\np.topic-title {\n  font-weight: bold }\n\npre.address {\n  margin-bottom: 0 ;\n  margin-top: 0 ;\n  font: inherit }\n\npre.literal-block, pre.doctest-block, pre.math, pre.code {\n  margin-left: 2em ;\n  margin-right: 2em }\n\npre.code .ln { color: grey; } /* line numbers */\npre.code, code { background-color: #eeeeee }\npre.code .comment, code .comment { color: #5C6576 }\npre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }\npre.code .literal.string, code .literal.string { color: #0C5404 }\npre.code .name.builtin, code .name.builtin { color: #352B84 }\npre.code .deleted, code .deleted { background-color: #DEB0A1}\npre.code .inserted, code .inserted { background-color: #A3D289}\n\nspan.classifier {\n  font-family: sans-serif ;\n  font-style: oblique }\n\nspan.classifier-delimiter {\n  font-family: sans-serif ;\n  font-weight: bold }\n\nspan.interpreted {\n  font-family: sans-serif }\n\nspan.option {\n  white-space: nowrap }\n\nspan.pre {\n  white-space: pre }\n\nspan.problematic {\n  color: red }\n\nspan.section-subtitle {\n  /* font-size relative to parent (h1..h6 element) */\n  font-size: 80% }\n\ntable.citation {\n  border-left: solid 1px gray;\n  margin-left: 1px }\n\ntable.docinfo {\n  margin: 2em 4em }\n\ntable.docutils {\n  margin-top: 0.5em ;\n  margin-bottom: 0.5em }\n\ntable.footnote {\n  border-left: solid 1px black;\n  margin-left: 1px }\n\ntable.docutils td, table.docutils th,\ntable.docinfo td, table.docinfo th {\n  padding-left: 0.5em ;\n  padding-right: 0.5em ;\n  vertical-align: top }\n\ntable.docutils th.field-name, table.docinfo th.docinfo-name {\n  font-weight: bold ;\n  text-align: left ;\n  white-space: nowrap ;\n  padding-left: 0 }\n\n/* \"booktabs\" style (no vertical lines) */\ntable.docutils.booktabs {\n  border: 0px;\n  border-top: 2px solid;\n  border-bottom: 2px solid;\n  border-collapse: collapse;\n}\ntable.docutils.booktabs * {\n  border: 0px;\n}\ntable.docutils.booktabs th {\n  border-bottom: thin solid;\n  text-align: left;\n}\n\nh1 tt.docutils, h2 tt.docutils, h3 tt.docutils,\nh4 tt.docutils, h5 tt.docutils, h6 tt.docutils {\n  font-size: 100% }\n\nul.auto-toc {\n  list-style-type: none }\n\n\u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv class=\"document\"\u003e\n\n\n\u003c!-- -*- Mode: rst -*- --\u003e\n\u003c!-- -*- Mode: rst -*- --\u003e\n\u003c!-- |CodeReviewUrl|\n|CodeReviewHomePage|_\n|CodeReviewDoc|_\n|CodeReview@github|_\n|CodeReview@readthedocs|_\n|CodeReview@readthedocs-badge|\n|CodeReview@pypi|_ --\u003e\n\u003c!-- .. _CodeReview@github: https://github.com/FabriceSalvaire/CodeReview --\u003e\n\u003c!-- .. _CodeReview@readthedocs: http://CodeReview.readthedocs.org --\u003e\n\u003c!-- .. _CodeReview@pypi: https://pypi.python.org/pypi/CodeReview --\u003e\n\u003c!-- End --\u003e\n\u003c!-- -*- Mode: rst -*- --\u003e\n\u003c!-- http://www.pygit2.org/install.html\nhttp://www.riverbankcomputing.com/software/pyqt/download5 --\u003e\n\u003cdiv class=\"section\" id=\"codereview\"\u003e\n\u003ch1\u003eCodeReview\u003c/h1\u003e\n\u003cp\u003e\u003ca class=\"reference external\" href=\"https://pypi.python.org/pypi/CodeReview\"\u003e\u003cobject data=\"https://img.shields.io/pypi/l/CodeReview.svg\" type=\"image/svg+xml\"\u003eCodeReview license\u003c/object\u003e\u003c/a\u003e\n\u003ca class=\"reference external\" href=\"https://pypi.python.org/pypi/CodeReview\"\u003e\u003cobject data=\"https://img.shields.io/pypi/pyversions/CodeReview.svg\" type=\"image/svg+xml\"\u003eCodeReview python version\u003c/object\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"reference external\" href=\"https://pypi.python.org/pypi/CodeReview\"\u003e\u003cobject data=\"https://img.shields.io/pypi/v/CodeReview.svg\" type=\"image/svg+xml\"\u003eCodeReview last version\u003c/object\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c!-- * Quick Link to `Production Branch \u003chttps://github.com/FabriceSalvaire/CodeReview/tree/master\u003e`_\n* Quick Link to `Devel Branch \u003chttps://github.com/FabriceSalvaire/CodeReview/tree/devel\u003e`_ --\u003e\n\u003cp\u003eCodeReview Home Page is located at \u003ca class=\"reference external\" href=\"http://fabricesalvaire.github.io/CodeReview\"\u003ehttp://fabricesalvaire.github.io/CodeReview\u003c/a\u003e\u003c/p\u003e\n\u003cimg alt=\"https://raw.github.com/FabriceSalvaire/CodeReview/master/doc/sphinx/source/images/code-review-log.png\" src=\"https://raw.github.com/FabriceSalvaire/CodeReview/master/doc/sphinx/source/images/code-review-log.png\" /\u003e\n\u003cimg alt=\"https://raw.github.com/FabriceSalvaire/CodeReview/master/doc/sphinx/source/images/code-review-diff.png\" src=\"https://raw.github.com/FabriceSalvaire/CodeReview/master/doc/sphinx/source/images/code-review-diff.png\" /\u003e\n\u003cdiv class=\"section\" id=\"credits\"\u003e\n\u003ch2\u003eCredits\u003c/h2\u003e\n\u003cp\u003eAuthors: \u003ca class=\"reference external\" href=\"http://fabrice-salvaire.fr\"\u003eFabrice Salvaire\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"news\"\u003e\n\u003ch2\u003eNews\u003c/h2\u003e\n\u003c!-- -*- Mode: rst -*- --\u003e\n\u003c!-- no title here --\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"v1-1-2022-25-10\"\u003e\n\u003ch2\u003eV1.1 2022-25-10\u003c/h2\u003e\n\u003cul class=\"simple\"\u003e\n\u003cli\u003eUpdated install process\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"v1-2017-12-20\"\u003e\n\u003ch2\u003eV1 2017-12-20\u003c/h2\u003e\n\u003cul class=\"simple\"\u003e\n\u003cli\u003eRedesigned INotify support\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- -*- Mode: rst -*- --\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"introduction\"\u003e\n\u003ch1\u003eIntroduction\u003c/h1\u003e\n\u003cp\u003eI code using the venerable \u003ca class=\"reference external\" href=\"https://www.gnu.org/software/emacs\"\u003eEmacs\u003c/a\u003e editor and the extension\n\u003ca class=\"reference external\" href=\"https://magit.vc\"\u003eMagit\u003c/a\u003e which is a powerfull text-based user interface to Git.  Despite, I am\nhappy with Magit for most tasks, I dislike the diff view rendering in Emacs.\u003c/p\u003e\n\u003cp\u003eThus the goal of CodeReview is to provide a more convenient tool for code review tasks on local Git\nrepositories.  Unlike software like \u003ca class=\"reference external\" href=\"https://www.gerritcodereview.com\"\u003eGerrit\u003c/a\u003e, CodeReview is not\ndesigned to do team-level code review, but to check the stage before a commit and show the\ndifference between two versions.  In particular, CodeReview fills the gap with IDEs that don't\nprovide a nice side-by-side diff view.\u003c/p\u003e\n\u003cp\u003eHistorically, I wrote this tool as a replacement of \u003cstrong\u003eqbzr\u003c/strong\u003e for Git.\u003c/p\u003e\n\u003cdiv class=\"section\" id=\"how-to-use-codereview\"\u003e\n\u003ch2\u003eHow to use CodeReview ?\u003c/h2\u003e\n\u003cp\u003eCodeReview provides two applications \u003cem\u003epyqgit\u003c/em\u003e and \u003cem\u003ediff-viewer\u003c/em\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"disclaimer\"\u003e\n\u003ch2\u003eDisclaimer\u003c/h2\u003e\n\u003cp\u003eThis tool was written 10 years ago (late 2011) and I am using it for my own needs, thus it works as is.\u003c/p\u003e\n\u003cp\u003eI tried to implement a file watching feature but it is a nightmare to debug.\u003c/p\u003e\n\u003cp\u003eThe Qt code is now a bit out dated, but the actual diff viewer implementation would require some\nworks to be ported to QML.\u003c/p\u003e\n\u003c!-- -*- Mode: rst -*- --\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"features\"\u003e\n\u003ch1\u003eFeatures\u003c/h1\u003e\n\u003cp\u003eThe main features of CodeReview are:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul class=\"simple\"\u003e\n\u003cli\u003edisplay and browse the log and paches of a Git repository\u003c/li\u003e\n\u003cli\u003ediff side by side using Patience algorithm\u003c/li\u003e\n\u003cli\u003ewatch for file system changes\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDiff viewer features:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cul class=\"simple\"\u003e\n\u003cli\u003estage/unstage file\u003c/li\u003e\n\u003cli\u003enumber of context lines\u003c/li\u003e\n\u003cli\u003efont size\u003c/li\u003e\n\u003cli\u003eline number mode\u003c/li\u003e\n\u003cli\u003ealign mode\u003c/li\u003e\n\u003cli\u003ecomplete mode\u003c/li\u003e\n\u003cli\u003ehighlight mode\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"installation\"\u003e\n\u003cspan id=\"installation-page\"\u003e\u003c/span\u003e\u003ch1\u003eInstallation\u003c/h1\u003e\n\u003cp\u003eCodeReview is written in Python and uses the GUI framework \u003ca class=\"reference external\" href=\"https://www.riverbankcomputing.com/software/pyqt\"\u003ePyQt5\u003c/a\u003e and the Git library \u003ca class=\"reference external\" href=\"http://www.pygit2.org\"\u003epygit2\u003c/a\u003e.\nThus, CodeReview is operating system agnostic and should work on Linux, Windows and OSX.\u003c/p\u003e\n\u003cp\u003eTo install CodeReview from \u003ca class=\"reference external\" href=\"https://github.com/FabriceSalvaire/CodeReview\"\u003esource code\u003c/a\u003e, you need a working Python environment and a C compiler.\u003c/p\u003e\n\u003cdiv class=\"section\" id=\"on-linux\"\u003e\n\u003ch2\u003eOn Linux\u003c/h2\u003e\n\u003cp\u003eTo summarise, you can easily install CodeReview on Linux with just \u003ccode\u003epip install CodeReview\u003c/code\u003e but read the followings.\u003c/p\u003e\n\u003cp\u003eFirst you need to verify that Python is installed on your distribution.\u003c/p\u003e\n\u003cp\u003eIf you install CodeReview from source, you will also need the GCC C compiler.\u003c/p\u003e\n\u003cp\u003eYou can create a \u003ca class=\"reference external\" href=\"https://docs.python.org/3/library/venv.html\"\u003ePython virtual environment\u003c/a\u003e to install CodeReview in its own container:\u003c/p\u003e\n\u003cpre class=\"code sh literal-block\"\u003e\n\u003cspan class=\"comment single\"\u003e# create the venv\n\u003c/span\u003epython3.10 -m venv \u003cspan class=\"name variable\"\u003e$HOME\u003c/span\u003e/codereview\n\u003cspan class=\"comment single\"\u003e# enter in the venv\n\u003c/span\u003e\u003cspan class=\"name builtin\"\u003esource\u003c/span\u003e \u003cspan class=\"name variable\"\u003e$HOME\u003c/span\u003e/codereview/bin/activate\n\u003c/pre\u003e\n\u003cp\u003eThis is not mandatory, but it is a good practice if you don't know exactly what you are doing.\nEspecially, if you don't want to spoil your distribution.\u003c/p\u003e\n\u003cp\u003eNotice, you can later create a shell script to wrap the venv activation and the pyqgit command.\u003c/p\u003e\n\u003cp\u003eThen install CodeReview either from \u003ca class=\"reference external\" href=\"https://pypi.python.org/pypi\"\u003ePyPI\u003c/a\u003e (official Python package repository) or from source:\u003c/p\u003e\n\u003cpre class=\"code sh literal-block\"\u003e\n\u003cspan class=\"comment single\"\u003e# source .tar.gz or wheel/binary from PyPI (can require a GCC C compiler)\n\u003c/span\u003epip install CodeReview\n\n\u003cspan class=\"comment single\"\u003e# from Git repository (require a GCC C compiler)\n\u003c/span\u003epip install git+https://github.com/FabriceSalvaire/CodeReview\n\u003c/pre\u003e\n\u003cp\u003eIf the \u003ccite\u003epip\u003c/cite\u003e command is not available, you must install the corresponding package of your distribution.\u003c/p\u003e\n\u003cp\u003eFinally, run CodeReview to verify that the installation was successful:\u003c/p\u003e\n\u003cpre class=\"code sh literal-block\"\u003e\npyqgit --help\ndiff-viewer --help\n\npyqgit git_repository_path\ndiff-viewer a.txt b.txt\n\n\u003cspan class=\"name builtin\"\u003ecd\u003c/span\u003e git_repository_path\npyqgit\n\u003c/pre\u003e\n\u003cp\u003eExample of shell wrapper:\u003c/p\u003e\n\u003cpre class=\"code sh literal-block\"\u003e\n\u003cspan class=\"comment hashbang\"\u003e#! /usr/bin/bash\n\u003c/span\u003e\u003cspan class=\"name variable\"\u003ePY_ENV\u003c/span\u003e\u003cspan class=\"operator\"\u003e=\u003c/span\u003e\u003cspan class=\"literal string interpol\"\u003e${\u003c/span\u003e\u003cspan class=\"name variable\"\u003eHOME\u003c/span\u003e\u003cspan class=\"literal string interpol\"\u003e}\u003c/span\u003e/codereview\n\u003cspan class=\"name builtin\"\u003esource\u003c/span\u003e \u003cspan class=\"literal string interpol\"\u003e${\u003c/span\u003e\u003cspan class=\"name variable\"\u003ePY_ENV\u003c/span\u003e\u003cspan class=\"literal string interpol\"\u003e}\u003c/span\u003e/bin/activate\n\u003cspan class=\"name variable\"\u003eCodeReviewLogLevel\u003c/span\u003e\u003cspan class=\"operator\"\u003e=\u003c/span\u003e\u003cspan class=\"literal string single\"\u003e'WARNING'\u003c/span\u003e \u003cspan class=\"literal string interpol\"\u003e${\u003c/span\u003e\u003cspan class=\"name variable\"\u003ePY_ENV\u003c/span\u003e\u003cspan class=\"literal string interpol\"\u003e}\u003c/span\u003e/bin/pyqgit \u003cspan class=\"name variable\"\u003e$1\u003c/span\u003e \u003cspan class=\"punctuation\"\u003e\u0026amp;\u003c/span\u003e\n\u003c/pre\u003e\n\u003cp\u003eYou can also clone the repository and install it using theses commands:\u003c/p\u003e\n\u003cpre class=\"code sh literal-block\"\u003e\ngit clone git\u0026#64;github.com:FabriceSalvaire/CodeReview.git\npython setup.py build\npython setup.py install\n\u003c/pre\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"on-windows\"\u003e\n\u003ch2\u003eOn Windows\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eActually there is no installer available, but it is welcome.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eYou must follow the same procedure that for Linux.  However it is a bit more difficult to achieve.\u003c/p\u003e\n\u003cp\u003eA suggestion is to install the \u003ca class=\"reference external\" href=\"https://www.anaconda.com/products/distribution\"\u003eAnaconda Python Distribution\u003c/a\u003e and got a working compiler.\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"on-osx\"\u003e\n\u003ch2\u003eOn OSX\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAn up to date installation procedure is welcome.\u003c/strong\u003e\u003c/p\u003e\n\u003c!-- On Fedora --\u003e\n\u003c!-- - - - - - - - - - --\u003e\n\u003c!--  --\u003e\n\u003c!-- RPM packages are available for the Fedora distribution on https://copr.fedorainfracloud.org/coprs/fabricesalvaire/code-review --\u003e\n\u003c!--  --\u003e\n\u003c!-- Run these commands to enable the copr repository and install the last release: --\u003e\n\u003c!--  --\u003e\n\u003c!-- .. code-block:: sh --\u003e\n\u003c!--  --\u003e\n\u003c!-- dnf copr enable fabricesalvaire/code-review --\u003e\n\u003c!-- dnf install CodeReview --\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"dependencies\"\u003e\n\u003ch2\u003eDependencies\u003c/h2\u003e\n\u003cp\u003eCodeReview requires the dependencies listed in \u003ca class=\"reference external\" href=\"https://github.com/FabriceSalvaire/CodeReview/blob/master/requirements.txt\"\u003erequirements.txt\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"section\" id=\"how-to-help\"\u003e\n\u003ch1\u003eHow to help\u003c/h1\u003e\n\u003cul class=\"simple\"\u003e\n\u003cli\u003etest it on Windows and OSX\u003c/li\u003e\n\u003cli\u003efix bugs: look at issues\u003c/li\u003e\n\u003cli\u003esometime pyqgit is slow: profile code to find issues\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabricesalvaire%2Fcodereview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabricesalvaire%2Fcodereview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabricesalvaire%2Fcodereview/lists"}