Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/fabricesalvaire/codereview

CodeReview is a Git GUI tool to perform code review (Diff Viewer) written in Python3 and Qt5.
https://github.com/fabricesalvaire/codereview

diff-viewer git git-gui pyqt5 python3

Last synced: 14 days ago
JSON representation

CodeReview is a Git GUI tool to perform code review (Diff Viewer) written in Python3 and Qt5.

Awesome Lists containing this project

README

        

README.rst

/*
:Author: David Goodger ([email protected])
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }

table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }

.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }

.last, .with-subtitle {
margin-bottom: 0 ! important }

.hidden {
display: none }

.subscript {
vertical-align: sub;
font-size: smaller }

.superscript {
vertical-align: super;
font-size: smaller }

a.toc-backref {
text-decoration: none ;
color: black }

blockquote.epigraph {
margin: 2em 5em ; }

dl.docutils dd {
margin-bottom: 0.5em }

object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/

div.abstract {
margin: 2em 5em }

div.abstract p.topic-title {
font-weight: bold ;
text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/

div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }

div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }

div.figure {
margin-left: 2em ;
margin-right: 2em }

div.footer, div.header {
clear: both;
font-size: smaller }

div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }

div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }

div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }

div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }

div.system-messages {
margin: 5em }

div.system-messages h1 {
color: red }

div.system-message {
border: medium outset ;
padding: 1em }

div.system-message p.system-message-title {
color: red ;
font-weight: bold }

div.topic {
margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }

h1.title {
text-align: center }

h2.subtitle {
text-align: center }

hr.docutils {
width: 75% }

img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }

img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }

img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}

table.align-center {
margin-left: auto;
margin-right: auto;
}

.align-left {
text-align: left }

.align-center {
clear: both ;
text-align: center }

.align-right {
text-align: right }

/* reset inner alignment in figures */
div.align-right {
text-align: inherit }

/* div.align-center * { */
/* text-align: left } */

.align-top {
vertical-align: top }

.align-middle {
vertical-align: middle }

.align-bottom {
vertical-align: bottom }

ol.simple, ul.simple {
margin-bottom: 1em }

ol.arabic {
list-style: decimal }

ol.loweralpha {
list-style: lower-alpha }

ol.upperalpha {
list-style: upper-alpha }

ol.lowerroman {
list-style: lower-roman }

ol.upperroman {
list-style: upper-roman }

p.attribution {
text-align: right ;
margin-left: 50% }

p.caption {
font-style: italic }

p.credits {
font-style: italic ;
font-size: smaller }

p.label {
white-space: nowrap }

p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }

p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }

p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }

p.topic-title {
font-weight: bold }

pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }

pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }

pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}

span.classifier {
font-family: sans-serif ;
font-style: oblique }

span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }

span.interpreted {
font-family: sans-serif }

span.option {
white-space: nowrap }

span.pre {
white-space: pre }

span.problematic {
color: red }

span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }

table.citation {
border-left: solid 1px gray;
margin-left: 1px }

table.docinfo {
margin: 2em 4em }

table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }

table.footnote {
border-left: solid 1px black;
margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }

/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }

ul.auto-toc {
list-style-type: none }


CodeReview


CodeReview license
CodeReview python version


CodeReview last version

CodeReview Home Page is located at http://fabricesalvaire.github.io/CodeReview


https://raw.github.com/FabriceSalvaire/CodeReview/master/doc/sphinx/source/images/code-review-log.png
https://raw.github.com/FabriceSalvaire/CodeReview/master/doc/sphinx/source/images/code-review-diff.png

Credits


Authors: Fabrice Salvaire




News



V1.1 2022-25-10



  • Updated install process




V1 2017-12-20



  • Redesigned INotify support




Introduction


I code using the venerable Emacs editor and the extension
Magit which is a powerfull text-based user interface to Git. Despite, I am
happy with Magit for most tasks, I dislike the diff view rendering in Emacs.


Thus the goal of CodeReview is to provide a more convenient tool for code review tasks on local Git
repositories. Unlike software like Gerrit, CodeReview is not
designed to do team-level code review, but to check the stage before a commit and show the
difference between two versions. In particular, CodeReview fills the gap with IDEs that don't
provide a nice side-by-side diff view.


Historically, I wrote this tool as a replacement of qbzr for Git.



How to use CodeReview ?


CodeReview provides two applications pyqgit and diff-viewer.




Disclaimer


This tool was written 10 years ago (late 2011) and I am using it for my own needs, thus it works as is.


I tried to implement a file watching feature but it is a nightmare to debug.


The Qt code is now a bit out dated, but the actual diff viewer implementation would require some
works to be ported to QML.




Features


The main features of CodeReview are:




  • display and browse the log and paches of a Git repository

  • diff side by side using Patience algorithm

  • watch for file system changes



Diff viewer features:




  • stage/unstage file

  • number of context lines

  • font size

  • line number mode

  • align mode

  • complete mode

  • highlight mode





Installation


CodeReview is written in Python and uses the GUI framework PyQt5 and the Git library pygit2.
Thus, CodeReview is operating system agnostic and should work on Linux, Windows and OSX.


To install CodeReview from source code, you need a working Python environment and a C compiler.



On Linux


To summarise, you can easily install CodeReview on Linux with just pip install CodeReview but read the followings.


First you need to verify that Python is installed on your distribution.


If you install CodeReview from source, you will also need the GCC C compiler.


You can create a Python virtual environment to install CodeReview in its own container:



# create the venv
python3.10 -m venv $HOME/codereview
# enter in the venv
source $HOME/codereview/bin/activate

This is not mandatory, but it is a good practice if you don't know exactly what you are doing.
Especially, if you don't want to spoil your distribution.


Notice, you can later create a shell script to wrap the venv activation and the pyqgit command.


Then install CodeReview either from PyPI (official Python package repository) or from source:



# source .tar.gz or wheel/binary from PyPI (can require a GCC C compiler)
pip install CodeReview

# from Git repository (require a GCC C compiler)
pip install git+https://github.com/FabriceSalvaire/CodeReview


If the pip command is not available, you must install the corresponding package of your distribution.


Finally, run CodeReview to verify that the installation was successful:



pyqgit --help
diff-viewer --help

pyqgit git_repository_path
diff-viewer a.txt b.txt

cd git_repository_path
pyqgit


Example of shell wrapper:



#! /usr/bin/bash
PY_ENV=${HOME}/codereview
source ${PY_ENV}/bin/activate
CodeReviewLogLevel='WARNING' ${PY_ENV}/bin/pyqgit $1 &

You can also clone the repository and install it using theses commands:



git clone [email protected]:FabriceSalvaire/CodeReview.git
python setup.py build
python setup.py install



On Windows


Actually there is no installer available, but it is welcome.


You must follow the same procedure that for Linux. However it is a bit more difficult to achieve.


A suggestion is to install the Anaconda Python Distribution and got a working compiler.




On OSX


An up to date installation procedure is welcome.



Dependencies


CodeReview requires the dependencies listed in requirements.txt





How to help



  • test it on Windows and OSX

  • fix bugs: look at issues

  • sometime pyqgit is slow: profile code to find issues