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