Add alpha and beta versions
This commit is contained in:
31
alpha/gitea_simple_app/README.md
Normal file
31
alpha/gitea_simple_app/README.md
Normal 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
|
||||
24
alpha/gitea_simple_app/README_START.md
Normal file
24
alpha/gitea_simple_app/README_START.md
Normal 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`.
|
||||
BIN
alpha/gitea_simple_app/__pycache__/api.cpython-312.pyc
Normal file
BIN
alpha/gitea_simple_app/__pycache__/api.cpython-312.pyc
Normal file
Binary file not shown.
BIN
alpha/gitea_simple_app/__pycache__/parser.cpython-312.pyc
Normal file
BIN
alpha/gitea_simple_app/__pycache__/parser.cpython-312.pyc
Normal file
Binary file not shown.
63
alpha/gitea_simple_app/api.py
Normal file
63
alpha/gitea_simple_app/api.py
Normal 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
|
||||
6
alpha/gitea_simple_app/build_windows_exe.bat
Normal file
6
alpha/gitea_simple_app/build_windows_exe.bat
Normal 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
|
||||
120
alpha/gitea_simple_app/main.py
Normal file
120
alpha/gitea_simple_app/main.py
Normal 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()
|
||||
20
alpha/gitea_simple_app/parser.py
Normal file
20
alpha/gitea_simple_app/parser.py
Normal 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
|
||||
1
alpha/gitea_simple_app/requirements.txt
Normal file
1
alpha/gitea_simple_app/requirements.txt
Normal file
@@ -0,0 +1 @@
|
||||
requests
|
||||
3
alpha/gitea_simple_app/run_linux.sh
Executable file
3
alpha/gitea_simple_app/run_linux.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
cd "$(dirname "$0")"
|
||||
python3 main.py
|
||||
4
alpha/gitea_simple_app/run_windows.bat
Normal file
4
alpha/gitea_simple_app/run_windows.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
cd /d "%~dp0"
|
||||
python main.py
|
||||
pause
|
||||
Reference in New Issue
Block a user