ubuntu-dev-tools/upload-permission

148 lines
5.7 KiB
Plaintext
Raw Normal View History

2011-12-02 18:59:46 +02:00
#!/usr/bin/python
#
# Copyright (C) 2011, Stefano Rivera <stefanor@ubuntu.com>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
import optparse
import sys
2011-12-02 18:59:46 +02:00
2011-12-03 23:50:11 +02:00
from devscripts.logger import Logger
2011-12-02 18:59:46 +02:00
from ubuntutools.lp.lpapicache import (Launchpad, Distribution, PersonTeam,
2011-12-03 23:51:24 +02:00
Packageset, PackageNotFoundException,
2011-12-02 18:59:46 +02:00
SeriesNotFoundException)
2011-12-04 00:08:08 +02:00
from ubuntutools.misc import split_release_pocket
2011-12-02 18:59:46 +02:00
2011-12-03 23:50:11 +02:00
def parse_arguments():
'''Parse arguments and return (options, package)'''
2011-12-02 18:59:46 +02:00
parser = optparse.OptionParser('%prog [options] package')
parser.add_option('-r', '--release', default=None, metavar='RELEASE',
help='Use RELEASE, rather than the current development '
'release')
parser.add_option('-a', '--list-uploaders',
default=False, action='store_true',
help='List all the people/teams with upload rights')
2011-12-02 18:59:46 +02:00
parser.add_option('-t', '--list-team-members',
default=False, action='store_true',
help='List all team members of teams with upload rights '
'(implies --list-uploaders)')
2011-12-02 18:59:46 +02:00
options, args = parser.parse_args()
if len(args) != 1:
parser.error("One (and only one) package must be specified")
package = args[0]
if options.list_team_members:
options.list_uploaders = True
2011-12-03 23:50:11 +02:00
return (options, package)
def main():
'''Query upload permissions'''
options, package = parse_arguments()
2011-12-02 18:59:46 +02:00
# Need to be logged in to see uploaders:
Launchpad.login()
ubuntu = Distribution('ubuntu')
archive = ubuntu.getArchive()
if options.release is None:
series = ubuntu.getDevelopmentSeries()
2011-12-04 00:08:08 +02:00
pocket = 'Release'
2011-12-02 18:59:46 +02:00
else:
try:
2011-12-04 00:08:08 +02:00
release, pocket = split_release_pocket(options.release)
series = ubuntu.getSeries(release)
2011-12-02 18:59:46 +02:00
except SeriesNotFoundException, e:
2011-12-03 23:50:11 +02:00
Logger.error(str(e))
sys.exit(2)
2011-12-02 18:59:46 +02:00
2011-12-03 23:51:24 +02:00
try:
spph = archive.getSourcePackage(package)
except PackageNotFoundException, e:
Logger.error(str(e))
sys.exit(2)
2011-12-02 18:59:46 +02:00
component = spph.getComponent()
if options.list_uploaders:
if series.status in ('Experimental', 'Active Development',
'Pre-release Freeze'):
component_uploader = archive.getUploadersForComponent(
component_name=component)[0]
print "All upload permissions for %s:" % package
print
print "Component (%s)" % component
print "============" + ("=" * len(component))
print_uploaders([component_uploader], options.list_team_members)
packagesets = sorted(Packageset.setsIncludingSource(
distroseries=series,
sourcepackagename=package))
if packagesets:
2011-12-02 18:59:46 +02:00
print
print "Packagesets"
print "==========="
for packageset in packagesets:
print
print "%s:" % packageset.name
print_uploaders(archive.getUploadersForPackageset(
packageset=packageset), options.list_team_members)
2011-12-02 18:59:46 +02:00
ppu_uploaders = archive.getUploadersForPackage(
source_package_name=package)
if ppu_uploaders:
print
print "Per-Package-Uploaders"
print "====================="
print
print_uploaders(ppu_uploaders, options.list_team_members)
2011-12-02 18:59:46 +02:00
print
2011-12-04 00:08:08 +02:00
if PersonTeam.me.canUploadPackage(archive, series, package, component,
pocket):
2011-12-04 00:18:23 +02:00
print "You can upload %s to %s." % (package, options.release)
2011-12-02 18:59:46 +02:00
else:
2011-12-04 00:18:23 +02:00
print ("You can not upload %s to %s, yourself."
% (package, options.release))
2011-12-04 00:08:08 +02:00
if (series.status in ('Current Stable Release', 'Supported', 'Obsolete')
and pocket == 'Release'):
print ("%s is in the '%s' state. "
"You may want to query the %s-proposed pocket."
% (release, series.status, release))
2011-12-04 00:18:23 +02:00
else:
print ("But you can still contribute to it via the sponsorship "
"process: https://wiki.ubuntu.com/SponsorshipProcess")
if not options.list_uploaders:
print ("To see who has the necessary upload rights, "
"use the --list-uploaders option.")
sys.exit(1)
2011-12-02 18:59:46 +02:00
def print_uploaders(uploaders, expand_teams=False, prefix=''):
2011-12-03 22:37:55 +02:00
"""Given a list of uploaders, pretty-print them all
Each line is prefixed with prefix.
If expand_teams is set, recurse, adding more spaces to prefix on each
recursion.
"""
2011-12-02 18:59:46 +02:00
for uploader in sorted(uploaders, key=lambda p: p.display_name):
print ("%s* %s (%s)%s"
% (prefix, uploader.display_name, uploader.name,
' [team]' if uploader.is_team else ''))
if expand_teams and uploader.is_team:
print_uploaders(uploader.participants, True, prefix=prefix + ' ')
2011-12-03 22:37:55 +02:00
2011-12-02 18:59:46 +02:00
if __name__ == '__main__':
main()