# HG changeset patch # User Steve Losh # Date 1276644195 14400 # Node ID 30864e67432fcfed028db50c0b47beeb242667e6 # Parent 9307f4023849bb805eb407c6a67fb72f21e9a09e# Parent d5280b38dd4c0908a9c573dd535ea81891fdb00f merge with default diff -r d5280b38dd4c -r 30864e67432f docs/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/Makefile Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,89 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/hg-review.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/hg-review.qhc" + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff -r d5280b38dd4c -r 30864e67432f docs/cli.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/cli.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,19 @@ +Command Line Interface +====================== + +hg-review provides a command line interface. + +review +------ + +``--comment`` +------------- + +``--signoff`` +------------- + +``--check`` +----------- + +``--web`` +--------- diff -r d5280b38dd4c -r 30864e67432f docs/concepts.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/concepts.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,148 @@ +Concepts +======== + +You're not perfect. + +Your code is not perfect. + +If you're the only person that's read your code, it's wrong. Period. + +As developers we need to review each other's code. This helps us catch errors +before they find our users. It also makes us take greater care when writing +code because we know someone will most definitely be looking at it. + +Code Review Basics +------------------ + +The simplest form of code review is asking a friend to look at the code you +just wrote. Often a second set of eyes can find problems you might not have +seen, especially if that person has more experience than you. + +Unfortunately, this isn't always practical. You might work remotely with people +thousands of miles away and not have a chance to simply turn around and say: +"Hey, could you look at this?" + +Code review tools (like hg-review) exist to make reviewing other people's code +easier. + +Their goal is to make it as easy as possible to tell another developer: "No, +you did *this* wrong. Fix it." + +Other Code Review Tools +----------------------- + +There are a lot of "code review tools" out there. + +The primary author of hg-review has a lot of experience with `Atlassian +Crucible `_, but some other +popular tools include: + +* `Rietveld `_ +* `Reviewboard `_ +* `Gerrit `_ +* `Code Collaborator `_ + +All of these tools try to accomplish the same goal: making it easy for +developers to tell each other how to write better code. + +hg-review has the same goal, but it goes about it a little differently. + +Distributed Code Review +----------------------- + +Let's back up for just a second and talk about version control. Some of the +most popular version control systems a few years ago were *centralized* systems +like `Subversion `_ and +`CVS `_. + +With these systems you had a central server that contained all the history of +your project. You would push changes to this central server and it would store +them. + +In the past half-decade or so there has been a move toward *decentralized* or +*distrubuted* version control systems. With these systems you commit to your +local machine and then *push* and *pull* your commits to other people. + +Code review tools, however, seem to have remained rooted in the "centralized +server" approach. Even the tools that support decentralized version control +systems like `git `_ and `Mercurial `_ +rely on a central server to store the code review data. + +hg-review does away with the "centralized data store" model and embraces +Mercurial's distributed nature. Code review data is held in a normal Mercurial +repository and can be pushed and pulled like any other type of data. + +This has several advantages, the biggest one being that you can review code +while offline (while in a bus, plane, train or car, or example) without +sacrificing any functionality. + +It also means that the full power of Mercurial, such as tracking history and +signing changesets with GPG, can be brought to bear on the review data. + +Review Data +----------- + +hg-review tracks two kinds of code review data: comments and signoffs. + +Comments are simple comments that people make about changesets. People can +comment on: + +* A changeset as a whole. +* A specific file within a changeset. +* One or more lines of a specific file within a changeset. + +Signoffs, on the other hand, *always* apply to a changeset as a whole. Each +person can have on signoff for any particular changeset (though they can edit +their signoff later). + +Signoffs can be used for whatever purpose your project might find useful, but +the author of hg-review recommends that they be used to mean: + + I approve of this changeset and think it should make its way to production. + +for signoffs of "Yes" and: + + I do not approve of this changeset and do not think it should make its way to + production without another changeset on top of it that fixes the problems + I have listed. + +for signoffs of "No." + +Signoffs of "neutral" might mean: + + This changeset doesn't really impact me, so I don't care. + +or: + + I've looked at this code but don't have the expertise to provide a useful + opinion. + + +Repository Structure +-------------------- + +While it's not necessary to know exactly how the guts of hg-review work, it +*is* helpful to understand the basic idea behind it. + +Let's say you have a project with a Mercurial repository in +``~/src/yourproject/`` and you'd like to start using hg-review with it. + +The first thing to understand is that Mercurial itself stores data about this +local repository in ``~/src/yourproject/.hg/``, and that data is local to your +machine. It is never committed or tracked by Mercurial, but is instead used by +the Mercurial program itself to work with your repository. + +hg-review creates a *separate* Mercurial repository to keep track of its data. +It stores this repository in ``~/src/yourproject/.hg/review/``. + +Because this is inside of Mercurial's internal ``.hg`` directory of your +project, changes to the review data (like comments and signoffs) won't be +tracked by your project's repository. + +Instead, hg-review manages its own data in its own repository to avoid +cluttering up your project's log with useless "added a comment"-type commits. + +This structure means that you can ``cd`` into the review data repository itself +and interact with it just as you would a normal Mercurial repository. You can +``push`` and ``pull`` to and from other people, backout changesets, and do +anything else you could with a normal Mercurial repository. diff -r d5280b38dd4c -r 30864e67432f docs/conf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/conf.py Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +# +# hg-review documentation build configuration file, created by +# sphinx-quickstart on Mon Jun 14 20:39:45 2010. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.append(os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'hg-review' +copyright = u'2010, Steve Losh' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = 'pre-alpha' +# The full version, including alpha/beta/rc tags. +release = 'pre-alpha' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +html_theme_path = ['.'] +html_theme = 'hgreview' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'hg-reviewdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'hg-review.tex', u'hg-review Documentation', + u'Steve Losh', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff -r d5280b38dd4c -r 30864e67432f docs/dev.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/dev.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,11 @@ +API +=== + +Data Repository +--------------- + +File Formats +------------ + +Python API +---------- diff -r d5280b38dd4c -r 30864e67432f docs/hacking.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/hacking.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,11 @@ +Hacking hg-review +================= + +Layout +------ + +Testing +------- + +Documentation +------------- diff -r d5280b38dd4c -r 30864e67432f docs/hgreview/static/aal.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/hgreview/static/aal.css Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,99 @@ +/* + aardvark.legs by Anatoli Papirovski - http://fecklessmind.com/ + Licensed under the MIT license. http://www.opensource.org/licenses/mit-license.php +*/ + +/* + Reset first. Modified version of Eric Meyer and Paul Chaplin reset + from http://meyerweb.com/eric/tools/css/reset/ +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +header, nav, section, article, aside, footer +{border: 0; margin: 0; outline: 0; padding: 0; background: transparent; vertical-align: baseline;} + +blockquote, q {quotes: none;} +blockquote:before,blockquote:after,q:before,q:after {content: ''; content: none;} + +header, nav, section, article, aside, footer {display: block;} + +/* Basic styles */ +body {background: #fff; color: #111; font: 1em/1.5em "Helvetica Neue", Helvetica, Arial, "Liberation Sans", "Bitstream Vera Sans", sans-serif;} +html>body {font-size: 16px;} + +img {display: inline-block; vertical-align: bottom;} + +h1,h2,h3,h4,h5,h6,strong,b,dt,th {font-weight: 700;} +address,cite,em,i,caption,dfn,var {font-style: italic;} + +h1 {margin: 0 0 0.75em; font-size: 2em;} +h2 {margin: 0 0 1em; font-size: 1.5em;} +h3 {margin: 0 0 1.286em; font-size: 1.167em;} +h4 {margin: 0 0 1.5em; font-size: 1em;} +h5 {margin: 0 0 1.8em; font-size: .834em;} +h6 {margin: 0 0 2em; font-size: .75em;} + +p,ul,ol,dl,blockquote,pre {margin: 0 0 1.5em;} + +li ul,li ol {margin: 0;} +ul {list-style: outside disc;} +ol {list-style: outside decimal;} +li {margin: 0 0 0 2em;} +dd {padding-left: 1.5em;} +blockquote {padding: 0 1.5em;} + +a {text-decoration: underline;} +a:hover {text-decoration: none;} +abbr,acronym {border-bottom: 1px dotted; cursor: help;} +del {text-decoration: line-through;} +ins {text-decoration: overline;} +sub {font-size: .834em; line-height: 1em; vertical-align: sub;} +sup {font-size: .834em; line-height: 1em; vertical-align: super;} + +tt,code,kbd,samp,pre {font-size: 1em; font-family: Consolas, Monaco, "Courier New", Courier, monospace;} + +/* Table styles */ +table {border-collapse: collapse; border-spacing: 0; margin: 0 0 1.5em;} +caption {text-align: left;} +th, td {padding: .25em .5em;} +tbody td, tbody th {border: 1px solid #000;} +tfoot {font-style: italic;} + +/* Form styles */ +fieldset {clear: both;} +legend {padding: 0 0 1.286em; font-size: 1.167em; font-weight: 700;} +fieldset fieldset legend {padding: 0 0 1.5em; font-size: 1em;} +* html legend {margin-left: -7px;} +*+html legend {margin-left: -7px;} + +form .field, form .buttons {clear: both; margin: 0 0 1.5em;} +form .field label {display: block;} +form ul.fields li {list-style-type: none; margin: 0;} +form ul.inline li, form ul.inline label {display: inline;} +form ul.inline li {padding: 0 .75em 0 0;} + +input.radio, input.checkbox {vertical-align: top;} +label, button, input.submit, input.image {cursor: pointer;} +* html input.radio, * html input.checkbox {vertical-align: middle;} +*+html input.radio, *+html input.checkbox {vertical-align: middle;} + +textarea {overflow: auto;} +input.text, input.password, textarea, select {margin: 0; font: 1em/1.3 Helvetica, Arial, "Liberation Sans", "Bitstream Vera Sans", sans-serif; vertical-align: baseline;} +input.text, input.password, textarea {border: 1px solid #444; border-bottom-color: #666; border-right-color: #666; padding: 2px;} + +* html button {margin: 0 .34em 0 0;} +*+html button {margin: 0 .34em 0 0;} + +form.horizontal .field {padding-left: 150px;} +form.horizontal .field label {display: inline; float: left; width: 140px; margin-left: -150px;} + +/* Useful classes */ +img.left {display: inline; float: left; margin: 0 1.5em .75em 0;} +img.right {display: inline; float: right; margin: 0 0 .75em .75em;} diff -r d5280b38dd4c -r 30864e67432f docs/hgreview/static/review.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/hgreview/static/review.css Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,146 @@ +@import url("aal.css"); +body, html { + background-color: #f8f7e8; + font-family: Georgia, serif; + color: #222; +} +body a, html a { + color: #b6410c; + text-decoration: none; +} +body a:hover, html a:hover { + text-decoration: underline; +} +body a.headerlink, html a.headerlink { + display: none; +} +body h1, +html h1, +body h2, +html h2, +body h3, +html h3, +body h4, +html h4, +body h5, +html h5, +body h6, +html h6 { + font-weight: normal; +} +body h1, html h1 { + letter-spacing: 1px; +} +body ul, html ul { + list-style-type: none; +} +body ul li, html ul li { + margin-left: 0; +} +body ul li li, html ul li li { + margin-left: 1em; +} +.related { + display: none; +} +.document { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; + border: 1px solid #edecc7; + margin: 25px auto 0px; + padding: 0px 00px; + width: 800px; +} +.document .documentwrapper { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; + background-color: #fbfbf3; + float: left; + width: 100%; +} +.document .documentwrapper .bodywrapper { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; + background-color: #fefefe; + margin-left: 230px; + border-left: 1px solid #edecc7; + padding: 20px 30px; + min-height: 700px; +} +.document .documentwrapper .bodywrapper div pre { + border: 1px solid #edecc7; + background-color: #fbfbf3; + font-size: 13px; + font-family: Monaco, Consolas, "Courier New", monospace; + line-height: 24px; + margin-bottom: 32px; + margin-top: -8px; + margin-left: 24px; + padding: 0px 8px; + width: 498px; + overflow-x: auto; +} +.document .documentwrapper .bodywrapper span.pre { + background-color: #fafaef; + border: 1px solid #edecc7; + padding: 0px 6px; + font-size: 13px; + font-family: Monaco, Consolas, "Courier New", monospace; + line-height: 24px; + white-space: pre; +} +.document .documentwrapper .bodywrapper ul span.pre { + background-color: inherit; + border: none; + padding: 0; +} +.document .documentwrapper .bodywrapper a em { + font-style: normal; +} +.document .documentwrapper .bodywrapper tt.docutils.literal { + background-color: #fafaef; + border: 1px solid #edecc7; + padding: 0px 6px; + font-size: 13px; + font-family: Monaco, Consolas, "Courier New", monospace; + line-height: 24px; + white-space: pre; +} +.document .documentwrapper .bodywrapper tt.docutils.literal span.pre { + border: 0; + padding: 0; +} +.document .sphinxsidebar { + float: left; + margin-left: -100%; + width: 210px; + padding: 20px 20px; +} +.document .sphinxsidebar #searchbox h3 { + margin-bottom: 8px; +} +.document .sphinxsidebar #searchbox form input:nth-child(1) { + border: 1px solid #999; + font-size: 16px; +} +.document .sphinxsidebar #searchbox form input:nth-child(2) { + display: block; + margin-top: 6px; + width: 60px; +} +.document .sphinxsidebar #searchbox .searchtip { + display: none; +} +.clearer { + clear: both; +} +.footer { + width: 800px; + margin: 8px auto 40px; + padding-right: 10px; + text-align: right; + font-style: italic; +} diff -r d5280b38dd4c -r 30864e67432f docs/hgreview/static/review.less --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/hgreview/static/review.less Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,158 @@ +@import url("aal.css"); + +@c-cream: #edecc7; +@c-soft-cream: lighten(@c-cream, 10%); + +@font-normal: Georgia, serif; +@font-mono: Monaco, Consolas, "Courier New", monospace; +@content-width: 800px; + +.border-radius(@radius) { + -webkit-border-radius: @radius; + -moz-border-radius: @radius; + border-radius: @radius; +} + +body, html { + background-color: @c-soft-cream; + font-family: Georgia, serif; + color: #222; + + a { + color: #b6410c; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + &.headerlink { + display: none; + } + } + h1, h2, h3, h4, h5, h6 { + font-weight: normal; + } + h1 { + letter-spacing: 1px; + } + ul { + list-style-type: none; + + li { + margin-left: 0; + + li { + margin-left: 1em; + } + } + } +} +.related { + display: none; +} +.document { + .border-radius(8px); + border: 1px solid @c-cream; + margin: 25px auto 0px; + padding: 0px 00px; + width: @content-width; + + .documentwrapper { + .border-radius(8px); + background-color: lighten(@c-soft-cream, 3%); + float: left; + width: 100%; + + .bodywrapper { + .border-radius(8px); + background-color: #fefefe; + margin-left: 230px; + border-left: 1px solid @c-cream; + padding: 20px 30px; + min-height: 700px; + + div pre { + border: 1px solid @c-cream; + background-color: lighten(@c-soft-cream, 3%); + font-size: 13px; + font-family: @font-mono; + line-height: 24px; + margin-bottom: 32px; + margin-top: -8px; + margin-left: 24px; + padding: 0px 8px; + width: @content-width - 302px; + overflow-x: auto; + } + span.pre { + background-color: lighten(@c-soft-cream, 2%); + border: 1px solid @c-cream; + padding: 0px 6px; + font-size: 13px; + font-family: @font-mono; + line-height: 24px; + white-space: pre; + } + ul { + span.pre { + background-color: inherit; + border: none; + padding: 0; + } + } + a em { + font-style: normal; + } + tt.docutils.literal { + background-color: lighten(@c-soft-cream, 2%); + border: 1px solid @c-cream; + padding: 0px 6px; + font-size: 13px; + font-family: @font-mono; + line-height: 24px; + white-space: pre; + + span.pre { + border: 0; + padding: 0; + } + } + } + } + .sphinxsidebar { + float: left; + margin-left: -100%; + width: 210px; + padding: 20px 20px; + + #searchbox { + h3 { + margin-bottom: 8px; + } + form { + input:nth-child(1) { + border: 1px solid #999; + font-size: 16px; + } + input:nth-child(2) { + display: block; + margin-top: 6px; + width: 60px; + } + } + .searchtip { + display: none; + } + } + } +} +.clearer { + clear: both; +} +.footer { + width: @content-width; + margin: 8px auto 40px; + padding-right: 10px; + text-align: right; + font-style: italic; +} diff -r d5280b38dd4c -r 30864e67432f docs/hgreview/theme.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/hgreview/theme.conf Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,5 @@ +[theme] +inherit = basic +stylesheet = review.css +pygments_style = none + diff -r d5280b38dd4c -r 30864e67432f docs/index.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/index.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,69 @@ +.. hg-review documentation master file, created by + sphinx-quickstart on Mon Jun 14 20:39:45 2010. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +hg-review documentation +======================= + +hg-review is a `Mercurial `_ extension for performing +distributed code review. + +Quickstart +---------- + +If you're impatient and want to play with hg-review right away, here's what you +need to do. + +First, clone the extension somewhere:: + + hg clone http://bitbucket.org/sjl/hg-review/ + +Then add it to your ``~/.hgrc`` file:: + + [extensions] + review = [path to]/hg-review/review/ + +Now you need a repository that has code review enabled. Luckily, you've +already got one -- hg-review uses itself for code review. + +``cd`` into the directory you cloned hg-review to and initialize the review +data:: + + cd hg-review + hg review --init + +Start the web interface:: + + hg review --web + +Open http://localhost:8080/ in your browser of choice and poke around. + +Check out the :doc:`Overview ` when you're ready to learn more. + +User's Guide +------------ + +If you want to use hg-review for anything more than some simple poking around, +this is the place to start. + +.. toctree:: + :maxdepth: 2 + + overview + concepts + webui + cli + +Developer's Guide +----------------- + +If you want to integrate hg-review with your own application or Mercurial +extension, or hack on he-review itself, this is what you need to know. + +.. toctree:: + :maxdepth: 2 + + dev + hacking + diff -r d5280b38dd4c -r 30864e67432f docs/kick --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/kick Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +kicker -qs -l 0.1 -e reload_safari \ +_build/**/* diff -r d5280b38dd4c -r 30864e67432f docs/overview.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/overview.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,89 @@ +Overview +======== + +Let's get started using hg-review. No matter how you want to use it, you need +to install it first! + +Installation +------------ + +hg-review requires `Python `_ 2.5 or later and `Mercurial +`_ 1.4 or later + +You probably have both of these requirements already, but if you encounter +problems you might want to check these first with ``python --version`` and +``hg --version``. + +hg-review also depends on a couple of other things like `Flask +`_ and `Jinja2 `_, but it +bundles these requirements so you don't need to worry about them. + +To install hg-review, first clone the extension somewhere:: + + hg clone http://bitbucket.org/sjl/hg-review/ + +Then add it to your ``~/.hgrc`` file:: + + [extensions] + review = [path to]/hg-review/review/ + +Usage +----- + +The easiest way to work with hg-review is with the :doc:`web interface +`. There's also a command-line interface, but it's really easiest to +work with the web ui. + +Projects with Existing Code Reviews +''''''''''''''''''''''''''''''''''' + +If you want to work with a repository that already has code review set up, all +you need to do is cd into that repository, run ``hg review --init`` to pull +down the review data, and then run ``hg review --web`` to fire up the web ui. + +Once that's done you can visit http://localhost:8080/ in your browser to start +reviewing. + +You should read over the :doc:`concepts ` documentation to make sure +you know how hg-review works, and the :doc:`web interface ` +documentation for a quick tour of how to use the web ui. + +Projects without Existing Code Reviews +'''''''''''''''''''''''''''''''''''''' + +If you want to *start* using hg-review with a repository, you need to do a few +things to get it ready. + +First, create a repository to hold the code review data. This repository should +be in a location that's accessible by anyone that needs to see the review data. + +For example, if you're working on an open-source project that's hosted at +http://bitbucket.org/you/project/ you should create a new repository for +the review data at http://bitbucket.org/you/project-review/ + +Next you'll need to initialize the review data in your project. ``cd`` into you +project's directory and run:: + + hg review --init --remote-path URL + +The ``URL`` should be the URL of the review repo you just created. + +This will create a local review data repo for you, as well as an ``.hgreview`` +file in your project. You need to commit this ``.hgreview`` file to your +project with the command that hg-review suggested. + +Don't worry, this is the only time hg-review will make you commit something to +your project's repository and clutter up its changelog. + +Now you can get to work reviewing changesets with the web interface by +running ``hg review --web`` in your project. + +You should read over the :doc:`concepts ` documentation to make sure +you know how hg-review works, and the :doc:`web interface ` +documentation for a quick tour of how to use the web ui. + +Reporting Bugs +-------------- + +If you encounter any errors while using hg-review please `post a bug +`_. diff -r d5280b38dd4c -r 30864e67432f docs/publish.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/publish.sh Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +make html +rsync --delete -az _build/html/ ~/src/sjl.bitbucket.org/hg-review +hg -R ~/src/sjl.bitbucket.org commit -Am 'hg-review: Update documentation.' +hg -R ~/src/sjl.bitbucket.org push diff -r d5280b38dd4c -r 30864e67432f docs/webui.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/webui.rst Tue Jun 15 19:23:15 2010 -0400 @@ -0,0 +1,11 @@ +Web Interface +============= + + +The web interface of hg-review is probably what you're going to use the most. + +Local Use +--------- + +Deployment to a Server +----------------------