Coverage for app/venv/lib/python3.14/site-packages/weblate/vcs/apps.py: 82%

66 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 07:15 +0000

1# Copyright © Michal Čihař <michal@weblate.org> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4from __future__ import annotations 

5 

6import os 

7from typing import TYPE_CHECKING 

8 

9from django.apps import AppConfig 

10from django.core.checks import Warning as DjangoWarning 

11from django.core.checks import register 

12from django.db.models.signals import post_migrate 

13 

14import weblate.vcs.gpg 

15from weblate.utils.checks import weblate_check 

16from weblate.utils.data import data_dir 

17from weblate.utils.lock import WeblateLock 

18from weblate.vcs.base import RepositoryError 

19from weblate.vcs.git import GitRepository, SubversionRepository 

20from weblate.vcs.mercurial import HgRepository 

21from weblate.vcs.ssh import ensure_ssh_key 

22 

23if TYPE_CHECKING: 23 ↛ 24line 23 didn't jump to line 24 because the condition on line 23 was never true

24 from collections.abc import Iterable, Sequence 

25 

26 from django.core.checks import CheckMessage 

27 

28GIT_ERRORS: list[str] = [] 

29 

30 

31@register(deploy=True) 

32def check_gpg( 

33 *, 

34 app_configs: Sequence[AppConfig] | None, 

35 databases: Sequence[str] | None, 

36 **kwargs, 

37) -> Iterable[CheckMessage]: 

38 from weblate.vcs.gpg import get_gpg_public_key 

39 

40 get_gpg_public_key() 

41 template = "{}: {}" 

42 return [ 

43 weblate_check("weblate.C036", template.format(key, message)) 

44 for key, message in weblate.vcs.gpg.GPG_ERRORS.items() 

45 ] 

46 

47 

48@register 

49def check_vcs( 

50 *, 

51 app_configs: Sequence[AppConfig] | None, 

52 databases: Sequence[str] | None, 

53 **kwargs, 

54) -> Iterable[CheckMessage]: 

55 from weblate.vcs.models import VCS_REGISTRY 

56 

57 message = "Failure in loading VCS module for {}: {}" 

58 return [ 

59 weblate_check( 

60 f"weblate.W033.{key}", 

61 message.format(key, str(value).strip()), 

62 DjangoWarning, 

63 ) 

64 for key, value in VCS_REGISTRY.errors.items() 

65 ] 

66 

67 

68@register(deploy=True) 

69def check_git( 

70 *, 

71 app_configs: Sequence[AppConfig] | None, 

72 databases: Sequence[str] | None, 

73 **kwargs, 

74) -> Iterable[CheckMessage]: 

75 template = "Failure in configuring Git: {}" 

76 return [ 

77 weblate_check("weblate.C035", template.format(message)) 

78 for message in GIT_ERRORS 

79 ] 

80 

81 

82@register 

83def check_vcs_credentials( 

84 *, 

85 app_configs: Sequence[AppConfig] | None, 

86 databases: Sequence[str] | None, 

87 **kwargs, 

88) -> Iterable[CheckMessage]: 

89 from weblate.vcs.models import VCS_REGISTRY 

90 

91 return [ 

92 weblate_check("weblate.C040", error) 

93 for instance in VCS_REGISTRY.values() 

94 for error in instance.validate_configuration() 

95 ] 

96 

97 

98class VCSConfig(AppConfig): 

99 name = "weblate.vcs" 

100 label = "vcs" 

101 verbose_name = "VCS" 

102 

103 def ready(self) -> None: 

104 super().ready() 

105 post_migrate.connect(self.post_migrate, sender=self) 

106 

107 def post_migrate(self, sender: AppConfig, **kwargs) -> None: 

108 ensure_ssh_key() 

109 home = data_dir("home") 

110 

111 if not os.path.exists(home): 111 ↛ 112line 111 didn't jump to line 112 because the condition on line 111 was never true

112 os.makedirs(home) 

113 

114 # Configure merge driver for Gettext PO 

115 # We need to do this behind lock to avoid errors when servers 

116 # start in parallel 

117 lockfile = WeblateLock( 

118 lock_path=home, 

119 scope="gitlock", 

120 key=0, 

121 slug="", 

122 cache_template="lock:{scope}", 

123 file_template="{scope}", 

124 timeout=120, 

125 ) 

126 with lockfile: 

127 try: 

128 GitRepository.global_setup() 

129 except RepositoryError as error: 

130 GIT_ERRORS.append(str(error)) 

131 if SubversionRepository.is_supported(): 131 ↛ 136line 131 didn't jump to line 136 because the condition on line 131 was always true

132 try: 

133 SubversionRepository.global_setup() 

134 except RepositoryError as error: 

135 GIT_ERRORS.append(str(error)) 

136 if HgRepository.is_supported(): 136 ↛ exitline 136 didn't jump to the function exit

137 try: 

138 HgRepository.global_setup() 

139 except RepositoryError as error: 

140 GIT_ERRORS.append(str(error))