Coverage for app/venv/lib/python3.14/site-packages/weblate/gitexport/models.py: 71%
37 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
5from __future__ import annotations
7from typing import TYPE_CHECKING
9from django.db.models.signals import post_save, pre_save
10from django.dispatch import receiver
11from django.urls import reverse
13from weblate.trans.models import Component, Project
14from weblate.utils.decorators import disable_for_loaddata
15from weblate.utils.site import get_site_url
16from weblate.vcs.models import VCS_REGISTRY
18if TYPE_CHECKING: 18 ↛ 19line 18 didn't jump to line 19 because the condition on line 18 was never true
19 from weblate.trans.models.component import ComponentQuerySet
22def get_export_url(component: Component) -> str:
23 """Return Git export URL for component."""
24 url = reverse(
25 "git-export",
26 kwargs={"path": component.get_url_path(), "git_request": "info/refs"},
27 )
28 # Strip trailing info/refs part:
29 return get_site_url(url[:-9])
32@receiver(pre_save, sender=Component)
33@disable_for_loaddata
34def update_component_git_export(sender, instance, **kwargs) -> None:
35 if not instance.is_repo_link and instance.vcs in VCS_REGISTRY.git_based: 35 ↛ exitline 35 didn't return from function 'update_component_git_export' because the condition on line 35 was always true
36 instance.git_export = get_export_url(instance)
39def update_components(matching: ComponentQuerySet) -> None:
40 updates = []
41 for component in (
42 matching.filter(vcs__in=VCS_REGISTRY.git_based)
43 .exclude(repo__startswith="weblate:/")
44 .iterator(chunk_size=100)
45 ):
46 new_url = get_export_url(component)
47 if component.git_export != new_url: 47 ↛ 48line 47 didn't jump to line 48 because the condition on line 47 was never true
48 component.git_export = new_url
49 updates.append(component)
50 if len(updates) > 100:
51 Component.objects.bulk_update(updates, ["git_export"])
52 updates = []
54 if updates: 54 ↛ 55line 54 didn't jump to line 55 because the condition on line 54 was never true
55 Component.objects.bulk_update(updates, ["git_export"])
58@receiver(post_save, sender=Project)
59@disable_for_loaddata
60def update_project_git_export(sender, instance, **kwargs) -> None:
61 update_components(instance.component_set.all())
64def update_all_components() -> None:
65 """Update git export URL for all components."""
66 update_components(Component.objects.prefetch_related("project"))