Coverage for src/debputy/packaging/debconf_templates.py: 32%
31 statements
« prev ^ index » next coverage.py v7.8.2, created at 2026-06-16 19:34 +0000
« prev ^ index » next coverage.py v7.8.2, created at 2026-06-16 19:34 +0000
1import os.path
2import shutil
3import subprocess
4import textwrap
6from debputy.maintscript_snippet import (
7 MaintscriptSnippetContainer,
8 MaintscriptSnippet,
9 SnippetResolver,
10)
11from debputy.packager_provided_files import PackagerProvidedFile
12from debputy.packages import BinaryPackage
13from debputy.packaging.makeshlibs import resolve_reserved_provided_file
14from debputy.plugin.api.spec import FlushableSubstvars
15from debputy.util import _error, escape_shell
17# Match debhelper (minus one space in each end, which comes
18# via join).
19LINE_PREFIX = "\\\n "
22def process_debconf_templates(
23 binary_package: BinaryPackage,
24 reserved_packager_provided_files: dict[str, list[PackagerProvidedFile]],
25 maintscript_snippets: dict[str, MaintscriptSnippetContainer],
26 substvars: FlushableSubstvars,
27 control_output_dir: str,
28) -> None:
29 provided_templates_file = resolve_reserved_provided_file(
30 "templates",
31 reserved_packager_provided_files,
32 )
33 if provided_templates_file is None:
34 return
36 templates_file = os.path.join(control_output_dir, "templates")
37 debian_dir = provided_templates_file.parent_dir
38 po_template_dir = debian_dir.get("po") if debian_dir is not None else None
39 if po_template_dir is not None and po_template_dir.is_dir:
40 with open(templates_file, "wb") as fd:
41 cmd = [
42 "po2debconf",
43 provided_templates_file.fs_path,
44 ]
45 print(f" {escape_shell(*cmd)} > {templates_file}")
46 try:
47 subprocess.check_call(
48 cmd,
49 stdout=fd.fileno(),
50 )
51 except subprocess.CalledProcessError:
52 _error(
53 f"Failed to generate the templates files for {binary_package.name}. Please review "
54 f" the output of {escape_shell('po-debconf', provided_templates_file.fs_path)}"
55 " to understand the issue."
56 )
57 else:
58 shutil.copyfile(provided_templates_file.fs_path, templates_file)
60 dependency = (
61 "cdebconf-udeb" if binary_package.is_udeb else "debconf (>= 0.5) | debconf-2.0"
62 )
63 substvars.add_dependency("misc:Depends", dependency)
64 if not binary_package.is_udeb:
65 # udebs do not have `postrm` scripts
66 maintscript_snippets["postrm"].append(
67 MaintscriptSnippet(
68 f"debputy (due to {provided_templates_file.fs_path})",
69 uses_debconf=True,
70 snippet=SnippetResolver.snippet_template(textwrap.dedent("""\
71 if [ "$1" = purge ] ; then
72 db_purge
73 db_stop
74 fi
75 """)),
76 )
77 )