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

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

2# 

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

4 

5from __future__ import annotations 

6 

7from typing import TYPE_CHECKING 

8 

9from django.db.models.signals import post_save, pre_save 

10from django.dispatch import receiver 

11from django.urls import reverse 

12 

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 

17 

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 

20 

21 

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]) 

30 

31 

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) 

37 

38 

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 = [] 

53 

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"]) 

56 

57 

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()) 

62 

63 

64def update_all_components() -> None: 

65 """Update git export URL for all components.""" 

66 update_components(Component.objects.prefetch_related("project"))