102 lines
2.7 KiB
Python
102 lines
2.7 KiB
Python
import json
|
|
from time import time
|
|
#with open("/home/john/issues.json", "r") as f:
|
|
# data = json.loads(f.read())
|
|
#with open("/home/john/issues2.json", "r") as f:
|
|
# data.extend(json.loads(f.read()))
|
|
|
|
print("Fetching issues...", end='')
|
|
start = time()
|
|
from gitea import Gitea, Repository, Issue
|
|
g = Gitea("https://gamedev.ffwf.net/gitea", token_text="3b450f66e21d62c22bb9fa1c8b975049a5d0c38d")
|
|
repo = Repository.request(g, "john", "McRogueFace")
|
|
issues = repo.get_issues()
|
|
dur = time() - start
|
|
print(f"({dur:.1f}s)")
|
|
print("Gitea Version: " + g.get_version())
|
|
print("API-Token belongs to user: " + g.get_user().username)
|
|
|
|
data = [
|
|
{
|
|
"labels": i.labels,
|
|
"body": i.body,
|
|
"number": i.number,
|
|
}
|
|
for i in issues
|
|
]
|
|
|
|
input()
|
|
|
|
def front_number(txt):
|
|
if not txt[0].isdigit(): return None
|
|
number = ""
|
|
for c in txt:
|
|
if not c.isdigit():
|
|
break
|
|
number += c
|
|
return int(number)
|
|
|
|
def split_any(txt, splitters):
|
|
tokens = []
|
|
txt = [txt]
|
|
for s in splitters:
|
|
for t in txt:
|
|
tokens.extend(t.split(s))
|
|
txt = tokens
|
|
tokens = []
|
|
return txt
|
|
|
|
def find_refs(txt):
|
|
tokens = [tok for tok in split_any(txt, ' ,;\t\r\n') if tok.startswith('#')]
|
|
return [front_number(tok[1:]) for tok in tokens]
|
|
|
|
from collections import defaultdict
|
|
issue_relations = defaultdict(list)
|
|
|
|
nodes = set()
|
|
|
|
for issue in data:
|
|
#refs = issue['body'].split('#')[1::2]
|
|
|
|
#refs = [front_number(r) for r in refs if front_number(r) is not None]
|
|
refs = find_refs(issue['body'])
|
|
print(issue['number'], ':', refs)
|
|
issue_relations[issue['number']].extend(refs)
|
|
nodes.add(issue['number'])
|
|
for r in refs:
|
|
nodes.add(r)
|
|
issue_relations[r].append(issue['number'])
|
|
|
|
|
|
# Find issue labels
|
|
issue_labels = {}
|
|
for d in data:
|
|
labels = [l['name'] for l in d['labels']]
|
|
#print(d['number'], labels)
|
|
issue_labels[d['number']] = labels
|
|
|
|
import networkx as nx
|
|
import matplotlib.pyplot as plt
|
|
|
|
relations = nx.Graph()
|
|
|
|
for k in issue_relations:
|
|
relations.add_node(k)
|
|
for r in issue_relations[k]:
|
|
relations.add_edge(k, r)
|
|
relations.add_edge(r, k)
|
|
|
|
#nx.draw_networkx(relations)
|
|
|
|
pos = nx.spring_layout(relations)
|
|
nx.draw_networkx_nodes(relations, pos,
|
|
nodelist = [n for n in issue_labels if 'Alpha Release Requirement' in issue_labels[n]],
|
|
node_color="tab:red")
|
|
nx.draw_networkx_nodes(relations, pos,
|
|
nodelist = [n for n in issue_labels if 'Alpha Release Requirement' not in issue_labels[n]],
|
|
node_color="tab:blue")
|
|
nx.draw_networkx_edges(relations, pos,
|
|
edgelist = relations.edges()
|
|
)
|
|
nx.draw_networkx_labels(relations, pos, {i: str(i) for i in relations.nodes()})
|
|
plt.show() |