add a validate method to HashedStream
[~helmut/debian-dedup.git] / README
1 Required packages
2 -----------------
3
4     aptitude install python python-debian python-lzma curl python-jinja2 python-werkzeug sqlite3 python-imaging python-yaml python-concurrent.futures python-pkg-resources
5
6 Create a database
7 -----------------
8 The database name is currently hardcoded as `test.sqlite3`. So copy the SQL
9 statements from `schema.sql` into `sqlite3 test.sqlite3`. In addition it is
10 highly recommended to put the database into WAL mode. Otherwise all your
11 reading queries will block forever when doing an import. This setting is
12 permanent.
13
14     PRAGMA journal_mode = WAL;
15
16 Import packages
17 ---------------
18 Import individual packages by feeding them to importpkg.py and readyaml.py:
19
20     ./importpkg.py < somepkg.deb | ./readyaml.py
21
22 You can import your local apt cache:
23
24     ./autoimport.py /var/cache/apt/archives
25
26 Import a full mirror (only http supported):
27
28     ./autoimport.py -n -p http://your.mirror.example/debian
29
30 After changing the database, a few tables caching expensive computations need
31 to be (re)generated. Execute `./update_sharing.py`. Without this step the web
32 interface will report wrong results.
33
34 Viewing the results
35 -------------------
36 Run `./webapp.py` and enjoy a webinterface at `0.0.0.0:8800` or inspect the
37 SQL database by hand. Here are some example queries.
38
39 Finding the 100 largest files shared with multiple packages.
40
41     SELECT pa.name, a.filename, pb.name, b.filename, a.size FROM content AS a JOIN hash AS ha ON a.id = ha.cid JOIN hash AS hb ON ha.hash = hb.hash JOIN content AS b ON b.id = hb.cid JOIN package AS pa ON a.pid = pa.id JOIN package AS pb ON b.pid = pb.id WHERE (a.pid != b.pid OR a.filename != b.filename) ORDER BY a.size DESC LIMIT 100;
42
43 Finding those top 100 files that save most space when being reduced to only
44 one copy in the archive.
45
46     SELECT hash, sum(size)-min(size), count(*), count(distinct pid) FROM content JOIN hash ON content.id = hash.cid JOIN function ON hash.fid = function.id WHERE function.name = "sha512" GROUP BY hash ORDER BY sum(size)-min(size) DESC LIMIT 100;
47
48 Finding PNG images that do not carry a .png file extension.
49
50     SELECT package.name, content.filename, content.size FROM content JOIN hash ON content.id = hash.cid JOIN package ON content.pid = package.id JOIN function ON hash.fid = function.id WHERE function.name = "png_sha512" AND lower(filename) NOT LIKE "%.png";
51
52 Finding .gz files which either are not gziped or contain errors.
53
54     SELECT package.name, content.filename FROM content JOIN package ON content.pid = package.id WHERE filename LIKE "%.gz" AND (SELECT count(*) FROM hash JOIN function ON hash.fid = function.id WHERE hash.cid = content.id AND function.name = "gzip_sha512") = 0;