mirror of
				https://git.launchpad.net/ubuntu-dev-tools
				synced 2025-11-04 07:54:03 +00:00 
			
		
		
		
	Use f-strings
pylint complains about C0209: Formatting a regular string which could be a f-string (consider-using-f-string) Signed-off-by: Benjamin Drung <benjamin.drung@canonical.com>
This commit is contained in:
		
							parent
							
								
									069a6926c0
								
							
						
					
					
						commit
						aa556af89d
					
				@ -202,7 +202,7 @@ def find_release_package(mirror, workdir, package, version, source_release, conf
 | 
			
		||||
        distribution = system_distribution()
 | 
			
		||||
    mirrors = [mirror] if mirror else []
 | 
			
		||||
 | 
			
		||||
    mirrors.append(config.get_value("%s_MIRROR" % distribution.upper()))
 | 
			
		||||
    mirrors.append(config.get_value(f"{distribution.upper()}_MIRROR"))
 | 
			
		||||
 | 
			
		||||
    if not version:
 | 
			
		||||
        archive = Distribution(distribution.lower()).getArchive()
 | 
			
		||||
@ -259,13 +259,13 @@ def get_backport_version(version, suffix, upload, release):
 | 
			
		||||
            release_version = debian_distro_info.version(release)
 | 
			
		||||
            if not release_version:
 | 
			
		||||
                error("Can't find the release version for %s", release)
 | 
			
		||||
            backport_version = "{}~bpo{}+1".format(version, release_version)
 | 
			
		||||
            backport_version = f"{version}~bpo{release_version}+1"
 | 
			
		||||
        else:
 | 
			
		||||
            error("%s is not a supported release (%s)", release, debian_codenames)
 | 
			
		||||
    elif distribution == "Ubuntu":
 | 
			
		||||
        series = Distribution(distribution.lower()).getSeries(name_or_version=release)
 | 
			
		||||
 | 
			
		||||
        backport_version = version + ("~bpo%s.1" % (series.version))
 | 
			
		||||
        backport_version = f"{version}~bpo{series.version}.1"
 | 
			
		||||
    else:
 | 
			
		||||
        error("Unknown distribution «%s» for release «%s»", distribution, release)
 | 
			
		||||
    if suffix is not None:
 | 
			
		||||
@ -291,7 +291,7 @@ def get_old_version(source, release):
 | 
			
		||||
def get_backport_dist(release, release_pocket):
 | 
			
		||||
    if release_pocket:
 | 
			
		||||
        return release
 | 
			
		||||
    return "%s-backports" % release
 | 
			
		||||
    return f"{release}-backports"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def do_build(workdir, dsc, release, builder, update):
 | 
			
		||||
@ -309,9 +309,9 @@ def do_build(workdir, dsc, release, builder, update):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def do_upload(workdir, package, bp_version, changes, upload, prompt):
 | 
			
		||||
    print("Please check %s %s in file://%s carefully!" % (package, bp_version, workdir))
 | 
			
		||||
    print(f"Please check {package} {bp_version} in file://{workdir} carefully!")
 | 
			
		||||
    if prompt or upload == "ubuntu":
 | 
			
		||||
        question = "Do you want to upload the package to %s" % upload
 | 
			
		||||
        question = f"Do you want to upload the package to {upload}"
 | 
			
		||||
        answer = YesNoQuestion().ask(question, "yes")
 | 
			
		||||
        if answer == "no":
 | 
			
		||||
            return
 | 
			
		||||
@ -329,13 +329,11 @@ def orig_needed(upload, workdir, pkg):
 | 
			
		||||
    version = pkg.version.upstream_version
 | 
			
		||||
 | 
			
		||||
    http = Http()
 | 
			
		||||
    for filename in glob.glob(os.path.join(workdir, "%s_%s.orig*" % (pkg.source, version))):
 | 
			
		||||
        url = "https://launchpad.net/~%s/+archive/%s/+sourcefiles/%s/%s/%s" % (
 | 
			
		||||
            quote(user),
 | 
			
		||||
            quote(ppa),
 | 
			
		||||
            quote(pkg.source),
 | 
			
		||||
            quote(pkg.version.full_version),
 | 
			
		||||
            quote(os.path.basename(filename)),
 | 
			
		||||
    for filename in glob.glob(os.path.join(workdir, f"{pkg.source}_{version}.orig*")):
 | 
			
		||||
        url = (
 | 
			
		||||
            f"https://launchpad.net/~{quote(user)}/+archive/{quote(ppa)}/+sourcefiles"
 | 
			
		||||
            f"/{quote(pkg.source)}/{quote(pkg.version.full_version)}"
 | 
			
		||||
            f"/{quote(os.path.basename(filename))}"
 | 
			
		||||
        )
 | 
			
		||||
        try:
 | 
			
		||||
            headers = http.request(url, "HEAD")[0]
 | 
			
		||||
@ -364,11 +362,11 @@ def do_backport(
 | 
			
		||||
    keyid,
 | 
			
		||||
    prompt,
 | 
			
		||||
):
 | 
			
		||||
    dirname = "%s-%s" % (pkg.source, release)
 | 
			
		||||
    dirname = f"{pkg.source}-{release}"
 | 
			
		||||
    srcdir = os.path.join(workdir, dirname)
 | 
			
		||||
 | 
			
		||||
    if os.path.exists(srcdir):
 | 
			
		||||
        question = "Working directory %s already exists. Delete it?" % srcdir
 | 
			
		||||
        question = f"Working directory {srcdir} already exists. Delete it?"
 | 
			
		||||
        if YesNoQuestion().ask(question, "no") == "no":
 | 
			
		||||
            sys.exit(1)
 | 
			
		||||
        shutil.rmtree(srcdir)
 | 
			
		||||
@ -379,9 +377,9 @@ def do_backport(
 | 
			
		||||
    old_version = get_old_version(pkg.source, release)
 | 
			
		||||
    bp_dist = get_backport_dist(release, release_pocket)
 | 
			
		||||
 | 
			
		||||
    changelog = "%s backport to %s." % (message, release)
 | 
			
		||||
    changelog = f"{message} backport to {release}."
 | 
			
		||||
    if close:
 | 
			
		||||
        changelog += " (LP: #%s)" % (close,)
 | 
			
		||||
        changelog += f" (LP: #{close})"
 | 
			
		||||
    check_call(
 | 
			
		||||
        [
 | 
			
		||||
            "dch",
 | 
			
		||||
@ -403,7 +401,7 @@ def do_backport(
 | 
			
		||||
    else:
 | 
			
		||||
        cmd.append("-sd")
 | 
			
		||||
    if old_version:
 | 
			
		||||
        cmd.append("-v%s" % old_version)
 | 
			
		||||
        cmd.append(f"-v{old_version}")
 | 
			
		||||
    env = os.environ.copy()
 | 
			
		||||
    # An ubuntu.com e-mail address would make dpkg-buildpackage fail if there
 | 
			
		||||
    # wasn't an Ubuntu maintainer for an ubuntu-versioned package. LP: #1007042
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ def main():
 | 
			
		||||
    parser.add_argument("filename", help=argparse.SUPPRESS)
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
    if not os.path.isfile(args.filename):
 | 
			
		||||
        parser.error("File %s does not exist" % args.filename)
 | 
			
		||||
        parser.error(f"File {args.filename} does not exist")
 | 
			
		||||
 | 
			
		||||
    if "UDT_EDIT_WRAPPER_EDITOR" in os.environ:
 | 
			
		||||
        os.environ["EDITOR"] = os.environ["UDT_EDIT_WRAPPER_EDITOR"]
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@ def main():
 | 
			
		||||
        "multiverse-manual",
 | 
			
		||||
    ):
 | 
			
		||||
 | 
			
		||||
        url = "https://merges.ubuntu.com/%s.json" % component
 | 
			
		||||
        url = f"https://merges.ubuntu.com/{component}.json"
 | 
			
		||||
        try:
 | 
			
		||||
            headers, page = Http().request(url)
 | 
			
		||||
        except HttpLib2Error as e:
 | 
			
		||||
@ -71,10 +71,10 @@ def main():
 | 
			
		||||
            if merge.get("user"):
 | 
			
		||||
                author = merge["user"]
 | 
			
		||||
            if merge.get("uploader"):
 | 
			
		||||
                uploader = "(%s)" % merge["uploader"]
 | 
			
		||||
                uploader = f"({merge['uploader']})"
 | 
			
		||||
            teams = merge.get("teams", [])
 | 
			
		||||
 | 
			
		||||
            pretty_uploader = "{} {}".format(author, uploader)
 | 
			
		||||
            pretty_uploader = f"{author} {uploader}"
 | 
			
		||||
            if (
 | 
			
		||||
                args.string is None
 | 
			
		||||
                or args.string in package
 | 
			
		||||
 | 
			
		||||
@ -129,10 +129,7 @@ def main():
 | 
			
		||||
            err = True
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        description = "Imported from Debian bug http://bugs.debian.org/%d:\n\n%s" % (
 | 
			
		||||
            bug_num,
 | 
			
		||||
            summary,
 | 
			
		||||
        )
 | 
			
		||||
        description = f"Imported from Debian bug http://bugs.debian.org/{bug_num}:\n\n{summary}"
 | 
			
		||||
        # LP limits descriptions to 50K chars
 | 
			
		||||
        description = (description[:49994] + " [...]") if len(description) > 50000 else description
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -154,7 +154,7 @@ class PbuilderDist:
 | 
			
		||||
                # should work nevertheless.
 | 
			
		||||
                if distro not in self._debian_distros:
 | 
			
		||||
                    question = (
 | 
			
		||||
                        'Warning: Unknown distribution "%s". ' "Do you want to continue" % distro
 | 
			
		||||
                        f'Warning: Unknown distribution "{distro}". ' "Do you want to continue"
 | 
			
		||||
                    )
 | 
			
		||||
                    answer = YesNoQuestion().ask(question, "no")
 | 
			
		||||
                    if answer == "no":
 | 
			
		||||
@ -208,7 +208,7 @@ class PbuilderDist:
 | 
			
		||||
 | 
			
		||||
        prefix = os.path.join(self.base, self.chroot_string)
 | 
			
		||||
        if "--buildresult" not in remaining_arguments:
 | 
			
		||||
            result = os.path.normpath("%s_result/" % prefix)
 | 
			
		||||
            result = os.path.normpath(f"{prefix}_result/")
 | 
			
		||||
        else:
 | 
			
		||||
            location_of_arg = remaining_arguments.index("--buildresult")
 | 
			
		||||
            result = os.path.normpath(remaining_arguments[location_of_arg + 1])
 | 
			
		||||
@ -241,7 +241,7 @@ class PbuilderDist:
 | 
			
		||||
                sys.exit(1)
 | 
			
		||||
 | 
			
		||||
        arguments = [
 | 
			
		||||
            "--%s" % self.operation,
 | 
			
		||||
            f"--{self.operation}",
 | 
			
		||||
            "--distribution",
 | 
			
		||||
            self.target_distro,
 | 
			
		||||
            "--buildresult",
 | 
			
		||||
@ -282,9 +282,9 @@ class PbuilderDist:
 | 
			
		||||
        arguments += ["--mirror", mirror]
 | 
			
		||||
 | 
			
		||||
        othermirrors = []
 | 
			
		||||
        localrepo = "/var/cache/archive/" + self.target_distro
 | 
			
		||||
        localrepo = f"/var/cache/archive/{self.target_distro}"
 | 
			
		||||
        if os.path.exists(localrepo):
 | 
			
		||||
            repo = "deb file:///var/cache/archive/ %s/" % self.target_distro
 | 
			
		||||
            repo = f"deb file:///var/cache/archive/ {self.target_distro}/"
 | 
			
		||||
            othermirrors.append(repo)
 | 
			
		||||
 | 
			
		||||
        if self.target_distro in self._debian_distros:
 | 
			
		||||
@ -307,21 +307,17 @@ class PbuilderDist:
 | 
			
		||||
                    if float(debian_info.version(codename)) < 11.0:
 | 
			
		||||
                        pocket = "/updates"
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s%s %s"
 | 
			
		||||
                    % (config.get_value("DEBSEC_MIRROR"), self.target_distro, pocket, components)
 | 
			
		||||
                    f"deb {config.get_value('DEBSEC_MIRROR')}"
 | 
			
		||||
                    f" {self.target_distro}{pocket} {components}"
 | 
			
		||||
                )
 | 
			
		||||
            if self.enable_updates:
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s-updates %s" % (mirror, self.target_distro, components)
 | 
			
		||||
                )
 | 
			
		||||
                othermirrors.append(f"deb {mirror} {self.target_distro}-updates {components}")
 | 
			
		||||
            if self.enable_proposed:
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s-proposed-updates %s" % (mirror, self.target_distro, components)
 | 
			
		||||
                    f"deb {mirror} {self.target_distro}-proposed-updates {components}"
 | 
			
		||||
                )
 | 
			
		||||
            if self.enable_backports:
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s-backports %s" % (mirror, self.target_distro, components)
 | 
			
		||||
                )
 | 
			
		||||
                othermirrors.append(f"deb {mirror} {self.target_distro}-backports {components}")
 | 
			
		||||
 | 
			
		||||
            aptcache = os.path.join(self.base, "aptcache", "debian")
 | 
			
		||||
        else:
 | 
			
		||||
@ -336,17 +332,11 @@ class PbuilderDist:
 | 
			
		||||
                self.enable_updates = False
 | 
			
		||||
 | 
			
		||||
            if self.enable_security:
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s-security %s" % (mirror, self.target_distro, components)
 | 
			
		||||
                )
 | 
			
		||||
                othermirrors.append(f"deb {mirror} {self.target_distro}-security {components}")
 | 
			
		||||
            if self.enable_updates:
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s-updates %s" % (mirror, self.target_distro, components)
 | 
			
		||||
                )
 | 
			
		||||
                othermirrors.append(f"deb {mirror} {self.target_distro}-updates {components}")
 | 
			
		||||
            if self.enable_proposed:
 | 
			
		||||
                othermirrors.append(
 | 
			
		||||
                    "deb %s %s-proposed %s" % (mirror, self.target_distro, components)
 | 
			
		||||
                )
 | 
			
		||||
                othermirrors.append(f"deb {mirror} {self.target_distro}-proposed {components}")
 | 
			
		||||
 | 
			
		||||
            aptcache = os.path.join(self.base, "aptcache", "ubuntu")
 | 
			
		||||
 | 
			
		||||
@ -392,7 +382,7 @@ class PbuilderDist:
 | 
			
		||||
        if self.build_architecture != self.system_architecture:
 | 
			
		||||
            arguments += ["--debootstrapopts", "--arch=" + self.build_architecture]
 | 
			
		||||
 | 
			
		||||
        apt_conf_dir = os.path.join(self.base, "etc/%s/apt.conf" % self.target_distro)
 | 
			
		||||
        apt_conf_dir = os.path.join(self.base, f"etc/{self.target_distro}/apt.conf")
 | 
			
		||||
        if os.path.exists(apt_conf_dir):
 | 
			
		||||
            arguments += ["--aptconfdir", apt_conf_dir]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@ Logger = getLogger()
 | 
			
		||||
def previous_version(package, version, distance):
 | 
			
		||||
    "Given an (extracted) package, determine the version distance versions ago"
 | 
			
		||||
    upver = Version(version).upstream_version
 | 
			
		||||
    filename = "%s-%s/debian/changelog" % (package, upver)
 | 
			
		||||
    filename = f"{package}-{upver}/debian/changelog"
 | 
			
		||||
    changelog_file = open(filename, "r", encoding="utf-8")
 | 
			
		||||
    changelog = debian.changelog.Changelog(changelog_file.read())
 | 
			
		||||
    changelog_file.close()
 | 
			
		||||
 | 
			
		||||
@ -41,11 +41,11 @@ def determine_destinations(source, destination):
 | 
			
		||||
        destination = ubuntu_info.lts()
 | 
			
		||||
 | 
			
		||||
    if source not in ubuntu_info.all:
 | 
			
		||||
        raise DestinationException("Source release %s does not exist" % source)
 | 
			
		||||
        raise DestinationException(f"Source release {source} does not exist")
 | 
			
		||||
    if destination not in ubuntu_info.all:
 | 
			
		||||
        raise DestinationException("Destination release %s does not exist" % destination)
 | 
			
		||||
        raise DestinationException(f"Destination release {destination} does not exist")
 | 
			
		||||
    if destination not in ubuntu_info.supported():
 | 
			
		||||
        raise DestinationException("Destination release %s is not supported" % destination)
 | 
			
		||||
        raise DestinationException(f"Destination release {destination} is not supported")
 | 
			
		||||
 | 
			
		||||
    found = False
 | 
			
		||||
    destinations = []
 | 
			
		||||
@ -137,9 +137,9 @@ def find_rdepends(releases, published_binaries):
 | 
			
		||||
    for binpkg, rdeps in intermediate.items():
 | 
			
		||||
        output += ["", binpkg, "-" * len(binpkg)]
 | 
			
		||||
        for pkg, appearences in rdeps.items():
 | 
			
		||||
            output += ["* %s" % pkg]
 | 
			
		||||
            output += [f"* {pkg}"]
 | 
			
		||||
            for release, relationship in appearences:
 | 
			
		||||
                output += ["  [ ] %s (%s)" % (release, relationship)]
 | 
			
		||||
                output += [f"  [ ] {release} ({relationship})"]
 | 
			
		||||
 | 
			
		||||
    found_any = sum(len(rdeps) for rdeps in intermediate.values())
 | 
			
		||||
    if found_any:
 | 
			
		||||
@ -200,11 +200,9 @@ def request_backport(package_spph, source, destinations):
 | 
			
		||||
 | 
			
		||||
    testing = ["[Testing]", ""]
 | 
			
		||||
    for dest in destinations:
 | 
			
		||||
        testing += [" * %s:" % dest.capitalize()]
 | 
			
		||||
        testing += [f" * {dest.capitalize()}:"]
 | 
			
		||||
        testing += ["   [ ] Package builds without modification"]
 | 
			
		||||
        testing += [
 | 
			
		||||
            "   [ ] %s installs cleanly and runs" % binary for binary in published_binaries
 | 
			
		||||
        ]
 | 
			
		||||
        testing += [f"   [ ] {binary} installs cleanly and runs" for binary in published_binaries]
 | 
			
		||||
 | 
			
		||||
    subst = {
 | 
			
		||||
        "package": package_spph.getPackageName(),
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								requestsync
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								requestsync
									
									
									
									
									
								
							@ -299,17 +299,14 @@ def main():
 | 
			
		||||
        check_existing_reports(srcpkg)
 | 
			
		||||
 | 
			
		||||
    # Generate bug report
 | 
			
		||||
    pkg_to_sync = "%s %s (%s) from Debian %s (%s)" % (
 | 
			
		||||
        srcpkg,
 | 
			
		||||
        debian_version,
 | 
			
		||||
        ubuntu_component,
 | 
			
		||||
        distro,
 | 
			
		||||
        debian_component,
 | 
			
		||||
    pkg_to_sync = (
 | 
			
		||||
        f"{srcpkg} {debian_version} ({ubuntu_component})"
 | 
			
		||||
        f" from Debian {distro} ({debian_component})"
 | 
			
		||||
    )
 | 
			
		||||
    title = "Sync %s" % pkg_to_sync
 | 
			
		||||
    title = f"Sync {pkg_to_sync}"
 | 
			
		||||
    if ffe:
 | 
			
		||||
        title = "FFe: " + title
 | 
			
		||||
    report = "Please sync %s\n\n" % pkg_to_sync
 | 
			
		||||
    report = f"Please sync {pkg_to_sync}\n\n"
 | 
			
		||||
 | 
			
		||||
    if "ubuntu" in str(ubuntu_version):
 | 
			
		||||
        need_interaction = True
 | 
			
		||||
@ -318,9 +315,8 @@ def main():
 | 
			
		||||
        Logger.info("Please edit the report and give an explanation.")
 | 
			
		||||
        Logger.info("Not saving the report file will abort the request.")
 | 
			
		||||
        report += (
 | 
			
		||||
            "Explanation of the Ubuntu delta and why it can be "
 | 
			
		||||
            "dropped:\n%s\n>>> ENTER_EXPLANATION_HERE <<<\n\n"
 | 
			
		||||
            % get_ubuntu_delta_changelog(ubuntu_srcpkg)
 | 
			
		||||
            f"Explanation of the Ubuntu delta and why it can be dropped:\n"
 | 
			
		||||
            f"{get_ubuntu_delta_changelog(ubuntu_srcpkg)}\n>>> ENTER_EXPLANATION_HERE <<<\n\n"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    if ffe:
 | 
			
		||||
@ -339,10 +335,7 @@ def main():
 | 
			
		||||
    if newsource:
 | 
			
		||||
        report += "All changelog entries:\n\n"
 | 
			
		||||
    else:
 | 
			
		||||
        report += "Changelog entries since current %s version %s:\n\n" % (
 | 
			
		||||
            args.release,
 | 
			
		||||
            ubuntu_version,
 | 
			
		||||
        )
 | 
			
		||||
        report += f"Changelog entries since current {args.release} version {ubuntu_version}:\n\n"
 | 
			
		||||
    changelog = debian_srcpkg.getChangelog(since_version=base_version)
 | 
			
		||||
    if not changelog:
 | 
			
		||||
        if not args.missing_changelog_ok:
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,7 @@ def main():
 | 
			
		||||
    # Convert unstable/testing aliases to codenames:
 | 
			
		||||
    distribution = codename_to_distribution(options.release)
 | 
			
		||||
    if not distribution:
 | 
			
		||||
        parser.error("Unknown release codename %s" % options.release)
 | 
			
		||||
        parser.error(f"Unknown release codename {options.release}")
 | 
			
		||||
    distro_info = vendor_to_distroinfo(distribution)()
 | 
			
		||||
    try:
 | 
			
		||||
        options.release = distro_info.codename(options.release, default=options.release)
 | 
			
		||||
@ -184,13 +184,13 @@ def display_verbose(package, values):
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    def log_package(values, package, arch, dependency, offset=0):
 | 
			
		||||
        line = "  " * offset + "* %s" % package
 | 
			
		||||
        line = f"{'  ' * offset}* {package}"
 | 
			
		||||
        if all_archs and set(arch) != all_archs:
 | 
			
		||||
            line += " [%s]" % " ".join(sorted(arch))
 | 
			
		||||
            line += f" [{' '.join(sorted(arch))}]"
 | 
			
		||||
        if dependency:
 | 
			
		||||
            if len(line) < 30:
 | 
			
		||||
                line += " " * (30 - len(line))
 | 
			
		||||
                line += "  (for %s)" % dependency
 | 
			
		||||
                line += f"  (for {dependency})"
 | 
			
		||||
        Logger.info(line)
 | 
			
		||||
        data = values.get(package)
 | 
			
		||||
        if data:
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ def present_on(appearences):
 | 
			
		||||
    for flavor, types in present.items():
 | 
			
		||||
        if len(types) > 1:
 | 
			
		||||
            types.discard("supported")
 | 
			
		||||
    output = ["  %s: %s" % (flavor, ", ".join(sorted(types))) for flavor, types in present.items()]
 | 
			
		||||
    output = [f"  {flavor}: {', '.join(sorted(types))}" for flavor, types in present.items()]
 | 
			
		||||
    output.sort()
 | 
			
		||||
    return "\n".join(output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ def parse(script_name):
 | 
			
		||||
        "%(prog)s [options] <bug number>\n"
 | 
			
		||||
        "One of --upload, --workdir, or --sponsor must be specified."
 | 
			
		||||
    )
 | 
			
		||||
    epilog = "See %s(1) for more info." % (script_name)
 | 
			
		||||
    epilog = f"See {script_name}(1) for more info."
 | 
			
		||||
    parser = argparse.ArgumentParser(usage=usage, epilog=epilog)
 | 
			
		||||
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
 | 
			
		||||
@ -93,7 +93,7 @@ def gen_debdiff(tmpdir, changelog):
 | 
			
		||||
    newver = next(changelog_it).version
 | 
			
		||||
    oldver = next(changelog_it).version
 | 
			
		||||
 | 
			
		||||
    debdiff = os.path.join(tmpdir, "%s_%s.debdiff" % (pkg, newver))
 | 
			
		||||
    debdiff = os.path.join(tmpdir, f"{pkg}_{newver}.debdiff")
 | 
			
		||||
 | 
			
		||||
    diff_cmd = ["bzr", "diff", "-r", "tag:" + str(oldver)]
 | 
			
		||||
    if call(diff_cmd, stdout=DEVNULL, stderr=DEVNULL) == 1:
 | 
			
		||||
@ -104,8 +104,8 @@ def gen_debdiff(tmpdir, changelog):
 | 
			
		||||
        if newver.epoch is not None:
 | 
			
		||||
            newver = str(newver)[str(newver).index(":") + 1 :]
 | 
			
		||||
 | 
			
		||||
        olddsc = "../%s_%s.dsc" % (pkg, oldver)
 | 
			
		||||
        newdsc = "../%s_%s.dsc" % (pkg, newver)
 | 
			
		||||
        olddsc = f"../{pkg}_{oldver}.dsc"
 | 
			
		||||
        newdsc = f"../{pkg}_{newver}.dsc"
 | 
			
		||||
 | 
			
		||||
        check_file(olddsc)
 | 
			
		||||
        check_file(newdsc)
 | 
			
		||||
@ -176,7 +176,7 @@ def submit_bugreport(body, debdiff, deb_version, changelog):
 | 
			
		||||
        "--pseudo-header",
 | 
			
		||||
        "User: ubuntu-devel@lists.ubuntu.com",
 | 
			
		||||
        "--pseudo-header",
 | 
			
		||||
        "Usertags: origin-ubuntu %s ubuntu-patch" % devel,
 | 
			
		||||
        f"Usertags: origin-ubuntu {devel} ubuntu-patch",
 | 
			
		||||
        "--tag",
 | 
			
		||||
        "patch",
 | 
			
		||||
        "--bts",
 | 
			
		||||
@ -197,15 +197,14 @@ def check_reportbug_config():
 | 
			
		||||
    if os.path.exists(reportbugrc_filename):
 | 
			
		||||
        return
 | 
			
		||||
    email = ubu_email()[1]
 | 
			
		||||
    reportbugrc = (
 | 
			
		||||
        """# Reportbug configuration generated by submittodebian(1)
 | 
			
		||||
    reportbugrc = f"""# Reportbug configuration generated by submittodebian(1)
 | 
			
		||||
# See reportbug.conf(5) for the configuration file format.
 | 
			
		||||
 | 
			
		||||
# Use Debian's reportbug SMTP Server:
 | 
			
		||||
# Note: it's limited to 5 connections per hour, and cannot CC you at submission
 | 
			
		||||
# time. See /usr/share/doc/reportbug/README.Users.gz for more details.
 | 
			
		||||
smtphost reportbug.debian.org:587
 | 
			
		||||
header "X-Debbugs-CC: %s"
 | 
			
		||||
header "X-Debbugs-CC: {email}"
 | 
			
		||||
no-cc
 | 
			
		||||
 | 
			
		||||
# Use GMail's SMTP Server:
 | 
			
		||||
@ -213,8 +212,6 @@ no-cc
 | 
			
		||||
#smtpuser "<your address>@gmail.com"
 | 
			
		||||
#smtptls
 | 
			
		||||
"""
 | 
			
		||||
        % email
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    with open(reportbugrc_filename, "w", encoding="utf-8") as f:
 | 
			
		||||
        f.write(reportbugrc)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										37
									
								
								syncpackage
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								syncpackage
									
									
									
									
									
								
							@ -85,11 +85,11 @@ def add_fixed_bugs(changes, bugs):
 | 
			
		||||
    for i, change in enumerate(changes):
 | 
			
		||||
        if change.startswith("Launchpad-Bugs-Fixed:"):
 | 
			
		||||
            bugs.update(changes[i][22:].strip().split(" "))
 | 
			
		||||
            changes[i] = "Launchpad-Bugs-Fixed: %s" % (" ".join(bugs))
 | 
			
		||||
            changes[i] = f"Launchpad-Bugs-Fixed: {' '.join(bugs)}"
 | 
			
		||||
            break
 | 
			
		||||
        if i == len(changes) - 1:
 | 
			
		||||
            # Launchpad-Bugs-Fixed entry does not exist in changes file
 | 
			
		||||
            line = "Launchpad-Bugs-Fixed: %s" % (" ".join(bugs))
 | 
			
		||||
            line = f"Launchpad-Bugs-Fixed: {' '.join(bugs)}"
 | 
			
		||||
            changes.append(line)
 | 
			
		||||
 | 
			
		||||
    return "\n".join(changes + [""])
 | 
			
		||||
@ -194,7 +194,7 @@ def sync_dsc(
 | 
			
		||||
 | 
			
		||||
    if not fakesync:
 | 
			
		||||
        # create the changes file
 | 
			
		||||
        changes_filename = "%s_%s_source.changes" % (src_pkg.source, new_ver.strip_epoch())
 | 
			
		||||
        changes_filename = f"{src_pkg.source}_{new_ver.strip_epoch()}_source.changes"
 | 
			
		||||
        cmd = [
 | 
			
		||||
            "dpkg-genchanges",
 | 
			
		||||
            "-S",
 | 
			
		||||
@ -237,11 +237,10 @@ def sync_dsc(
 | 
			
		||||
    else:
 | 
			
		||||
        # Create fakesync changelog entry
 | 
			
		||||
        new_ver = Version(new_ver.full_version + "fakesync1")
 | 
			
		||||
        changes_filename = "%s_%s_source.changes" % (src_pkg.source, new_ver.strip_epoch())
 | 
			
		||||
        changes_filename = f"{src_pkg.source}_{new_ver.strip_epoch()}_source.changes"
 | 
			
		||||
        if len(bugs) > 0:
 | 
			
		||||
            message = "Fake sync due to mismatching orig tarball (LP: %s)." % (
 | 
			
		||||
                ", ".join(["#" + str(b) for b in bugs])
 | 
			
		||||
            )
 | 
			
		||||
            bug_numbers = [f"#{b}" for b in bugs]
 | 
			
		||||
            message = f"Fake sync due to mismatching orig tarball (LP: {', '.join(bug_numbers)})."
 | 
			
		||||
        else:
 | 
			
		||||
            message = "Fake sync due to mismatching orig tarball."
 | 
			
		||||
        cmd = ["dch", "-v", new_ver.full_version, "--force-distribution", "-D", release, message]
 | 
			
		||||
@ -441,12 +440,8 @@ def is_blacklisted(query):
 | 
			
		||||
    lp_comments = series.getDifferenceComments(source_package_name=query)
 | 
			
		||||
    blacklisted = False
 | 
			
		||||
    comments = [
 | 
			
		||||
        "%s\n  -- %s  %s"
 | 
			
		||||
        % (
 | 
			
		||||
            c.body_text,
 | 
			
		||||
            c.comment_author.name,
 | 
			
		||||
            c.comment_date.strftime("%a, %d %b %Y %H:%M:%S +0000"),
 | 
			
		||||
        )
 | 
			
		||||
        f"{c.body_text}\n  -- {c.comment_author.name}"
 | 
			
		||||
        f"  {c.comment_date.strftime('%a, %d %b %Y %H:%M:%S +0000')}"
 | 
			
		||||
        for c in lp_comments
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
@ -482,9 +477,9 @@ def is_blacklisted(query):
 | 
			
		||||
def close_bugs(bugs, package, version, changes, sponsoree):
 | 
			
		||||
    """Close the correct task on all bugs, with changes"""
 | 
			
		||||
    ubuntu = Launchpad.distributions["ubuntu"]
 | 
			
		||||
    message = "This bug was fixed in the package %s - %s" % (package, version)
 | 
			
		||||
    message = f"This bug was fixed in the package {package} - {version}"
 | 
			
		||||
    if sponsoree:
 | 
			
		||||
        message += "\nSponsored for %s (%s)" % (sponsoree.display_name, sponsoree.name)
 | 
			
		||||
        message += f"\nSponsored for {sponsoree.display_name} ({sponsoree.name})"
 | 
			
		||||
    if changes:
 | 
			
		||||
        message += "\n\n---------------\n" + changes
 | 
			
		||||
    for bug in bugs:
 | 
			
		||||
@ -510,7 +505,7 @@ def parse():
 | 
			
		||||
    """Parse given command-line parameters."""
 | 
			
		||||
 | 
			
		||||
    usage = "%(prog)s [options] <.dsc URL/path or package name>"
 | 
			
		||||
    epilog = "See %s(1) for more info." % os.path.basename(sys.argv[0])
 | 
			
		||||
    epilog = f"See {os.path.basename(sys.argv[0])}(1) for more info."
 | 
			
		||||
    parser = argparse.ArgumentParser(usage=usage, epilog=epilog)
 | 
			
		||||
 | 
			
		||||
    parser.add_argument("-d", "--distribution", help="Debian distribution to sync from.")
 | 
			
		||||
@ -599,13 +594,13 @@ def parse():
 | 
			
		||||
        "-D",
 | 
			
		||||
        "--debian-mirror",
 | 
			
		||||
        metavar="DEBIAN_MIRROR",
 | 
			
		||||
        help="Preferred Debian mirror (default: %s)" % UDTConfig.defaults["DEBIAN_MIRROR"],
 | 
			
		||||
        help=f"Preferred Debian mirror (default: {UDTConfig.defaults['DEBIAN_MIRROR']})",
 | 
			
		||||
    )
 | 
			
		||||
    no_lp.add_argument(
 | 
			
		||||
        "-U",
 | 
			
		||||
        "--ubuntu-mirror",
 | 
			
		||||
        metavar="UBUNTU_MIRROR",
 | 
			
		||||
        help="Preferred Ubuntu mirror (default: %s)" % UDTConfig.defaults["UBUNTU_MIRROR"],
 | 
			
		||||
        help=f"Preferred Ubuntu mirror (default: {UDTConfig.defaults['UBUNTU_MIRROR']})",
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument("package", help=argparse.SUPPRESS)
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
@ -620,8 +615,8 @@ def parse():
 | 
			
		||||
 | 
			
		||||
    if args.component not in (None, "main", "contrib", "non-free"):
 | 
			
		||||
        parser.error(
 | 
			
		||||
            "%s is not a valid Debian component. "
 | 
			
		||||
            "It should be one of main, contrib, or non-free." % args.component
 | 
			
		||||
            f"{args.component} is not a valid Debian component. "
 | 
			
		||||
            f"It should be one of main, contrib, or non-free."
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    if args.lp and args.uploader_name:
 | 
			
		||||
@ -668,7 +663,7 @@ def main():
 | 
			
		||||
 | 
			
		||||
    if args.release is None:
 | 
			
		||||
        ubuntu = Launchpad.distributions["ubuntu"]
 | 
			
		||||
        args.release = "%s-proposed" % ubuntu.current_series.name
 | 
			
		||||
        args.release = f"{ubuntu.current_series.name}-proposed"
 | 
			
		||||
 | 
			
		||||
    if not args.fakesync and not args.lp:
 | 
			
		||||
        Logger.warning(
 | 
			
		||||
 | 
			
		||||
@ -80,9 +80,8 @@ def main():
 | 
			
		||||
        "--arch",
 | 
			
		||||
        action="append",
 | 
			
		||||
        dest="architecture",
 | 
			
		||||
        help="Rebuild or rescore a specific "
 | 
			
		||||
        "architecture. Valid architectures "
 | 
			
		||||
        "include: %s." % ", ".join(valid_archs),
 | 
			
		||||
        help=f"Rebuild or rescore a specific architecture. Valid architectures "
 | 
			
		||||
        f"include: {', '.join(valid_archs)}.",
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    # Batch processing options
 | 
			
		||||
@ -115,8 +114,8 @@ def main():
 | 
			
		||||
        "--arch2",
 | 
			
		||||
        action="append",
 | 
			
		||||
        dest="architecture",
 | 
			
		||||
        help="Affect only 'architecture' (can be used "
 | 
			
		||||
        "several times). Valid architectures are: %s." % ", ".join(valid_archs),
 | 
			
		||||
        help=f"Affect only 'architecture' (can be used several times)."
 | 
			
		||||
        f" Valid architectures are: {', '.join(valid_archs)}.",
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument("packages", metavar="package", nargs="+", help=argparse.SUPPRESS)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,7 @@ def main():
 | 
			
		||||
 | 
			
		||||
    for iso in args.isos:
 | 
			
		||||
        if len(args.isos) > 1:
 | 
			
		||||
            prefix = "%s:" % iso
 | 
			
		||||
            prefix = f"{iso}:"
 | 
			
		||||
        else:
 | 
			
		||||
            prefix = ""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -647,7 +647,7 @@ class DebianSourcePackage(SourcePackage):
 | 
			
		||||
                version = self.version.full_version
 | 
			
		||||
                srcpkg = Snapshot.getSourcePackage(self.source, version=version)
 | 
			
		||||
                if not srcpkg:
 | 
			
		||||
                    msg = "Package {} {} not found".format(self.source, version)
 | 
			
		||||
                    msg = f"Package {self.source} {version} not found"
 | 
			
		||||
                    raise PackageNotFoundException(msg)
 | 
			
		||||
                self._snapshot_package = srcpkg
 | 
			
		||||
            else:
 | 
			
		||||
@ -657,7 +657,7 @@ class DebianSourcePackage(SourcePackage):
 | 
			
		||||
                params = {"series": series} if series else {}
 | 
			
		||||
                srcpkg = Madison(self.distribution).getSourcePackage(self.source, **params)
 | 
			
		||||
                if not srcpkg:
 | 
			
		||||
                    raise PackageNotFoundException("Package {} not found".format(self.source))
 | 
			
		||||
                    raise PackageNotFoundException(f"Package {self.source} not found")
 | 
			
		||||
                if self.source != srcpkg.name:
 | 
			
		||||
                    self.binary = self.source
 | 
			
		||||
                    self.source = srcpkg.name
 | 
			
		||||
@ -688,7 +688,7 @@ class PersonalPackageArchiveSourcePackage(UbuntuSourcePackage):
 | 
			
		||||
        assert "ppa" in kwargs
 | 
			
		||||
        ppa = kwargs["ppa"].split("/")
 | 
			
		||||
        if len(ppa) != 2:
 | 
			
		||||
            raise ValueError('Invalid PPA value "%s",' 'must be "<USER>/<PPA>"' % kwargs["ppa"])
 | 
			
		||||
            raise ValueError(f'Invalid PPA value "{kwargs["ppa"]}",' 'must be "<USER>/<PPA>"')
 | 
			
		||||
        self._teamname = ppa[0]
 | 
			
		||||
        self._ppaname = ppa[1]
 | 
			
		||||
        self.masters = []
 | 
			
		||||
@ -960,13 +960,13 @@ class Madison(_WebJSON):
 | 
			
		||||
        return self.urls[self._distro]
 | 
			
		||||
 | 
			
		||||
    def getSourcePackage(self, name, series="unstable"):
 | 
			
		||||
        url = "?f=json&package={name}&s={series}".format(name=name, series=series)
 | 
			
		||||
        url = f"?f=json&package={name}&s={series}"
 | 
			
		||||
        try:
 | 
			
		||||
            result = self.load(url)
 | 
			
		||||
        except HTTPError:
 | 
			
		||||
            result = None
 | 
			
		||||
        if not result:
 | 
			
		||||
            msg = "Package {} not found in '{}'".format(name, series)
 | 
			
		||||
            msg = f"Package {name} not found in '{series}'"
 | 
			
		||||
            raise PackageNotFoundException(msg)
 | 
			
		||||
        versions = list(result[0][name].values())[0]
 | 
			
		||||
        latest = versions[sorted(versions.keys(), reverse=True)[0]]
 | 
			
		||||
@ -985,17 +985,17 @@ class _Snapshot(_WebJSON):
 | 
			
		||||
        # unfortunately there is no (easy) way to find the component for older
 | 
			
		||||
        # package versions (madison only lists the most recent versions).
 | 
			
		||||
        # so we have to parse the file path to determine the component :(
 | 
			
		||||
        url = "/mr/package/{}/{}/srcfiles".format(name, version)
 | 
			
		||||
        url = f"/mr/package/{name}/{version}/srcfiles"
 | 
			
		||||
        try:
 | 
			
		||||
            response = self.load("{}?fileinfo=1".format(url))
 | 
			
		||||
            response = self.load(f"{url}?fileinfo=1")
 | 
			
		||||
        except HTTPError as error:
 | 
			
		||||
            msg = "Package {} version {} not found"
 | 
			
		||||
            raise PackageNotFoundException(msg.format(name, version)) from error
 | 
			
		||||
            msg = f"Package {name} version {version} not found"
 | 
			
		||||
            raise PackageNotFoundException(msg) from error
 | 
			
		||||
        result = response.get("result")
 | 
			
		||||
        info = response.get("fileinfo")
 | 
			
		||||
        if len(result) < 1:
 | 
			
		||||
            msg = "No source files for package {} version {}"
 | 
			
		||||
            raise PackageNotFoundException(msg.format(name, version))
 | 
			
		||||
            msg = f"No source files for package {name} version {version}"
 | 
			
		||||
            raise PackageNotFoundException(msg)
 | 
			
		||||
        path = info[result[0]["hash"]][0]["path"]
 | 
			
		||||
        # this expects the 'component' to follow 'pool[-*]' in the path
 | 
			
		||||
        found_pool = False
 | 
			
		||||
@ -1015,15 +1015,15 @@ class _Snapshot(_WebJSON):
 | 
			
		||||
 | 
			
		||||
    def _get_package(self, name, url, pkginit, version, sort_key):
 | 
			
		||||
        try:
 | 
			
		||||
            results = self.load("/mr/{}/{}/".format(url, name))["result"]
 | 
			
		||||
            results = self.load(f"/mr/{url}/{name}/")["result"]
 | 
			
		||||
        except HTTPError as error:
 | 
			
		||||
            raise PackageNotFoundException("Package {} not found.".format(name)) from error
 | 
			
		||||
            raise PackageNotFoundException(f"Package {name} not found.") from error
 | 
			
		||||
 | 
			
		||||
        results = sorted(results, key=lambda r: r[sort_key], reverse=True)
 | 
			
		||||
        results = [pkginit(r) for r in results if version == r["version"]]
 | 
			
		||||
        if not results:
 | 
			
		||||
            msg = "Package {name} version {version} not found."
 | 
			
		||||
            raise PackageNotFoundException(msg.format(name=name, version=version))
 | 
			
		||||
            msg = f"Package {name} version {version} not found."
 | 
			
		||||
            raise PackageNotFoundException(msg)
 | 
			
		||||
        return results
 | 
			
		||||
 | 
			
		||||
    def getSourcePackages(self, name, version):
 | 
			
		||||
@ -1080,8 +1080,8 @@ class SnapshotSourcePackage(SnapshotPackage):
 | 
			
		||||
 | 
			
		||||
    def getBinaryFiles(self, arch=None, name=None, ext=None):
 | 
			
		||||
        if not self._binary_files:
 | 
			
		||||
            url = "/mr/package/{}/{}/allfiles".format(self.name, self.version)
 | 
			
		||||
            response = Snapshot.load("{}?fileinfo=1".format(url))
 | 
			
		||||
            url = f"/mr/package/{self.name}/{self.version}/allfiles"
 | 
			
		||||
            response = Snapshot.load(f"{url}?fileinfo=1")
 | 
			
		||||
            info = response["fileinfo"]
 | 
			
		||||
            files = [
 | 
			
		||||
                SnapshotBinaryFile(
 | 
			
		||||
@ -1108,8 +1108,8 @@ class SnapshotSourcePackage(SnapshotPackage):
 | 
			
		||||
 | 
			
		||||
    def getFiles(self):
 | 
			
		||||
        if not self._files:
 | 
			
		||||
            url = "/mr/package/{}/{}/srcfiles".format(self.name, self.version)
 | 
			
		||||
            response = Snapshot.load("{}?fileinfo=1".format(url))
 | 
			
		||||
            url = f"/mr/package/{self.name}/{self.version}/srcfiles"
 | 
			
		||||
            response = Snapshot.load(f"{url}?fileinfo=1")
 | 
			
		||||
            info = response["fileinfo"]
 | 
			
		||||
            self._files = [
 | 
			
		||||
                SnapshotSourceFile(
 | 
			
		||||
@ -1144,8 +1144,8 @@ class SnapshotBinaryPackage(SnapshotPackage):
 | 
			
		||||
 | 
			
		||||
    def getFiles(self, arch=None):
 | 
			
		||||
        if not self._files:
 | 
			
		||||
            url = "/mr/binary/{}/{}/binfiles".format(self.name, self.version)
 | 
			
		||||
            response = Snapshot.load("{}?fileinfo=1".format(url))
 | 
			
		||||
            url = f"/mr/binary/{self.name}/{self.version}/binfiles"
 | 
			
		||||
            response = Snapshot.load(f"{url}?fileinfo=1")
 | 
			
		||||
            info = response["fileinfo"]
 | 
			
		||||
            self._files = [
 | 
			
		||||
                SnapshotBinaryFile(
 | 
			
		||||
@ -1209,10 +1209,10 @@ class SnapshotFile:
 | 
			
		||||
        return self._hash
 | 
			
		||||
 | 
			
		||||
    def getUrl(self):
 | 
			
		||||
        return "{}/file/{}".format(Snapshot.getHostUrl(), self.getHash())
 | 
			
		||||
        return f"{Snapshot.getHostUrl()}/file/{self.getHash()}"
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return "{}/{} {} bytes {}".format(self.path, self.name, self.size, self.date)
 | 
			
		||||
        return f"{self.path}/{self.name} {self.size} bytes {self.date}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SnapshotSourceFile(SnapshotFile):
 | 
			
		||||
@ -1260,7 +1260,7 @@ class SnapshotSPPH:
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def display_name(self):
 | 
			
		||||
        return "{name} {version}".format(name=self.getPackageName(), version=self.getVersion())
 | 
			
		||||
        return f"{self.getPackageName()} {self.getVersion()}"
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def pocket(self):
 | 
			
		||||
@ -1329,7 +1329,7 @@ class SnapshotSPPH:
 | 
			
		||||
        if self._changelog is None:
 | 
			
		||||
            name = self.getPackageName()
 | 
			
		||||
            if name.startswith("lib"):
 | 
			
		||||
                subdir = "lib%s" % name[3]
 | 
			
		||||
                subdir = f"lib{name[3]}"
 | 
			
		||||
            else:
 | 
			
		||||
                subdir = name[0]
 | 
			
		||||
            pkgversion = Version(self.getVersion()).strip_epoch()
 | 
			
		||||
@ -1394,7 +1394,7 @@ class SnapshotBPPH:  # pylint: disable=too-many-public-methods
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def display_name(self):
 | 
			
		||||
        return "{name} {version}".format(name=self.getPackageName(), version=self.getVersion())
 | 
			
		||||
        return f"{self.getPackageName()} {self.getVersion()}"
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def pocket(self):
 | 
			
		||||
 | 
			
		||||
@ -130,7 +130,7 @@ class MetaWrapper(type):
 | 
			
		||||
    def __init__(cls, name, bases, attrd):
 | 
			
		||||
        super(MetaWrapper, cls).__init__(name, bases, attrd)
 | 
			
		||||
        if "resource_type" not in attrd:
 | 
			
		||||
            raise TypeError('Class "%s" needs an associated resource type' % name)
 | 
			
		||||
            raise TypeError(f'Class "{name}" needs an associated resource type')
 | 
			
		||||
        cls._cache = {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -173,13 +173,13 @@ class BaseWrapper(metaclass=MetaWrapper):
 | 
			
		||||
                    if isinstance(cache, collections.abc.Callable):
 | 
			
		||||
                        cache(cached)
 | 
			
		||||
                return cached
 | 
			
		||||
            raise TypeError("'%s' is not a '%s' object" % (str(data), str(cls.resource_type)))
 | 
			
		||||
            raise TypeError(f"'{data}' is not a '{cls.resource_type}' object")
 | 
			
		||||
 | 
			
		||||
        # not a LP API representation, let the specific class handle it
 | 
			
		||||
        fetch = getattr(cls, "fetch", None)
 | 
			
		||||
        if isinstance(fetch, collections.abc.Callable):
 | 
			
		||||
            return fetch(data)
 | 
			
		||||
        raise NotImplementedError("Don't know how to fetch '%s' from LP" % str(data))
 | 
			
		||||
        raise NotImplementedError(f"Don't know how to fetch '{data}' from LP")
 | 
			
		||||
 | 
			
		||||
    def __call__(self):
 | 
			
		||||
        return self._lpobject
 | 
			
		||||
@ -188,9 +188,7 @@ class BaseWrapper(metaclass=MetaWrapper):
 | 
			
		||||
        return getattr(self._lpobject, attr)
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        if hasattr(str, "format"):
 | 
			
		||||
            return "<{0}: {1!r}>".format(self.__class__.__name__, self._lpobject)
 | 
			
		||||
        return "<%s: %r>" % (self.__class__.__name__, self._lpobject)
 | 
			
		||||
        return f"<{self.__class__.__name__}: {self._lpobject!r}>"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Distribution(BaseWrapper):
 | 
			
		||||
@ -225,7 +223,7 @@ class Distribution(BaseWrapper):
 | 
			
		||||
        Fetch the distribution object identified by 'dist' from LP.
 | 
			
		||||
        """
 | 
			
		||||
        if not isinstance(dist, str):
 | 
			
		||||
            raise TypeError("Don't know what do with '%r'" % dist)
 | 
			
		||||
            raise TypeError(f"Don't know what do with '{dist!r}'")
 | 
			
		||||
        cached = cls._cache.get(dist)
 | 
			
		||||
        if not cached:
 | 
			
		||||
            cached = Distribution(Launchpad.distributions[dist])
 | 
			
		||||
@ -250,7 +248,7 @@ class Distribution(BaseWrapper):
 | 
			
		||||
 | 
			
		||||
            if res:
 | 
			
		||||
                return res
 | 
			
		||||
            message = "The Archive '%s' doesn't exist in %s" % (archive, self.display_name)
 | 
			
		||||
            message = f"The Archive '{archive}' doesn't exist in {self.display_name}"
 | 
			
		||||
            raise ArchiveNotFoundException(message)
 | 
			
		||||
 | 
			
		||||
        if self._main_archive is None:
 | 
			
		||||
@ -271,7 +269,7 @@ class Distribution(BaseWrapper):
 | 
			
		||||
        try:
 | 
			
		||||
            series = DistroSeries(self().getSeries(name_or_version=name_or_version))
 | 
			
		||||
        except HTTPError as error:
 | 
			
		||||
            message = "Release '%s' is unknown in '%s'." % (name_or_version, self.display_name)
 | 
			
		||||
            message = f"Release '{name_or_version}' is unknown in '{self.display_name}'."
 | 
			
		||||
            raise SeriesNotFoundException(message) from error
 | 
			
		||||
 | 
			
		||||
        self._cache_series(series)
 | 
			
		||||
@ -299,10 +297,7 @@ class Distribution(BaseWrapper):
 | 
			
		||||
 | 
			
		||||
        allseries = filter(lambda s: s.active, self._series.values())
 | 
			
		||||
        allseries = sorted(allseries, key=lambda s: float(s.version), reverse=True)
 | 
			
		||||
        Logger.debug(
 | 
			
		||||
            "Found series: %s",
 | 
			
		||||
            ", ".join(map(lambda s: "%s (%s)" % (s.name, s.version), allseries)),
 | 
			
		||||
        )
 | 
			
		||||
        Logger.debug("Found series: %s", ", ".join([f"{s.name} ({s.version})" for s in allseries]))
 | 
			
		||||
        return collections.OrderedDict((s.name, s) for s in allseries)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -346,7 +341,7 @@ class DistroSeries(BaseWrapper):
 | 
			
		||||
                architecture = DistroArchSeries(self().getDistroArchSeries(archtag=archtag))
 | 
			
		||||
                self._architectures[architecture.architecture_tag] = architecture
 | 
			
		||||
            except HTTPError as error:
 | 
			
		||||
                message = "Architecture %s is unknown." % archtag
 | 
			
		||||
                message = f"Architecture {archtag} is unknown."
 | 
			
		||||
                raise ArchSeriesNotFoundException(message) from error
 | 
			
		||||
        return self._architectures[archtag]
 | 
			
		||||
 | 
			
		||||
@ -584,7 +579,7 @@ class Archive(BaseWrapper):
 | 
			
		||||
 | 
			
		||||
        for pocket_ in pockets:
 | 
			
		||||
            if pocket_ not in POCKETS:
 | 
			
		||||
                raise PocketDoesNotExistError("Pocket '%s' does not exist." % pocket_)
 | 
			
		||||
                raise PocketDoesNotExistError(f"Pocket '{pocket_}' does not exist.")
 | 
			
		||||
 | 
			
		||||
        if not status:
 | 
			
		||||
            if version:
 | 
			
		||||
@ -600,7 +595,7 @@ class Archive(BaseWrapper):
 | 
			
		||||
 | 
			
		||||
        for status_ in statuses:
 | 
			
		||||
            if status_ not in STATUSES:
 | 
			
		||||
                raise ValueError("Status '%s' is not valid." % status_)
 | 
			
		||||
                raise ValueError(f"Status '{status_}' is not valid.")
 | 
			
		||||
 | 
			
		||||
        dist = Distribution(self.distribution_link)
 | 
			
		||||
 | 
			
		||||
@ -662,32 +657,30 @@ class Archive(BaseWrapper):
 | 
			
		||||
                params["version"] = version
 | 
			
		||||
 | 
			
		||||
            Logger.debug(
 | 
			
		||||
                "Calling %s(%s)",
 | 
			
		||||
                function,
 | 
			
		||||
                ", ".join(["%s=%s" % (k, v) for (k, v) in params.items()]),
 | 
			
		||||
                "Calling %s(%s)", function, ", ".join([f"{k}={v}" for (k, v) in params.items()])
 | 
			
		||||
            )
 | 
			
		||||
            records = getattr(self, function)(**params)
 | 
			
		||||
 | 
			
		||||
            err_msg = "does not exist in the %s %s archive" % (dist.display_name, self.name)
 | 
			
		||||
            err_msg = f"does not exist in the {dist.display_name} {self.name} archive"
 | 
			
		||||
 | 
			
		||||
            for record in records:
 | 
			
		||||
                if binary:
 | 
			
		||||
                    rversion = getattr(record, "binary_package_version", None)
 | 
			
		||||
                else:
 | 
			
		||||
                    rversion = getattr(record, "source_package_version", None)
 | 
			
		||||
                skipmsg = "Skipping version %s: " % rversion
 | 
			
		||||
                skipmsg = f"Skipping version {rversion}: "
 | 
			
		||||
 | 
			
		||||
                if record.pocket not in pockets:
 | 
			
		||||
                    err_msg = "pocket %s not in (%s)" % (record.pocket, ",".join(pockets))
 | 
			
		||||
                    err_msg = f"pocket {record.pocket} not in ({','.join(pockets)})"
 | 
			
		||||
                    Logger.debug(skipmsg + err_msg)
 | 
			
		||||
                    continue
 | 
			
		||||
                if record.status not in statuses:
 | 
			
		||||
                    err_msg = "status %s not in (%s)" % (record.status, ",".join(statuses))
 | 
			
		||||
                    err_msg = f"status {record.status} not in ({','.join(statuses)})"
 | 
			
		||||
                    Logger.debug(skipmsg + err_msg)
 | 
			
		||||
                    continue
 | 
			
		||||
                release = wrapper(record)
 | 
			
		||||
                if binary and archtag and archtag != release.arch:
 | 
			
		||||
                    err_msg = "arch %s does not match requested arch %s" % (release.arch, archtag)
 | 
			
		||||
                    err_msg = f"arch {release.arch} does not match requested arch {archtag}"
 | 
			
		||||
                    Logger.debug(skipmsg + err_msg)
 | 
			
		||||
                    continue
 | 
			
		||||
                # results are ordered so first is latest
 | 
			
		||||
@ -713,30 +706,30 @@ class Archive(BaseWrapper):
 | 
			
		||||
            package_type = "source package"
 | 
			
		||||
        else:
 | 
			
		||||
            package_type = "package"
 | 
			
		||||
        msg = "The %s '%s' " % (package_type, name)
 | 
			
		||||
        msg = f"The {package_type} '{name}' "
 | 
			
		||||
        if version:
 | 
			
		||||
            msg += "version %s " % version
 | 
			
		||||
            msg += f"version {version} "
 | 
			
		||||
        msg += err_msg
 | 
			
		||||
        if binary and archtag:
 | 
			
		||||
            msg += " for architecture %s" % archtag
 | 
			
		||||
            msg += f" for architecture {archtag}"
 | 
			
		||||
        if len(series_to_check) > 1:
 | 
			
		||||
            msg += " in any release"
 | 
			
		||||
            if len(pockets) == 1:
 | 
			
		||||
                msg += " for pocket %s" % pockets[0]
 | 
			
		||||
                msg += f" for pocket {pockets[0]}"
 | 
			
		||||
            elif len(pockets) != len(POCKETS):
 | 
			
		||||
                msg += " for pockets " + ", ".join(pockets)
 | 
			
		||||
                msg += f" for pockets {', '.join(pockets)}"
 | 
			
		||||
        elif series:
 | 
			
		||||
            msg += " in %s" % series.name
 | 
			
		||||
            msg += f" in {series.name}"
 | 
			
		||||
            if len(pockets) == 1:
 | 
			
		||||
                msg += "-%s" % pockets[0]
 | 
			
		||||
                msg += f"-{pockets[0]}"
 | 
			
		||||
            elif len(pockets) != len(POCKETS):
 | 
			
		||||
                msg += " for pockets " + ", ".join(pockets)
 | 
			
		||||
                msg += f" for pockets {', '.join(pockets)}"
 | 
			
		||||
        if len(statuses) == 1:
 | 
			
		||||
            msg += " with status %s" % statuses[0]
 | 
			
		||||
            msg += f" with status {statuses[0]}"
 | 
			
		||||
        elif len(statuses) != len(STATUSES):
 | 
			
		||||
            msg += " with status in " + ", ".join(statuses)
 | 
			
		||||
            msg += f" with status in {', '.join(statuses)}"
 | 
			
		||||
        if version_with_epoch:
 | 
			
		||||
            msg += " (did you forget the epoch? try %s)" % version_with_epoch
 | 
			
		||||
            msg += f" (did you forget the epoch? try {version_with_epoch})"
 | 
			
		||||
        raise PackageNotFoundException(msg)
 | 
			
		||||
 | 
			
		||||
    def copyPackage(
 | 
			
		||||
@ -1113,8 +1106,9 @@ class SourcePackagePublishingHistory(BaseWrapper):
 | 
			
		||||
        for arch in archs:
 | 
			
		||||
            build = self._builds.get(arch)
 | 
			
		||||
            if build:
 | 
			
		||||
                res.append("  %s" % build)
 | 
			
		||||
        return "Build state(s) for '%s':\n%s" % (self.getPackageName(), "\n".join(res))
 | 
			
		||||
                res.append(f"  {build}")
 | 
			
		||||
        msg = "\n".join(res)
 | 
			
		||||
        return f"Build state(s) for '{self.getPackageName()}':\n{msg}"
 | 
			
		||||
 | 
			
		||||
    def rescoreBuilds(self, archs, score):
 | 
			
		||||
        res = []
 | 
			
		||||
@ -1126,14 +1120,11 @@ class SourcePackagePublishingHistory(BaseWrapper):
 | 
			
		||||
            build = self._builds.get(arch)
 | 
			
		||||
            if build:
 | 
			
		||||
                if build.rescore(score):
 | 
			
		||||
                    res.append("  %s: done" % arch)
 | 
			
		||||
                    res.append(f"  {arch}: done")
 | 
			
		||||
                else:
 | 
			
		||||
                    res.append("  %s: failed" % arch)
 | 
			
		||||
        return "Rescoring builds of '%s' to %i:\n%s" % (
 | 
			
		||||
            self.getPackageName(),
 | 
			
		||||
            score,
 | 
			
		||||
            "\n".join(res),
 | 
			
		||||
        )
 | 
			
		||||
                    res.append(f"  {arch}: failed")
 | 
			
		||||
        msg = "\n".join(res)
 | 
			
		||||
        return f"Rescoring builds of '{self.getPackageName()}' to {score}:\n{msg}"
 | 
			
		||||
 | 
			
		||||
    def retryBuilds(self, archs):
 | 
			
		||||
        res = []
 | 
			
		||||
@ -1145,10 +1136,11 @@ class SourcePackagePublishingHistory(BaseWrapper):
 | 
			
		||||
            build = self._builds.get(arch)
 | 
			
		||||
            if build:
 | 
			
		||||
                if build.retry():
 | 
			
		||||
                    res.append("  %s: done" % arch)
 | 
			
		||||
                    res.append(f"  {arch}: done")
 | 
			
		||||
                else:
 | 
			
		||||
                    res.append("  %s: failed" % arch)
 | 
			
		||||
        return "Retrying builds of '%s':\n%s" % (self.getPackageName(), "\n".join(res))
 | 
			
		||||
                    res.append(f"  {arch}: failed")
 | 
			
		||||
        msg = "\n".join(res)
 | 
			
		||||
        return f"Retrying builds of '{self.getPackageName()}':\n{msg}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BinaryPackagePublishingHistory(BaseWrapper):
 | 
			
		||||
@ -1297,9 +1289,7 @@ class BinaryPackagePublishingHistory(BaseWrapper):
 | 
			
		||||
        """
 | 
			
		||||
        Returns the original build URL of the binary package.
 | 
			
		||||
        """
 | 
			
		||||
        return "{build}/+files/{filename}".format(
 | 
			
		||||
            build=self.getBuild().getUrl(), filename=self.getFileName()
 | 
			
		||||
        )
 | 
			
		||||
        return f"{self.getBuild().getUrl()}/+files/{self.getFileName()}"
 | 
			
		||||
 | 
			
		||||
    def getFileVersion(self):
 | 
			
		||||
        """
 | 
			
		||||
@ -1351,11 +1341,9 @@ class BinaryPackagePublishingHistory(BaseWrapper):
 | 
			
		||||
        """
 | 
			
		||||
        Returns the filename for this binary package.
 | 
			
		||||
        """
 | 
			
		||||
        return "{name}_{version}_{arch}.{ext}".format(
 | 
			
		||||
            name=self.getPackageName(),
 | 
			
		||||
            version=self.getFileVersion(),
 | 
			
		||||
            arch=self.getFileArch(),
 | 
			
		||||
            ext=self.getFileExt(),
 | 
			
		||||
        return (
 | 
			
		||||
            f"{self.getPackageName()}_{self.getFileVersion()}"
 | 
			
		||||
            f"_{self.getFileArch()}.{self.getFileExt()}"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1392,7 +1380,7 @@ class PersonTeam(BaseWrapper, metaclass=MetaPersonTeam):
 | 
			
		||||
            self._upload = {}
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return "%s (%s)" % (self.display_name, self.name)
 | 
			
		||||
        return f"{self.display_name} ({self.name})"
 | 
			
		||||
 | 
			
		||||
    def cache(self):
 | 
			
		||||
        self._cache[self.name] = self
 | 
			
		||||
@ -1403,7 +1391,7 @@ class PersonTeam(BaseWrapper, metaclass=MetaPersonTeam):
 | 
			
		||||
        Fetch the person or team object identified by 'url' from LP.
 | 
			
		||||
        """
 | 
			
		||||
        if not isinstance(person_or_team, str):
 | 
			
		||||
            raise TypeError("Don't know what do with '%r'" % person_or_team)
 | 
			
		||||
            raise TypeError(f"Don't know what do with '{person_or_team!r}'")
 | 
			
		||||
        cached = cls._cache.get(person_or_team)
 | 
			
		||||
        if not cached:
 | 
			
		||||
            cached = PersonTeam(Launchpad.people[person_or_team])
 | 
			
		||||
@ -1426,9 +1414,9 @@ class PersonTeam(BaseWrapper, metaclass=MetaPersonTeam):
 | 
			
		||||
        'distroseries' has to be an DistroSeries object.
 | 
			
		||||
        """
 | 
			
		||||
        if not isinstance(archive, Archive):
 | 
			
		||||
            raise TypeError("'%r' is not an Archive object." % archive)
 | 
			
		||||
            raise TypeError(f"'{archive!r}' is not an Archive object.")
 | 
			
		||||
        if not isinstance(distroseries, DistroSeries):
 | 
			
		||||
            raise TypeError("'%r' is not a DistroSeries object." % distroseries)
 | 
			
		||||
            raise TypeError(f"'{distroseries!r}' is not a DistroSeries object.")
 | 
			
		||||
        if package is not None and not isinstance(package, str):
 | 
			
		||||
            raise TypeError("A source package name expected.")
 | 
			
		||||
        if component is not None and not isinstance(component, str):
 | 
			
		||||
@ -1436,7 +1424,7 @@ class PersonTeam(BaseWrapper, metaclass=MetaPersonTeam):
 | 
			
		||||
        if package is None and component is None:
 | 
			
		||||
            raise ValueError("Either a source package name or a component has to be specified.")
 | 
			
		||||
        if pocket not in POCKETS:
 | 
			
		||||
            raise PocketDoesNotExistError("Pocket '%s' does not exist." % pocket)
 | 
			
		||||
            raise PocketDoesNotExistError(f"Pocket '{pocket}' does not exist.")
 | 
			
		||||
 | 
			
		||||
        can_upload = self._upload.get((archive, distroseries, pocket, package, component))
 | 
			
		||||
 | 
			
		||||
@ -1504,7 +1492,7 @@ class Project(BaseWrapper):
 | 
			
		||||
        Fetch the project object identified by 'project' from LP.
 | 
			
		||||
        """
 | 
			
		||||
        if not isinstance(project, str):
 | 
			
		||||
            raise TypeError("Don't know what do with '%r'" % project)
 | 
			
		||||
            raise TypeError(f"Don't know what do with '{project!r}'")
 | 
			
		||||
        return Project(Launchpad.projects(project))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1524,7 +1512,7 @@ class Build(BaseWrapper):
 | 
			
		||||
    resource_type = "build"
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return "%s: %s" % (self.arch_tag, self.buildstate)
 | 
			
		||||
        return f"{self.arch_tag}: {self.buildstate}"
 | 
			
		||||
 | 
			
		||||
    def getSourcePackagePublishingHistory(self):
 | 
			
		||||
        link = self._lpobject.current_source_publication_link
 | 
			
		||||
 | 
			
		||||
@ -173,7 +173,7 @@ def split_release_pocket(release, default="Release"):
 | 
			
		||||
        pocket = pocket.capitalize()
 | 
			
		||||
 | 
			
		||||
        if pocket not in POCKETS:
 | 
			
		||||
            raise PocketDoesNotExistError("Pocket '%s' does not exist." % pocket)
 | 
			
		||||
            raise PocketDoesNotExistError(f"Pocket '{pocket}' does not exist.")
 | 
			
		||||
 | 
			
		||||
    return (release, pocket)
 | 
			
		||||
 | 
			
		||||
@ -406,7 +406,7 @@ def _download(fsrc, fdst, size, *, blocksize):
 | 
			
		||||
    parsed = urlparse(url)
 | 
			
		||||
    filename = Path(parsed.path).name
 | 
			
		||||
    hostname = parsed.hostname
 | 
			
		||||
    sizemb = " (%0.3f MiB)" % (size / 1024.0 / 1024) if size else ""
 | 
			
		||||
    sizemb = f" ({size / 1024.0 / 1024:0.3f} MiB)" if size else ""
 | 
			
		||||
    Logger.info("Downloading %s from %s%s", filename, hostname, sizemb)
 | 
			
		||||
 | 
			
		||||
    # Don't show progress if:
 | 
			
		||||
 | 
			
		||||
@ -133,12 +133,12 @@ class PullPkg:
 | 
			
		||||
 | 
			
		||||
        help_default_pull = "What to pull: " + ", ".join(VALID_PULLS)
 | 
			
		||||
        if self._default_pull:
 | 
			
		||||
            help_default_pull += " (default: %s)" % self._default_pull
 | 
			
		||||
            help_default_pull += f" (default: {self._default_pull})"
 | 
			
		||||
        help_default_distro = "Pull from: " + ", ".join(VALID_DISTROS)
 | 
			
		||||
        if self._default_distro:
 | 
			
		||||
            help_default_distro += " (default: %s)" % self._default_distro
 | 
			
		||||
            help_default_distro += f" (default: {self._default_distro})"
 | 
			
		||||
        help_default_arch = "Get binary packages for arch"
 | 
			
		||||
        help_default_arch += "(default: %s)" % self._default_arch
 | 
			
		||||
        help_default_arch += f"(default: {self._default_arch})"
 | 
			
		||||
 | 
			
		||||
        # use add_help=False because we do parse_known_args() below, and if
 | 
			
		||||
        # that sees --help then it exits immediately
 | 
			
		||||
@ -233,7 +233,7 @@ class PullPkg:
 | 
			
		||||
            pull = PULL_DEBS
 | 
			
		||||
        # verify pull action is valid
 | 
			
		||||
        if pull not in VALID_PULLS:
 | 
			
		||||
            raise InvalidPullValueError("Invalid pull action '%s'" % pull)
 | 
			
		||||
            raise InvalidPullValueError(f"Invalid pull action '{pull}'")
 | 
			
		||||
 | 
			
		||||
        return pull
 | 
			
		||||
 | 
			
		||||
@ -254,7 +254,7 @@ class PullPkg:
 | 
			
		||||
            distro = DISTRO_UCA
 | 
			
		||||
        # verify distro is valid
 | 
			
		||||
        if distro not in VALID_DISTROS:
 | 
			
		||||
            raise InvalidDistroValueError("Invalid distro '%s'" % distro)
 | 
			
		||||
            raise InvalidDistroValueError(f"Invalid distro '{distro}'")
 | 
			
		||||
 | 
			
		||||
        return distro
 | 
			
		||||
 | 
			
		||||
@ -397,11 +397,10 @@ class PullPkg:
 | 
			
		||||
            elif options["status"][0].capitalize() in UPLOAD_QUEUE_STATUSES:
 | 
			
		||||
                params["status"] = options["status"][0].capitalize()
 | 
			
		||||
            else:
 | 
			
		||||
                msg = "Invalid upload queue status '%s': valid values are %s" % (
 | 
			
		||||
                    options["status"][0],
 | 
			
		||||
                    ", ".join(UPLOAD_QUEUE_STATUSES),
 | 
			
		||||
                raise ValueError(
 | 
			
		||||
                    f"Invalid upload queue status '{options['status'][0]}':"
 | 
			
		||||
                    f" valid values are {', '.join(UPLOAD_QUEUE_STATUSES)}"
 | 
			
		||||
                )
 | 
			
		||||
                raise ValueError(msg)
 | 
			
		||||
 | 
			
		||||
        return params
 | 
			
		||||
 | 
			
		||||
@ -492,7 +491,7 @@ class PullPkg:
 | 
			
		||||
                Logger.error("No %s found for %s %s", pull, package, spph.getVersion())
 | 
			
		||||
        else:
 | 
			
		||||
            Logger.error("Internal error: invalid pull value after parse_pull()")
 | 
			
		||||
            raise InvalidPullValueError("Invalid pull value '%s'" % pull)
 | 
			
		||||
            raise InvalidPullValueError(f"Invalid pull value '{pull}'")
 | 
			
		||||
 | 
			
		||||
    def pull_upload_queue(
 | 
			
		||||
        self,
 | 
			
		||||
@ -543,22 +542,18 @@ class PullPkg:
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
        if not packages:
 | 
			
		||||
            msg = "Package %s not found in %s upload queue for %s" % (
 | 
			
		||||
                package,
 | 
			
		||||
                queuetype,
 | 
			
		||||
                series.name,
 | 
			
		||||
            )
 | 
			
		||||
            msg = f"Package {package} not found in {queuetype} upload queue for {series.name}"
 | 
			
		||||
            if version:
 | 
			
		||||
                msg += " with version/id %s" % version
 | 
			
		||||
                msg += f" with version/id {version}"
 | 
			
		||||
            if pull in VALID_BINARY_PULLS:
 | 
			
		||||
                msg += " for arch %s" % arch
 | 
			
		||||
                msg += f" for arch {arch}"
 | 
			
		||||
            raise PackageNotFoundException(msg)
 | 
			
		||||
 | 
			
		||||
        if pull == PULL_LIST:
 | 
			
		||||
            for pkg in packages:
 | 
			
		||||
                msg = "Found %s %s (ID %s)" % (pkg.package_name, pkg.package_version, pkg.id)
 | 
			
		||||
                msg = f"Found {pkg.package_name} {pkg.package_version} (ID {pkg.id})"
 | 
			
		||||
                if pkg.display_arches:
 | 
			
		||||
                    msg += " arch %s" % pkg.display_arches
 | 
			
		||||
                    msg += f" arch {pkg.display_arches}"
 | 
			
		||||
                Logger.info(msg)
 | 
			
		||||
                url = pkg.changesFileUrl()
 | 
			
		||||
                if url:
 | 
			
		||||
@ -591,7 +586,7 @@ class PullPkg:
 | 
			
		||||
        if len(packages) > 1:
 | 
			
		||||
            msg = "Found multiple packages"
 | 
			
		||||
            if version:
 | 
			
		||||
                msg += " with version %s, please specify the ID instead" % version
 | 
			
		||||
                msg += f" with version {version}, please specify the ID instead"
 | 
			
		||||
            else:
 | 
			
		||||
                msg += ", please specify the version"
 | 
			
		||||
            Logger.error("Available package versions/ids are:")
 | 
			
		||||
@ -634,13 +629,13 @@ class PullPkg:
 | 
			
		||||
        else:
 | 
			
		||||
            name = ".*"
 | 
			
		||||
            if pull == PULL_DEBS:
 | 
			
		||||
                name = r"{}(?<!-di)(?<!-dbgsym)$".format(name)
 | 
			
		||||
                name = rf"{name}(?<!-di)(?<!-dbgsym)$"
 | 
			
		||||
            elif pull == PULL_DDEBS:
 | 
			
		||||
                name += "-dbgsym$"
 | 
			
		||||
            elif pull == PULL_UDEBS:
 | 
			
		||||
                name += "-di$"
 | 
			
		||||
            else:
 | 
			
		||||
                raise InvalidPullValueError("Invalid pull value %s" % pull)
 | 
			
		||||
                raise InvalidPullValueError(f"Invalid pull value {pull}")
 | 
			
		||||
 | 
			
		||||
            urls |= set(pkg.binaryFileUrls())
 | 
			
		||||
            if not urls:
 | 
			
		||||
 | 
			
		||||
@ -78,7 +78,7 @@ class YesNoQuestion(Question):
 | 
			
		||||
 | 
			
		||||
def input_number(question, min_number, max_number, default=None):
 | 
			
		||||
    if default:
 | 
			
		||||
        question += " [%i]? " % (default)
 | 
			
		||||
        question += f" [{default}]? "
 | 
			
		||||
    else:
 | 
			
		||||
        question += "? "
 | 
			
		||||
    selected = None
 | 
			
		||||
@ -94,7 +94,7 @@ def input_number(question, min_number, max_number, default=None):
 | 
			
		||||
            try:
 | 
			
		||||
                selected = int(selected)
 | 
			
		||||
                if selected < min_number or selected > max_number:
 | 
			
		||||
                    print("Please input a number between %i and %i." % (min_number, max_number))
 | 
			
		||||
                    print(f"Please input a number between {min_number} and {max_number}.")
 | 
			
		||||
            except ValueError:
 | 
			
		||||
                print("Please input a number.")
 | 
			
		||||
    assert isinstance(selected, int)
 | 
			
		||||
@ -108,7 +108,7 @@ def confirmation_prompt(message=None, action=None):
 | 
			
		||||
    if message is None:
 | 
			
		||||
        if action is None:
 | 
			
		||||
            action = "continue"
 | 
			
		||||
        message = "Press [Enter] to %s. Press [Ctrl-C] to abort now." % action
 | 
			
		||||
        message = f"Press [Enter] to {action}. Press [Ctrl-C] to abort now."
 | 
			
		||||
    try:
 | 
			
		||||
        input(message)
 | 
			
		||||
    except (EOFError, KeyboardInterrupt):
 | 
			
		||||
@ -126,7 +126,7 @@ class EditFile:
 | 
			
		||||
 | 
			
		||||
    def edit(self, optional=False):
 | 
			
		||||
        if optional:
 | 
			
		||||
            print("\n\nCurrently the %s looks like:" % self.description)
 | 
			
		||||
            print(f"\n\nCurrently the {self.description} looks like:")
 | 
			
		||||
            with open(self.filename, "r", encoding="utf-8") as f:
 | 
			
		||||
                print(f.read())
 | 
			
		||||
            if YesNoQuestion().ask("Edit", "no") == "no":
 | 
			
		||||
@ -147,12 +147,12 @@ class EditFile:
 | 
			
		||||
 | 
			
		||||
            if placeholders_present:
 | 
			
		||||
                print(
 | 
			
		||||
                    "Placeholders still present in the %s. "
 | 
			
		||||
                    "Please replace them with useful information." % self.description
 | 
			
		||||
                    f"Placeholders still present in the {self.description}. "
 | 
			
		||||
                    f"Please replace them with useful information."
 | 
			
		||||
                )
 | 
			
		||||
                confirmation_prompt(action="edit again")
 | 
			
		||||
            elif not modified:
 | 
			
		||||
                print("The %s was not modified" % self.description)
 | 
			
		||||
                print(f"The {self.description} was not modified")
 | 
			
		||||
                if YesNoQuestion().ask("Edit again", "yes") == "no":
 | 
			
		||||
                    done = True
 | 
			
		||||
            elif self.check_edit():
 | 
			
		||||
@ -172,9 +172,7 @@ class EditBugReport(EditFile):
 | 
			
		||||
    def __init__(self, subject, body, placeholders=None):
 | 
			
		||||
        prefix = os.path.basename(sys.argv[0]) + "_"
 | 
			
		||||
        tmpfile = tempfile.NamedTemporaryFile(prefix=prefix, suffix=".txt", delete=False)
 | 
			
		||||
        tmpfile.write(
 | 
			
		||||
            ("Summary (one line):\n%s\n\nDescription:\n%s" % (subject, body)).encode("utf-8")
 | 
			
		||||
        )
 | 
			
		||||
        tmpfile.write((f"Summary (one line):\n{subject}\n\nDescription:\n{body}").encode("utf-8"))
 | 
			
		||||
        tmpfile.close()
 | 
			
		||||
        super().__init__(tmpfile.name, "bug report", placeholders)
 | 
			
		||||
 | 
			
		||||
@ -184,8 +182,7 @@ class EditBugReport(EditFile):
 | 
			
		||||
 | 
			
		||||
        if self.split_re.match(report) is None:
 | 
			
		||||
            print(
 | 
			
		||||
                "The %s doesn't start with 'Summary:' and 'Description:' "
 | 
			
		||||
                "blocks" % self.description
 | 
			
		||||
                f"The {self.description} doesn't start with 'Summary:' and 'Description:' blocks"
 | 
			
		||||
            )
 | 
			
		||||
            confirmation_prompt("edit again")
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
@ -105,13 +105,11 @@ def check_existing_reports(srcpkg):
 | 
			
		||||
    # Search bug list for other sync requests.
 | 
			
		||||
    for bug in pkg_bug_list:
 | 
			
		||||
        # check for Sync or sync and the package name
 | 
			
		||||
        if not bug.is_complete and "ync %s" % srcpkg in bug.title:
 | 
			
		||||
        if not bug.is_complete and f"ync {srcpkg}" in bug.title:
 | 
			
		||||
            print(
 | 
			
		||||
                "The following bug could be a possible duplicate sync bug "
 | 
			
		||||
                "on Launchpad:\n"
 | 
			
		||||
                " * %s (%s)\n"
 | 
			
		||||
                "Please check the above URL to verify this before "
 | 
			
		||||
                "continuing." % (bug.title, bug.web_link)
 | 
			
		||||
                f"The following bug could be a possible duplicate sync bug on Launchpad:\n"
 | 
			
		||||
                f" * {bug.title} ({bug.web_link})\n"
 | 
			
		||||
                f"Please check the above URL to verify this before continuing."
 | 
			
		||||
            )
 | 
			
		||||
            confirmation_prompt()
 | 
			
		||||
 | 
			
		||||
@ -126,10 +124,9 @@ def get_ubuntu_delta_changelog(srcpkg):
 | 
			
		||||
        source_name=srcpkg.getPackageName(), exact_match=True, pocket="Release"
 | 
			
		||||
    )
 | 
			
		||||
    debian_info = DebianDistroInfo()
 | 
			
		||||
    name_chars = "[-+0-9a-z.]"
 | 
			
		||||
    topline = re.compile(
 | 
			
		||||
        r"^(\w%(name_chars)s*) \(([^\(\) \t]+)\)"
 | 
			
		||||
        r"((\s+%(name_chars)s+)+)\;" % {"name_chars": "[-+0-9a-z.]"},
 | 
			
		||||
        re.IGNORECASE,
 | 
			
		||||
        rf"^(\w%({name_chars})s*) \(([^\(\) \t]+)\)((\s+%({name_chars})s+)+)\;", re.IGNORECASE
 | 
			
		||||
    )
 | 
			
		||||
    delta = []
 | 
			
		||||
    for record in spph:
 | 
			
		||||
@ -168,14 +165,12 @@ def post_bug(srcpkg, subscribe, status, bugtitle, bugtext):
 | 
			
		||||
    Use the LP API to file the sync request.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    print("The final report is:\nSummary: %s\nDescription:\n%s\n" % (bugtitle, bugtext))
 | 
			
		||||
    print(f"The final report is:\nSummary: {bugtitle}\nDescription:\n{bugtext}\n")
 | 
			
		||||
    confirmation_prompt()
 | 
			
		||||
 | 
			
		||||
    if srcpkg:
 | 
			
		||||
        # pylint: disable=protected-access
 | 
			
		||||
        bug_target = DistributionSourcePackage(
 | 
			
		||||
            "%subuntu/+source/%s" % (Launchpad._root_uri, srcpkg)
 | 
			
		||||
        )
 | 
			
		||||
        bug_target = DistributionSourcePackage(f"{Launchpad._root_uri}ubuntu/+source/{srcpkg}")
 | 
			
		||||
    else:
 | 
			
		||||
        # new source package
 | 
			
		||||
        bug_target = Distribution("ubuntu")
 | 
			
		||||
@ -193,4 +188,4 @@ def post_bug(srcpkg, subscribe, status, bugtitle, bugtext):
 | 
			
		||||
 | 
			
		||||
    bug.subscribe(person=PersonTeam(subscribe)())
 | 
			
		||||
 | 
			
		||||
    print("Sync request filed as bug #%i: %s" % (bug.id, bug.web_link))
 | 
			
		||||
    print(f"Sync request filed as bug #{bug.id}: {bug.web_link}")
 | 
			
		||||
 | 
			
		||||
@ -73,8 +73,8 @@ def need_sponsorship(name, component, release):
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    val = YesNoQuestion().ask(
 | 
			
		||||
        "Do you have upload permissions for the '%s' component or "
 | 
			
		||||
        "the package '%s' in Ubuntu %s?\nIf in doubt answer 'n'." % (component, name, release),
 | 
			
		||||
        f"Do you have upload permissions for the '{component}' component or "
 | 
			
		||||
        f"the package '{name}' in Ubuntu {release}?\nIf in doubt answer 'n'.",
 | 
			
		||||
        "no",
 | 
			
		||||
    )
 | 
			
		||||
    return val == "no"
 | 
			
		||||
@ -85,9 +85,8 @@ def check_existing_reports(srcpkg):
 | 
			
		||||
    Point the user to the URL to manually check for duplicate bug reports.
 | 
			
		||||
    """
 | 
			
		||||
    print(
 | 
			
		||||
        "Please check on "
 | 
			
		||||
        "https://bugs.launchpad.net/ubuntu/+source/%s/+bugs\n"
 | 
			
		||||
        "for duplicate sync requests before continuing." % srcpkg
 | 
			
		||||
        f"Please check on https://bugs.launchpad.net/ubuntu/+source/{srcpkg}/+bugs\n"
 | 
			
		||||
        f"for duplicate sync requests before continuing."
 | 
			
		||||
    )
 | 
			
		||||
    confirmation_prompt()
 | 
			
		||||
 | 
			
		||||
@ -129,29 +128,25 @@ def mail_bug(
 | 
			
		||||
    Submit the sync request per email.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    to = "new@" + bug_mail_domain
 | 
			
		||||
    to = f"new@{bug_mail_domain}"
 | 
			
		||||
 | 
			
		||||
    # generate mailbody
 | 
			
		||||
    if srcpkg:
 | 
			
		||||
        mailbody = " affects ubuntu/%s\n" % srcpkg
 | 
			
		||||
        mailbody = f" affects ubuntu/{srcpkg}\n"
 | 
			
		||||
    else:
 | 
			
		||||
        mailbody = " affects ubuntu\n"
 | 
			
		||||
    mailbody += """\
 | 
			
		||||
 status %s
 | 
			
		||||
    mailbody += f"""\
 | 
			
		||||
 status {status}
 | 
			
		||||
 importance wishlist
 | 
			
		||||
 subscribe %s
 | 
			
		||||
 subscribe {subscribe}
 | 
			
		||||
 done
 | 
			
		||||
 | 
			
		||||
%s""" % (
 | 
			
		||||
        status,
 | 
			
		||||
        subscribe,
 | 
			
		||||
        bugtext,
 | 
			
		||||
    )
 | 
			
		||||
{bugtext}"""
 | 
			
		||||
 | 
			
		||||
    # prepare sign command
 | 
			
		||||
    gpg_command = None
 | 
			
		||||
    for cmd in ("gnome-gpg", "gpg2", "gpg"):
 | 
			
		||||
        if os.access("/usr/bin/%s" % cmd, os.X_OK):
 | 
			
		||||
        if os.access(f"/usr/bin/{cmd}", os.X_OK):
 | 
			
		||||
            gpg_command = [cmd]
 | 
			
		||||
            break
 | 
			
		||||
 | 
			
		||||
@ -173,20 +168,15 @@ def mail_bug(
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    # generate email
 | 
			
		||||
    mail = """\
 | 
			
		||||
From: %s
 | 
			
		||||
To: %s
 | 
			
		||||
Subject: %s
 | 
			
		||||
    mail = f"""\
 | 
			
		||||
From: {myemailaddr}
 | 
			
		||||
To: {to}
 | 
			
		||||
Subject: {bugtitle}
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
 | 
			
		||||
%s""" % (
 | 
			
		||||
        myemailaddr,
 | 
			
		||||
        to,
 | 
			
		||||
        bugtitle,
 | 
			
		||||
        signed_report,
 | 
			
		||||
    )
 | 
			
		||||
{signed_report}"""
 | 
			
		||||
 | 
			
		||||
    print("The final report is:\n%s" % mail)
 | 
			
		||||
    print(f"The final report is:\n{mail}")
 | 
			
		||||
    confirmation_prompt()
 | 
			
		||||
 | 
			
		||||
    # save mail in temporary file
 | 
			
		||||
 | 
			
		||||
@ -80,7 +80,7 @@ class BugTask:
 | 
			
		||||
                dsc_file = os.path.join(os.getcwd(), filename)
 | 
			
		||||
            else:
 | 
			
		||||
                urlretrieve(url, filename)
 | 
			
		||||
        assert os.path.isfile(dsc_file), "%s does not exist." % (dsc_file)
 | 
			
		||||
        assert os.path.isfile(dsc_file), f"{dsc_file} does not exist."
 | 
			
		||||
        return dsc_file
 | 
			
		||||
 | 
			
		||||
    def get_branch_link(self):
 | 
			
		||||
 | 
			
		||||
@ -91,10 +91,9 @@ class SourcePackage:
 | 
			
		||||
 | 
			
		||||
            msg = "Sync request ACK'd."
 | 
			
		||||
            if self._build_log:
 | 
			
		||||
                msg = ("%s %s builds on %s. " + msg) % (
 | 
			
		||||
                    self._package,
 | 
			
		||||
                    self._version,
 | 
			
		||||
                    self._builder.get_architecture(),
 | 
			
		||||
                msg = (
 | 
			
		||||
                    f"{self._package} {self._version} builds"
 | 
			
		||||
                    f" on {self._builder.get_architecture()}. {msg}"
 | 
			
		||||
                )
 | 
			
		||||
            bug.newMessage(content=msg, subject="sponsor-patch")
 | 
			
		||||
            Logger.debug("Acknowledged sync request bug #%i.", bug.id)
 | 
			
		||||
@ -136,7 +135,7 @@ class SourcePackage:
 | 
			
		||||
            else:
 | 
			
		||||
                target = upload
 | 
			
		||||
            question = Question(["yes", "edit", "no"])
 | 
			
		||||
            answer = question.ask("Do you want to upload the package to %s" % target, "no")
 | 
			
		||||
            answer = question.ask(f"Do you want to upload the package to {target}", "no")
 | 
			
		||||
            if answer == "edit":
 | 
			
		||||
                return False
 | 
			
		||||
            if answer == "no":
 | 
			
		||||
@ -177,8 +176,9 @@ class SourcePackage:
 | 
			
		||||
 | 
			
		||||
        if dist is None:
 | 
			
		||||
            dist = re.sub("-.*$", "", self._changelog.distributions)
 | 
			
		||||
        build_name = "{}_{}_{}.build".format(
 | 
			
		||||
            self._package, strip_epoch(self._version), self._builder.get_architecture()
 | 
			
		||||
        build_name = (
 | 
			
		||||
            f"{self._package}_{strip_epoch(self._version)}"
 | 
			
		||||
            f"_{self._builder.get_architecture()}.build"
 | 
			
		||||
        )
 | 
			
		||||
        self._build_log = os.path.join(self._buildresult, build_name)
 | 
			
		||||
 | 
			
		||||
@ -255,7 +255,7 @@ class SourcePackage:
 | 
			
		||||
    def _changes_file(self):
 | 
			
		||||
        """Returns the file name of the .changes file."""
 | 
			
		||||
        return os.path.join(
 | 
			
		||||
            self._workdir, "{}_{}_source.changes".format(self._package, strip_epoch(self._version))
 | 
			
		||||
            self._workdir, f"{self._package}_{ strip_epoch(self._version)}_source.changes"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def check_target(self, upload, launchpad):
 | 
			
		||||
@ -310,8 +310,8 @@ class SourcePackage:
 | 
			
		||||
        bug title."""
 | 
			
		||||
 | 
			
		||||
        if not task.title_contains(self._version):
 | 
			
		||||
            print("Bug #%i title: %s" % (bug_number, task.get_bug_title()))
 | 
			
		||||
            msg = "Is %s %s the version that should be synced" % (self._package, self._version)
 | 
			
		||||
            print(f"Bug #{bug_number} title: {task.get_bug_title()}")
 | 
			
		||||
            msg = f"Is {self._package} {self._version} the version that should be synced"
 | 
			
		||||
            answer = YesNoQuestion().ask(msg, "no")
 | 
			
		||||
            if answer == "no":
 | 
			
		||||
                user_abort()
 | 
			
		||||
@ -319,22 +319,20 @@ class SourcePackage:
 | 
			
		||||
    @property
 | 
			
		||||
    def _debdiff_filename(self):
 | 
			
		||||
        """Returns the file name of the .debdiff file."""
 | 
			
		||||
        debdiff_name = "{}_{}.debdiff".format(self._package, strip_epoch(self._version))
 | 
			
		||||
        debdiff_name = f"{self._package}_{strip_epoch(self._version)}.debdiff"
 | 
			
		||||
        return os.path.join(self._workdir, debdiff_name)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def _dsc_file(self):
 | 
			
		||||
        """Returns the file name of the .dsc file."""
 | 
			
		||||
        return os.path.join(
 | 
			
		||||
            self._workdir, "{}_{}.dsc".format(self._package, strip_epoch(self._version))
 | 
			
		||||
        )
 | 
			
		||||
        return os.path.join(self._workdir, f"{self._package}_{strip_epoch(self._version)}.dsc")
 | 
			
		||||
 | 
			
		||||
    def generate_debdiff(self, dsc_file):
 | 
			
		||||
        """Generates a debdiff between the given .dsc file and this source
 | 
			
		||||
        package."""
 | 
			
		||||
 | 
			
		||||
        assert os.path.isfile(dsc_file), "%s does not exist." % (dsc_file)
 | 
			
		||||
        assert os.path.isfile(self._dsc_file), "%s does not exist." % (self._dsc_file)
 | 
			
		||||
        assert os.path.isfile(dsc_file), f"{dsc_file} does not exist."
 | 
			
		||||
        assert os.path.isfile(self._dsc_file), f"{self._dsc_file} does not exist."
 | 
			
		||||
        cmd = ["debdiff", dsc_file, self._dsc_file]
 | 
			
		||||
        if not Logger.isEnabledFor(logging.DEBUG):
 | 
			
		||||
            cmd.insert(1, "-q")
 | 
			
		||||
@ -350,7 +348,7 @@ class SourcePackage:
 | 
			
		||||
        change something.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        assert os.path.isfile(self._changes_file), "%s does not exist." % (self._changes_file)
 | 
			
		||||
        assert os.path.isfile(self._changes_file), f"{self._changes_file} does not exist."
 | 
			
		||||
        changes = debian.deb822.Changes(open(self._changes_file, encoding="utf-8"))
 | 
			
		||||
        fixed_bugs = []
 | 
			
		||||
        if "Launchpad-Bugs-Fixed" in changes:
 | 
			
		||||
@ -371,7 +369,7 @@ class SourcePackage:
 | 
			
		||||
        """Print things that should be checked before uploading a package."""
 | 
			
		||||
 | 
			
		||||
        lintian_filename = self._run_lintian()
 | 
			
		||||
        print("\nPlease check %s %s carefully:" % (self._package, self._version))
 | 
			
		||||
        print(f"\nPlease check {self._package} {self._version} carefully:")
 | 
			
		||||
        if os.path.isfile(self._debdiff_filename):
 | 
			
		||||
            print("file://" + self._debdiff_filename)
 | 
			
		||||
        print("file://" + lintian_filename)
 | 
			
		||||
@ -430,7 +428,7 @@ class SourcePackage:
 | 
			
		||||
            changes_for_lintian = self._changes_file
 | 
			
		||||
 | 
			
		||||
        # Check lintian
 | 
			
		||||
        assert os.path.isfile(changes_for_lintian), "%s does not exist." % (changes_for_lintian)
 | 
			
		||||
        assert os.path.isfile(changes_for_lintian), f"{changes_for_lintian} does not exist."
 | 
			
		||||
        cmd = ["lintian", "-IE", "--pedantic", "-q", "--profile", "ubuntu", changes_for_lintian]
 | 
			
		||||
        lintian_filename = os.path.join(
 | 
			
		||||
            self._workdir, self._package + "_" + strip_epoch(self._version) + ".lintian"
 | 
			
		||||
 | 
			
		||||
@ -83,12 +83,11 @@ def edit_source():
 | 
			
		||||
    cmd = [get_user_shell()]
 | 
			
		||||
    Logger.debug(" ".join(cmd))
 | 
			
		||||
    print(
 | 
			
		||||
        """An interactive shell was launched in
 | 
			
		||||
file://%s
 | 
			
		||||
        f"""An interactive shell was launched in
 | 
			
		||||
file://{os.getcwd()}
 | 
			
		||||
Edit your files. When you are done, exit the shell. If you wish to abort the
 | 
			
		||||
process, exit the shell such that it returns an exit code other than zero.
 | 
			
		||||
"""
 | 
			
		||||
        % (os.getcwd()),
 | 
			
		||||
""",
 | 
			
		||||
        end=" ",
 | 
			
		||||
    )
 | 
			
		||||
    returncode = subprocess.call(cmd)
 | 
			
		||||
@ -101,35 +100,25 @@ def ask_for_patch_or_branch(bug, attached_patches, linked_branches):
 | 
			
		||||
    patch = None
 | 
			
		||||
    branch = None
 | 
			
		||||
    if len(attached_patches) == 0:
 | 
			
		||||
        msg = "https://launchpad.net/bugs/%i has %i branches linked:" % (
 | 
			
		||||
            bug.id,
 | 
			
		||||
            len(linked_branches),
 | 
			
		||||
        )
 | 
			
		||||
        msg = f"{len(linked_branches)} branches linked:"
 | 
			
		||||
    elif len(linked_branches) == 0:
 | 
			
		||||
        msg = "https://launchpad.net/bugs/%i has %i patches attached:" % (
 | 
			
		||||
            bug.id,
 | 
			
		||||
            len(attached_patches),
 | 
			
		||||
        )
 | 
			
		||||
        msg = f"{len(attached_patches)} patches attached:"
 | 
			
		||||
    else:
 | 
			
		||||
        branches = "%i branch" % len(linked_branches)
 | 
			
		||||
        branches = f"{len(linked_branches)} branch"
 | 
			
		||||
        if len(linked_branches) > 1:
 | 
			
		||||
            branches += "es"
 | 
			
		||||
        patches = "%i patch" % len(attached_patches)
 | 
			
		||||
        patches = f"{len(attached_patches)} patch"
 | 
			
		||||
        if len(attached_patches) > 1:
 | 
			
		||||
            patches += "es"
 | 
			
		||||
        msg = "https://launchpad.net/bugs/%i has %s linked and %s attached:" % (
 | 
			
		||||
            bug.id,
 | 
			
		||||
            branches,
 | 
			
		||||
            patches,
 | 
			
		||||
        )
 | 
			
		||||
    Logger.info(msg)
 | 
			
		||||
        msg = f"{branches} linked and {patches} attached:"
 | 
			
		||||
    Logger.info("https://launchpad.net/bugs/%i has %s", bug.id, msg)
 | 
			
		||||
    i = 0
 | 
			
		||||
    for linked_branch in linked_branches:
 | 
			
		||||
        i += 1
 | 
			
		||||
        print("%i) %s" % (i, linked_branch.display_name))
 | 
			
		||||
        print(f"{i}) {linked_branch.display_name}")
 | 
			
		||||
    for attached_patch in attached_patches:
 | 
			
		||||
        i += 1
 | 
			
		||||
        print("%i) %s" % (i, attached_patch.title))
 | 
			
		||||
        print(f"{i}) {attached_patch.title}")
 | 
			
		||||
    selected = input_number("Which branch or patch do you want to download", 1, i, i)
 | 
			
		||||
    if selected <= len(linked_branches):
 | 
			
		||||
        branch = linked_branches[selected - 1].bzr_identity
 | 
			
		||||
@ -246,7 +235,7 @@ def get_open_ubuntu_bug_task(launchpad, bug, branch=None):
 | 
			
		||||
                "https://launchpad.net/bugs/%i has %i Ubuntu tasks:", bug_id, len(ubuntu_tasks)
 | 
			
		||||
            )
 | 
			
		||||
            for i, ubuntu_task in enumerate(ubuntu_tasks):
 | 
			
		||||
                print("%i) %s" % (i + 1, ubuntu_task.get_package_and_series()))
 | 
			
		||||
                print(f"{i + 1}) {ubuntu_task.get_package_and_series()}")
 | 
			
		||||
            selected = input_number(
 | 
			
		||||
                "To which Ubuntu task does the patch belong", 1, len(ubuntu_tasks)
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@ class ConfigTestCase(unittest.TestCase):
 | 
			
		||||
            os.path.expanduser("~/.devscripts"): self._config_files["user"],
 | 
			
		||||
        }
 | 
			
		||||
        if filename not in files:
 | 
			
		||||
            raise IOError("No such file or directory: '%s'" % filename)
 | 
			
		||||
            raise IOError(f"No such file or directory: '{filename}'")
 | 
			
		||||
        return StringIO(files[filename])
 | 
			
		||||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
@ -209,7 +209,7 @@ class UbuEmailTestCase(unittest.TestCase):
 | 
			
		||||
        os.environ["DEBEMAIL"] = "joe@debian.org"
 | 
			
		||||
        name = "Joe Ubuntunista"
 | 
			
		||||
        email = "joe@ubuntu.com"
 | 
			
		||||
        os.environ["UBUMAIL"] = "%s <%s>" % (name, email)
 | 
			
		||||
        os.environ["UBUMAIL"] = f"{name} <{email}>"
 | 
			
		||||
        self.assertEqual(ubu_email(), (name, email))
 | 
			
		||||
        self.assertEqual(os.environ["DEBFULLNAME"], name)
 | 
			
		||||
        self.assertEqual(os.environ["DEBEMAIL"], email)
 | 
			
		||||
@ -217,7 +217,7 @@ class UbuEmailTestCase(unittest.TestCase):
 | 
			
		||||
    def test_debemail_with_name(self):
 | 
			
		||||
        name = "Joe Developer"
 | 
			
		||||
        email = "joe@example.net"
 | 
			
		||||
        os.environ["DEBEMAIL"] = orig = "%s <%s>" % (name, email)
 | 
			
		||||
        os.environ["DEBEMAIL"] = orig = f"{name} <{email}>"
 | 
			
		||||
        self.assertEqual(ubu_email(), (name, email))
 | 
			
		||||
        self.assertEqual(os.environ["DEBEMAIL"], orig)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -216,7 +216,7 @@ class UpdateMaintainerTestCase(unittest.TestCase):
 | 
			
		||||
            or base not in self._files
 | 
			
		||||
            or (mode == "r" and self._files[base] is None)
 | 
			
		||||
        ):
 | 
			
		||||
            raise IOError("No such file or directory: '%s'" % filename)
 | 
			
		||||
            raise IOError(f"No such file or directory: '{filename}'")
 | 
			
		||||
        if mode == "w":
 | 
			
		||||
            self._files[base] = StringIO()
 | 
			
		||||
            self._files[base].close = lambda: None
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@ class Control:
 | 
			
		||||
    """Represents a debian/control file"""
 | 
			
		||||
 | 
			
		||||
    def __init__(self, filename):
 | 
			
		||||
        assert os.path.isfile(filename), "%s does not exist." % (filename)
 | 
			
		||||
        assert os.path.isfile(filename), f"{filename} does not exist."
 | 
			
		||||
        self._filename = filename
 | 
			
		||||
        self._content = open(filename, encoding="utf-8").read()
 | 
			
		||||
 | 
			
		||||
@ -114,9 +114,9 @@ def _find_files(debian_directory, verbose):
 | 
			
		||||
 | 
			
		||||
    # Make sure that a changelog and control file is available
 | 
			
		||||
    if len(control_files) == 0:
 | 
			
		||||
        raise MaintainerUpdateException("No control file found in %s." % debian_directory)
 | 
			
		||||
        raise MaintainerUpdateException(f"No control file found in {debian_directory}.")
 | 
			
		||||
    if not os.path.isfile(changelog_file):
 | 
			
		||||
        raise MaintainerUpdateException("No changelog file found in %s." % debian_directory)
 | 
			
		||||
        raise MaintainerUpdateException(f"No changelog file found in {debian_directory}.")
 | 
			
		||||
 | 
			
		||||
    # If the rules file accounts for XSBC-Original-Maintainer, we should not
 | 
			
		||||
    # touch it in this package (e.g. the python package).
 | 
			
		||||
@ -160,8 +160,8 @@ def update_maintainer(debian_directory, verbose=False):
 | 
			
		||||
 | 
			
		||||
        if original_maintainer.strip().lower() in _PREVIOUS_UBUNTU_MAINTAINER:
 | 
			
		||||
            if verbose:
 | 
			
		||||
                print("The old maintainer was: %s" % original_maintainer)
 | 
			
		||||
                print("Resetting as: %s" % _UBUNTU_MAINTAINER)
 | 
			
		||||
                print(f"The old maintainer was: {original_maintainer}")
 | 
			
		||||
                print(f"Resetting as: {_UBUNTU_MAINTAINER}")
 | 
			
		||||
            control.set_maintainer(_UBUNTU_MAINTAINER)
 | 
			
		||||
            control.save()
 | 
			
		||||
            continue
 | 
			
		||||
@ -182,8 +182,8 @@ def update_maintainer(debian_directory, verbose=False):
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        if verbose:
 | 
			
		||||
            print("The original maintainer is: %s" % original_maintainer)
 | 
			
		||||
            print("Resetting as: %s" % _UBUNTU_MAINTAINER)
 | 
			
		||||
            print(f"The original maintainer is: {original_maintainer}")
 | 
			
		||||
            print(f"Resetting as: {_UBUNTU_MAINTAINER}")
 | 
			
		||||
        control.set_original_maintainer(original_maintainer)
 | 
			
		||||
        control.set_maintainer(_UBUNTU_MAINTAINER)
 | 
			
		||||
        control.save()
 | 
			
		||||
@ -205,7 +205,7 @@ def restore_maintainer(debian_directory, verbose=False):
 | 
			
		||||
        if not orig_maintainer:
 | 
			
		||||
            continue
 | 
			
		||||
        if verbose:
 | 
			
		||||
            print("Restoring original maintainer: %s" % orig_maintainer)
 | 
			
		||||
            print(f"Restoring original maintainer: {orig_maintainer}")
 | 
			
		||||
        control.set_maintainer(orig_maintainer)
 | 
			
		||||
        control.remove_original_maintainer()
 | 
			
		||||
        control.save()
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@ def find_debian_dir(depth=6):
 | 
			
		||||
    :returns: a path to an existing debian/ directory, or None
 | 
			
		||||
    """
 | 
			
		||||
    for path in ["../" * n or "./" for n in list(range(0, depth + 1))]:
 | 
			
		||||
        debian_path = "{}debian".format(path)
 | 
			
		||||
        debian_path = f"{path}debian"
 | 
			
		||||
        if os.path.exists(os.path.join(debian_path, "control")) and os.path.exists(
 | 
			
		||||
            os.path.join(debian_path, "changelog")
 | 
			
		||||
        ):
 | 
			
		||||
@ -46,7 +46,7 @@ def find_debian_dir(depth=6):
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    script_name = os.path.basename(sys.argv[0])
 | 
			
		||||
    epilog = "See %s(1) for more info." % (script_name)
 | 
			
		||||
    epilog = f"See {script_name}(1) for more info."
 | 
			
		||||
    parser = argparse.ArgumentParser(epilog=epilog)
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        "-d",
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user