Skip to content

iterface report be side #2

@kevin373738

Description

@kevin373738
from flask import Flask, request, jsonify, render_template
import urllib.parse
import requests

app = Flask(__name__)

GITLAB_TOKEN = “”  #token 
PROJECTS = [“", “"] #project url 
GITLAB_API = "https://git.ecomedic.vn/api/v4"
GITLAB_WEB = "https://git.ecomedic.vn"

# Fetch Merge Requests for each project on the target branch
def get_merge_requests(project_path, target_branch):
    url = f"{GITLAB_API}/projects/{urllib.parse.quote(project_path, safe='')}/merge_requests"
    headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}
    params = {
        "target_branch": target_branch,
        "state": "all",
        "per_page": 100
    }
    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Error fetching MRs for {project_path}: {e}")
        return []

# Get number of changed files, additions, deletions in MR
def get_mr_changes(project_path, mr_iid):
    url = f"{GITLAB_API}/projects/{urllib.parse.quote(project_path, safe='')}/merge_requests/{mr_iid}/changes"
    headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        changes = response.json().get("changes", [])

        additions = 0
        deletions = 0

        for file in changes:
            diff = file.get("diff", "")
            # Count actual added/removed lines (excluding diff markers like @@)
            for line in diff.splitlines():
                if line.startswith('+') and not line.startswith('+++'):
                    additions += 1
                elif line.startswith('-') and not line.startswith('---'):
                    deletions += 1

        return len(changes), additions, deletions
    except requests.exceptions.RequestException as e:
        print(f"Error fetching changes for MR {mr_iid} in {project_path}: {e}")
        return 0, 0, 0

# Home page
@app.route('/')
def index():
    return render_template("index.html")

# Route to run report
@app.route('/run-report', methods=["POST"])
def run_report():
    target_branch = request.json.get("target_branch")
    result = []

    for project in PROJECTS:
        mrs = get_merge_requests(project, target_branch)
        for mr in mrs:
            file_count, additions, deletions = get_mr_changes(project, mr["iid"])

            assignee = mr.get("assignee")
            assignee_name = assignee["name"] if assignee else "N/A"

            reviewers = ", ".join([r["name"] for r in mr.get("reviewers", [])]) if mr.get("reviewers") else "N/A"

            result.append({
                "project": project,
                "title": mr["title"],
                "files": file_count,
                "additions": additions,
                "deletions": deletions,
                "assignee": assignee_name,
                "reviewers": reviewers,
                "status": mr.get("state", "N/A").capitalize(),
                "link": f"{GITLAB_WEB}/{project}/-/merge_requests/{mr['iid']}"
            })

    return jsonify(result)

# Get all branches
@app.route('/branches', methods=['GET'])
def get_branches():
    all_branches = set()
    headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}

    for project in PROJECTS:
        url = f"{GITLAB_API}/projects/{urllib.parse.quote(project, safe='')}/repository/branches"
        try:
            response = requests.get(url, headers=headers)
            response.raise_for_status()
            branches = response.json()
            for branch in branches:
                all_branches.add(branch["name"])
        except requests.exceptions.RequestException as e:
            print(f"Error fetching branches for {project}: {e}")
            continue

    return jsonify(sorted(list(all_branches)))

# Run the app
if __name__ == "__main__":
    app.run(debug=True)

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