<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="1187.37">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 14.0px; font: 12.0px Helvetica}
</style>
</head>
<body>
<p class="p1">Hi,</p>
<p class="p2"><br></p>
<p class="p3">as you might be aware, I've done my share on bitching about my mirror (f.pypi.python.org) breaking.</p>
<p class="p2"><br></p>
<p class="p3">I have picked pep381client apart yesterday and rebuilt it - mostly from ground up.</p>
<p class="p2"><br></p>
<p class="p3">You can find a working version here:</p>
<p class="p3"><a href="https://bitbucket.org/ctheune/bandersnatch">https://bitbucket.org/ctheune/bandersnatch</a></p>
<p class="p2"><br></p>
<p class="p3">The focus has been on making it a lot more robust and a lot easier to repair a mirror when it's known to be broken. To achieve that I:</p>
<p class="p2"><br></p>
<p class="p3">- refactored the code, trying to make it more intentional, less mechanical</p>
<p class="p3">- stop parsing the simple pages' html and make more use of the XML-RPC API</p>
<p class="p3">- add Tarek's worker/queue approach for parallelizing it</p>
<p class="p3">- keep as little state as possible on the client</p>
<p class="p3">- switch form timestamps to serial counters for checking what and how much to update</p>
<p class="p3">- handle locking of concurrent runs more gracefully</p>
<p class="p2"><br></p>
<p class="p3">I think I have a good grasp of what's going on now so that I can keep maintining this in the future.</p>
<p class="p2"><br></p>
<p class="p3">I'm currently re-initializing my own mirror. This basically can be run in-place by just removing the existing state data and calling my sync script (bsn-mirror) instead of pep381run with the same parameters.</p>
<p class="p2"><br></p>
<p class="p3">Tomorrow I'll update the documentation, make it use a config file and put some lipstick on the main entry point. After that I should be ready for a release.</p>
<p class="p2"><br></p>
<p class="p3">If you want to give it a try already, you just do this:</p>
<p class="p2"><br></p>
<p class="p3">$ hg clone https://bitbucket/org/ctheune/bandersnatch</p>
<p class="p3">$ cd bandersnatch</p>
<p class="p3">$ virtualenv-2.7 .</p>
<p class="p3">$ bin/python bootstrap.py</p>
<p class="p3">$ bin/buildout</p>
<p class="p3">$ bin/bsn-mirror /my/mirror/path</p>
<p class="p2"><br></p>
<p class="p3">Cheers,</p>
<p class="p3">Christian</p>
</body>
</html>