hg-review/api.html @ 08b2deff2e09

birdgrinder: Update documentation.
author Steve Losh <steve@stevelosh.com>
date Sun, 25 Jul 2010 11:55:06 -0400
parents 1d1ba7d1338d
children (none)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>API &mdash; hg-review vpre-alpha documentation</title>
    <link rel="stylesheet" href="_static/review.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     'pre-alpha',
        COLLAPSE_MODINDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <link rel="top" title="hg-review vpre-alpha documentation" href="index.html" />
    <link rel="next" title="Hacking hg-review" href="hacking.html" />
    <link rel="prev" title="Command Line Interface" href="cli.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="hacking.html" title="Hacking hg-review"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="cli.html" title="Command Line Interface"
             accesskey="P">previous</a> |</li>
        <li><a href="index.html">hg-review vpre-alpha documentation</a> &raquo;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="api">
<h1>API<a class="headerlink" href="#api" title="Permalink to this headline">¶</a></h1>
<p>hg-review takes Mercurial&#8217;s approach to API stability:</p>
<ul class="simple">
<li>The command line interface is fairly stable and will not break often.</li>
<li>File formats will not change often.</li>
<li>The internal implementation may change frequently &#8211; there are no guarantees
of stability.</li>
</ul>
<p>Providing a stable CLI means that (possibly non-GPL) programs can interact with
hg-review easily without fear of constant breaking.</p>
<p>Stable file formats mean that older versions of hg-review will be able to work
with review data from newer versions (albeit with reduced functionality).</p>
<p><em>Not</em> providing a stable internal implementation allows hg-review&#8217;s code to be
kept clean and elegant. It means that Python programs will needs to use
subprocesses to avoid breaking, but this is a tradeoff that the author feels is
worth making.</p>
<div class="section" id="data-repository-layout">
<h2>Data Repository Layout<a class="headerlink" href="#data-repository-layout" title="Permalink to this headline">¶</a></h2>
<p>The structure of hg-review&#8217;s data repository looks like this:</p>
<div class="highlight-python"><pre>your-project/
|
+-- .hg/
|   |
|   +-- review
|   |   |
|   |   +-- {{ changeset hash }}
|   |   |   |
|   |   |   +-- .exists
|   |   |   |
|   |   |   +-- comments
|   |   |   |   |
|   |   |   |   +-- {{ comment hash }}
|   |   |   |   |
|   |   |   |   `-- other comments...
|   |   |   |
|   |   |   +-- signoffs
|   |   |       |
|   |   |       +-- {{ signoff hash }}
|   |   |       |
|   |   |       `-- other signoffs ...
|   |   |
|   |   `-- other changesets ...
|   |
|   `-- other files ...
|
`-- other files ...</pre>
</div>
<p>All review data for a changeset is stored in:</p>
<div class="highlight-python"><pre>.hg/review/{{ changeset hash }}/</pre>
</div>
<p>A <tt class="docutils literal"><span class="pre">.exists</span></tt> file is included in that directory when code review for
that changeset is initialized. This allows us to check if a given changeset has
been initialized for code review very quickly.</p>
<p>Comments for a changeset are stored in:</p>
<div class="highlight-python"><pre>.hg/review/{{ changeset hash }}/comments/{{ comment hash }}</pre>
</div>
<p>Signoffs for a changeset are stored in:</p>
<div class="highlight-python"><pre>.hg/review/{{ changeset hash }}/signoffs/{{ signoff hash }}</pre>
</div>
</div>
<div class="section" id="file-formats">
<h2>File Formats<a class="headerlink" href="#file-formats" title="Permalink to this headline">¶</a></h2>
<p>hg-review&#8217;s file format is (fairly) stable and is designed to be easily parsed
to enable export to other code review systems.</p>
<p>Comment and signoff files are stored as JSON. The files are indented four
spaces per level to make them more human-readable.</p>
<div class="section" id="exists-files">
<h3><tt class="docutils literal"><span class="pre">.exists</span></tt> Files<a class="headerlink" href="#exists-files" title="Permalink to this headline">¶</a></h3>
<p>The <tt class="docutils literal"><span class="pre">.exists</span></tt> file is always empty. It simply exists to make looking up
whether a given changeset has been initialized faster. It may go away in the
future &#8211; do not depend on it.</p>
</div>
<div class="section" id="comment-files">
<h3>Comment Files<a class="headerlink" href="#comment-files" title="Permalink to this headline">¶</a></h3>
<p>Here is a sample comment file:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">{</span>
    <span class="s">&quot;author&quot;</span><span class="p">:</span> <span class="s">&quot;Steve Losh &lt;steve@stevelosh.com&gt;&quot;</span><span class="p">,</span>
    <span class="s">&quot;file&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="s">&quot;reykjavi</span><span class="se">\u0301</span><span class="s">k.txt&quot;</span><span class="p">,</span>
        <span class="s">&quot;cmV5YWphdmnMgWsudHh0&quot;</span>
    <span class="p">],</span>
    <span class="s">&quot;hgdate&quot;</span><span class="p">:</span> <span class="s">&quot;Mon Jul 12 23:55:51 2010 -0400&quot;</span><span class="p">,</span>
    <span class="s">&quot;lines&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="mi">0</span>
    <span class="p">],</span>
    <span class="s">&quot;message&quot;</span><span class="p">:</span> <span class="s">&quot;Sample.&quot;</span><span class="p">,</span>
    <span class="s">&quot;node&quot;</span><span class="p">:</span> <span class="s">&quot;0e987f91e9b6628b26a30c5d00668a15fae8f22f&quot;</span><span class="p">,</span>
    <span class="s">&quot;style&quot;</span><span class="p">:</span> <span class="s">&quot;markdown&quot;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Comment files have some or all of the following fields:</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">author</span></tt></dt>
<dd>The Mercurial username of the person that added this comment.</dd>
<dt><tt class="docutils literal"><span class="pre">file</span></tt></dt>
<dd>A list of two strings. The first string is a (JSON-encoded) representation
of the UTF-8 filename. The second string is a base64 encoded version of the
actual bytes of the filename (which is what Mercurial gives and expects to
receive internally). If this is a review-level comment both strings will be
blank.</dd>
<dt><tt class="docutils literal"><span class="pre">hgdate</span></tt></dt>
<dd>The date and time the comment was added (or last edited).</dd>
<dt><tt class="docutils literal"><span class="pre">lines</span></tt></dt>
<dd>A list of integers representing the lines of the file that this comment
applies to. If this is a file-level or review-level comment the list will
be empty.</dd>
<dt><tt class="docutils literal"><span class="pre">message</span></tt></dt>
<dd>A string representing the raw comment message.</dd>
<dt><tt class="docutils literal"><span class="pre">node</span></tt></dt>
<dd>A string representing the hash of the changset this comment belongs to, for
easy lookup later.</dd>
<dt><tt class="docutils literal"><span class="pre">style</span></tt></dt>
<dd>A string representing the style of this comment &#8211; this will be
<tt class="docutils literal"><span class="pre">markdown</span></tt> for Markdown comments and blank for plain-text comments. More
styles may be added in the future.</dd>
</dl>
</div>
<div class="section" id="signoff-files">
<h3>Signoff Files<a class="headerlink" href="#signoff-files" title="Permalink to this headline">¶</a></h3>
<p>Here is a sample signoff file:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">{</span>
    <span class="s">&quot;author&quot;</span><span class="p">:</span> <span class="s">&quot;Steve Losh &lt;steve@stevelosh.com&gt;&quot;</span><span class="p">,</span>
    <span class="s">&quot;hgdate&quot;</span><span class="p">:</span> <span class="s">&quot;Tue Jul 13 00:16:00 2010 -0400&quot;</span><span class="p">,</span>
    <span class="s">&quot;message&quot;</span><span class="p">:</span> <span class="s">&quot;Sample.&quot;</span><span class="p">,</span>
    <span class="s">&quot;node&quot;</span><span class="p">:</span> <span class="s">&quot;0e987f91e9b6628b26a30c5d00668a15fae8f22f&quot;</span><span class="p">,</span>
    <span class="s">&quot;opinion&quot;</span><span class="p">:</span> <span class="s">&quot;yes&quot;</span><span class="p">,</span>
    <span class="s">&quot;style&quot;</span><span class="p">:</span> <span class="s">&quot;markdown&quot;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Signoff files have some or all of the following fields:</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">author</span></tt></dt>
<dd>The Mercurial username of the person that added this comment.</dd>
<dt><tt class="docutils literal"><span class="pre">hgdate</span></tt></dt>
<dd>The date and time the comment was added (or last edited).</dd>
<dt><tt class="docutils literal"><span class="pre">message</span></tt></dt>
<dd>A string representing the raw comment message.</dd>
<dt><tt class="docutils literal"><span class="pre">node</span></tt></dt>
<dd>A string representing the hash of the changset this comment belongs to, for
easy lookup later.</dd>
<dt><tt class="docutils literal"><span class="pre">opinion</span></tt></dt>
<dd>A string representing the signoff opinion. This will be <tt class="docutils literal"><span class="pre">yes</span></tt>, <tt class="docutils literal"><span class="pre">no</span></tt>, or
a blank string (for a neutral signoff).</dd>
<dt><tt class="docutils literal"><span class="pre">style</span></tt></dt>
<dd>A string representing the style of this comment &#8211; this will be
<tt class="docutils literal"><span class="pre">markdown</span></tt> for Markdown comments and blank for plain-text comments. More
styles may be added in the future.</dd>
</dl>
</div>
</div>
<div class="section" id="command-line-interface">
<h2>Command Line Interface<a class="headerlink" href="#command-line-interface" title="Permalink to this headline">¶</a></h2>
<p>hg-review&#8217;s command line interface is (fairly) stable. If you want to interact
with review data for a repository this is the safest method to use.</p>
<p>See the <a class="reference external" href="cli.html"><em>command line interface documentation</em></a> for more details.</p>
</div>
<div class="section" id="internal-python-api">
<h2>Internal Python API<a class="headerlink" href="#internal-python-api" title="Permalink to this headline">¶</a></h2>
<p>hg-review&#8217;s internal Python implementation is <em>not</em> stable. It may change at
any time. Relying on it virtually guarantees your application will break at
some point.</p>
<p>For a more stable API you should use the command line interface.</p>
<p>The Python API will be documented later, but is not a high priority at the
moment because of its volatility.</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <h3><a href="index.html">Table Of Contents</a></h3>
            <ul>
<li><a class="reference external" href="#">API</a><ul>
<li><a class="reference external" href="#data-repository-layout">Data Repository Layout</a></li>
<li><a class="reference external" href="#file-formats">File Formats</a><ul>
<li><a class="reference external" href="#exists-files"><tt class="docutils literal"><span class="pre">.exists</span></tt> Files</a></li>
<li><a class="reference external" href="#comment-files">Comment Files</a></li>
<li><a class="reference external" href="#signoff-files">Signoff Files</a></li>
</ul>
</li>
<li><a class="reference external" href="#command-line-interface">Command Line Interface</a></li>
<li><a class="reference external" href="#internal-python-api">Internal Python API</a></li>
</ul>
</li>
</ul>

            <h4>Previous topic</h4>
            <p class="topless"><a href="cli.html"
                                  title="previous chapter">Command Line Interface</a></p>
            <h4>Next topic</h4>
            <p class="topless"><a href="hacking.html"
                                  title="next chapter">Hacking hg-review</a></p>
            <h3>This Page</h3>
            <ul class="this-page-menu">
              <li><a href="_sources/api.txt"
                     rel="nofollow">Show Source</a></li>
            </ul>
          <div id="searchbox" style="display: none">
            <h3>Quick search</h3>
              <form class="search" action="search.html" method="get">
                <input type="text" name="q" size="18" />
                <input type="submit" value="Go" />
                <input type="hidden" name="check_keywords" value="yes" />
                <input type="hidden" name="area" value="default" />
              </form>
              <p class="searchtip" style="font-size: 90%">
              Enter search terms or a module, class or function name.
              </p>
          </div>
          <script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="hacking.html" title="Hacking hg-review"
             >next</a> |</li>
        <li class="right" >
          <a href="cli.html" title="Command Line Interface"
             >previous</a> |</li>
        <li><a href="index.html">hg-review vpre-alpha documentation</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
      &copy; Copyright 2010, Steve Losh and contributors.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.7.
    </div>
  </body>
</html>