2
# -*- coding: utf-8 -*-
4
# Copyright (C) 2018 Canonical Ltd
6
# This program is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU General Public License
8
# as published by the Free Software Foundation; either version 2
9
# of the License, or (at your option) any later version.
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
# GNU General Public License for more details.
16
# A copy of the GNU General Public License version 2 is in LICENSE.
21
from collections import defaultdict
22
from datetime import datetime
29
from textwrap import dedent
30
from urllib.request import urlopen
33
from jinja2 import Environment, FileSystemLoader
37
loader=FileSystemLoader(os.path.dirname(os.path.abspath(__file__)) + '/templates'),
39
extensions=['jinja2.ext.i18n'],
41
env.install_null_translations(True)
45
# copied from component-mismatches
49
tempdir = tempfile.mkdtemp(prefix='component-mismatches')
50
atexit.register(shutil.rmtree, tempdir)
53
# copied from component-mismatches
54
def decompress_open(tagfile):
56
decompressed = tempfile.mktemp(dir=tempdir)
57
fin = gzip.GzipFile(filename=tagfile)
58
with open(decompressed, 'wb') as fout:
59
fout.write(fin.read())
60
return open(decompressed, 'r')
63
# copied from generate-team-p-m
64
def get_subscribers_json(packages, subscribers_json):
65
if subscribers_json is None:
66
j = urlopen("http://people.canonical.com/~ubuntu-archive/package-team-mapping.json")
68
j = open(subscribers_json, 'rb')
70
team_to_packages = json.loads(j.read().decode('utf-8'))
72
for team, team_packages in team_to_packages.items():
73
for package in team_packages:
74
if package in packages:
75
package_to_teams.setdefault(package, []).append(team)
76
return package_to_teams
78
def packages_with_bzr_repos(options):
80
for component in options.components.split(','):
81
sources_path = "%s/dists/%s/%s/source/Sources.gz" % (
82
options.archive_dir, options.suite, component)
83
for section in apt_pkg.TagFile(decompress_open(sources_path)):
84
if 'Package' in section and 'Vcs-Bzr' in section:
85
pkgs[section['Package']] = section['Vcs-Bzr']
90
return re.sub('^lp:','https://code.launchpad.net/',repo)
93
parser = argparse.ArgumentParser()
94
parser.add_argument('--archive-dir', action='store', default=os.path.expanduser("~/mirror/ubuntu"))
95
parser.add_argument('--components', action='store', default="main,restricted,universe,multiverse")
96
parser.add_argument('--suite', action='store')
97
parser.add_argument('--subscribers-json', action='store')
98
parser.add_argument('output')
99
args = parser.parse_args()
101
pkgs = packages_with_bzr_repos(args)
103
print("getting subscribers")
104
subscribers = get_subscribers_json(set(pkgs.keys()), args.subscribers_json)
105
for p in set(pkgs.keys()):
106
if p not in subscribers:
107
subscribers[p] = ['unknown']
110
team_to_pkgs = defaultdict(list)
111
for package, teams in subscribers.items():
112
all_teams |= set(teams)
114
team_to_pkgs[team].append(package)
116
team_to_attn_count = {}
117
for team, packages in team_to_pkgs.items():
118
team_to_attn_count[team] = len(packages)
119
team_to_pkgs[team] = [(package, repo_url(pkgs[package])) for package in sorted(packages)]
122
t = env.get_template('team-report-bzr.html')
123
now = datetime.utcnow()
124
with open(args.output, 'w', encoding='utf-8') as fp:
127
now="%s.%s.%s %d:%s:%s UTC" % (now.year, now.month, now.day, now.hour, now.minute, now.second),
128
team_to_pkgs=team_to_pkgs,
129
team_to_attn_count=team_to_attn_count))
131
if __name__ == '__main__':