|
12 | 12 | from ..tasks.artifact import define_artifact |
13 | 13 | from ..workflows.catalogue import REQUEST_ARTIFACT_DEFINITION_GENERATE, REQUEST_ARTIFACT_GENERATE |
14 | 14 | from ..workflows.utils import add_branch_tag |
15 | | -from .models import GitRepositoryPullReadOnly, RequestArtifactDefinitionGenerate, RequestArtifactGenerate |
| 15 | +from .models import ( |
| 16 | + GitRepositoryMerge, |
| 17 | + GitRepositoryPullReadOnly, |
| 18 | + RequestArtifactDefinitionGenerate, |
| 19 | + RequestArtifactGenerate, |
| 20 | +) |
16 | 21 | from .repository import InfrahubReadOnlyRepository, InfrahubRepository, get_initialized_repo |
17 | 22 |
|
18 | 23 | log = get_logger() |
@@ -275,3 +280,39 @@ async def pull_read_only(model: GitRepositoryPullReadOnly) -> None: |
275 | 280 |
|
276 | 281 | await repo.import_objects_from_files(infrahub_branch_name=model.infrahub_branch_name, commit=model.commit) |
277 | 282 | await repo.sync_from_remote(commit=model.commit) |
| 283 | + |
| 284 | + |
| 285 | +@flow(name="git-repository-merge") |
| 286 | +async def merge_git_repository(model: GitRepositoryMerge) -> None: |
| 287 | + service = services.service |
| 288 | + log.info( |
| 289 | + "Merging repository branch", |
| 290 | + repository_name=model.repository_name, |
| 291 | + repository_id=model.repository_id, |
| 292 | + source_branch=model.source_branch, |
| 293 | + destination_branch=model.destination_branch, |
| 294 | + ) |
| 295 | + |
| 296 | + repo = await InfrahubRepository.init( |
| 297 | + id=model.repository_id, |
| 298 | + name=model.repository_name, |
| 299 | + client=service.client, |
| 300 | + default_branch_name=model.default_branch, |
| 301 | + ) |
| 302 | + |
| 303 | + if model.internal_status == RepositoryInternalStatus.STAGING.value: |
| 304 | + repo_source = await service.client.get( |
| 305 | + kind=InfrahubKind.GENERICREPOSITORY, id=model.repository_id, branch=model.source_branch |
| 306 | + ) |
| 307 | + repo_main = await service.client.get(kind=InfrahubKind.GENERICREPOSITORY, id=model.repository_id) |
| 308 | + repo_main.internal_status.value = RepositoryInternalStatus.ACTIVE.value |
| 309 | + repo_main.sync_status.value = repo_source.sync_status.value |
| 310 | + |
| 311 | + commit = repo.get_commit_value(branch_name=repo.default_branch, remote=False) |
| 312 | + repo_main.commit.value = commit |
| 313 | + |
| 314 | + await repo_main.save() |
| 315 | + |
| 316 | + else: |
| 317 | + async with lock.registry.get(name=model.repository_name, namespace="repository"): |
| 318 | + await repo.merge(source_branch=model.source_branch, dest_branch=model.destination_branch) |
0 commit comments