You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
7.5 KiB

#! /usr/bin/python3
# Copyright 2012 Canonical Ltd.
# Author: Colin Watson <cjwatson@ubuntu.com>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Override a publication."""
from __future__ import print_function
from collections import OrderedDict
from optparse import OptionParser, SUPPRESS_HELP
from launchpadlib.launchpad import Launchpad
from ubuntutools.question import YesNoQuestion
import lputils
def find_publications(options, packages):
for package in packages:
# Change matching source.
if (options.source_and_binary or options.binary_and_source or
options.source_only):
source = lputils.find_latest_published_source(options, package)
yield "source", source
# Change all binaries for matching source.
if options.source_and_binary:
for binary in source.getPublishedBinaries():
if not binary.is_debug:
yield "binary", binary
# Change matching binaries.
elif not options.source_only:
for binary in lputils.find_latest_published_binaries(
options, package):
if not binary.is_debug:
yield "binary", binary
def stringify_phased_update_percentage(phased_update_percentage):
if phased_update_percentage is None:
return "100%"
else:
return '%s%%' % phased_update_percentage
def stringify_binary_kwargs(binary_kwargs):
for key, value in binary_kwargs.items():
if key == "new_phased_update_percentage":
yield stringify_phased_update_percentage(value)
else:
yield value
def change_overrides(options, packages):
source_kwargs = OrderedDict()
binary_kwargs = OrderedDict()
if options.component:
print("Override component to %s" % options.component)
source_kwargs["new_component"] = options.component
binary_kwargs["new_component"] = options.component
if options.section:
print("Override section to %s" % options.section)
source_kwargs["new_section"] = options.section
binary_kwargs["new_section"] = options.section
if options.priority:
print("Override priority to %s" % options.priority)
binary_kwargs["new_priority"] = options.priority
if options.percentage is not None:
print("Override percentage to %s" % options.percentage)
binary_kwargs["new_phased_update_percentage"] = options.percentage
publications = []
for pubtype, publication in find_publications(options, packages):
if pubtype == "source" and not source_kwargs:
continue
publications.append((pubtype, publication))
if pubtype == "source":
print("%s: %s/%s -> %s" % (
publication.display_name,
publication.component_name, publication.section_name,
"/".join(source_kwargs.values())))
else:
print("%s: %s/%s/%s/%s -> %s" % (
publication.display_name,
publication.component_name, publication.section_name,
publication.priority_name.lower(),
stringify_phased_update_percentage(
publication.phased_update_percentage),
"/".join(stringify_binary_kwargs(binary_kwargs))))
if options.dry_run:
print("Dry run; no publications overridden.")
else:
if not options.confirm_all:
if YesNoQuestion().ask("Override", "no") == "no":
return
num_overridden = 0
num_same = 0
for pubtype, publication in publications:
if pubtype == "source":
kwargs = source_kwargs
else:
kwargs = binary_kwargs
if publication.changeOverride(**kwargs):
num_overridden += 1
else:
print("%s remained the same" % publication.display_name)
num_same += 1
summary = []
if num_overridden:
summary.append("%d %s overridden" % (
num_overridden,
"publication" if num_overridden == 1 else "publications"))
if num_same:
summary.append("%d %s remained the same" % (
num_same, "publication" if num_same == 1 else "publications"))
if summary:
print("%s." % "; ".join(summary))
def main():
parser = OptionParser(
usage="usage: %prog -s suite [options] package [...]",
epilog=lputils.ARCHIVE_REFERENCE_DESCRIPTION)
parser.add_option(
"-l", "--launchpad", dest="launchpad_instance", default="production")
parser.add_option(
"-n", "--dry-run", default=False, action="store_true",
help="only show removals that would be performed")
parser.add_option(
"-y", "--confirm-all", default=False, action="store_true",
help="do not ask for confirmation")
parser.add_option("-A", "--archive", help="override in ARCHIVE")
parser.add_option(
"-s", "--suite", metavar="SUITE", help="override in SUITE")
parser.add_option(
"-a", "--architecture", dest="architectures", action="append",
metavar="ARCHITECTURE",
help="architecture tag (may be given multiple times)")
parser.add_option(
"-e", "--version",
metavar="VERSION", help="package version (default: current version)")
parser.add_option(
"-S", "--source-and-binary", default=False, action="store_true",
help="select source and all binaries from this source")
parser.add_option(
"-B", "--binary-and-source", default=False, action="store_true",
help="select source and binary (of the same name)")
parser.add_option(
"-t", "--source-only", default=False, action="store_true",
help="select source packages only")
parser.add_option(
"-c", "--component",
metavar="COMPONENT", help="move package to COMPONENT")
parser.add_option(
"-p", "--priority",
metavar="PRIORITY", help="move package to PRIORITY")
parser.add_option(
"-x", "--section",
metavar="SECTION", help="move package to SECTION")
parser.add_option(
"-z", "--percentage", type="int", default=None,
metavar="PERCENTAGE", help="set phased update percentage")
# Deprecated in favour of -A.
parser.add_option(
"-d", "--distribution", default="ubuntu", help=SUPPRESS_HELP)
parser.add_option(
"-j", "--partner", default=False, action="store_true",
help=SUPPRESS_HELP)
options, args = parser.parse_args()
if (not options.component and not options.section and not options.priority
and options.percentage is None):
parser.error(
"You must override at least one of component, section, "
"priority, and percentage.")
options.launchpad = Launchpad.login_with(
"change-override", options.launchpad_instance, version="devel")
lputils.setup_location(options)
change_overrides(options, args)
if __name__ == '__main__':
main()