roundabout,
created on Monday, 3 June 2024, 07:05:58 (1717398358),
received on Wednesday, 31 July 2024, 06:54:49 (1722408889)
Author identity: vlad <vlad.muntoiu@gmail.com>
2793c055bee6f4c03095a8117a5add06902a10cc
celery_tasks.py
@@ -8,6 +8,8 @@ from celery import shared_task
from app import db, _
from smtplib import SMTP
from celery.utils.log import get_task_logger
from sqlalchemy.orm import make_transient
from datetime import datetime
@shared_task(ignore_result=False)
@@ -34,7 +36,7 @@ def send_notification(user_notification_id):
@shared_task(ignore_result=False)
def merge_heads(head_route, head_branch, base_route, base_branch, simulate=True):
from models import Repo
from models import Repo, Commit
server_repo_location = os.path.join(config.REPOS_PATH, base_route.lstrip("/"))
if not os.path.isdir(server_repo_location):
raise FileNotFoundError(f"Repo {server_repo_location} not found, cannot merge.")
@@ -66,6 +68,8 @@ def merge_heads(head_route, head_branch, base_route, base_branch, simulate=True)
part_out, part_err = common.git_command(server_repo_location, b"", "checkout", f"{base_branch}", return_err=True)
out += part_out
err += part_err
new_commits = common.git_command(server_repo_location, b"", "log", "--oneline", f"{base_branch}..{head_branch}")
if simulate:
part_out, part_err, merge_exit = common.git_command(server_repo_location, b"", "merge", "--allow-unrelated-histories",
"--no-commit", "--no-ff", f"NEW/{head_branch}", return_err=True, return_exit=True)
@@ -83,6 +87,18 @@ def merge_heads(head_route, head_branch, base_route, base_branch, simulate=True)
if simulate:
# Undo the merge.
common.git_command(server_repo_location, b"", "merge", "--abort")
else:
# Copy the commits rows from the head repo to the base repo
for commit in new_commits:
commit_data = Commit.query.filter_by(repo_name=head_route, sha=commit.split())
db.session.expunge(commit_data)
make_transient(commit_data)
commit_data.repo_name = base_route
commit_data.identifier = f"{base_route}/{commit_data.sha}"
commit_data.receive_date = datetime.now()
db.session.add(commit_data)
return "merge_simulator" if simulate else "merge", out, err, head_route, head_branch, base_route, base_branch, merge_exit