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

1import os.path 

2import shutil 

3import subprocess 

4import textwrap 

5 

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 

16 

17# Match debhelper (minus one space in each end, which comes 

18# via join). 

19LINE_PREFIX = "\\\n " 

20 

21 

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 

35 

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) 

59 

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 )