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

1import os.path 

2import shutil 

3import subprocess 

4import textwrap 

5 

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 

12 

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

14# via join). 

15LINE_PREFIX = "\\\n " 

16 

17 

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 

31 

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) 

55 

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 )