summaryrefslogtreecommitdiff
path: root/rep/ept/popcon
diff options
context:
space:
mode:
authorEnrico Zini <enrico@enricozini.org>2009-09-29 15:08:02 +0100
committerEnrico Zini <enrico@enricozini.org>2009-09-29 15:08:02 +0100
commit006621455482edd8abf46a05292120745f99f7ec (patch)
treeff1318ccc409a3dd0519035ce2949ac8a48e969e /rep/ept/popcon
downloadlibept-006621455482edd8abf46a05292120745f99f7ec.tar.gz
Initial import
Diffstat (limited to 'rep/ept/popcon')
-rw-r--r--rep/ept/popcon/index.html128
-rw-r--r--rep/ept/popcon/local.cc.gcov.html235
-rw-r--r--rep/ept/popcon/local.h.gcov.html154
-rw-r--r--rep/ept/popcon/local.test.h.gcov.html178
-rw-r--r--rep/ept/popcon/maint/index.html128
-rw-r--r--rep/ept/popcon/maint/path.cc.gcov.html182
-rw-r--r--rep/ept/popcon/maint/path.h.gcov.html194
-rw-r--r--rep/ept/popcon/maint/popconindexer.cc.gcov.html314
-rw-r--r--rep/ept/popcon/maint/popconindexer.h.gcov.html142
-rw-r--r--rep/ept/popcon/maint/sourcedir.cc.gcov.html210
-rw-r--r--rep/ept/popcon/maint/sourcedir.h.gcov.html130
-rw-r--r--rep/ept/popcon/popcon.cc.gcov.html162
-rw-r--r--rep/ept/popcon/popcon.h.gcov.html220
-rw-r--r--rep/ept/popcon/popcon.test.h.gcov.html175
14 files changed, 2552 insertions, 0 deletions
diff --git a/rep/ept/popcon/index.html b/rep/ept/popcon/index.html
new file mode 100644
index 0000000..d87cf3d
--- /dev/null
+++ b/rep/ept/popcon/index.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - ept/popcon</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">161</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">83.2 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">134</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=2 cellspacing=1 border=0>
+
+ <tr>
+ <td width="50%"><br></td>
+ <td width="15%"></td>
+ <td width="15%"></td>
+ <td width="20%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename</td>
+ <td class="tableHead" colspan=3>Coverage</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="local.cc.gcov.html">local.cc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=62 height=10 alt="62.1%"><img src="../../snow.png" width=38 height=10 alt="62.1%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">62.1&nbsp;%</td>
+ <td class="coverNumHi">41&nbsp;/&nbsp;66&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="local.h.gcov.html">local.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">1&nbsp;/&nbsp;1&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="local.test.h.gcov.html">local.test.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">8&nbsp;/&nbsp;8&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="popcon.cc.gcov.html">popcon.cc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="95.7%"><img src="../../snow.png" width=4 height=10 alt="95.7%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">95.7&nbsp;%</td>
+ <td class="coverNumHi">22&nbsp;/&nbsp;23&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="popcon.h.gcov.html">popcon.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=96 height=10 alt="96.0%"><img src="../../snow.png" width=4 height=10 alt="96.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">96.0&nbsp;%</td>
+ <td class="coverNumHi">24&nbsp;/&nbsp;25&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="popcon.test.h.gcov.html">popcon.test.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">38&nbsp;/&nbsp;38&nbsp;lines</td>
+ </tr>
+
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/local.cc.gcov.html b/rep/ept/popcon/local.cc.gcov.html
new file mode 100644
index 0000000..e6b44b8
--- /dev/null
+++ b/rep/ept/popcon/local.cc.gcov.html
@@ -0,0 +1,235 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/local.cc</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - <a href="index.html">ept/popcon</a> - local.cc</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">66</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">62.1 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">41</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : /** @file
+<span class="lineNum"> 2 </span> : * @author Enrico Zini &lt;enrico@enricozini.org&gt;
+<span class="lineNum"> 3 </span> : * Correlate popcon data with local popcon information
+<span class="lineNum"> 4 </span> : */
+<span class="lineNum"> 5 </span> :
+<span class="lineNum"> 6 </span> : /*
+<span class="lineNum"> 7 </span> : * Copyright (C) 2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 8 </span> : *
+<span class="lineNum"> 9 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 10 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 11 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 12 </span> : * (at your option) any later version.
+<span class="lineNum"> 13 </span> : *
+<span class="lineNum"> 14 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 15 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 16 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 17 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 18 </span> : *
+<span class="lineNum"> 19 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 20 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 21 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 22 </span> : */
+<span class="lineNum"> 23 </span> :
+<span class="lineNum"> 24 </span> : #include &lt;ept/popcon/local.h&gt;
+<span class="lineNum"> 25 </span> : #include &lt;ept/popcon/popcon.h&gt;
+<span class="lineNum"> 26 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 27 </span> :
+<span class="lineNum"> 28 </span> : #include &lt;wibble/exception.h&gt;
+<span class="lineNum"> 29 </span> :
+<span class="lineNum"> 30 </span> : #include &lt;algorithm&gt;
+<span class="lineNum"> 31 </span> : #include &lt;fstream&gt;
+<span class="lineNum"> 32 </span> : #include &lt;cmath&gt;
+<span class="lineNum"> 33 </span> :
+<span class="lineNum"> 34 </span> : //#include &lt;iostream&gt;
+<span class="lineNum"> 35 </span> :
+<span class="lineNum"> 36 </span> : using namespace std;
+<span class="lineNum"> 37 </span> :
+<span class="lineNum"> 38 </span> : namespace ept {
+<span class="lineNum"> 39 </span> : namespace popcon {
+<span class="lineNum"> 40 </span> :
+<span class="lineNum"> 41 </span> : // Split a string where there are separators
+<span class="lineNum"> 42 </span><span class="lineCov"> 1903 : static vector&lt;string&gt; split(const std::string&amp; str, char sep = ' ')</span>
+<span class="lineNum"> 43 </span> : {
+<span class="lineNum"> 44 </span><span class="lineCov"> 1903 : vector&lt;string&gt; res;</span>
+<span class="lineNum"> 45 </span><span class="lineCov"> 1903 : size_t start = 0;</span>
+<span class="lineNum"> 46 </span><span class="lineCov"> 10435 : while (start &lt; str.size())</span>
+<span class="lineNum"> 47 </span> : {
+<span class="lineNum"> 48 </span><span class="lineCov"> 8531 : size_t end = str.find(sep, start);</span>
+<span class="lineNum"> 49 </span><span class="lineCov"> 8531 : if (end == string::npos)</span>
+<span class="lineNum"> 50 </span> : {
+<span class="lineNum"> 51 </span><span class="lineCov"> 1902 : res.push_back(str.substr(start));</span>
+<span class="lineNum"> 52 </span><span class="lineCov"> 1902 : break;</span>
+<span class="lineNum"> 53 </span> : }
+<span class="lineNum"> 54 </span> : else
+<span class="lineNum"> 55 </span> : {
+<span class="lineNum"> 56 </span><span class="lineCov"> 6629 : res.push_back(str.substr(start, end-start));</span>
+<span class="lineNum"> 57 </span><span class="lineCov"> 6629 : start = end + 1;</span>
+<span class="lineNum"> 58 </span> : }
+<span class="lineNum"> 59 </span> : }
+<span class="lineNum"> 60 </span><span class="lineNoCov"> 0 : return res;</span>
+<span class="lineNum"> 61 </span> : }
+<span class="lineNum"> 62 </span> :
+<span class="lineNum"> 63 </span> : // Reverse sort pairs by comparing their second element
+<span class="lineNum"> 64 </span> : struct secondsort
+<span class="lineNum"> 65 </span> : {
+<span class="lineNum"> 66 </span><span class="lineNoCov"> 0 : bool operator()(const pair&lt;string, float&gt;&amp; a, const pair&lt;string, float&gt;&amp; b) const</span>
+<span class="lineNum"> 67 </span> : {
+<span class="lineNum"> 68 </span><span class="lineNoCov"> 0 : if (a.second == b.second)</span>
+<span class="lineNum"> 69 </span><span class="lineNoCov"> 0 : return a.first &gt; b.first;</span>
+<span class="lineNum"> 70 </span> : else
+<span class="lineNum"> 71 </span><span class="lineNoCov"> 0 : return a.second &gt; b.second;</span>
+<span class="lineNum"> 72 </span> : }
+<span class="lineNum"> 73 </span> : };
+<span class="lineNum"> 74 </span> :
+<span class="lineNum"> 75 </span><span class="lineCov"> 1 : Local::Local(const std::string&amp; file)</span>
+<span class="lineNum"> 76 </span> : {
+<span class="lineNum"> 77 </span><span class="lineCov"> 1 : m_timestamp = Path::timestamp(file);</span>
+<span class="lineNum"> 78 </span><span class="lineCov"> 1 : if (m_timestamp == 0)</span>
+<span class="lineNum"> 79 </span><span class="lineNoCov"> 0 : return;</span>
+<span class="lineNum"> 80 </span> :
+<span class="lineNum"> 81 </span><span class="lineCov"> 1 : ifstream in;</span>
+<span class="lineNum"> 82 </span><span class="lineCov"> 1 : in.open(file.c_str());</span>
+<span class="lineNum"> 83 </span><span class="lineCov"> 1 : if (!in.good())</span>
+<span class="lineNum"> 84 </span><span class="lineNoCov"> 0 : throw wibble::exception::File(file, &quot;opening file for reading&quot;);</span>
+<span class="lineNum"> 85 </span> :
+<span class="lineNum"> 86 </span><span class="lineCov"> 1907 : while (!in.eof())</span>
+<span class="lineNum"> 87 </span> : {
+<span class="lineNum"> 88 </span><span class="lineCov"> 1905 : std::string line;</span>
+<span class="lineNum"> 89 </span><span class="lineCov"> 1905 : getline(in, line);</span>
+<span class="lineNum"> 90 </span><span class="lineCov"> 1905 : if (line.substr(0, 10) == &quot;POPULARITY&quot;)</span>
+<span class="lineNum"> 91 </span><span class="lineCov"> 3 : continue;</span>
+<span class="lineNum"> 92 </span><span class="lineCov"> 1904 : if (line.substr(0, 14) == &quot;END-POPULARITY&quot;)</span>
+<span class="lineNum"> 93 </span> : continue;
+<span class="lineNum"> 94 </span><span class="lineCov"> 1903 : vector&lt;string&gt; data = split(line);</span>
+<span class="lineNum"> 95 </span><span class="lineCov"> 1903 : if (data.size() &lt; 4)</span>
+<span class="lineNum"> 96 </span> : continue;
+<span class="lineNum"> 97 </span><span class="lineCov"> 1902 : if (data[3] == &quot;&lt;NOFILES&gt;&quot;)</span>
+<span class="lineNum"> 98 </span> : // This is an empty / virtual package
+<span class="lineNum"> 99 </span><span class="lineCov"> 979 : m_scores.insert(make_pair(data[2], 0.1));</span>
+<span class="lineNum"> 100 </span><span class="lineCov"> 923 : else if (data.size() == 4)</span>
+<span class="lineNum"> 101 </span> : // Package normally in use
+<span class="lineNum"> 102 </span><span class="lineNoCov"> 0 : m_scores.insert(make_pair(data[2], 1.0));</span>
+<span class="lineNum"> 103 </span><span class="lineCov"> 923 : else if (data[4] == &quot;&lt;OLD&gt;&quot;)</span>
+<span class="lineNum"> 104 </span> : // Unused packages
+<span class="lineNum"> 105 </span><span class="lineCov"> 745 : m_scores.insert(make_pair(data[2], 0.3));</span>
+<span class="lineNum"> 106 </span><span class="lineCov"> 178 : else if (data[4] == &quot;&lt;RECENT-CTIME&gt;&quot;)</span>
+<span class="lineNum"> 107 </span> : // Recently installed packages
+<span class="lineNum"> 108 </span><span class="lineCov"> 178 : m_scores.insert(make_pair(data[2], 0.5));</span>
+<span class="lineNum"> 109 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 110 </span><span class="lineNoCov"> 0 : }</span>
+<span class="lineNum"> 111 </span> :
+<span class="lineNum"> 112 </span><span class="lineCov"> 2 : float Local::score(const std::string&amp; pkg) const</span>
+<span class="lineNum"> 113 </span> : {
+<span class="lineNum"> 114 </span><span class="lineCov"> 2 : std::map&lt;std::string, float&gt;::const_iterator i = m_scores.find(pkg);</span>
+<span class="lineNum"> 115 </span><span class="lineCov"> 2 : if (i == m_scores.end())</span>
+<span class="lineNum"> 116 </span><span class="lineNoCov"> 0 : return 0;</span>
+<span class="lineNum"> 117 </span> : else
+<span class="lineNum"> 118 </span><span class="lineCov"> 2 : return i-&gt;second;</span>
+<span class="lineNum"> 119 </span> : }
+<span class="lineNum"> 120 </span> :
+<span class="lineNum"> 121 </span> : /**
+<span class="lineNum"> 122 </span> : * Return the TFIDF score of the package computed against the popcon
+<span class="lineNum"> 123 </span> : * information.
+<span class="lineNum"> 124 </span> : */
+<span class="lineNum"> 125 </span><span class="lineCov"> 1 : float Local::tfidf(const Popcon&amp; popcon, const std::string&amp; pkg) const</span>
+<span class="lineNum"> 126 </span> : {
+<span class="lineNum"> 127 </span><span class="lineCov"> 1 : float popconScore = popcon.score(pkg);</span>
+<span class="lineNum"> 128 </span> : //cerr &lt;&lt; pkg &lt;&lt; &quot;: &quot; &lt;&lt; score(pkg) &lt;&lt; &quot; * log(&quot; &lt;&lt; (float)popcon.submissions() &lt;&lt; &quot; / &quot; &lt;&lt; popconScore &lt;&lt; &quot;) = &quot; &lt;&lt; score(pkg) * log((float)popcon.submissions() / popconScore) &lt;&lt; endl;
+<span class="lineNum"> 129 </span><span class="lineCov"> 1 : if (popconScore == 0)</span>
+<span class="lineNum"> 130 </span><span class="lineNoCov"> 0 : return 0;</span>
+<span class="lineNum"> 131 </span> : else
+<span class="lineNum"> 132 </span><span class="lineCov"> 1 : return score(pkg) * log((float)popcon.submissions() / popconScore);</span>
+<span class="lineNum"> 133 </span> :
+<span class="lineNum"> 134 </span> : }
+<span class="lineNum"> 135 </span> :
+<span class="lineNum"> 136 </span><span class="lineNoCov"> 0 : std::vector&lt; std::pair&lt;std::string, float&gt; &gt; Local::scores() const</span>
+<span class="lineNum"> 137 </span> : {
+<span class="lineNum"> 138 </span><span class="lineNoCov"> 0 : vector&lt; pair&lt;string, float&gt; &gt; res;</span>
+<span class="lineNum"> 139 </span> : // Copy the scores in res
+<span class="lineNum"> 140 </span><span class="lineNoCov"> 0 : copy(m_scores.begin(), m_scores.end(), back_inserter(res));</span>
+<span class="lineNum"> 141 </span> : // Sort res by score
+<span class="lineNum"> 142 </span><span class="lineNoCov"> 0 : sort(res.begin(), res.end(), secondsort());</span>
+<span class="lineNum"> 143 </span><span class="lineNoCov"> 0 : return res;</span>
+<span class="lineNum"> 144 </span> : }
+<span class="lineNum"> 145 </span> :
+<span class="lineNum"> 146 </span><span class="lineNoCov"> 0 : std::vector&lt; std::pair&lt;std::string, float&gt; &gt; Local::tfidf(const Popcon&amp; popcon) const</span>
+<span class="lineNum"> 147 </span> : {
+<span class="lineNum"> 148 </span><span class="lineNoCov"> 0 : vector&lt; pair&lt;string, float&gt; &gt; res;</span>
+<span class="lineNum"> 149 </span> : // Compute the tfidf scores and store them into res
+<span class="lineNum"> 150 </span><span class="lineNoCov"> 0 : for (std::map&lt;std::string, float&gt;::const_iterator i = m_scores.begin();</span>
+<span class="lineNum"> 151 </span> : i != m_scores.end(); ++i)
+<span class="lineNum"> 152 </span> : {
+<span class="lineNum"> 153 </span><span class="lineNoCov"> 0 : float popconScore = popcon.score(i-&gt;first);</span>
+<span class="lineNum"> 154 </span><span class="lineNoCov"> 0 : if (popconScore == 0)</span>
+<span class="lineNum"> 155 </span><span class="lineNoCov"> 0 : res.push_back(make_pair(i-&gt;first, 0.0f));</span>
+<span class="lineNum"> 156 </span> : else
+<span class="lineNum"> 157 </span> : res.push_back(make_pair(i-&gt;first,
+<span class="lineNum"> 158 </span><span class="lineNoCov"> 0 : i-&gt;second * log((float)popcon.submissions() / popconScore)));</span>
+<span class="lineNum"> 159 </span> : }
+<span class="lineNum"> 160 </span> : // Sort res by score
+<span class="lineNum"> 161 </span><span class="lineNoCov"> 0 : sort(res.begin(), res.end(), secondsort());</span>
+<span class="lineNum"> 162 </span><span class="lineNoCov"> 0 : return res;</span>
+<span class="lineNum"> 163 </span> : }
+<span class="lineNum"> 164 </span> :
+<span class="lineNum"> 165 </span> : }
+<span class="lineNum"> 166 </span><span class="lineCov"> 6 : }</span>
+<span class="lineNum"> 167 </span> :
+<span class="lineNum"> 168 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/local.h.gcov.html b/rep/ept/popcon/local.h.gcov.html
new file mode 100644
index 0000000..a8cb45d
--- /dev/null
+++ b/rep/ept/popcon/local.h.gcov.html
@@ -0,0 +1,154 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/local.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - <a href="index.html">ept/popcon</a> - local.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">1</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">100.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">1</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : #ifndef EPT_POPCON_LOCAL_H
+<span class="lineNum"> 2 </span> : #define EPT_POPCON_LOCAL_H
+<span class="lineNum"> 3 </span> :
+<span class="lineNum"> 4 </span> : /** @file
+<span class="lineNum"> 5 </span> : * @author Enrico Zini &lt;enrico@enricozini.org&gt;
+<span class="lineNum"> 6 </span> : * Correlate popcon data with local popcon information
+<span class="lineNum"> 7 </span> : */
+<span class="lineNum"> 8 </span> :
+<span class="lineNum"> 9 </span> : /*
+<span class="lineNum"> 10 </span> : * Copyright (C) 2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 11 </span> : *
+<span class="lineNum"> 12 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 13 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 14 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 15 </span> : * (at your option) any later version.
+<span class="lineNum"> 16 </span> : *
+<span class="lineNum"> 17 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 18 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 19 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 20 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 21 </span> : *
+<span class="lineNum"> 22 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 23 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 24 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 25 </span> : */
+<span class="lineNum"> 26 </span> :
+<span class="lineNum"> 27 </span> : #include &lt;string&gt;
+<span class="lineNum"> 28 </span> : #include &lt;vector&gt;
+<span class="lineNum"> 29 </span> : #include &lt;map&gt;
+<span class="lineNum"> 30 </span> :
+<span class="lineNum"> 31 </span> : namespace ept {
+<span class="lineNum"> 32 </span> : namespace popcon {
+<span class="lineNum"> 33 </span> :
+<span class="lineNum"> 34 </span> : class Popcon;
+<span class="lineNum"> 35 </span> :
+<span class="lineNum"> 36 </span> : /**
+<span class="lineNum"> 37 </span> : * Access the results of the local daily popcon scan.
+<span class="lineNum"> 38 </span> : */
+<span class="lineNum"> 39 </span> : class Local
+<span class="lineNum"> 40 </span><span class="lineCov"> 1 : {</span>
+<span class="lineNum"> 41 </span> : protected:
+<span class="lineNum"> 42 </span> : std::map&lt;std::string, float&gt; m_scores;
+<span class="lineNum"> 43 </span> : time_t m_timestamp;
+<span class="lineNum"> 44 </span> :
+<span class="lineNum"> 45 </span> : public:
+<span class="lineNum"> 46 </span> : Local(const std::string&amp; file = std::string(&quot;/var/log/popularity-contest&quot;));
+<span class="lineNum"> 47 </span> :
+<span class="lineNum"> 48 </span> : /// Get the timestamp of the local popcon information
+<span class="lineNum"> 49 </span> : time_t timestamp() const { return m_timestamp; }
+<span class="lineNum"> 50 </span> :
+<span class="lineNum"> 51 </span> : /// Return true if this data source has data, false if it's empty
+<span class="lineNum"> 52 </span> : bool hasData() const { return m_timestamp != 0; }
+<span class="lineNum"> 53 </span> :
+<span class="lineNum"> 54 </span> : /**
+<span class="lineNum"> 55 </span> : * Return the local score of the package
+<span class="lineNum"> 56 </span> : */
+<span class="lineNum"> 57 </span> : float score(const std::string&amp; pkg) const;
+<span class="lineNum"> 58 </span> :
+<span class="lineNum"> 59 </span> : /**
+<span class="lineNum"> 60 </span> : * Return the TFIDF score of the package computed against the popcon
+<span class="lineNum"> 61 </span> : * information.
+<span class="lineNum"> 62 </span> : *
+<span class="lineNum"> 63 </span> : * The TFIDF score is high when a package is representative of this system,
+<span class="lineNum"> 64 </span> : * that is, it is used in this system and not much used in other systems.
+<span class="lineNum"> 65 </span> : */
+<span class="lineNum"> 66 </span> : float tfidf(const Popcon&amp; popcon, const std::string&amp; pkg) const;
+<span class="lineNum"> 67 </span> :
+<span class="lineNum"> 68 </span> : /**
+<span class="lineNum"> 69 </span> : * Read the local popcon vote and return the list of packages and their
+<span class="lineNum"> 70 </span> : * local scores, sorted by ascending score.
+<span class="lineNum"> 71 </span> : */
+<span class="lineNum"> 72 </span> : std::vector&lt; std::pair&lt;std::string, float&gt; &gt; scores() const;
+<span class="lineNum"> 73 </span> :
+<span class="lineNum"> 74 </span> : /**
+<span class="lineNum"> 75 </span> : * Read the local popcon vote and return the list of packages and their
+<span class="lineNum"> 76 </span> : * TFIDF scores computed against the popcon information.
+<span class="lineNum"> 77 </span> : *
+<span class="lineNum"> 78 </span> : * The packages will be sorted by ascending score.
+<span class="lineNum"> 79 </span> : */
+<span class="lineNum"> 80 </span> : std::vector&lt; std::pair&lt;std::string, float&gt; &gt; tfidf(const Popcon&amp; popcon) const;
+<span class="lineNum"> 81 </span> : };
+<span class="lineNum"> 82 </span> :
+<span class="lineNum"> 83 </span> : }
+<span class="lineNum"> 84 </span> : }
+<span class="lineNum"> 85 </span> :
+<span class="lineNum"> 86 </span> : // vim:set ts=4 sw=4:
+<span class="lineNum"> 87 </span> : #endif
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/local.test.h.gcov.html b/rep/ept/popcon/local.test.h.gcov.html
new file mode 100644
index 0000000..05ce32e
--- /dev/null
+++ b/rep/ept/popcon/local.test.h.gcov.html
@@ -0,0 +1,178 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/local.test.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - <a href="index.html">ept/popcon</a> - local.test.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">8</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">100.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">8</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : // -*- mode: c++; tab-width: 4; indent-tabs-mode: t -*-
+<span class="lineNum"> 2 </span> : /*
+<span class="lineNum"> 3 </span> : * popcon/local test
+<span class="lineNum"> 4 </span> : *
+<span class="lineNum"> 5 </span> : * Copyright (C) 2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 6 </span> : *
+<span class="lineNum"> 7 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 8 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 9 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 10 </span> : * (at your option) any later version.
+<span class="lineNum"> 11 </span> : *
+<span class="lineNum"> 12 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 13 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 14 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 15 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 16 </span> : *
+<span class="lineNum"> 17 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 18 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 19 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 20 </span> : */
+<span class="lineNum"> 21 </span> :
+<span class="lineNum"> 22 </span> : #include &lt;ept/popcon/local.h&gt;
+<span class="lineNum"> 23 </span> : #include &lt;ept/popcon/popcon.h&gt;
+<span class="lineNum"> 24 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 25 </span> :
+<span class="lineNum"> 26 </span> : #include &lt;ept/test.h&gt;
+<span class="lineNum"> 27 </span> :
+<span class="lineNum"> 28 </span> : using namespace std;
+<span class="lineNum"> 29 </span> : using namespace ept;
+<span class="lineNum"> 30 </span> : using namespace ept::popcon;
+<span class="lineNum"> 31 </span> :
+<span class="lineNum"> 32 </span> : struct TestPopconLocal
+<span class="lineNum"> 33 </span><span class="lineCov"> 1 : {</span>
+<span class="lineNum"> 34 </span> : Path::OverridePopconSourceDir odsd;
+<span class="lineNum"> 35 </span> : Path::OverridePopconIndexDir odid;
+<span class="lineNum"> 36 </span> : Path::OverridePopconUserSourceDir odusd;
+<span class="lineNum"> 37 </span> : Path::OverridePopconUserIndexDir oduid;
+<span class="lineNum"> 38 </span> :
+<span class="lineNum"> 39 </span> : Popcon popcon;
+<span class="lineNum"> 40 </span> : Local local;
+<span class="lineNum"> 41 </span> :
+<span class="lineNum"> 42 </span><span class="lineCov"> 1 : TestPopconLocal()</span>
+<span class="lineNum"> 43 </span> : : odsd( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 44 </span> : odid( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 45 </span> : odusd( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 46 </span> : oduid( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 47 </span><span class="lineCov"> 1 : local( TEST_ENV_DIR &quot;popcon/popularity-contest&quot; )</span>
+<span class="lineNum"> 48 </span><span class="lineCov"> 1 : {}</span>
+<span class="lineNum"> 49 </span> :
+<span class="lineNum"> 50 </span> : // Very basic access
+<span class="lineNum"> 51 </span><span class="lineCov"> 1 : Test basicAccess()</span>
+<span class="lineNum"> 52 </span> : {
+<span class="lineNum"> 53 </span><span class="lineCov"> 1 : assert(local.score(&quot;apt&quot;) &gt; 0);</span>
+<span class="lineNum"> 54 </span><span class="lineCov"> 2 : assert(local.tfidf(popcon, &quot;apt&quot;) &gt; 0);</span>
+<span class="lineNum"> 55 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 56 </span> :
+<span class="lineNum"> 57 </span> : #if 0 // mornfall: apparently left out by enrico, leaving as it is
+<span class="lineNum"> 58 </span> : // Check that every valid index is accessible
+<span class="lineNum"> 59 </span> : template&lt;&gt; template&lt;&gt;
+<span class="lineNum"> 60 </span> : void to::test&lt; 2 &gt;()
+<span class="lineNum"> 61 </span> : {
+<span class="lineNum"> 62 </span> : for (size_t i = 0; i &lt; popcon.size(); ++i)
+<span class="lineNum"> 63 </span> : {
+<span class="lineNum"> 64 </span> : //cerr &lt;&lt; popcon.name(i) &lt;&lt; &quot; &quot; &lt;&lt; popcon.score(i) &lt;&lt; endl;
+<span class="lineNum"> 65 </span> : assert(popcon.score(i) &gt; 0);
+<span class="lineNum"> 66 </span> : }
+<span class="lineNum"> 67 </span> : }
+<span class="lineNum"> 68 </span> :
+<span class="lineNum"> 69 </span> : // Check that we can get a score for every package
+<span class="lineNum"> 70 </span> : template&lt;&gt; template&lt;&gt;
+<span class="lineNum"> 71 </span> : void to::test&lt; 3 &gt;()
+<span class="lineNum"> 72 </span> : {
+<span class="lineNum"> 73 </span> : int has = 0;
+<span class="lineNum"> 74 </span> : for (Apt::iterator i = apt.begin(); i != apt.end(); ++i)
+<span class="lineNum"> 75 </span> : {
+<span class="lineNum"> 76 </span> : float score = popcon.score(*i);
+<span class="lineNum"> 77 </span> : if (score &gt; 0)
+<span class="lineNum"> 78 </span> : ++has;
+<span class="lineNum"> 79 </span> : }
+<span class="lineNum"> 80 </span> : // At least 1000 packages should have a score
+<span class="lineNum"> 81 </span> : assert(has &gt; 1000);
+<span class="lineNum"> 82 </span> : }
+<span class="lineNum"> 83 </span> :
+<span class="lineNum"> 84 </span> : // Check that scores are meaningful
+<span class="lineNum"> 85 </span> : template&lt;&gt; template&lt;&gt;
+<span class="lineNum"> 86 </span> : void to::test&lt; 4 &gt;()
+<span class="lineNum"> 87 </span> : {
+<span class="lineNum"> 88 </span> : assert(popcon[&quot;apt&quot;] &gt; popcon[&quot;libapt-pkg-dev&quot;]);
+<span class="lineNum"> 89 </span> : }
+<span class="lineNum"> 90 </span> :
+<span class="lineNum"> 91 </span> : // If there is no data, Popcon should work as if all scores were 0
+<span class="lineNum"> 92 </span> : template&lt;&gt; template&lt;&gt;
+<span class="lineNum"> 93 </span> : void to::test&lt;5&gt;()
+<span class="lineNum"> 94 </span> : {
+<span class="lineNum"> 95 </span> : Path::OverridePopconSourceDir odsd(&quot;./empty&quot;);
+<span class="lineNum"> 96 </span> : Path::OverridePopconIndexDir odid(&quot;./empty&quot;);
+<span class="lineNum"> 97 </span> : Path::OverridePopconUserSourceDir odusd(&quot;./empty&quot;);
+<span class="lineNum"> 98 </span> : Path::OverridePopconUserIndexDir oduid(&quot;./empty&quot;);
+<span class="lineNum"> 99 </span> : Popcon empty;
+<span class="lineNum"> 100 </span> :
+<span class="lineNum"> 101 </span> : assert_eq(empty.timestamp(), 0);
+<span class="lineNum"> 102 </span> : assert(!empty.hasData());
+<span class="lineNum"> 103 </span> :
+<span class="lineNum"> 104 </span> : assert(empty.size() == 0);
+<span class="lineNum"> 105 </span> : assert(empty.score(&quot;apt&quot;) == 0.0);
+<span class="lineNum"> 106 </span> : }
+<span class="lineNum"> 107 </span> : #endif
+<span class="lineNum"> 108 </span> :
+<span class="lineNum"> 109 </span> : };
+<span class="lineNum"> 110 </span> :
+<span class="lineNum"> 111 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/index.html b/rep/ept/popcon/maint/index.html
new file mode 100644
index 0000000..f507903
--- /dev/null
+++ b/rep/ept/popcon/maint/index.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - ept/popcon/maint</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">258</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">88.4 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">228</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <center>
+ <table width="80%" cellpadding=2 cellspacing=1 border=0>
+
+ <tr>
+ <td width="50%"><br></td>
+ <td width="15%"></td>
+ <td width="15%"></td>
+ <td width="20%"></td>
+ </tr>
+
+ <tr>
+ <td class="tableHead">Filename</td>
+ <td class="tableHead" colspan=3>Coverage</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="path.cc.gcov.html">path.cc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=98 height=10 alt="97.6%"><img src="../../../snow.png" width=2 height=10 alt="97.6%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">97.6&nbsp;%</td>
+ <td class="coverNumHi">41&nbsp;/&nbsp;42&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="path.h.gcov.html">path.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">17&nbsp;/&nbsp;17&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="popconindexer.cc.gcov.html">popconindexer.cc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=79 height=10 alt="79.3%"><img src="../../../snow.png" width=21 height=10 alt="79.3%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">79.3&nbsp;%</td>
+ <td class="coverNumHi">92&nbsp;/&nbsp;116&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="popconindexer.h.gcov.html">popconindexer.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">5&nbsp;/&nbsp;5&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="sourcedir.cc.gcov.html">sourcedir.cc</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=93 height=10 alt="93.4%"><img src="../../../snow.png" width=7 height=10 alt="93.4%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">93.4&nbsp;%</td>
+ <td class="coverNumHi">71&nbsp;/&nbsp;76&nbsp;lines</td>
+ </tr>
+
+ <tr>
+ <td class="coverFile"><a href="sourcedir.h.gcov.html">sourcedir.h</a></td>
+ <td class="coverBar" align="center">
+ <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../../../emerald.png" width=100 height=10 alt="100.0%"></td></tr></table>
+ </td>
+ <td class="coverPerHi">100.0&nbsp;%</td>
+ <td class="coverNumHi">2&nbsp;/&nbsp;2&nbsp;lines</td>
+ </tr>
+
+ </table>
+ </center>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/path.cc.gcov.html b/rep/ept/popcon/maint/path.cc.gcov.html
new file mode 100644
index 0000000..b332e8d
--- /dev/null
+++ b/rep/ept/popcon/maint/path.cc.gcov.html
@@ -0,0 +1,182 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint/path.cc</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">ept/popcon/maint</a> - path.cc</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">42</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">97.6 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">41</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : // -*- mode: c++; indent-tabs-mode: t -*-
+<span class="lineNum"> 2 </span> :
+<span class="lineNum"> 3 </span> : /** \file
+<span class="lineNum"> 4 </span> : * popcon paths
+<span class="lineNum"> 5 </span> : */
+<span class="lineNum"> 6 </span> :
+<span class="lineNum"> 7 </span> : /*
+<span class="lineNum"> 8 </span> : * Copyright (C) 2005,2006,2007 Enrico Zini &lt;enrico@debian.org&gt;, Peter Rockai &lt;me@mornfall.net&gt;
+<span class="lineNum"> 9 </span> : *
+<span class="lineNum"> 10 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 11 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 12 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 13 </span> : * (at your option) any later version.
+<span class="lineNum"> 14 </span> : *
+<span class="lineNum"> 15 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 16 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 17 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 18 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 19 </span> : *
+<span class="lineNum"> 20 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 21 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 22 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 23 </span> : */
+<span class="lineNum"> 24 </span> :
+<span class="lineNum"> 25 </span> : #include &lt;ept/config.h&gt;
+<span class="lineNum"> 26 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 27 </span> :
+<span class="lineNum"> 28 </span> : #include &lt;wibble/sys/fs.h&gt;
+<span class="lineNum"> 29 </span> : #include &lt;wibble/string.h&gt;
+<span class="lineNum"> 30 </span> :
+<span class="lineNum"> 31 </span> : #include &lt;sys/types.h&gt; // getpwuid, stat, mkdir, getuid
+<span class="lineNum"> 32 </span> : #include &lt;sys/stat.h&gt; // stat, mkdir
+<span class="lineNum"> 33 </span> : #include &lt;pwd.h&gt; // getpwuid
+<span class="lineNum"> 34 </span> : #include &lt;unistd.h&gt; // stat, getuid
+<span class="lineNum"> 35 </span> :
+<span class="lineNum"> 36 </span> : using namespace wibble;
+<span class="lineNum"> 37 </span> :
+<span class="lineNum"> 38 </span> : namespace ept {
+<span class="lineNum"> 39 </span> : namespace popcon {
+<span class="lineNum"> 40 </span> :
+<span class="lineNum"> 41 </span><span class="lineCov"> 2 : static std::string userdir()</span>
+<span class="lineNum"> 42 </span> : {
+<span class="lineNum"> 43 </span><span class="lineCov"> 2 : std::string rcdir;</span>
+<span class="lineNum"> 44 </span> :
+<span class="lineNum"> 45 </span><span class="lineCov"> 2 : struct passwd* udata = getpwuid(getuid());</span>
+<span class="lineNum"> 46 </span><span class="lineCov"> 2 : rcdir = str::joinpath(udata-&gt;pw_dir, &quot;.popcon&quot;);</span>
+<span class="lineNum"> 47 </span> :
+<span class="lineNum"> 48 </span><span class="lineNoCov"> 0 : return rcdir;</span>
+<span class="lineNum"> 49 </span> : }
+<span class="lineNum"> 50 </span> :
+<span class="lineNum"> 51 </span> :
+<span class="lineNum"> 52 </span><span class="lineCov"> 178 : Path &amp;Path::instance() {</span>
+<span class="lineNum"> 53 </span><span class="lineCov"> 178 : if (!s_instance) {</span>
+<span class="lineNum"> 54 </span><span class="lineCov"> 1 : s_instance = new Path;</span>
+<span class="lineNum"> 55 </span><span class="lineCov"> 1 : instance().m_popconSourceDir = POPCON_DB_DIR;</span>
+<span class="lineNum"> 56 </span><span class="lineCov"> 1 : instance().m_popconIndexDir = POPCON_DB_DIR;</span>
+<span class="lineNum"> 57 </span><span class="lineCov"> 2 : instance().m_popconUserSourceDir = userdir();</span>
+<span class="lineNum"> 58 </span><span class="lineCov"> 2 : instance().m_popconUserIndexDir = userdir();</span>
+<span class="lineNum"> 59 </span> : }
+<span class="lineNum"> 60 </span><span class="lineCov"> 178 : return *s_instance;</span>
+<span class="lineNum"> 61 </span> : }
+<span class="lineNum"> 62 </span> :
+<span class="lineNum"> 63 </span><span class="lineCov"> 2 : int Path::access( const std::string &amp;s, int m ) {</span>
+<span class="lineNum"> 64 </span><span class="lineCov"> 2 : return ::access( s.c_str(), m );</span>
+<span class="lineNum"> 65 </span> : }
+<span class="lineNum"> 66 </span> :
+<span class="lineNum"> 67 </span><span class="lineCov"> 49 : time_t Path::timestamp( const std::string&amp; file ) {</span>
+<span class="lineNum"> 68 </span><span class="lineCov"> 49 : std::auto_ptr&lt;struct stat&gt; st = wibble::sys::fs::stat(file);</span>
+<span class="lineNum"> 69 </span><span class="lineCov"> 90 : return st.get() == NULL ? 0 : st-&gt;st_mtime;</span>
+<span class="lineNum"> 70 </span> : }
+<span class="lineNum"> 71 </span> :
+<span class="lineNum"> 72 </span><span class="lineCov"> 14 : void Path::setPopconSourceDir( const std::string &amp;s )</span>
+<span class="lineNum"> 73 </span> : {
+<span class="lineNum"> 74 </span><span class="lineCov"> 14 : instance().m_popconSourceDir = s;</span>
+<span class="lineNum"> 75 </span><span class="lineCov"> 14 : }</span>
+<span class="lineNum"> 76 </span><span class="lineCov"> 14 : void Path::setPopconIndexDir( const std::string &amp;s )</span>
+<span class="lineNum"> 77 </span> : {
+<span class="lineNum"> 78 </span><span class="lineCov"> 14 : instance().m_popconIndexDir = s;</span>
+<span class="lineNum"> 79 </span><span class="lineCov"> 14 : }</span>
+<span class="lineNum"> 80 </span><span class="lineCov"> 14 : void Path::setPopconUserSourceDir( const std::string &amp;s )</span>
+<span class="lineNum"> 81 </span> : {
+<span class="lineNum"> 82 </span><span class="lineCov"> 14 : instance().m_popconUserSourceDir = s;</span>
+<span class="lineNum"> 83 </span><span class="lineCov"> 14 : }</span>
+<span class="lineNum"> 84 </span><span class="lineCov"> 14 : void Path::setPopconUserIndexDir( const std::string &amp;s )</span>
+<span class="lineNum"> 85 </span> : {
+<span class="lineNum"> 86 </span><span class="lineCov"> 14 : instance().m_popconUserIndexDir = s;</span>
+<span class="lineNum"> 87 </span><span class="lineCov"> 14 : }</span>
+<span class="lineNum"> 88 </span> :
+<span class="lineNum"> 89 </span><span class="lineCov"> 14 : std::string Path::popconSourceDir() { return instance().m_popconSourceDir; }</span>
+<span class="lineNum"> 90 </span><span class="lineCov"> 43 : std::string Path::popconIndexDir() { return instance().m_popconIndexDir; }</span>
+<span class="lineNum"> 91 </span><span class="lineCov"> 14 : std::string Path::popconUserSourceDir() { return instance().m_popconUserSourceDir; }</span>
+<span class="lineNum"> 92 </span><span class="lineCov"> 47 : std::string Path::popconUserIndexDir() { return instance().m_popconUserIndexDir; }</span>
+<span class="lineNum"> 93 </span> :
+<span class="lineNum"> 94 </span><span class="lineCov"> 17 : std::string Path::scores() {</span>
+<span class="lineNum"> 95 </span><span class="lineCov"> 17 : return str::joinpath(popconIndexDir(), &quot;scores&quot;);</span>
+<span class="lineNum"> 96 </span> : }
+<span class="lineNum"> 97 </span> :
+<span class="lineNum"> 98 </span><span class="lineCov"> 17 : std::string Path::scoresIndex() {</span>
+<span class="lineNum"> 99 </span><span class="lineCov"> 17 : return str::joinpath(popconIndexDir(), &quot;scores.idx&quot;);</span>
+<span class="lineNum"> 100 </span> : }
+<span class="lineNum"> 101 </span> :
+<span class="lineNum"> 102 </span><span class="lineCov"> 20 : std::string Path::userScores() {</span>
+<span class="lineNum"> 103 </span><span class="lineCov"> 20 : return str::joinpath(popconUserIndexDir(), &quot;scores&quot;);</span>
+<span class="lineNum"> 104 </span> : }
+<span class="lineNum"> 105 </span> :
+<span class="lineNum"> 106 </span><span class="lineCov"> 20 : std::string Path::userScoresIndex() {</span>
+<span class="lineNum"> 107 </span><span class="lineCov"> 20 : return str::joinpath(popconUserIndexDir(), &quot;scores.idx&quot;);</span>
+<span class="lineNum"> 108 </span> : }
+<span class="lineNum"> 109 </span> :
+<span class="lineNum"> 110 </span> : Path *Path::s_instance = 0;
+<span class="lineNum"> 111 </span> :
+<span class="lineNum"> 112 </span> : }
+<span class="lineNum"> 113 </span> : }
+<span class="lineNum"> 114 </span> :
+<span class="lineNum"> 115 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/path.h.gcov.html b/rep/ept/popcon/maint/path.h.gcov.html
new file mode 100644
index 0000000..557613c
--- /dev/null
+++ b/rep/ept/popcon/maint/path.h.gcov.html
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint/path.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">ept/popcon/maint</a> - path.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">17</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">100.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">17</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : // -*- mode: c++; indent-tabs-mode: t -*-
+<span class="lineNum"> 2 </span> : /** \file
+<span class="lineNum"> 3 </span> : * popcon paths
+<span class="lineNum"> 4 </span> : */
+<span class="lineNum"> 5 </span> :
+<span class="lineNum"> 6 </span> : /*
+<span class="lineNum"> 7 </span> : * Copyright (C) 2005,2006,2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 8 </span> : *
+<span class="lineNum"> 9 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 10 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 11 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 12 </span> : * (at your option) any later version.
+<span class="lineNum"> 13 </span> : *
+<span class="lineNum"> 14 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 15 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 16 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 17 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 18 </span> : *
+<span class="lineNum"> 19 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 20 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 21 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 22 </span> : */
+<span class="lineNum"> 23 </span> :
+<span class="lineNum"> 24 </span> : #ifndef EPT_POPCON_PATH_H
+<span class="lineNum"> 25 </span> : #define EPT_POPCON_PATH_H
+<span class="lineNum"> 26 </span> :
+<span class="lineNum"> 27 </span> : #include &lt;string&gt;
+<span class="lineNum"> 28 </span> :
+<span class="lineNum"> 29 </span> : struct stat;
+<span class="lineNum"> 30 </span> :
+<span class="lineNum"> 31 </span> : namespace ept {
+<span class="lineNum"> 32 </span> : namespace popcon {
+<span class="lineNum"> 33 </span> :
+<span class="lineNum"> 34 </span> : /**
+<span class="lineNum"> 35 </span> : * Singleton class to configure and access the various Popcon paths
+<span class="lineNum"> 36 </span> : */
+<span class="lineNum"> 37 </span> : class Path
+<span class="lineNum"> 38 </span><span class="lineCov"> 1 : {</span>
+<span class="lineNum"> 39 </span> : public:
+<span class="lineNum"> 40 </span> : static std::string scores();
+<span class="lineNum"> 41 </span> : static std::string scoresIndex();
+<span class="lineNum"> 42 </span> : static std::string userScores();
+<span class="lineNum"> 43 </span> : static std::string userScoresIndex();
+<span class="lineNum"> 44 </span> :
+<span class="lineNum"> 45 </span> : static std::string popconSourceDir();
+<span class="lineNum"> 46 </span> : static std::string popconIndexDir();
+<span class="lineNum"> 47 </span> : static std::string popconUserSourceDir();
+<span class="lineNum"> 48 </span> : static std::string popconUserIndexDir();
+<span class="lineNum"> 49 </span> :
+<span class="lineNum"> 50 </span> : // Directory where Popcon source data is found
+<span class="lineNum"> 51 </span> : static void setPopconSourceDir( const std::string &amp;s );
+<span class="lineNum"> 52 </span> :
+<span class="lineNum"> 53 </span> : // Directory where Popcon indexes are kept
+<span class="lineNum"> 54 </span> : static void setPopconIndexDir( const std::string &amp;s );
+<span class="lineNum"> 55 </span> :
+<span class="lineNum"> 56 </span> : // User-specific directory for Popcon source data
+<span class="lineNum"> 57 </span> : static void setPopconUserSourceDir( const std::string &amp;s );
+<span class="lineNum"> 58 </span> :
+<span class="lineNum"> 59 </span> : // User-specific directory for Popcon index data
+<span class="lineNum"> 60 </span> : static void setPopconUserIndexDir( const std::string &amp;s );
+<span class="lineNum"> 61 </span> :
+<span class="lineNum"> 62 </span> : static int access( const std::string &amp;, int );
+<span class="lineNum"> 63 </span> : static time_t timestamp( const std::string&amp; );
+<span class="lineNum"> 64 </span> :
+<span class="lineNum"> 65 </span> : // RAII-style classes to temporarily override directories
+<span class="lineNum"> 66 </span> : class OverridePopconSourceDir
+<span class="lineNum"> 67 </span> : {
+<span class="lineNum"> 68 </span> : std::string old;
+<span class="lineNum"> 69 </span> : public:
+<span class="lineNum"> 70 </span><span class="lineCov"> 7 : OverridePopconSourceDir(const std::string&amp; path) : old(Path::popconSourceDir())</span>
+<span class="lineNum"> 71 </span> : {
+<span class="lineNum"> 72 </span><span class="lineCov"> 7 : Path::setPopconSourceDir(path);</span>
+<span class="lineNum"> 73 </span><span class="lineCov"> 7 : }</span>
+<span class="lineNum"> 74 </span><span class="lineCov"> 7 : ~OverridePopconSourceDir() { Path::setPopconSourceDir(old); }</span>
+<span class="lineNum"> 75 </span> : };
+<span class="lineNum"> 76 </span> : class OverridePopconIndexDir
+<span class="lineNum"> 77 </span> : {
+<span class="lineNum"> 78 </span> : std::string old;
+<span class="lineNum"> 79 </span> : public:
+<span class="lineNum"> 80 </span><span class="lineCov"> 7 : OverridePopconIndexDir(const std::string&amp; path) : old(Path::popconIndexDir())</span>
+<span class="lineNum"> 81 </span> : {
+<span class="lineNum"> 82 </span><span class="lineCov"> 7 : Path::setPopconIndexDir(path);</span>
+<span class="lineNum"> 83 </span><span class="lineCov"> 7 : }</span>
+<span class="lineNum"> 84 </span><span class="lineCov"> 7 : ~OverridePopconIndexDir() { Path::setPopconIndexDir(old); }</span>
+<span class="lineNum"> 85 </span> : };
+<span class="lineNum"> 86 </span> : class OverridePopconUserSourceDir
+<span class="lineNum"> 87 </span> : {
+<span class="lineNum"> 88 </span> : std::string old;
+<span class="lineNum"> 89 </span> : public:
+<span class="lineNum"> 90 </span><span class="lineCov"> 7 : OverridePopconUserSourceDir(const std::string&amp; path) : old(Path::popconUserSourceDir())</span>
+<span class="lineNum"> 91 </span> : {
+<span class="lineNum"> 92 </span><span class="lineCov"> 7 : Path::setPopconUserSourceDir(path);</span>
+<span class="lineNum"> 93 </span><span class="lineCov"> 7 : }</span>
+<span class="lineNum"> 94 </span><span class="lineCov"> 7 : ~OverridePopconUserSourceDir() { Path::setPopconUserSourceDir(old); }</span>
+<span class="lineNum"> 95 </span> : };
+<span class="lineNum"> 96 </span> : class OverridePopconUserIndexDir
+<span class="lineNum"> 97 </span> : {
+<span class="lineNum"> 98 </span> : std::string old;
+<span class="lineNum"> 99 </span> : public:
+<span class="lineNum"> 100 </span><span class="lineCov"> 7 : OverridePopconUserIndexDir(const std::string&amp; path) : old(Path::popconUserIndexDir())</span>
+<span class="lineNum"> 101 </span> : {
+<span class="lineNum"> 102 </span><span class="lineCov"> 7 : Path::setPopconUserIndexDir(path);</span>
+<span class="lineNum"> 103 </span><span class="lineCov"> 7 : }</span>
+<span class="lineNum"> 104 </span><span class="lineCov"> 7 : ~OverridePopconUserIndexDir() { Path::setPopconUserIndexDir(old); }</span>
+<span class="lineNum"> 105 </span> : };
+<span class="lineNum"> 106 </span> : protected:
+<span class="lineNum"> 107 </span> : static Path *s_instance;
+<span class="lineNum"> 108 </span> : static Path &amp;instance();
+<span class="lineNum"> 109 </span> :
+<span class="lineNum"> 110 </span> : // Directory where Popcon source data is found
+<span class="lineNum"> 111 </span> : std::string m_popconSourceDir;
+<span class="lineNum"> 112 </span> :
+<span class="lineNum"> 113 </span> : // Directory where Popcon indexes are kept
+<span class="lineNum"> 114 </span> : std::string m_popconIndexDir;
+<span class="lineNum"> 115 </span> :
+<span class="lineNum"> 116 </span> : // User-specific directory for Popcon source data
+<span class="lineNum"> 117 </span> : std::string m_popconUserSourceDir;
+<span class="lineNum"> 118 </span> :
+<span class="lineNum"> 119 </span> : // User-specific directory for Popcon index data
+<span class="lineNum"> 120 </span> : std::string m_popconUserIndexDir;
+<span class="lineNum"> 121 </span> : };
+<span class="lineNum"> 122 </span> :
+<span class="lineNum"> 123 </span> : }
+<span class="lineNum"> 124 </span> : }
+<span class="lineNum"> 125 </span> :
+<span class="lineNum"> 126 </span> : // vim:set ts=4 sw=4:
+<span class="lineNum"> 127 </span> : #endif
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/popconindexer.cc.gcov.html b/rep/ept/popcon/maint/popconindexer.cc.gcov.html
new file mode 100644
index 0000000..28d6298
--- /dev/null
+++ b/rep/ept/popcon/maint/popconindexer.cc.gcov.html
@@ -0,0 +1,314 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint/popconindexer.cc</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">ept/popcon/maint</a> - popconindexer.cc</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">116</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">79.3 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">92</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : #include &lt;ept/popcon/popcon.h&gt;
+<span class="lineNum"> 2 </span> : #include &lt;ept/popcon/maint/popconindexer.h&gt;
+<span class="lineNum"> 3 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 4 </span> :
+<span class="lineNum"> 5 </span> : #include &lt;wibble/exception.h&gt;
+<span class="lineNum"> 6 </span> : #include &lt;wibble/sys/fs.h&gt;
+<span class="lineNum"> 7 </span> :
+<span class="lineNum"> 8 </span> : #include &lt;tagcoll/diskindex/mmap.h&gt;
+<span class="lineNum"> 9 </span> :
+<span class="lineNum"> 10 </span> : #include &lt;set&gt;
+<span class="lineNum"> 11 </span> : #include &lt;string&gt;
+<span class="lineNum"> 12 </span> : #include &lt;cstdio&gt;
+<span class="lineNum"> 13 </span> : #include &lt;cstring&gt;
+<span class="lineNum"> 14 </span> :
+<span class="lineNum"> 15 </span> : using namespace std;
+<span class="lineNum"> 16 </span> :
+<span class="lineNum"> 17 </span> : namespace ept {
+<span class="lineNum"> 18 </span> : namespace popcon {
+<span class="lineNum"> 19 </span> :
+<span class="lineNum"> 20 </span> : template&lt;typename STRUCT&gt;
+<span class="lineNum"> 21 </span> : struct StructIndexer : public tagcoll::diskindex::MMapIndexer
+<span class="lineNum"> 22 </span><span class="lineCov"> 1 : {</span>
+<span class="lineNum"> 23 </span> : const STRUCT&amp; data;
+<span class="lineNum"> 24 </span><span class="lineCov"> 1 : StructIndexer(const STRUCT&amp; data) : data(data) {}</span>
+<span class="lineNum"> 25 </span> :
+<span class="lineNum"> 26 </span><span class="lineCov"> 1 : int encodedSize() const { return sizeof(STRUCT); }</span>
+<span class="lineNum"> 27 </span><span class="lineCov"> 1 : void encode(char* buf) const { *(STRUCT*)buf = data; }</span>
+<span class="lineNum"> 28 </span> : };
+<span class="lineNum"> 29 </span> :
+<span class="lineNum"> 30 </span> : /// MMapIndexer that indexes the package names
+<span class="lineNum"> 31 </span> : struct PopconGenerator : public tagcoll::diskindex::MMapIndexer
+<span class="lineNum"> 32 </span><span class="lineCov"> 4 : {</span>
+<span class="lineNum"> 33 </span> : // Sorted set of all available package names and data
+<span class="lineNum"> 34 </span> : std::map&lt;std::string, Score&gt; data;
+<span class="lineNum"> 35 </span> :
+<span class="lineNum"> 36 </span><span class="lineCov"> 1 : int encodedSize() const</span>
+<span class="lineNum"> 37 </span> : {
+<span class="lineNum"> 38 </span><span class="lineCov"> 1 : int size = data.size() * sizeof(Score);</span>
+<span class="lineNum"> 39 </span><span class="lineCov"> 69911 : for (std::map&lt;std::string, Score&gt;::const_iterator i = data.begin();</span>
+<span class="lineNum"> 40 </span> : i != data.end(); ++i)
+<span class="lineNum"> 41 </span><span class="lineCov"> 69910 : size += i-&gt;first.size() + 1;</span>
+<span class="lineNum"> 42 </span><span class="lineCov"> 1 : return tagcoll::diskindex::MMap::align(size);</span>
+<span class="lineNum"> 43 </span> : }
+<span class="lineNum"> 44 </span> :
+<span class="lineNum"> 45 </span><span class="lineCov"> 1 : void encode(char* buf) const</span>
+<span class="lineNum"> 46 </span> : {
+<span class="lineNum"> 47 </span><span class="lineCov"> 1 : int pos = data.size() * sizeof(Score);</span>
+<span class="lineNum"> 48 </span><span class="lineCov"> 1 : int idx = 0;</span>
+<span class="lineNum"> 49 </span><span class="lineCov"> 69911 : for (std::map&lt;std::string, Score&gt;::const_iterator i = data.begin();</span>
+<span class="lineNum"> 50 </span> : i != data.end(); ++i)
+<span class="lineNum"> 51 </span> : {
+<span class="lineNum"> 52 </span><span class="lineCov"> 69910 : ((Score*)buf)[idx] = i-&gt;second;</span>
+<span class="lineNum"> 53 </span><span class="lineCov"> 69910 : ((Score*)buf)[idx].offset = pos;</span>
+<span class="lineNum"> 54 </span><span class="lineCov"> 69910 : memcpy(buf + pos, i-&gt;first.c_str(), i-&gt;first.size() + 1);</span>
+<span class="lineNum"> 55 </span><span class="lineCov"> 69910 : pos += i-&gt;first.size() + 1;</span>
+<span class="lineNum"> 56 </span><span class="lineCov"> 69910 : ++idx;</span>
+<span class="lineNum"> 57 </span> : }
+<span class="lineNum"> 58 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 59 </span> : };
+<span class="lineNum"> 60 </span> :
+<span class="lineNum"> 61 </span> :
+<span class="lineNum"> 62 </span><span class="lineCov"> 7 : PopconIndexer::PopconIndexer()</span>
+<span class="lineNum"> 63 </span> : : mainSource(Path::popconSourceDir()),
+<span class="lineNum"> 64 </span><span class="lineCov"> 7 : userSource(Path::popconUserSourceDir())</span>
+<span class="lineNum"> 65 </span> : {
+<span class="lineNum"> 66 </span><span class="lineCov"> 7 : rescan();</span>
+<span class="lineNum"> 67 </span><span class="lineCov"> 7 : }</span>
+<span class="lineNum"> 68 </span> :
+<span class="lineNum"> 69 </span><span class="lineCov"> 7 : void PopconIndexer::rescan()</span>
+<span class="lineNum"> 70 </span> : {
+<span class="lineNum"> 71 </span><span class="lineCov"> 7 : ts_main_src = mainSource.timestamp();</span>
+<span class="lineNum"> 72 </span><span class="lineCov"> 7 : ts_user_src = userSource.timestamp();</span>
+<span class="lineNum"> 73 </span><span class="lineCov"> 7 : ts_main_sco = Path::timestamp(Path::scores());</span>
+<span class="lineNum"> 74 </span><span class="lineCov"> 14 : ts_user_sco = Path::timestamp(Path::userScores());</span>
+<span class="lineNum"> 75 </span><span class="lineCov"> 14 : ts_main_idx = Path::timestamp(Path::scoresIndex());</span>
+<span class="lineNum"> 76 </span><span class="lineCov"> 14 : ts_user_idx = Path::timestamp(Path::userScoresIndex());</span>
+<span class="lineNum"> 77 </span><span class="lineCov"> 7 : }</span>
+<span class="lineNum"> 78 </span> :
+<span class="lineNum"> 79 </span><span class="lineCov"> 7 : bool PopconIndexer::needsRebuild() const</span>
+<span class="lineNum"> 80 </span> : {
+<span class="lineNum"> 81 </span> : // If there are no indexes of any kind, then we need rebuilding
+<span class="lineNum"> 82 </span><span class="lineCov"> 7 : if (ts_user_sco == 0 || ts_main_sco == 0 || ts_user_idx == 0 &amp;&amp; ts_main_idx == 0)</span>
+<span class="lineNum"> 83 </span><span class="lineCov"> 2 : return true;</span>
+<span class="lineNum"> 84 </span> :
+<span class="lineNum"> 85 </span> : // If the user index is ok, then we are fine
+<span class="lineNum"> 86 </span><span class="lineCov"> 5 : if (ts_user_sco &gt;= sourceTimestamp() &amp;&amp; ts_user_idx &gt;= sourceTimestamp())</span>
+<span class="lineNum"> 87 </span><span class="lineCov"> 5 : return false;</span>
+<span class="lineNum"> 88 </span> :
+<span class="lineNum"> 89 </span> : // If there are user sources, then we cannot use the system index
+<span class="lineNum"> 90 </span><span class="lineNoCov"> 0 : if (ts_user_src &gt; 0)</span>
+<span class="lineNum"> 91 </span><span class="lineNoCov"> 0 : return true;</span>
+<span class="lineNum"> 92 </span> :
+<span class="lineNum"> 93 </span> : // If there are no user sources, then we can fallback on the system
+<span class="lineNum"> 94 </span> : // indexes in case the user indexes are not up to date
+<span class="lineNum"> 95 </span><span class="lineNoCov"> 0 : if (ts_main_sco &gt;= sourceTimestamp() &amp;&amp; ts_main_idx &gt;= sourceTimestamp())</span>
+<span class="lineNum"> 96 </span><span class="lineNoCov"> 0 : return false;</span>
+<span class="lineNum"> 97 </span> :
+<span class="lineNum"> 98 </span><span class="lineNoCov"> 0 : return true;</span>
+<span class="lineNum"> 99 </span> : }
+<span class="lineNum"> 100 </span> :
+<span class="lineNum"> 101 </span><span class="lineCov"> 7 : bool PopconIndexer::userIndexIsRedundant() const</span>
+<span class="lineNum"> 102 </span> : {
+<span class="lineNum"> 103 </span> : // If there is no user index, then it is not redundant
+<span class="lineNum"> 104 </span><span class="lineCov"> 7 : if (ts_user_idx == 0)</span>
+<span class="lineNum"> 105 </span><span class="lineCov"> 1 : return false;</span>
+<span class="lineNum"> 106 </span> :
+<span class="lineNum"> 107 </span> : // If the system index is not up to date, then the user index is not
+<span class="lineNum"> 108 </span> : // redundant
+<span class="lineNum"> 109 </span><span class="lineCov"> 6 : if (ts_main_idx &lt; sourceTimestamp())</span>
+<span class="lineNum"> 110 </span><span class="lineNoCov"> 0 : return false;</span>
+<span class="lineNum"> 111 </span> :
+<span class="lineNum"> 112 </span><span class="lineCov"> 6 : return true;</span>
+<span class="lineNum"> 113 </span> : }
+<span class="lineNum"> 114 </span> :
+<span class="lineNum"> 115 </span><span class="lineCov"> 2 : bool PopconIndexer::rebuild(const std::string&amp; scofname, const std::string&amp; idxfname)</span>
+<span class="lineNum"> 116 </span> : {
+<span class="lineNum"> 117 </span><span class="lineCov"> 2 : PopconGenerator gen;</span>
+<span class="lineNum"> 118 </span> : InfoStruct is;
+<span class="lineNum"> 119 </span><span class="lineCov"> 2 : is.submissions = 0;</span>
+<span class="lineNum"> 120 </span><span class="lineCov"> 2 : if (!mainSource.readScores(gen.data, is.submissions))</span>
+<span class="lineNum"> 121 </span><span class="lineCov"> 1 : userSource.readScores(gen.data, is.submissions);</span>
+<span class="lineNum"> 122 </span><span class="lineCov"> 2 : if (gen.data.empty())</span>
+<span class="lineNum"> 123 </span><span class="lineCov"> 1 : return false;</span>
+<span class="lineNum"> 124 </span> :
+<span class="lineNum"> 125 </span><span class="lineCov"> 1 : StructIndexer&lt;InfoStruct&gt; infoStruct(is);</span>
+<span class="lineNum"> 126 </span> :
+<span class="lineNum"> 127 </span> : // Create the index
+<span class="lineNum"> 128 </span><span class="lineCov"> 1 : tagcoll::diskindex::MasterMMapIndexer master(idxfname);</span>
+<span class="lineNum"> 129 </span><span class="lineCov"> 1 : master.append(gen);</span>
+<span class="lineNum"> 130 </span><span class="lineCov"> 1 : master.append(infoStruct);</span>
+<span class="lineNum"> 131 </span><span class="lineCov"> 1 : master.commit();</span>
+<span class="lineNum"> 132 </span> :
+<span class="lineNum"> 133 </span> : // for (map&lt;string, Score&gt;::const_iterator i = gen.data.begin(); i != gen.data.end(); ++i)
+<span class="lineNum"> 134 </span> : // {
+<span class="lineNum"> 135 </span> : // fprintf(stderr, &quot;%s %d %f\n&quot;, i-&gt;first.c_str(), i-&gt;second.offset, i-&gt;second.score);
+<span class="lineNum"> 136 </span> : // }
+<span class="lineNum"> 137 </span> :
+<span class="lineNum"> 138 </span> : // Create the score file
+<span class="lineNum"> 139 </span><span class="lineCov"> 1 : FILE* out = fopen(scofname.c_str(), &quot;wt&quot;);</span>
+<span class="lineNum"> 140 </span><span class="lineCov"> 1 : if (out == NULL)</span>
+<span class="lineNum"> 141 </span><span class="lineNoCov"> 0 : throw wibble::exception::File(scofname, &quot;opening and truncating file for writing&quot;);</span>
+<span class="lineNum"> 142 </span><span class="lineCov"> 69911 : for (map&lt;string, Score&gt;::const_iterator i = gen.data.begin();</span>
+<span class="lineNum"> 143 </span> : i != gen.data.end(); ++i)
+<span class="lineNum"> 144 </span> : {
+<span class="lineNum"> 145 </span><span class="lineCov"> 69910 : fprintf(out, &quot;%s %f\n&quot;, i-&gt;first.c_str(), i-&gt;second.score);</span>
+<span class="lineNum"> 146 </span> : }
+<span class="lineNum"> 147 </span><span class="lineCov"> 1 : fclose(out);</span>
+<span class="lineNum"> 148 </span><span class="lineCov"> 1 : return true;</span>
+<span class="lineNum"> 149 </span> : }
+<span class="lineNum"> 150 </span> :
+<span class="lineNum"> 151 </span><span class="lineCov"> 7 : bool PopconIndexer::rebuildIfNeeded()</span>
+<span class="lineNum"> 152 </span> : {
+<span class="lineNum"> 153 </span><span class="lineCov"> 7 : if (needsRebuild())</span>
+<span class="lineNum"> 154 </span> : {
+<span class="lineNum"> 155 </span> : // Decide if we rebuild the user index or the system index
+<span class="lineNum"> 156 </span><span class="lineCov"> 2 : if (Path::access(Path::popconIndexDir(), W_OK) == 0)</span>
+<span class="lineNum"> 157 </span> : {
+<span class="lineNum"> 158 </span> : // Since we can write on the system index directory, we rebuild
+<span class="lineNum"> 159 </span> : // the system index
+<span class="lineNum"> 160 </span><span class="lineCov"> 2 : if (!rebuild(Path::scores(), Path::scoresIndex()))</span>
+<span class="lineNum"> 161 </span><span class="lineCov"> 1 : return false;</span>
+<span class="lineNum"> 162 </span><span class="lineCov"> 1 : ts_main_sco = Path::timestamp(Path::scores());</span>
+<span class="lineNum"> 163 </span><span class="lineCov"> 2 : ts_main_idx = Path::timestamp(Path::scoresIndex());</span>
+<span class="lineNum"> 164 </span><span class="lineCov"> 2 : if (Path::scores() == Path::userScores())</span>
+<span class="lineNum"> 165 </span><span class="lineCov"> 1 : ts_user_sco = ts_main_sco;</span>
+<span class="lineNum"> 166 </span><span class="lineCov"> 1 : if (Path::scoresIndex() == Path::userScoresIndex())</span>
+<span class="lineNum"> 167 </span><span class="lineCov"> 1 : ts_user_idx = ts_main_idx;</span>
+<span class="lineNum"> 168 </span> : } else {
+<span class="lineNum"> 169 </span><span class="lineNoCov"> 0 : wibble::sys::fs::mkFilePath(Path::userScores());</span>
+<span class="lineNum"> 170 </span><span class="lineNoCov"> 0 : wibble::sys::fs::mkFilePath(Path::userScoresIndex());</span>
+<span class="lineNum"> 171 </span><span class="lineNoCov"> 0 : if (!rebuild(Path::userScores(), Path::userScoresIndex()))</span>
+<span class="lineNum"> 172 </span><span class="lineNoCov"> 0 : return false;</span>
+<span class="lineNum"> 173 </span><span class="lineNoCov"> 0 : ts_user_sco = Path::timestamp(Path::userScores());</span>
+<span class="lineNum"> 174 </span><span class="lineNoCov"> 0 : ts_user_idx = Path::timestamp(Path::userScoresIndex());</span>
+<span class="lineNum"> 175 </span> : }
+<span class="lineNum"> 176 </span><span class="lineCov"> 1 : return true;</span>
+<span class="lineNum"> 177 </span> : }
+<span class="lineNum"> 178 </span><span class="lineCov"> 5 : return false;</span>
+<span class="lineNum"> 179 </span> : }
+<span class="lineNum"> 180 </span> :
+<span class="lineNum"> 181 </span><span class="lineCov"> 7 : bool PopconIndexer::deleteRedundantUserIndex()</span>
+<span class="lineNum"> 182 </span> : {
+<span class="lineNum"> 183 </span><span class="lineCov"> 7 : if (userIndexIsRedundant())</span>
+<span class="lineNum"> 184 </span> : {
+<span class="lineNum"> 185 </span> : // Delete the user indexes if they exist
+<span class="lineNum"> 186 </span><span class="lineCov"> 6 : if (Path::scores() != Path::userScores())</span>
+<span class="lineNum"> 187 </span> : {
+<span class="lineNum"> 188 </span><span class="lineNoCov"> 0 : unlink(Path::userScores().c_str());</span>
+<span class="lineNum"> 189 </span><span class="lineNoCov"> 0 : ts_user_sco = 0;</span>
+<span class="lineNum"> 190 </span> : }
+<span class="lineNum"> 191 </span><span class="lineCov"> 6 : if (Path::scoresIndex() != Path::userScoresIndex())</span>
+<span class="lineNum"> 192 </span> : {
+<span class="lineNum"> 193 </span><span class="lineNoCov"> 0 : unlink(Path::userScoresIndex().c_str());</span>
+<span class="lineNum"> 194 </span><span class="lineNoCov"> 0 : ts_user_idx = 0;</span>
+<span class="lineNum"> 195 </span> : }
+<span class="lineNum"> 196 </span><span class="lineCov"> 6 : return true;</span>
+<span class="lineNum"> 197 </span> : }
+<span class="lineNum"> 198 </span><span class="lineCov"> 1 : return false;</span>
+<span class="lineNum"> 199 </span> : }
+<span class="lineNum"> 200 </span> :
+<span class="lineNum"> 201 </span><span class="lineCov"> 7 : bool PopconIndexer::getUpToDatePopcon(std::string&amp; scofname, std::string&amp; idxfname)</span>
+<span class="lineNum"> 202 </span> : {
+<span class="lineNum"> 203 </span> : // If there are no indexes of any kind, then we have nothing to return
+<span class="lineNum"> 204 </span><span class="lineCov"> 7 : if (ts_user_sco == 0 &amp;&amp; ts_main_sco == 0 &amp;&amp; ts_user_idx == 0 &amp;&amp; ts_main_idx == 0)</span>
+<span class="lineNum"> 205 </span><span class="lineCov"> 1 : return false;</span>
+<span class="lineNum"> 206 </span> :
+<span class="lineNum"> 207 </span> : // If the user index is up to date, use it
+<span class="lineNum"> 208 </span><span class="lineCov"> 6 : if (ts_user_sco &gt;= sourceTimestamp() &amp;&amp;</span>
+<span class="lineNum"> 209 </span> : ts_user_idx &gt;= sourceTimestamp())
+<span class="lineNum"> 210 </span> : {
+<span class="lineNum"> 211 </span><span class="lineCov"> 6 : scofname = Path::userScores();</span>
+<span class="lineNum"> 212 </span><span class="lineCov"> 12 : idxfname = Path::userScoresIndex();</span>
+<span class="lineNum"> 213 </span><span class="lineCov"> 6 : return true;</span>
+<span class="lineNum"> 214 </span> : }
+<span class="lineNum"> 215 </span> :
+<span class="lineNum"> 216 </span> : // If the user index is not up to date and we have user sources, we cannot
+<span class="lineNum"> 217 </span> : // fall back to the system index
+<span class="lineNum"> 218 </span><span class="lineNoCov"> 0 : if (ts_user_src != 0)</span>
+<span class="lineNum"> 219 </span><span class="lineNoCov"> 0 : return false;</span>
+<span class="lineNum"> 220 </span> :
+<span class="lineNum"> 221 </span> : // Fallback to the system index
+<span class="lineNum"> 222 </span><span class="lineNoCov"> 0 : if (ts_main_sco &gt;= sourceTimestamp() &amp;&amp;</span>
+<span class="lineNum"> 223 </span> : ts_main_idx &gt;= sourceTimestamp())
+<span class="lineNum"> 224 </span> : {
+<span class="lineNum"> 225 </span><span class="lineNoCov"> 0 : scofname = Path::scores();</span>
+<span class="lineNum"> 226 </span><span class="lineNoCov"> 0 : idxfname = Path::scoresIndex();</span>
+<span class="lineNum"> 227 </span><span class="lineNoCov"> 0 : return true;</span>
+<span class="lineNum"> 228 </span> : }
+<span class="lineNum"> 229 </span> :
+<span class="lineNum"> 230 </span><span class="lineNoCov"> 0 : return false;</span>
+<span class="lineNum"> 231 </span> : }
+<span class="lineNum"> 232 </span> :
+<span class="lineNum"> 233 </span> :
+<span class="lineNum"> 234 </span><span class="lineCov"> 7 : bool PopconIndexer::obtainWorkingPopcon(std::string&amp; scofname, std::string&amp; idxfname)</span>
+<span class="lineNum"> 235 </span> : {
+<span class="lineNum"> 236 </span><span class="lineCov"> 7 : PopconIndexer indexer;</span>
+<span class="lineNum"> 237 </span> :
+<span class="lineNum"> 238 </span><span class="lineCov"> 7 : indexer.rebuildIfNeeded();</span>
+<span class="lineNum"> 239 </span><span class="lineCov"> 7 : indexer.deleteRedundantUserIndex();</span>
+<span class="lineNum"> 240 </span><span class="lineCov"> 7 : return indexer.getUpToDatePopcon(scofname, idxfname);</span>
+<span class="lineNum"> 241 </span> : }
+<span class="lineNum"> 242 </span> :
+<span class="lineNum"> 243 </span> :
+<span class="lineNum"> 244 </span> : }
+<span class="lineNum"> 245 </span><span class="lineCov"> 6 : }</span>
+<span class="lineNum"> 246 </span> :
+<span class="lineNum"> 247 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/popconindexer.h.gcov.html b/rep/ept/popcon/maint/popconindexer.h.gcov.html
new file mode 100644
index 0000000..fe36a9d
--- /dev/null
+++ b/rep/ept/popcon/maint/popconindexer.h.gcov.html
@@ -0,0 +1,142 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint/popconindexer.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">ept/popcon/maint</a> - popconindexer.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">5</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">100.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">5</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : #ifndef EPT_DEBTAGS_PKGIDINDEXER_H
+<span class="lineNum"> 2 </span> : #define EPT_DEBTAGS_PKGIDINDEXER_H
+<span class="lineNum"> 3 </span> :
+<span class="lineNum"> 4 </span> : /** @file
+<span class="lineNum"> 5 </span> : * @author Enrico Zini &lt;enrico@enricozini.org&gt;
+<span class="lineNum"> 6 </span> : * Rebuild and maintain the map from package IDs to package names
+<span class="lineNum"> 7 </span> : */
+<span class="lineNum"> 8 </span> :
+<span class="lineNum"> 9 </span> : /*
+<span class="lineNum"> 10 </span> : * Copyright (C) 2003-2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 11 </span> : *
+<span class="lineNum"> 12 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 13 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 14 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 15 </span> : * (at your option) any later version.
+<span class="lineNum"> 16 </span> : *
+<span class="lineNum"> 17 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 18 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 19 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 20 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 21 </span> : *
+<span class="lineNum"> 22 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 23 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 24 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 25 </span> : */
+<span class="lineNum"> 26 </span> :
+<span class="lineNum"> 27 </span> : #include &lt;ept/popcon/maint/sourcedir.h&gt;
+<span class="lineNum"> 28 </span> : #include &lt;string&gt;
+<span class="lineNum"> 29 </span> :
+<span class="lineNum"> 30 </span> : namespace ept {
+<span class="lineNum"> 31 </span> : namespace popcon {
+<span class="lineNum"> 32 </span> :
+<span class="lineNum"> 33 </span> : struct InfoStruct
+<span class="lineNum"> 34 </span> : {
+<span class="lineNum"> 35 </span> : size_t submissions;
+<span class="lineNum"> 36 </span> : };
+<span class="lineNum"> 37 </span> :
+<span class="lineNum"> 38 </span> : struct PopconIndexer
+<span class="lineNum"> 39 </span><span class="lineCov"> 7 : {</span>
+<span class="lineNum"> 40 </span> : SourceDir mainSource;
+<span class="lineNum"> 41 </span> : SourceDir userSource;
+<span class="lineNum"> 42 </span> : time_t ts_main_src;
+<span class="lineNum"> 43 </span> : time_t ts_user_src;
+<span class="lineNum"> 44 </span> : time_t ts_main_sco;
+<span class="lineNum"> 45 </span> : time_t ts_user_sco;
+<span class="lineNum"> 46 </span> : time_t ts_main_idx;
+<span class="lineNum"> 47 </span> : time_t ts_user_idx;
+<span class="lineNum"> 48 </span> :
+<span class="lineNum"> 49 </span><span class="lineCov"> 28 : time_t sourceTimestamp() const</span>
+<span class="lineNum"> 50 </span> : {
+<span class="lineNum"> 51 </span><span class="lineCov"> 28 : time_t res = ts_main_src;</span>
+<span class="lineNum"> 52 </span><span class="lineCov"> 28 : if (ts_user_src &gt; res) res = ts_user_src;</span>
+<span class="lineNum"> 53 </span><span class="lineCov"> 28 : return res;</span>
+<span class="lineNum"> 54 </span> :
+<span class="lineNum"> 55 </span> : }
+<span class="lineNum"> 56 </span> : bool needsRebuild() const;
+<span class="lineNum"> 57 </span> : bool rebuild(const std::string&amp; scofname, const std::string&amp; idxfname);
+<span class="lineNum"> 58 </span> : bool rebuildIfNeeded();
+<span class="lineNum"> 59 </span> : bool getUpToDatePopcon(std::string&amp; scofname, std::string&amp; idxfname);
+<span class="lineNum"> 60 </span> :
+<span class="lineNum"> 61 </span> : bool userIndexIsRedundant() const;
+<span class="lineNum"> 62 </span> : bool deleteRedundantUserIndex();
+<span class="lineNum"> 63 </span> :
+<span class="lineNum"> 64 </span> : void rescan();
+<span class="lineNum"> 65 </span> :
+<span class="lineNum"> 66 </span> : PopconIndexer();
+<span class="lineNum"> 67 </span> :
+<span class="lineNum"> 68 </span> : static bool obtainWorkingPopcon(std::string&amp; scofname, std::string&amp; idxfname);
+<span class="lineNum"> 69 </span> : };
+<span class="lineNum"> 70 </span> :
+<span class="lineNum"> 71 </span> : }
+<span class="lineNum"> 72 </span> : }
+<span class="lineNum"> 73 </span> :
+<span class="lineNum"> 74 </span> : // vim:set ts=4 sw=4:
+<span class="lineNum"> 75 </span> : #endif
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/sourcedir.cc.gcov.html b/rep/ept/popcon/maint/sourcedir.cc.gcov.html
new file mode 100644
index 0000000..80a1a4e
--- /dev/null
+++ b/rep/ept/popcon/maint/sourcedir.cc.gcov.html
@@ -0,0 +1,210 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint/sourcedir.cc</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">ept/popcon/maint</a> - sourcedir.cc</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">76</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">93.4 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">71</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : #include &lt;ept/popcon/maint/sourcedir.h&gt;
+<span class="lineNum"> 2 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 3 </span> :
+<span class="lineNum"> 4 </span> : #include &lt;wibble/string.h&gt;
+<span class="lineNum"> 5 </span> :
+<span class="lineNum"> 6 </span> : #include &lt;tagcoll/input/zlib.h&gt;
+<span class="lineNum"> 7 </span> : #include &lt;tagcoll/input/stdio.h&gt;
+<span class="lineNum"> 8 </span> :
+<span class="lineNum"> 9 </span> : #include &lt;cstdlib&gt;
+<span class="lineNum"> 10 </span> :
+<span class="lineNum"> 11 </span> : using namespace std;
+<span class="lineNum"> 12 </span> : using namespace wibble;
+<span class="lineNum"> 13 </span> :
+<span class="lineNum"> 14 </span> : namespace ept {
+<span class="lineNum"> 15 </span> : namespace popcon {
+<span class="lineNum"> 16 </span> :
+<span class="lineNum"> 17 </span><span class="lineCov"> 93 : SourceDir::FileType SourceDir::fileType(const std::string&amp; name)</span>
+<span class="lineNum"> 18 </span> : {
+<span class="lineNum"> 19 </span><span class="lineCov"> 93 : if (name[0] == '.') return SKIP;</span>
+<span class="lineNum"> 20 </span> :
+<span class="lineNum"> 21 </span><span class="lineCov"> 59 : if (name == &quot;all-popcon-results.txt&quot;) return RAW;</span>
+<span class="lineNum"> 22 </span><span class="lineCov"> 59 : if (name == &quot;all-popcon-results.txt.gz&quot;) return RAWGZ;</span>
+<span class="lineNum"> 23 </span> :
+<span class="lineNum"> 24 </span><span class="lineCov"> 46 : return SKIP;</span>
+<span class="lineNum"> 25 </span> : }
+<span class="lineNum"> 26 </span> :
+<span class="lineNum"> 27 </span><span class="lineCov"> 14 : time_t SourceDir::timestamp()</span>
+<span class="lineNum"> 28 </span> : {
+<span class="lineNum"> 29 </span><span class="lineCov"> 14 : if (!valid()) return 0;</span>
+<span class="lineNum"> 30 </span> :
+<span class="lineNum"> 31 </span><span class="lineCov"> 14 : time_t max = 0;</span>
+<span class="lineNum"> 32 </span><span class="lineCov"> 98 : for (const_iterator d = begin(); d != end(); ++d)</span>
+<span class="lineNum"> 33 </span> : {
+<span class="lineNum"> 34 </span><span class="lineCov"> 84 : FileType type = fileType(d-&gt;d_name);</span>
+<span class="lineNum"> 35 </span><span class="lineCov"> 84 : if (type == SKIP) continue;</span>
+<span class="lineNum"> 36 </span> :
+<span class="lineNum"> 37 </span><span class="lineCov"> 12 : time_t ts = Path::timestamp(str::joinpath(path(), d-&gt;d_name));</span>
+<span class="lineNum"> 38 </span><span class="lineCov"> 24 : if (ts &gt; max) max = ts;</span>
+<span class="lineNum"> 39 </span><span class="lineCov"> 14 : }</span>
+<span class="lineNum"> 40 </span> :
+<span class="lineNum"> 41 </span><span class="lineCov"> 14 : return max;</span>
+<span class="lineNum"> 42 </span> : }
+<span class="lineNum"> 43 </span> :
+<span class="lineNum"> 44 </span><span class="lineCov"> 70200 : bool readLine(tagcoll::input::Input&amp; in, string&amp; str)</span>
+<span class="lineNum"> 45 </span> : {
+<span class="lineNum"> 46 </span><span class="lineCov"> 70200 : str.clear();</span>
+<span class="lineNum"> 47 </span> : int c;
+<span class="lineNum"> 48 </span><span class="lineCov"> 4594913 : while ((c = in.nextChar()) != tagcoll::input::Input::Eof &amp;&amp; c != '\n')</span>
+<span class="lineNum"> 49 </span><span class="lineCov"> 4454513 : str += c;</span>
+<span class="lineNum"> 50 </span><span class="lineCov"> 70200 : return c != tagcoll::input::Input::Eof;</span>
+<span class="lineNum"> 51 </span> : }
+<span class="lineNum"> 52 </span> :
+<span class="lineNum"> 53 </span><span class="lineCov"> 1 : static void parseScores(tagcoll::input::Input&amp; in, map&lt;std::string, Score&gt;&amp; out, size_t&amp; submissions)</span>
+<span class="lineNum"> 54 </span> : {
+<span class="lineNum"> 55 </span><span class="lineCov"> 1 : string line;</span>
+<span class="lineNum"> 56 </span><span class="lineCov"> 140349 : while (readLine(in, line))</span>
+<span class="lineNum"> 57 </span> : {
+<span class="lineNum"> 58 </span><span class="lineCov"> 70199 : if (line.size() &lt; 10)</span>
+<span class="lineNum"> 59 </span><span class="lineNoCov"> 0 : continue;</span>
+<span class="lineNum"> 60 </span><span class="lineCov"> 70199 : if (line.substr(0, 13) == &quot;Submissions: &quot;)</span>
+<span class="lineNum"> 61 </span> : {
+<span class="lineNum"> 62 </span><span class="lineCov"> 1 : submissions = strtoul(line.substr(13).c_str(), 0, 10);</span>
+<span class="lineNum"> 63 </span><span class="lineCov"> 1 : continue;</span>
+<span class="lineNum"> 64 </span> : }
+<span class="lineNum"> 65 </span><span class="lineCov"> 70198 : if (line.substr(0, 9) != &quot;Package: &quot;)</span>
+<span class="lineNum"> 66 </span><span class="lineCov"> 50 : continue;</span>
+<span class="lineNum"> 67 </span><span class="lineCov"> 70148 : size_t start = 9;</span>
+<span class="lineNum"> 68 </span><span class="lineCov"> 70148 : size_t end = line.find(' ', start);</span>
+<span class="lineNum"> 69 </span><span class="lineCov"> 70148 : if (end == string::npos)</span>
+<span class="lineNum"> 70 </span><span class="lineNoCov"> 0 : continue;</span>
+<span class="lineNum"> 71 </span><span class="lineCov"> 70148 : string name = line.substr(start, end-start);</span>
+<span class="lineNum"> 72 </span> : // Skip packages not in the apt index
+<span class="lineNum"> 73 </span> : //if (!apt.isValid(name))
+<span class="lineNum"> 74 </span> : //continue;
+<span class="lineNum"> 75 </span> :
+<span class="lineNum"> 76 </span><span class="lineCov"> 70148 : start = line.find_first_not_of(' ', end);</span>
+<span class="lineNum"> 77 </span><span class="lineCov"> 70148 : if (start == string::npos) continue;</span>
+<span class="lineNum"> 78 </span><span class="lineCov"> 70148 : end = line.find(' ', start);</span>
+<span class="lineNum"> 79 </span><span class="lineCov"> 70148 : if (end == string::npos) continue;</span>
+<span class="lineNum"> 80 </span><span class="lineCov"> 70148 : string vote = line.substr(start, end-start);</span>
+<span class="lineNum"> 81 </span> :
+<span class="lineNum"> 82 </span><span class="lineCov"> 70148 : start = line.find_first_not_of(' ', end);</span>
+<span class="lineNum"> 83 </span><span class="lineCov"> 70148 : if (start == string::npos) continue;</span>
+<span class="lineNum"> 84 </span><span class="lineCov"> 70148 : end = line.find(' ', start);</span>
+<span class="lineNum"> 85 </span><span class="lineCov"> 70148 : if (end == string::npos) continue;</span>
+<span class="lineNum"> 86 </span><span class="lineCov"> 70148 : string old = line.substr(start, end-start);</span>
+<span class="lineNum"> 87 </span> :
+<span class="lineNum"> 88 </span><span class="lineCov"> 70148 : start = line.find_first_not_of(' ', end);</span>
+<span class="lineNum"> 89 </span><span class="lineCov"> 70148 : if (start == string::npos) continue;</span>
+<span class="lineNum"> 90 </span><span class="lineCov"> 70148 : end = line.find(' ', start);</span>
+<span class="lineNum"> 91 </span><span class="lineCov"> 70148 : if (end == string::npos) continue;</span>
+<span class="lineNum"> 92 </span><span class="lineCov"> 70148 : string recent = line.substr(start, end-start);</span>
+<span class="lineNum"> 93 </span> :
+<span class="lineNum"> 94 </span><span class="lineCov"> 70148 : start = line.find_first_not_of(' ', end);</span>
+<span class="lineNum"> 95 </span><span class="lineCov"> 70148 : if (start == string::npos) continue;</span>
+<span class="lineNum"> 96 </span><span class="lineCov"> 70148 : end = line.find(' ', start);</span>
+<span class="lineNum"> 97 </span><span class="lineCov"> 70148 : if (end == string::npos) end = line.size();</span>
+<span class="lineNum"> 98 </span><span class="lineCov"> 70148 : string nofiles = line.substr(start, end-start);</span>
+<span class="lineNum"> 99 </span> :
+<span class="lineNum"> 100 </span> : float score = (float)strtoul(vote.c_str(), NULL, 10)
+<span class="lineNum"> 101 </span> : + (float)strtoul(recent.c_str(), NULL, 10) * 0.5f
+<span class="lineNum"> 102 </span> : + (float)strtoul(old.c_str(), NULL, 10) * 0.3f
+<span class="lineNum"> 103 </span><span class="lineCov"> 70148 : + (float)strtoul(nofiles.c_str(), NULL, 10) * 0.8f;</span>
+<span class="lineNum"> 104 </span> :
+<span class="lineNum"> 105 </span><span class="lineCov"> 70148 : if (score &gt; 0)</span>
+<span class="lineNum"> 106 </span><span class="lineCov"> 69910 : out.insert(make_pair(name, Score(score)));</span>
+<span class="lineNum"> 107 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 108 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 109 </span> :
+<span class="lineNum"> 110 </span><span class="lineCov"> 3 : bool SourceDir::readScores(map&lt;std::string, Score&gt;&amp; out, size_t&amp; submissions)</span>
+<span class="lineNum"> 111 </span> : {
+<span class="lineNum"> 112 </span><span class="lineCov"> 3 : if (!valid()) return false;</span>
+<span class="lineNum"> 113 </span><span class="lineCov"> 3 : bool done = false;</span>
+<span class="lineNum"> 114 </span> :
+<span class="lineNum"> 115 </span><span class="lineCov"> 12 : for (const_iterator d = begin(); d != end(); ++d)</span>
+<span class="lineNum"> 116 </span> : {
+<span class="lineNum"> 117 </span><span class="lineCov"> 9 : FileType type = fileType(d-&gt;d_name);</span>
+<span class="lineNum"> 118 </span><span class="lineCov"> 9 : if (type == RAW)</span>
+<span class="lineNum"> 119 </span> : {
+<span class="lineNum"> 120 </span> : // Read uncompressed data
+<span class="lineNum"> 121 </span><span class="lineNoCov"> 0 : tagcoll::input::Stdio in(str::joinpath(path(), d-&gt;d_name));</span>
+<span class="lineNum"> 122 </span> :
+<span class="lineNum"> 123 </span> : // Read the scores
+<span class="lineNum"> 124 </span><span class="lineNoCov"> 0 : parseScores(in, out, submissions);</span>
+<span class="lineNum"> 125 </span><span class="lineNoCov"> 0 : done = true;</span>
+<span class="lineNum"> 126 </span> : }
+<span class="lineNum"> 127 </span><span class="lineCov"> 9 : else if (type == RAWGZ)</span>
+<span class="lineNum"> 128 </span> : {
+<span class="lineNum"> 129 </span> : // Read compressed data
+<span class="lineNum"> 130 </span><span class="lineCov"> 1 : tagcoll::input::Zlib in(str::joinpath(path(), d-&gt;d_name));</span>
+<span class="lineNum"> 131 </span> :
+<span class="lineNum"> 132 </span> : // Read the scores
+<span class="lineNum"> 133 </span><span class="lineCov"> 1 : parseScores(in, out, submissions);</span>
+<span class="lineNum"> 134 </span><span class="lineCov"> 1 : done = true;</span>
+<span class="lineNum"> 135 </span> : }
+<span class="lineNum"> 136 </span><span class="lineCov"> 3 : }</span>
+<span class="lineNum"> 137 </span><span class="lineCov"> 3 : return done;</span>
+<span class="lineNum"> 138 </span> : }
+<span class="lineNum"> 139 </span> :
+<span class="lineNum"> 140 </span> : }
+<span class="lineNum"> 141 </span><span class="lineCov"> 6 : }</span>
+<span class="lineNum"> 142 </span> :
+<span class="lineNum"> 143 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/maint/sourcedir.h.gcov.html b/rep/ept/popcon/maint/sourcedir.h.gcov.html
new file mode 100644
index 0000000..56c0640
--- /dev/null
+++ b/rep/ept/popcon/maint/sourcedir.h.gcov.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/maint/sourcedir.h</title>
+ <link rel="stylesheet" type="text/css" href="../../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../../index.html">directory</a> - <a href="index.html">ept/popcon/maint</a> - sourcedir.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">2</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">100.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">2</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : #ifndef EPT_POPCON_SOURCEDIR_H
+<span class="lineNum"> 2 </span> : #define EPT_POPCON_SOURCEDIR_H
+<span class="lineNum"> 3 </span> :
+<span class="lineNum"> 4 </span> : /** @file
+<span class="lineNum"> 5 </span> : * @author Enrico Zini &lt;enrico@enricozini.org&gt;
+<span class="lineNum"> 6 </span> : * Popcon data source directory access
+<span class="lineNum"> 7 </span> : */
+<span class="lineNum"> 8 </span> :
+<span class="lineNum"> 9 </span> : /*
+<span class="lineNum"> 10 </span> : * Copyright (C) 2003,2004,2005,2006,2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 11 </span> : *
+<span class="lineNum"> 12 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 13 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 14 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 15 </span> : * (at your option) any later version.
+<span class="lineNum"> 16 </span> : *
+<span class="lineNum"> 17 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 18 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 19 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 20 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 21 </span> : *
+<span class="lineNum"> 22 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 23 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 24 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 25 </span> : */
+<span class="lineNum"> 26 </span> :
+<span class="lineNum"> 27 </span> : #include &lt;ept/popcon/popcon.h&gt;
+<span class="lineNum"> 28 </span> : #include &lt;wibble/sys/fs.h&gt;
+<span class="lineNum"> 29 </span> : #include &lt;string&gt;
+<span class="lineNum"> 30 </span> : #include &lt;map&gt;
+<span class="lineNum"> 31 </span> :
+<span class="lineNum"> 32 </span> : namespace ept {
+<span class="lineNum"> 33 </span> : namespace popcon {
+<span class="lineNum"> 34 </span> :
+<span class="lineNum"> 35 </span> : /**
+<span class="lineNum"> 36 </span> : * Access a directory containing Debtags data files
+<span class="lineNum"> 37 </span> : */
+<span class="lineNum"> 38 </span> : class SourceDir : public wibble::sys::fs::Directory
+<span class="lineNum"> 39 </span><span class="lineCov"> 14 : {</span>
+<span class="lineNum"> 40 </span> : protected:
+<span class="lineNum"> 41 </span> : enum FileType { SKIP, RAW, RAWGZ };
+<span class="lineNum"> 42 </span> :
+<span class="lineNum"> 43 </span> : // Check if a file name is a tag file, a vocabulary file or a file to skip.
+<span class="lineNum"> 44 </span> : // Please notice that it works on file names, not paths.
+<span class="lineNum"> 45 </span> : FileType fileType(const std::string&amp; name);
+<span class="lineNum"> 46 </span> :
+<span class="lineNum"> 47 </span> : public:
+<span class="lineNum"> 48 </span><span class="lineCov"> 14 : SourceDir(const std::string&amp; path) : Directory(path) {}</span>
+<span class="lineNum"> 49 </span> :
+<span class="lineNum"> 50 </span> : /// Return the time of the newest file in the source directory
+<span class="lineNum"> 51 </span> : time_t timestamp();
+<span class="lineNum"> 52 </span> :
+<span class="lineNum"> 53 </span> : /**
+<span class="lineNum"> 54 </span> : * Read the tag files in the directory and output their content to the map
+<span class="lineNum"> 55 </span> : */
+<span class="lineNum"> 56 </span> : bool readScores(std::map&lt;std::string, Score&gt;&amp; out, size_t&amp; submissions);
+<span class="lineNum"> 57 </span> : };
+<span class="lineNum"> 58 </span> :
+<span class="lineNum"> 59 </span> : }
+<span class="lineNum"> 60 </span> : }
+<span class="lineNum"> 61 </span> :
+<span class="lineNum"> 62 </span> : // vim:set ts=4 sw=4:
+<span class="lineNum"> 63 </span> : #endif
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/popcon.cc.gcov.html b/rep/ept/popcon/popcon.cc.gcov.html
new file mode 100644
index 0000000..f38fb61
--- /dev/null
+++ b/rep/ept/popcon/popcon.cc.gcov.html
@@ -0,0 +1,162 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/popcon.cc</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - <a href="index.html">ept/popcon</a> - popcon.cc</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">23</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">95.7 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">22</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : // -*- mode: c++; tab-width: 4; indent-tabs-mode: t -*-
+<span class="lineNum"> 2 </span> :
+<span class="lineNum"> 3 </span> : /** @file
+<span class="lineNum"> 4 </span> : * @author Enrico Zini &lt;enrico@enricozini.org&gt;
+<span class="lineNum"> 5 </span> : * Quick map from package IDs to package names
+<span class="lineNum"> 6 </span> : */
+<span class="lineNum"> 7 </span> :
+<span class="lineNum"> 8 </span> : /*
+<span class="lineNum"> 9 </span> : * Copyright (C) 2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 10 </span> : *
+<span class="lineNum"> 11 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 12 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 13 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 14 </span> : * (at your option) any later version.
+<span class="lineNum"> 15 </span> : *
+<span class="lineNum"> 16 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 17 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 18 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 19 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 20 </span> : *
+<span class="lineNum"> 21 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 22 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 23 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 24 </span> : */
+<span class="lineNum"> 25 </span> :
+<span class="lineNum"> 26 </span> : #include &lt;ept/popcon/popcon.h&gt;
+<span class="lineNum"> 27 </span> : #include &lt;ept/popcon/maint/popconindexer.h&gt;
+<span class="lineNum"> 28 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 29 </span> :
+<span class="lineNum"> 30 </span> : //#include &lt;iostream&gt;
+<span class="lineNum"> 31 </span> :
+<span class="lineNum"> 32 </span> : using namespace std;
+<span class="lineNum"> 33 </span> :
+<span class="lineNum"> 34 </span> : namespace ept {
+<span class="lineNum"> 35 </span> : namespace popcon {
+<span class="lineNum"> 36 </span> :
+<span class="lineNum"> 37 </span><span class="lineCov"> 3 : size_t Popcon::GeneralInfo::submissions() const</span>
+<span class="lineNum"> 38 </span> : {
+<span class="lineNum"> 39 </span><span class="lineCov"> 3 : if (!m_buf) return 0;</span>
+<span class="lineNum"> 40 </span><span class="lineCov"> 2 : return ((InfoStruct*)m_buf)-&gt;submissions;</span>
+<span class="lineNum"> 41 </span> : }
+<span class="lineNum"> 42 </span> :
+<span class="lineNum"> 43 </span><span class="lineCov"> 7 : Popcon::Popcon()</span>
+<span class="lineNum"> 44 </span> : {
+<span class="lineNum"> 45 </span><span class="lineCov"> 7 : std::string scofname, idxfname;</span>
+<span class="lineNum"> 46 </span> :
+<span class="lineNum"> 47 </span><span class="lineCov"> 7 : if (!PopconIndexer::obtainWorkingPopcon(scofname, idxfname))</span>
+<span class="lineNum"> 48 </span> : {
+<span class="lineNum"> 49 </span><span class="lineCov"> 1 : m_timestamp = 0;</span>
+<span class="lineNum"> 50 </span><span class="lineCov"> 1 : return;</span>
+<span class="lineNum"> 51 </span> : }
+<span class="lineNum"> 52 </span> :
+<span class="lineNum"> 53 </span> : //cerr &lt;&lt; &quot;GOT &quot; &lt;&lt; scofname &lt;&lt; &quot; &quot; &lt;&lt; idxfname &lt;&lt; endl;
+<span class="lineNum"> 54 </span> :
+<span class="lineNum"> 55 </span><span class="lineCov"> 6 : m_timestamp = Path::timestamp(idxfname);</span>
+<span class="lineNum"> 56 </span> :
+<span class="lineNum"> 57 </span><span class="lineCov"> 6 : mastermmap.init(idxfname);</span>
+<span class="lineNum"> 58 </span><span class="lineCov"> 6 : tagcoll::diskindex::MMap::init(mastermmap, 0);</span>
+<span class="lineNum"> 59 </span> :
+<span class="lineNum"> 60 </span><span class="lineCov"> 6 : m_info.init(mastermmap, 1);</span>
+<span class="lineNum"> 61 </span> :
+<span class="lineNum"> 62 </span> : //cerr &lt;&lt; &quot;SIZE &quot; &lt;&lt; size() &lt;&lt; endl;
+<span class="lineNum"> 63 </span> : //for (size_t i = 0; i &lt; size(); ++i)
+<span class="lineNum"> 64 </span> : //{
+<span class="lineNum"> 65 </span> : // cerr &lt;&lt; &quot;EL &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; ((Score*)m_buf)[i].offset &lt;&lt; &quot; &quot; &lt;&lt; ((Score*)m_buf)[i].score &lt;&lt; endl;
+<span class="lineNum"> 66 </span> : //}
+<span class="lineNum"> 67 </span><span class="lineNoCov"> 0 : }</span>
+<span class="lineNum"> 68 </span> :
+<span class="lineNum"> 69 </span><span class="lineCov"> 1792 : float Popcon::scoreByName(const std::string&amp; name) const</span>
+<span class="lineNum"> 70 </span> : {
+<span class="lineNum"> 71 </span> : // Binary search the index to find the package ID
+<span class="lineNum"> 72 </span> : int begin, end;
+<span class="lineNum"> 73 </span> :
+<span class="lineNum"> 74 </span> : /* Binary search */
+<span class="lineNum"> 75 </span><span class="lineCov"> 1792 : begin = -1, end = size();</span>
+<span class="lineNum"> 76 </span><span class="lineCov"> 32470 : while (end - begin &gt; 1)</span>
+<span class="lineNum"> 77 </span> : {
+<span class="lineNum"> 78 </span><span class="lineCov"> 28886 : int cur = (end + begin) / 2;</span>
+<span class="lineNum"> 79 </span><span class="lineCov"> 28886 : if (this-&gt;name(cur) &gt; name)</span>
+<span class="lineNum"> 80 </span><span class="lineCov"> 14367 : end = cur;</span>
+<span class="lineNum"> 81 </span> : else
+<span class="lineNum"> 82 </span><span class="lineCov"> 14519 : begin = cur;</span>
+<span class="lineNum"> 83 </span> : }
+<span class="lineNum"> 84 </span> :
+<span class="lineNum"> 85 </span><span class="lineCov"> 1792 : if (begin == -1 || this-&gt;name(begin) != name)</span>
+<span class="lineNum"> 86 </span> : //throw NotFoundException(string(&quot;looking for the ID of string &quot;) + str);
+<span class="lineNum"> 87 </span><span class="lineCov"> 31 : return 0;</span>
+<span class="lineNum"> 88 </span> : else
+<span class="lineNum"> 89 </span><span class="lineCov"> 1761 : return score(begin);</span>
+<span class="lineNum"> 90 </span> : }
+<span class="lineNum"> 91 </span> :
+<span class="lineNum"> 92 </span> : }
+<span class="lineNum"> 93 </span> : }
+<span class="lineNum"> 94 </span> :
+<span class="lineNum"> 95 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/popcon.h.gcov.html b/rep/ept/popcon/popcon.h.gcov.html
new file mode 100644
index 0000000..270736f
--- /dev/null
+++ b/rep/ept/popcon/popcon.h.gcov.html
@@ -0,0 +1,220 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/popcon.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - <a href="index.html">ept/popcon</a> - popcon.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">25</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">96.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">24</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : // -*- mode: c++; tab-width: 4; indent-tabs-mode: t -*-
+<span class="lineNum"> 2 </span> : #ifndef EPT_POPCON_POPCON_H
+<span class="lineNum"> 3 </span> : #define EPT_POPCON_POPCON_H
+<span class="lineNum"> 4 </span> :
+<span class="lineNum"> 5 </span> : /** @file
+<span class="lineNum"> 6 </span> : * @author Enrico Zini &lt;enrico@enricozini.org&gt;
+<span class="lineNum"> 7 </span> : * Access popcon data
+<span class="lineNum"> 8 </span> : */
+<span class="lineNum"> 9 </span> :
+<span class="lineNum"> 10 </span> : /*
+<span class="lineNum"> 11 </span> : * Copyright (C) 2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 12 </span> : *
+<span class="lineNum"> 13 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 14 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 15 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 16 </span> : * (at your option) any later version.
+<span class="lineNum"> 17 </span> : *
+<span class="lineNum"> 18 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 19 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 20 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 21 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 22 </span> : *
+<span class="lineNum"> 23 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 24 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 25 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 26 </span> : */
+<span class="lineNum"> 27 </span> :
+<span class="lineNum"> 28 </span> : #include &lt;tagcoll/diskindex/mmap.h&gt;
+<span class="lineNum"> 29 </span> : #include &lt;string&gt;
+<span class="lineNum"> 30 </span> :
+<span class="lineNum"> 31 </span> : namespace ept {
+<span class="lineNum"> 32 </span> : namespace apt {
+<span class="lineNum"> 33 </span> : class Apt;
+<span class="lineNum"> 34 </span> : }
+<span class="lineNum"> 35 </span> :
+<span class="lineNum"> 36 </span> : namespace popcon {
+<span class="lineNum"> 37 </span> :
+<span class="lineNum"> 38 </span> : /**
+<span class="lineNum"> 39 </span> : * Store the score information in the popcon cache.
+<span class="lineNum"> 40 </span> : *
+<span class="lineNum"> 41 </span> : * Currently, this is only one float; more can be added in the future.
+<span class="lineNum"> 42 </span> : */
+<span class="lineNum"> 43 </span> : class Score
+<span class="lineNum"> 44 </span> : {
+<span class="lineNum"> 45 </span> : protected:
+<span class="lineNum"> 46 </span> : unsigned offset;
+<span class="lineNum"> 47 </span> :
+<span class="lineNum"> 48 </span> : public:
+<span class="lineNum"> 49 </span> : float score;
+<span class="lineNum"> 50 </span> :
+<span class="lineNum"> 51 </span><span class="lineCov"> 69910 : Score(float score) : offset(offset), score(score) {}</span>
+<span class="lineNum"> 52 </span> :
+<span class="lineNum"> 53 </span> : friend class Popcon;
+<span class="lineNum"> 54 </span> : friend class PopconIndexer;
+<span class="lineNum"> 55 </span> : friend class PopconGenerator;
+<span class="lineNum"> 56 </span> : };
+<span class="lineNum"> 57 </span> :
+<span class="lineNum"> 58 </span> : /**
+<span class="lineNum"> 59 </span> : * Maps Packages to IDs and vice-versa.
+<span class="lineNum"> 60 </span> : *
+<span class="lineNum"> 61 </span> : * This is used in building the Debtags fast index, which works representing
+<span class="lineNum"> 62 </span> : * tags and packages as int IDs.
+<span class="lineNum"> 63 </span> : *
+<span class="lineNum"> 64 </span> : * Index building works like this:
+<span class="lineNum"> 65 </span> : * 1. The file all-popcon-results.txt.gz is downloaded from
+<span class="lineNum"> 66 </span> : * http://popcon.debian.org/all-popcon-results.txt.gz
+<span class="lineNum"> 67 </span> : * 2. The file is put in either ~/.popcon/all-popcon-results.txt.gz
+<span class="lineNum"> 68 </span> : * or in /var/lib/popcon/all-popcon-results.txt.gz
+<span class="lineNum"> 69 </span> : * 3. If the file is newer than the index, it will be automatically used to
+<span class="lineNum"> 70 </span> : * recompute the scores and rebuild the index.
+<span class="lineNum"> 71 </span> : */
+<span class="lineNum"> 72 </span> : class Popcon : public tagcoll::diskindex::MMap
+<span class="lineNum"> 73 </span><span class="lineCov"> 7 : {</span>
+<span class="lineNum"> 74 </span> : struct GeneralInfo : public tagcoll::diskindex::MMap
+<span class="lineNum"> 75 </span><span class="lineCov"> 7 : {</span>
+<span class="lineNum"> 76 </span> : size_t submissions() const;
+<span class="lineNum"> 77 </span> : };
+<span class="lineNum"> 78 </span> :
+<span class="lineNum"> 79 </span> : tagcoll::diskindex::MasterMMap mastermmap;
+<span class="lineNum"> 80 </span> : time_t m_timestamp;
+<span class="lineNum"> 81 </span> :
+<span class="lineNum"> 82 </span> : GeneralInfo m_info;
+<span class="lineNum"> 83 </span> :
+<span class="lineNum"> 84 </span> : /// Get the score structure by index
+<span class="lineNum"> 85 </span><span class="lineCov"> 102350 : const Score* structByIndex(size_t idx) const</span>
+<span class="lineNum"> 86 </span> : {
+<span class="lineNum"> 87 </span><span class="lineCov"> 102350 : if (idx &gt;= 0 &amp;&amp; idx &lt; size())</span>
+<span class="lineNum"> 88 </span><span class="lineCov"> 102350 : return (Score*)m_buf + idx;</span>
+<span class="lineNum"> 89 </span><span class="lineNoCov"> 0 : return 0;</span>
+<span class="lineNum"> 90 </span> : }
+<span class="lineNum"> 91 </span> :
+<span class="lineNum"> 92 </span> : public:
+<span class="lineNum"> 93 </span> : Popcon();
+<span class="lineNum"> 94 </span> :
+<span class="lineNum"> 95 </span> : /// Get the timestamp of when the index was last updated
+<span class="lineNum"> 96 </span><span class="lineCov"> 1 : time_t timestamp() const { return m_timestamp; }</span>
+<span class="lineNum"> 97 </span> :
+<span class="lineNum"> 98 </span> : /// Return true if this data source has data, false if it's empty
+<span class="lineNum"> 99 </span><span class="lineCov"> 1 : bool hasData() const { return m_timestamp != 0; }</span>
+<span class="lineNum"> 100 </span> :
+<span class="lineNum"> 101 </span> : /// Return the total number of popcon submissions
+<span class="lineNum"> 102 </span><span class="lineCov"> 3 : size_t submissions() const { return m_info.submissions(); }</span>
+<span class="lineNum"> 103 </span> :
+<span class="lineNum"> 104 </span> : /// Get the number of packages in the index
+<span class="lineNum"> 105 </span><span class="lineCov"> 174055 : size_t size() const</span>
+<span class="lineNum"> 106 </span> : {
+<span class="lineNum"> 107 </span><span class="lineCov"> 174055 : if (m_buf)</span>
+<span class="lineNum"> 108 </span><span class="lineCov"> 174053 : return ((Score*)m_buf)-&gt;offset / sizeof(Score);</span>
+<span class="lineNum"> 109 </span> : else
+<span class="lineNum"> 110 </span><span class="lineCov"> 2 : return 0;</span>
+<span class="lineNum"> 111 </span> : }
+<span class="lineNum"> 112 </span> :
+<span class="lineNum"> 113 </span> : /**
+<span class="lineNum"> 114 </span> : * Get a package name by index
+<span class="lineNum"> 115 </span> : *
+<span class="lineNum"> 116 </span> : * If the index is not valid, returns the empty string.
+<span class="lineNum"> 117 </span> : */
+<span class="lineNum"> 118 </span><span class="lineCov"> 30678 : std::string name(size_t idx) const</span>
+<span class="lineNum"> 119 </span> : {
+<span class="lineNum"> 120 </span><span class="lineCov"> 30678 : const Score* s = structByIndex(idx);</span>
+<span class="lineNum"> 121 </span><span class="lineCov"> 30678 : if (s == 0) return std::string();</span>
+<span class="lineNum"> 122 </span><span class="lineCov"> 30678 : return std::string(m_buf + s-&gt;offset);</span>
+<span class="lineNum"> 123 </span> : }
+<span class="lineNum"> 124 </span> :
+<span class="lineNum"> 125 </span> : /// Get the score by index
+<span class="lineNum"> 126 </span><span class="lineCov"> 71672 : float scoreByIndex(size_t idx) const</span>
+<span class="lineNum"> 127 </span> : {
+<span class="lineNum"> 128 </span><span class="lineCov"> 71672 : const Score* s = structByIndex(idx);</span>
+<span class="lineNum"> 129 </span><span class="lineCov"> 71672 : if (!s) return 0;</span>
+<span class="lineNum"> 130 </span><span class="lineCov"> 71672 : return s-&gt;score;</span>
+<span class="lineNum"> 131 </span> : }
+<span class="lineNum"> 132 </span> :
+<span class="lineNum"> 133 </span> : /// Get the score structure by package name
+<span class="lineNum"> 134 </span> : float scoreByName(const std::string&amp; name) const;
+<span class="lineNum"> 135 </span> :
+<span class="lineNum"> 136 </span> : /// Get the score by index
+<span class="lineNum"> 137 </span><span class="lineCov"> 71672 : float score(size_t idx) const { return scoreByIndex(idx); }</span>
+<span class="lineNum"> 138 </span> :
+<span class="lineNum"> 139 </span> : /// Get the score by index
+<span class="lineNum"> 140 </span> : float operator[](int idx) const { return scoreByIndex(idx); }
+<span class="lineNum"> 141 </span> :
+<span class="lineNum"> 142 </span> : /// Get the score by name
+<span class="lineNum"> 143 </span><span class="lineCov"> 1790 : float score(const std::string&amp; name) const { return scoreByName(name); }</span>
+<span class="lineNum"> 144 </span> :
+<span class="lineNum"> 145 </span> : /// Get the score structure by package name
+<span class="lineNum"> 146 </span><span class="lineCov"> 2 : float operator[](const std::string&amp; name) const { return scoreByName(name); }</span>
+<span class="lineNum"> 147 </span> : };
+<span class="lineNum"> 148 </span> :
+<span class="lineNum"> 149 </span> : }
+<span class="lineNum"> 150 </span> : }
+<span class="lineNum"> 151 </span> :
+<span class="lineNum"> 152 </span> : // vim:set ts=4 sw=4:
+<span class="lineNum"> 153 </span> : #endif
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>
diff --git a/rep/ept/popcon/popcon.test.h.gcov.html b/rep/ept/popcon/popcon.test.h.gcov.html
new file mode 100644
index 0000000..65387fc
--- /dev/null
+++ b/rep/ept/popcon/popcon.test.h.gcov.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <title>LCOV - lcov.info - ept/popcon/popcon.test.h</title>
+ <link rel="stylesheet" type="text/css" href="../../gcov.css">
+</head>
+
+<body>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="title">LTP GCOV extension - code coverage report</td></tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+
+ <tr>
+ <td width="100%">
+ <table cellpadding=1 border=0 width="100%">
+ <tr>
+ <td class="headerItem" width="20%">Current&nbsp;view:</td>
+ <td class="headerValue" width="80%" colspan=4><a href="../../index.html">directory</a> - <a href="index.html">ept/popcon</a> - popcon.test.h</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Test:</td>
+ <td class="headerValue" width="80%" colspan=4>lcov.info</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Date:</td>
+ <td class="headerValue" width="20%">2008-08-14</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Instrumented&nbsp;lines:</td>
+ <td class="headerValue" width="20%">38</td>
+ </tr>
+ <tr>
+ <td class="headerItem" width="20%">Code&nbsp;covered:</td>
+ <td class="headerValue" width="20%">100.0 %</td>
+ <td width="20%"></td>
+ <td class="headerItem" width="20%">Executed&nbsp;lines:</td>
+ <td class="headerValue" width="20%">38</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ </table>
+
+ <table cellpadding=0 cellspacing=0 border=0>
+ <tr>
+ <td><br></td>
+ </tr>
+ <tr>
+ <td><pre class="source">
+<span class="lineNum"> 1 </span> : // -*- mode: c++; tab-width: 4; indent-tabs-mode: t -*-
+<span class="lineNum"> 2 </span> : /*
+<span class="lineNum"> 3 </span> : * popcon test
+<span class="lineNum"> 4 </span> : *
+<span class="lineNum"> 5 </span> : * Copyright (C) 2007 Enrico Zini &lt;enrico@debian.org&gt;
+<span class="lineNum"> 6 </span> : *
+<span class="lineNum"> 7 </span> : * This program is free software; you can redistribute it and/or modify
+<span class="lineNum"> 8 </span> : * it under the terms of the GNU General Public License as published by
+<span class="lineNum"> 9 </span> : * the Free Software Foundation; either version 2 of the License, or
+<span class="lineNum"> 10 </span> : * (at your option) any later version.
+<span class="lineNum"> 11 </span> : *
+<span class="lineNum"> 12 </span> : * This program is distributed in the hope that it will be useful,
+<span class="lineNum"> 13 </span> : * but WITHOUT ANY WARRANTY; without even the implied warranty of
+<span class="lineNum"> 14 </span> : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+<span class="lineNum"> 15 </span> : * GNU General Public License for more details.
+<span class="lineNum"> 16 </span> : *
+<span class="lineNum"> 17 </span> : * You should have received a copy of the GNU General Public License
+<span class="lineNum"> 18 </span> : * along with this program; if not, write to the Free Software
+<span class="lineNum"> 19 </span> : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+<span class="lineNum"> 20 </span> : */
+<span class="lineNum"> 21 </span> :
+<span class="lineNum"> 22 </span> : #include &lt;ept/popcon/popcon.h&gt;
+<span class="lineNum"> 23 </span> : #include &lt;ept/popcon/maint/path.h&gt;
+<span class="lineNum"> 24 </span> : #include &lt;ept/apt/apt.h&gt;
+<span class="lineNum"> 25 </span> : #include &lt;set&gt;
+<span class="lineNum"> 26 </span> :
+<span class="lineNum"> 27 </span> : #include &lt;ept/test.h&gt;
+<span class="lineNum"> 28 </span> :
+<span class="lineNum"> 29 </span> : using namespace std;
+<span class="lineNum"> 30 </span> : using namespace ept;
+<span class="lineNum"> 31 </span> : using namespace ept::popcon;
+<span class="lineNum"> 32 </span> : using namespace ept::apt;
+<span class="lineNum"> 33 </span> :
+<span class="lineNum"> 34 </span> : struct TestPopcon
+<span class="lineNum"> 35 </span><span class="lineCov"> 5 : {</span>
+<span class="lineNum"> 36 </span> : popcon::Path::OverridePopconSourceDir odsd;
+<span class="lineNum"> 37 </span> : popcon::Path::OverridePopconIndexDir odid;
+<span class="lineNum"> 38 </span> : popcon::Path::OverridePopconUserSourceDir odusd;
+<span class="lineNum"> 39 </span> : popcon::Path::OverridePopconUserIndexDir oduid;
+<span class="lineNum"> 40 </span> :
+<span class="lineNum"> 41 </span> : Apt apt;
+<span class="lineNum"> 42 </span> : Popcon popcon;
+<span class="lineNum"> 43 </span> :
+<span class="lineNum"> 44 </span><span class="lineCov"> 5 : TestPopcon()</span>
+<span class="lineNum"> 45 </span> : : odsd( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 46 </span> : odid( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 47 </span> : odusd( TEST_ENV_DIR &quot;popcon&quot; ),
+<span class="lineNum"> 48 </span><span class="lineCov"> 5 : oduid( TEST_ENV_DIR &quot;popcon&quot; )</span>
+<span class="lineNum"> 49 </span><span class="lineCov"> 5 : {}</span>
+<span class="lineNum"> 50 </span> :
+<span class="lineNum"> 51 </span><span class="lineCov"> 1 : Test basicAccess()</span>
+<span class="lineNum"> 52 </span> : {
+<span class="lineNum"> 53 </span><span class="lineCov"> 1 : assert_eq(popcon.submissions(), 52024);</span>
+<span class="lineNum"> 54 </span><span class="lineCov"> 2 : assert(popcon.size() &gt; 0);</span>
+<span class="lineNum"> 55 </span><span class="lineCov"> 2 : assert(popcon.score(0) &gt; 0);</span>
+<span class="lineNum"> 56 </span><span class="lineCov"> 2 : assert(!popcon.name(0).empty());</span>
+<span class="lineNum"> 57 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 58 </span> :
+<span class="lineNum"> 59 </span> : // Check that every valid index is accessible
+<span class="lineNum"> 60 </span><span class="lineCov"> 1 : Test accessibility()</span>
+<span class="lineNum"> 61 </span> : {
+<span class="lineNum"> 62 </span><span class="lineCov"> 139822 : for (size_t i = 0; i &lt; popcon.size(); ++i)</span>
+<span class="lineNum"> 63 </span> : {
+<span class="lineNum"> 64 </span> : //cerr &lt;&lt; popcon.name(i) &lt;&lt; &quot; &quot; &lt;&lt; popcon.score(i) &lt;&lt; endl;
+<span class="lineNum"> 65 </span><span class="lineCov"> 69910 : assert(popcon.score(i) &gt; 0);</span>
+<span class="lineNum"> 66 </span> : }
+<span class="lineNum"> 67 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 68 </span> :
+<span class="lineNum"> 69 </span> : // Check that we can get a score for every package
+<span class="lineNum"> 70 </span><span class="lineCov"> 1 : Test haveScores()</span>
+<span class="lineNum"> 71 </span> : {
+<span class="lineNum"> 72 </span><span class="lineCov"> 1 : int has = 0;</span>
+<span class="lineNum"> 73 </span><span class="lineCov"> 1789 : for (Apt::iterator i = apt.begin(); i != apt.end(); ++i)</span>
+<span class="lineNum"> 74 </span> : {
+<span class="lineNum"> 75 </span><span class="lineCov"> 1788 : float score = popcon.score(*i);</span>
+<span class="lineNum"> 76 </span><span class="lineCov"> 1788 : if (score &gt; 0)</span>
+<span class="lineNum"> 77 </span><span class="lineCov"> 1758 : ++has;</span>
+<span class="lineNum"> 78 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 79 </span> : // At least 1000 packages should have a score
+<span class="lineNum"> 80 </span><span class="lineCov"> 2 : assert(has &gt; 1000);</span>
+<span class="lineNum"> 81 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 82 </span> :
+<span class="lineNum"> 83 </span> : // Check that scores are meaningful
+<span class="lineNum"> 84 </span><span class="lineCov"> 1 : Test validScores()</span>
+<span class="lineNum"> 85 </span> : {
+<span class="lineNum"> 86 </span><span class="lineCov"> 1 : assert(popcon[&quot;apt&quot;] &gt; popcon[&quot;libapt-pkg-dev&quot;]);</span>
+<span class="lineNum"> 87 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 88 </span> :
+<span class="lineNum"> 89 </span> : // If there is no data, Popcon should work as if all scores were 0
+<span class="lineNum"> 90 </span><span class="lineCov"> 1 : Test fallbackValues()</span>
+<span class="lineNum"> 91 </span> : {
+<span class="lineNum"> 92 </span><span class="lineCov"> 1 : popcon::Path::OverridePopconSourceDir odsd(&quot;./empty&quot;);</span>
+<span class="lineNum"> 93 </span><span class="lineCov"> 2 : popcon::Path::OverridePopconIndexDir odid(&quot;./empty&quot;);</span>
+<span class="lineNum"> 94 </span><span class="lineCov"> 2 : popcon::Path::OverridePopconUserSourceDir odusd(&quot;./empty&quot;);</span>
+<span class="lineNum"> 95 </span><span class="lineCov"> 2 : popcon::Path::OverridePopconUserIndexDir oduid(&quot;./empty&quot;);</span>
+<span class="lineNum"> 96 </span><span class="lineCov"> 1 : Popcon empty;</span>
+<span class="lineNum"> 97 </span> :
+<span class="lineNum"> 98 </span><span class="lineCov"> 1 : assert_eq(empty.timestamp(), 0);</span>
+<span class="lineNum"> 99 </span><span class="lineCov"> 2 : assert(!empty.hasData());</span>
+<span class="lineNum"> 100 </span> :
+<span class="lineNum"> 101 </span><span class="lineCov"> 2 : assert_eq(empty.submissions(), 0);</span>
+<span class="lineNum"> 102 </span><span class="lineCov"> 2 : assert(empty.size() == 0);</span>
+<span class="lineNum"> 103 </span><span class="lineCov"> 2 : assert(empty.score(&quot;apt&quot;) == 0.0);</span>
+<span class="lineNum"> 104 </span><span class="lineCov"> 1 : }</span>
+<span class="lineNum"> 105 </span> :
+<span class="lineNum"> 106 </span> : };
+<span class="lineNum"> 107 </span> :
+<span class="lineNum"> 108 </span> : // vim:set ts=4 sw=4:
+</pre>
+ </td>
+ </tr>
+ </table>
+ <br>
+
+ <table width="100%" border=0 cellspacing=0 cellpadding=0>
+ <tr><td class="ruler"><img src="../../glass.png" width=3 height=3 alt=""></td></tr>
+ <tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LTP GCOV extension version 1.6</a></td></tr>
+ </table>
+ <br>
+
+</body>
+</html>