]> piware.de Git - bin.git/blob - mirror-orphans
initial checkin
[bin.git] / mirror-orphans
1 #!/usr/bin/python
2
3 import os, os.path, gzip, sys
4
5 mirrordir = '/mirror'
6
7 def get_package_versions_file(f, map):
8     currpkg = None
9     currversion = None
10
11     for line in gzip.open(f):
12         line = line.strip()
13         if not line:
14             if (not currpkg) or (not currversion):
15                 print >> sys.stderr, "Error: end of package record without all data available"
16                 sys.exit(1)
17             map.setdefault(currpkg, []).append(currversion)
18             currpkg = None
19             currversion = None
20             continue
21
22         attr = line.split(":", 1)
23
24         if len(attr) < 2:
25             continue
26
27         if attr[0] == "Package":
28             if currpkg:
29                 print >> sys.stderr, "Error: read two Packages: lines in a row"
30                 sys.exit(1)
31             currpkg = attr[1].strip()
32
33         if attr[0] == "Version":
34             if currversion:
35                 print >> sys.stderr, "Error: read two Version: lines in a row"
36                 sys.exit(1)
37             currversion = attr[1].strip()
38             # remove epochs
39             colpos = currversion.find(':')
40             if colpos >= 0:
41                 currversion = currversion[colpos+1:]
42
43 def get_package_versions_tree(rootdir):
44     """Generate a archive map from a Debian-style package archive directory.
45
46     rootdir: path to archive root path
47     return: mapping: sourcepackage -> [versions]
48     """
49
50     map = {}
51
52     for release in os.listdir(rootdir + "/dists"):
53         for comp in os.listdir(rootdir + "/dists/" + release):
54             compdir = rootdir + "/dists/" + release + "/" + comp
55             if not os.path.isdir(compdir):
56                 continue
57             get_package_versions_file(compdir + "/source/Sources.gz", map)
58             for arch in os.listdir(compdir):
59                 if arch.startswith('binary-'):
60                     get_package_versions_file(compdir + '/' + arch + '/Packages.gz', map)
61
62     return map
63
64 known_versions = get_package_versions_tree(mirrordir)
65
66 for path, dirs, files in os.walk(os.path.join(mirrordir, 'pool')):
67     for f in files:
68         (pkg, version) = (f.split('_'))[0:2]
69         if f.endswith('.deb'):
70             pass
71         elif f.endswith('.dsc'):
72             version = version[:-4]
73         elif f.endswith('.diff.gz'):
74             version = version[:-8]
75         elif f.endswith('.tar.gz'):
76             continue
77         else:
78             print os.path.join(path, f)
79             continue
80
81         if not version in known_versions.get(pkg, ()):
82             print os.path.join(path, f)
83