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
« 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
6import os
7from typing import TYPE_CHECKING
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
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
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
26 from django.core.checks import CheckMessage
28GIT_ERRORS: list[str] = []
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
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 ]
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
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 ]
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 ]
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
91 return [
92 weblate_check("weblate.C040", error)
93 for instance in VCS_REGISTRY.values()
94 for error in instance.validate_configuration()
95 ]
98class VCSConfig(AppConfig):
99 name = "weblate.vcs"
100 label = "vcs"
101 verbose_name = "VCS"
103 def ready(self) -> None:
104 super().ready()
105 post_migrate.connect(self.post_migrate, sender=self)
107 def post_migrate(self, sender: AppConfig, **kwargs) -> None:
108 ensure_ssh_key()
109 home = data_dir("home")
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)
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))