Add alpha and beta versions

This commit is contained in:
2026-05-24 13:51:49 +03:00
commit 12ee7eee2d
27 changed files with 1305 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
# Gitea Repository Analyzer
Программа для анализа репозиториев Gitea.
## Возможности
- получение информации о репозитории
- вывод автора
- вывод соавторов
- даты создания и изменения
- подсчёт строк Python-кода
## Запуск
```bash
pip install -r requirements.txt
python main.py
---
# 🚀 Как загрузить на Gitea
---
# 1. Создать репозиторий
На Gitea:
- New Repository
- например:
```text
gitea-analyzer

View File

@@ -0,0 +1,24 @@
# Gitea Analyzer Simple
Простая версия без логина и пароля.
## Linux / Ubuntu
```bash
sudo apt install python3-tk -y
pip3 install -r requirements.txt
python3 main.py
```
Или:
```bash
./run_linux.sh
```
## Windows
1. Установить Python.
2. Запустить `run_windows.bat`.
Для сборки exe запустить `build_windows_exe.bat`.

Binary file not shown.

View File

@@ -0,0 +1,63 @@
import requests
import base64
def split_link(repo_link):
parts = repo_link.replace("https://", "").split("/")
base_url = "https://" + parts[0]
owner = parts[1]
repo = parts[2]
return base_url, owner, repo
def get_repo_data(repo_link):
base_url, owner, repo = split_link(repo_link)
url = f"{base_url}/api/v1/repos/{owner}/{repo}"
return requests.get(url).json()
def get_commits(repo_link):
base_url, owner, repo = split_link(repo_link)
url = f"{base_url}/api/v1/repos/{owner}/{repo}/commits"
return requests.get(url).json()
def get_code_lines(repo_link):
base_url, owner, repo = split_link(repo_link)
# получаем список файлов
url = f"{base_url}/api/v1/repos/{owner}/{repo}/git/trees/main?recursive=1"
data = requests.get(url).json()
total_lines = 0
for file in data.get("tree", []):
if file.get("type") != "blob":
continue
path = file.get("path", "")
if not path.endswith(".py"):
continue
# читаем файл через API (НЕ raw!)
file_url = f"{base_url}/api/v1/repos/{owner}/{repo}/contents/{path}"
r = requests.get(file_url)
if r.status_code != 200:
continue
file_data = r.json()
content = file_data.get("content")
if content:
decoded = base64.b64decode(content).decode("utf-8", errors="ignore")
total_lines += len(decoded.splitlines())
return total_lines

View File

@@ -0,0 +1,6 @@
@echo off
cd /d "%~dp0"
python -m pip install -r requirements.txt
python -m pip install pyinstaller
python -m PyInstaller --onefile --windowed --name GiteaAnalyzer main.py
pause

View File

@@ -0,0 +1,120 @@
import tkinter as tk
from tkinter import messagebox
from api import get_repo_data, get_commits, get_code_lines
from parser import parse_repo_info, parse_authors
class GiteaAnalyzer:
def __init__(self):
self.root = tk.Tk()
self.root.title("Gitea Analyzer")
self.root.geometry("1000x700")
self.root.minsize(850, 600)
self.root.configure(bg="#eef4ff")
self.build_interface()
self.root.mainloop()
def build_interface(self):
title = tk.Label(
self.root,
text="Gitea Repository Analyzer",
font=("Arial", 22, "bold"),
bg="#eef4ff",
fg="#1d3557",
)
title.pack(pady=(20, 5))
subtitle = tk.Label(
self.root,
text="Введите ссылку на репозиторий Gitea и получите информацию о нём",
font=("Arial", 12),
bg="#eef4ff",
fg="#333333",
)
subtitle.pack(pady=(0, 15))
input_frame = tk.Frame(self.root, bg="#eef4ff")
input_frame.pack(fill="x", padx=30)
self.repo_entry = tk.Entry(input_frame, font=("Arial", 12))
self.repo_entry.pack(side="left", fill="x", expand=True, ipady=6)
self.repo_entry.insert(0, "https://iux-gitea.myddns.me/owner/repo")
self.repo_entry.bind("<FocusIn>", self.clear_placeholder)
self.repo_entry.bind("<Return>", lambda event: self.analyze())
analyze_button = tk.Button(
input_frame,
text="Анализировать",
command=self.analyze,
bg="#4d8ee8",
fg="white",
font=("Arial", 11, "bold"),
relief="flat",
padx=20,
pady=7,
cursor="hand2",
)
analyze_button.pack(side="left", padx=(10, 0))
self.result_text = tk.Text(
self.root,
font=("Consolas", 11),
wrap="word",
state="disabled",
bg="#ffffff",
fg="#111111",
)
self.result_text.pack(fill="both", expand=True, padx=30, pady=20)
def clear_placeholder(self, event):
if self.repo_entry.get() == "https://iux-gitea.myddns.me/owner/repo":
self.repo_entry.delete(0, tk.END)
def set_text(self, text):
self.result_text.config(state="normal")
self.result_text.delete("1.0", tk.END)
self.result_text.insert(tk.END, text)
self.result_text.config(state="disabled")
def analyze(self):
repo_link = self.repo_entry.get().strip()
if not repo_link or repo_link == "https://iux-gitea.myddns.me/owner/repo":
messagebox.showerror("Ошибка", "Введите ссылку на репозиторий")
return
try:
self.set_text("Загрузка данных...\n")
self.root.update()
repo_data = get_repo_data(repo_link)
commits = get_commits(repo_link)
lines = get_code_lines(repo_link)
info = parse_repo_info(repo_data)
authors = parse_authors(commits)
output = []
output.append(f"Ссылка: {repo_link}\n")
output.append(info)
output.append("\nАвторы / соавторы по коммитам:\n")
if authors:
for author in sorted(authors):
output.append(f"- {author}\n")
else:
output.append("- нет данных\n")
output.append(f"\nСтрок Python-кода: {lines}\n")
self.set_text("".join(output))
except Exception as error:
self.set_text("")
messagebox.showerror("Ошибка", f"Не удалось получить данные:\n{error}")
if __name__ == "__main__":
GiteaAnalyzer()

View File

@@ -0,0 +1,20 @@
def parse_repo_info(data):
return (
f"Название: {data.get('name', '')}\n"
f"Описание: {data.get('description', '')}\n"
f"Автор: {data.get('owner', {}).get('login', '')}\n"
f"Создан: {data.get('created_at', '')}\n"
f"Изменён: {data.get('updated_at', '')}\n"
)
def parse_authors(commits):
authors = set()
for commit in commits:
try:
authors.add(commit["commit"]["author"]["name"])
except:
continue
return authors

View File

@@ -0,0 +1 @@
requests

View File

@@ -0,0 +1,3 @@
#!/bin/bash
cd "$(dirname "$0")"
python3 main.py

View File

@@ -0,0 +1,4 @@
@echo off
cd /d "%~dp0"
python main.py
pause