-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
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
Labels
No labels