1#

2# Copyright (C) 2019-2025 Mathieu Parent <math.parent@gmail.com>

3#

4# This program is free software: you can redistribute it and/or modify

5# it under the terms of the GNU Lesser General Public License as published by

6# the Free Software Foundation, either version 3 of the License, or

7# (at your option) any later version.

8#

9# This program is distributed in the hope that it will be useful,

10# but WITHOUT ANY WARRANTY; without even the implied warranty of

11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

12# GNU Lesser General Public License for more details.

13#

14# You should have received a copy of the GNU Lesser General Public License

15# along with this program. If not, see <http://www.gnu.org/licenses/>.

16

17

18 from __future__ import annotations

19

20 from typing import TYPE_CHECKING

21

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

23 from gitlabracadabra.gitlab.pygitlab import PyGitlab

24

25

26 class DeployKeyCache:

27 """Deploy keys mapping cache.

28

29 indexed by id and slug (tile@project_id).

30 """

31

32 def __init__(self, connection: PyGitlab) -> None:

33 """Initialize a deploy keys cache.

34

35 Args:

36 connection: A GitlabConnection/PyGitlab.

37 """

38 self._connection = connection

39 self._slug2id: dict[str, int | None] = {}

40 self._id2slug: dict[int, str | None] = {}

41

42 def map_deploy_key(self, deploy_key_id: int, project_id: int, deploy_key_title: str) -> None:

43 """Map deploy key id and slug.

44

45 Args:

46 deploy_key_id: Deploy key id.

47 project_id: GitLab Project id.

48 deploy_key_title: Deploy key title.

49 """

50 slug = f"{deploy_key_title}@{project_id}"

51 self._id2slug[deploy_key_id] = slug

52 self._slug2id[slug] = deploy_key_id

53

54 def id_from_title(self, project_id: int, deploy_key_title: str) -> int | None:

55 """Get deploy key id from project and deploy key title.

56

57 Args:

58 project_id: GitLab Project id.

59 deploy_key_title: Deploy key title.

60

61 Returns:

62 Deploy key id.

63 """

64 slug = f"{deploy_key_title}@{project_id}"

65 if slug not in self._slug2id: 65 ↛ 73 line 65 didn't jump to line 73 because the condition on line 65 was always true

66 self._slug2id[slug] = None

67 project = self._connection.pygitlab.projects.get(project_id, lazy=True)

68 for deploy_key in project.keys.list(all=True): 68 ↛ 73 line 68 didn't jump to line 73 because the loop on line 68 didn't complete

69 if deploy_key.title == deploy_key_title: 69 ↛ 68 line 69 didn't jump to line 68 because the condition on line 69 was always true

70 self._slug2id[slug] = deploy_key.id

71 self.map_deploy_key(deploy_key.id, project_id, deploy_key_title)

72 break

73 return self._slug2id[slug]