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)
46
# copied from component-mismatches
50
tempdir = tempfile.mkdtemp(prefix='component-mismatches')
51
atexit.register(shutil.rmtree, tempdir)
54
# copied from component-mismatches
55
def decompress_open(tagfile):
57
decompressed = tempfile.mktemp(dir=tempdir)
58
fin = gzip.GzipFile(filename=tagfile)
59
with open(decompressed, 'wb') as fout:
60
fout.write(fin.read())
61
return open(decompressed, 'r')
64
# copied from generate-team-p-m
65
def get_subscribers_json(packages, subscribers_json):
66
if subscribers_json is None:
67
j = urlopen("http://people.canonical.com/~ubuntu-archive/package-team-mapping.json")
69
j = open(subscribers_json, 'rb')
71
team_to_packages = json.loads(j.read().decode('utf-8'))
73
for team, team_packages in team_to_packages.items():
74
for package in team_packages:
75
if package in packages:
76
package_to_teams.setdefault(package, []).append(team)
77
return package_to_teams
80
def packages_with_bzr_repos(options):
82
for component in options.components.split(','):
83
sources_path = "%s/dists/%s/%s/source/Sources.gz" % (
84
options.archive_dir, options.suite, component)
85
for section in apt_pkg.TagFile(decompress_open(sources_path)):
86
if 'Package' in section and 'Vcs-Bzr' in section:
87
pkgs[section['Package']] = section['Vcs-Bzr']
92
return re.sub('^lp:', 'https://code.launchpad.net/', repo)
96
parser = argparse.ArgumentParser()
97
parser.add_argument('--archive-dir', action='store', default=os.path.expanduser("~/mirror/ubuntu"))
98
parser.add_argument('--components', action='store', default="main,restricted,universe,multiverse")
99
parser.add_argument('--suite', action='store')
100
parser.add_argument('--subscribers-json', action='store')
101
parser.add_argument('output')
102
args = parser.parse_args()
104
pkgs = packages_with_bzr_repos(args)
106
print("getting subscribers")
107
subscribers = get_subscribers_json(set(pkgs.keys()), args.subscribers_json)
108
for p in set(pkgs.keys()):
109
if p not in subscribers:
110
subscribers[p] = ['unknown']
113
team_to_pkgs = defaultdict(list)
114
for package, teams in subscribers.items():
115
all_teams |= set(teams)
117
team_to_pkgs[team].append(package)
119
team_to_attn_count = {}
120
for team, packages in team_to_pkgs.items():
121
team_to_attn_count[team] = len(packages)
122
team_to_pkgs[team] = [(package, repo_url(pkgs[package])) for package in sorted(packages)]
125
t = env.get_template('team-report-bzr.html')
126
now = datetime.utcnow()
127
with open(args.output, 'w', encoding='utf-8') as fp:
130
now="%s UTC" % now.strftime("%Y-%m-%d %H:%M:%S"),
131
team_to_pkgs=team_to_pkgs,
132
team_to_attn_count=team_to_attn_count))
135
if __name__ == '__main__':