Skip to content

update acordinglyΒ #1

@kevin373738

Description

@kevin373738

import re
import requests
import pandas as pd
import urllib.parse

πŸ”Ή GitLab Access Token

GITLAB_TOKEN = ""
if not GITLAB_TOKEN:
raise ValueError("❌ ERROR: GitLab token is missing! Set it with 'export GITLAB_TOKEN=your_token_here'")

πŸ”Ή List of project paths (namespace/project-name)

PROJECTS = [
"pspl/poems-mobile3-ios",
"pspl/poems-mobile3-android"
]

πŸ”Ή Target branch

TARGET_BRANCH = "develop_phase_1"

πŸ”Ή Jira base URL

JIRA_BASE_URL = "https://poems3.atlassian.net/browse/"

πŸ”Ή GitLab API base URL

GITLAB_API = "https://git.ecomedic.vn/api/v4"

Extract Jira ticket number

def extract_jira_ticket(title):
match = re.search(r"[([A-Z]+-\d+)]", title)
return match.group(1) if match else None

Extract Type (Task/Bugfix) and Summary

def extract_type_and_summary(title):
task_match = re.search(r"\bTask\b", title, re.IGNORECASE)
bug_match = re.search(r"\bBug\b", title, re.IGNORECASE)

type_label = "Task" if task_match else "Bug" if bug_match else "Unknown"

# Extract text after the last []
summary_match = re.split(r"\[.*?\]\s*", title)
summary = summary_match[-1] if summary_match else title

return type_label, summary.strip()

Fetch open Merge Requests

def fetch_merge_requests(project_id, platform):
encoded_branch = urllib.parse.quote(TARGET_BRANCH, safe="")
url = f"{GITLAB_API}/projects/{project_id}/merge_requests?state=opened&target_branch={encoded_branch}"
headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}

try:
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # βœ… Ensures API request success
    merge_requests = response.json()

    mr_list = []
    for mr in merge_requests:
        jira_ticket = extract_jira_ticket(mr["title"])
        jira_ticket_link = f'=HYPERLINK("{JIRA_BASE_URL}{jira_ticket}", "{jira_ticket}")' if jira_ticket else "N/A"

        mr_list.append({
            "Platform": "iOS" if "ios" in platform.lower() else "Android",
            "Type": extract_type_and_summary(mr["title"])[0],
            "Jira Ticket": jira_ticket_link,
            "Summary": extract_type_and_summary(mr["title"])[1],
            "Status": "",
            "MR URL": mr["web_url"],
            "Assignee": mr["assignee"]["name"] if mr.get("assignee") and isinstance(mr["assignee"], dict) else "Unassigned"
        })
    return mr_list

except requests.exceptions.RequestException as e:
    print(f"❌ Error: Failed to fetch MRs for {platform}. Error: {e}")
    return []

Save MR details to an Excel file

def save_to_excel(mrs):
if not mrs:
print("⚠️ No open MRs found!")
return

df = pd.DataFrame(mrs)

Sort by Jira Ticket (placing "N/A" at the bottom)

df = df.sort_values(by=["Jira Ticket"], key=lambda x: x.fillna("ZZZ"))

# βœ… Extract numbers from Jira Ticket and sort numerically
df["Jira Number"] = df["Jira Ticket"].str.extract(r"(\d+)$").astype(float)
df = df.sort_values(by=["Jira Number"], na_position="last").drop(columns=["Jira Number"])

output_file = "merge_requests.xlsx"
df.to_excel(output_file, index=False)
print(f"βœ… Excel file generated: {output_file}")

πŸ”Ή Function to get project ID dynamically

def get_project_id(project_path):
encoded_path = urllib.parse.quote(project_path, safe="")
url = f"{GITLAB_API}/projects/{encoded_path}"
headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}

try:
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    return response.json().get("id")

except requests.exceptions.RequestException as e:
    print(f"❌ Error: Unable to get project ID for {project_path}. Error: {e}")
    return None

Main execution

if name == "main":
all_merge_requests = []

for project in PROJECTS:
    project_id = get_project_id(project)
    if project_id:
        all_merge_requests.extend(fetch_merge_requests(project_id, project))

save_to_excel(all_merge_requests)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions