Skip to content

iterface report be side #2

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)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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