File size: 4,378 Bytes
08b2a3e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
import gradio as gr
from git import Repo, Git
import datetime
import argparse
from collections import Counter
import os
def greet(name):
with tempfile.TemporaryDirectory() as d:
Repo.clone_from(name,d,)
return check_repo(d, datetime.datetime(2022, 01, 01), 10)
def check():
parser = argparse.ArgumentParser(
prog = 'ProgramName',
description = 'What the program does',
epilog = 'Text at the bottom of help')
parser.add_argument('repo', nargs='?', default=default_repo()) # option that takes a value
parser.add_argument('--since',
type=lambda d: datetime.datetime.strptime(d, '%Y-%m-%d'),
default=None,
help='Set a start date')
parser.add_argument('--filter',
type=lambda d: d.split(","),
default=None,
help='Set a comma separated filter')
parser.add_argument('--mincount',
type=int,
default=10,
help='Set a comma separated filter')
args = parser.parse_args()
if "/" not in args.repo:
args.repo = f"/home/nicolas/src/{args.repo}"
with cd(args.repo):
check_repo(args.repo, args.since, args.mincount)
class cd:
"""Context manager for changing the current working directory"""
def __init__(self, newPath):
self.newPath = os.path.expanduser(newPath)
def __enter__(self):
self.savedPath = os.getcwd()
os.chdir(self.newPath)
def __exit__(self, etype, value, traceback):
os.chdir(self.savedPath)
def default_repo():
return os.getcwd()
def check_repo(repo_path, since, mincount):
repo_path = args.repo
most_common = 10
bugwords = [("revert", 1), ("bug", 1), ("fix", 1)]
repo = Repo(repo_path)
c = Counter()
git = Git()
commits = []
for commit in repo.iter_commits():
if args.since and commit.committed_datetime < args.since.astimezone():
break
commits.append(commit.hexsha[:6])
files = Counter()
bugfiles = Counter()
current_commit = 0
current_files = []
out = git.show('--stat', '--oneline', '--name-only', f"{commits[-1]}..")
is_bug = 0
for i, line in enumerate(out.split("\n")):
line = line.strip()
if not line:
continue
if line.startswith(commits[current_commit]):
# files[commits[current_commit]] = files.copy()
commit, message = line.lower().split(" ", 1)
found = False
for (bugword, count) in bugwords:
if bugword in message:
is_bug = count
found = True
break
if not found:
is_bug = 0
current_commit += 1
else:
found = True
if args.filter:
found = False
for filter_ in args.filter:
if filter_ in line:
found = True
break
if not found:
continue
files[line] += 1
if is_bug:
bugfiles[line] += is_bug
string = ""
string += "=====" + "\n"
string += "Most commonly changed files" + "\n"
string += + "\n"
for (filename, count) in files.most_common(most_common):
string += f"{filename}: {count}" + "\n"
string += + "\n"
string += + "\n"
string += "=====" + "\n"
string += "Most commonly bugged files" + "\n"
for (filename, count) in bugfiles.most_common(most_common):
string += f"{filename}: {count}" + "\n"
string += + "\n"
string += + "\n"
string += "=====" + "\n"
string += "Most commonly bugged files (adjusted)" + "\n"
adjusted = {}
for (filename, count) in bugfiles.items():
if count < args.mincount:
continue
percentage = count / files[filename]
adjusted[filename] = (percentage, count)
for (filename, (percentage, count)) in sorted(adjusted.items(), key=lambda x: x[1], reverse=True)[:most_common]:
string += f"{filename}: {percentage} ({count})" + "\n"
return string
iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()
|