2 # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
3 # vi: set ft=python sts=4 ts=4 sw=4 et:
8 from datetime import datetime
15 'etch': 'Debian GNU/Linux 4.0 (etch)',
16 'lenny': 'Debian GNU/Linux 5.0 (lenny)',
17 'squeeze': 'Debian GNU/Linux 6.0 (squeeze)',
18 'wheezy': 'Debian GNU/Linux 7.0 (wheezy)',
19 'jessie': 'Debian testing (jessie)',
20 'sid': 'Debian unstable (sid)',
21 'hardy': 'Ubuntu 08.04 LTS "Hardy Heron" (hardy)',
22 'jaunty': 'Ubuntu 09.04 "Jaunty Jackalope" (jaunty)',
23 'karmic': 'Ubuntu 09.10 "Karmic Koala" (karmic)',
24 'lucid': 'Ubuntu 10.04 LTS "Lucid Lynx" (lucid)',
25 'maverick': 'Ubuntu 10.10 "Maverick Meerkat" (maverick)',
26 'natty': 'Ubuntu 11.04 "Natty Narwhal" (natty)',
27 'oneiric': 'Ubuntu 11.10 "Oneiric Ocelot" (oneiric)',
28 'precise': 'Ubuntu 12.04 LTS "Precise Pangolin" (precise)',
29 'quantal': 'Ubuntu 12.10 "Quantal Quetzal" (quantal)',
30 'raring': 'Ubuntu 13.04 "Raring Ringtail" (raring)',
31 'saucy': 'Ubuntu 13.10 "Saucy Salamander" (saucy)',
32 'trusty': 'Ubuntu 14.04 LTS "Trusty Tahr" (trusty)',
36 sys.stderr.write('E: %s\n' % msg)
40 # sys.stderr.write("I: %s\n" % msg)
43 file_regex = re.compile('.*popcon-(\d{4}-\d{1,2}-\d{1,2})(|.gz)')
45 def read_popcon_stats(filename, read_packages=True):
46 info("Reading %s" % filename)
47 entry = dict(submissions = None,
52 for line in fileinput.FileInput(filename, openhook=fileinput.hook_compressed):
53 key, values = [x.strip().lower() for x in line.split(':', 1)]
54 if key == 'package': # most probable
58 pkg, vote, old, recent, nofiles = values.split()
60 raise ValueError("Failed to split %s" % values)
61 entry[key][pkg] = tuple(int(x) for x in (vote, old, recent, nofiles))
62 elif key in ('release', 'architecture'):
63 kvalue, value = values.split()
64 entry[key][kvalue] = int(value)
65 elif key == 'submissions':
66 entry[key] = int(values)
68 raise ValueError("Do not know how to handle line" % line)
71 if __name__ == '__main__':
77 for f in sys.argv[1:]:
78 file_reg = file_regex.match(f)
80 error("Failed to recognize filename %s" % f)
83 date = time.strptime(file_reg.groups()[0], '%Y-%m-%d')
84 entry = read_popcon_stats(f, read_packages=False)
86 date_int = int(time.mktime(date)*1000)
87 # Let's coarsen a bit -- to a week which makes sense anyways
88 # since popcon submissions are spread over a week for balanced
91 coarsen = coarsen_days*24*3600*1000
92 # coarsen and place marker at the end of the duration
93 # but not later than today
94 date_int = min((date_int//coarsen + 1)*coarsen,
96 for version, count in entry['release'].iteritems():
97 if not version in popcon_versions:
98 popcon_versions[version] = {}
99 popcon_ = popcon_versions[version]
100 popcon_[date_int] = count + popcon_.get(date_int, 0)
101 timestamps.add(date_int)
103 versions = sorted([x for x in popcon_versions.keys() if not 'ubuntu' in x]) + \
104 sorted([x for x in popcon_versions.keys() if 'ubuntu' in x])
106 # we need to make sure that for every date we have an entry for
107 # every version, otherwise d3 pukes because of ... d3.v2.js:expand
109 'values': [[date, popcon_versions[k].get(date, 0)/coarsen_days]
110 for date in sorted(list(timestamps))]}
112 print json.dumps(export)