Skip to content

Commit 0d130e9

Browse files
committed
Move remaining non-view functions to domain module
1 parent a96c5f8 commit 0d130e9

2 files changed

Lines changed: 221 additions & 217 deletions

File tree

codespeed/domain.py

Lines changed: 218 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# -*- coding: utf-8 -*-
22
import logging
3+
from datetime import datetime
4+
from django.core.exceptions import ValidationError
35

46
from django.conf import settings
5-
from codespeed.models import Executable, Revision
7+
from codespeed.models import (Environment, Executable, Revision,
8+
Project, Branch, Benchmark,
9+
Result, Report)
610

711
logger = logging.getLogger(__name__)
812

@@ -104,3 +108,216 @@ def getdefaultexecutable():
104108
default = execquery[0]
105109

106110
return default
111+
112+
113+
def getcomparisonexes():
114+
all_executables = {}
115+
exekeys = []
116+
baselines = getbaselineexecutables()
117+
for proj in Project.objects.all():
118+
executables = []
119+
executablekeys = []
120+
maxlen = 20
121+
# add all tagged revs for any project
122+
for exe in baselines:
123+
if exe['key'] is not "none" and exe['executable'].project == proj:
124+
executablekeys.append(exe['key'])
125+
executables.append(exe)
126+
127+
# add latest revs of the project
128+
branches = Branch.objects.filter(project=proj)
129+
for branch in branches:
130+
try:
131+
rev = Revision.objects.filter(branch=branch).latest('date')
132+
except Revision.DoesNotExist:
133+
continue
134+
# Now only append when tag == "",
135+
# because we already added tagged revisions
136+
if rev.tag == "":
137+
for exe in Executable.objects.filter(project=proj):
138+
exestring = str(exe)
139+
if len(exestring) > maxlen:
140+
exestring = str(exe)[0:maxlen] + "..."
141+
name = exestring + " latest"
142+
if branch.name != 'default':
143+
name += " in branch '" + branch.name + "'"
144+
key = str(exe.id) + "+L+" + branch.name
145+
executablekeys.append(key)
146+
executables.append({
147+
'key': key,
148+
'executable': exe,
149+
'revision': rev,
150+
'name': name,
151+
})
152+
all_executables[proj] = executables
153+
exekeys += executablekeys
154+
return all_executables, exekeys
155+
156+
157+
def getcommitlogs(rev, startrev, update=False):
158+
logs = []
159+
160+
if rev.branch.project.repo_type == 'S':
161+
from subversion import getlogs, updaterepo
162+
elif rev.branch.project.repo_type == 'M':
163+
from mercurial import getlogs, updaterepo
164+
elif rev.branch.project.repo_type == 'G':
165+
from git import getlogs, updaterepo
166+
elif rev.branch.project.repo_type == 'H':
167+
from github import getlogs, updaterepo
168+
else:
169+
if rev.branch.project.repo_type not in ("N", ""):
170+
logger.warning("Don't know how to retrieve logs from %s project",
171+
rev.branch.project.get_repo_type_display())
172+
return logs
173+
174+
if update:
175+
updaterepo(rev.branch.project)
176+
177+
logs = getlogs(rev, startrev)
178+
179+
# Remove last log because the startrev log shouldn't be shown
180+
if len(logs) > 1 and logs[-1].get('commitid') == startrev.commitid:
181+
logs.pop()
182+
183+
return logs
184+
185+
186+
def saverevisioninfo(rev):
187+
log = getcommitlogs(rev, rev, update=True)
188+
189+
if log:
190+
log = log[0]
191+
rev.author = log['author']
192+
rev.date = log['date']
193+
rev.message = log['message']
194+
195+
196+
def validate_result(item):
197+
"""
198+
Validates that a result dictionary has all needed parameters
199+
200+
It returns a tuple
201+
Environment, False when no errors where found
202+
Errormessage, True when there is an error
203+
"""
204+
mandatory_data = [
205+
'commitid',
206+
'branch',
207+
'project',
208+
'executable',
209+
'benchmark',
210+
'environment',
211+
'result_value',
212+
]
213+
214+
error = True
215+
for key in mandatory_data:
216+
if key not in item:
217+
return 'Key "' + key + '" missing from request', error
218+
elif key in item and item[key] == "":
219+
return 'Value for key "' + key + '" empty in request', error
220+
221+
# Check that the Environment exists
222+
try:
223+
e = Environment.objects.get(name=item['environment'])
224+
error = False
225+
return e, error
226+
except Environment.DoesNotExist:
227+
return "Environment %(environment)s not found" % item, error
228+
229+
230+
def create_report_if_enough_data(rev, exe, e):
231+
"""Triggers Report creation when there are enough results"""
232+
last_revs = Revision.objects.filter(
233+
branch=rev.branch
234+
).order_by('-date')[:2]
235+
if len(last_revs) > 1:
236+
current_results = rev.results.filter(executable=exe, environment=e)
237+
last_results = last_revs[1].results.filter(
238+
executable=exe, environment=e)
239+
# If there is are at least as many results as in the last revision,
240+
# create new report
241+
if len(current_results) >= len(last_results):
242+
logger.debug("create_report_if_enough_data: About to create new report")
243+
report, created = Report.objects.get_or_create(
244+
executable=exe, environment=e, revision=rev
245+
)
246+
report.full_clean()
247+
report.save()
248+
logger.debug("create_report_if_enough_data: Created new report.")
249+
250+
251+
def save_result(data):
252+
res, error = validate_result(data)
253+
if error:
254+
return res, True
255+
else:
256+
assert(isinstance(res, Environment))
257+
env = res
258+
259+
p, created = Project.objects.get_or_create(name=data["project"])
260+
branch, created = Branch.objects.get_or_create(name=data["branch"],
261+
project=p)
262+
b, created = Benchmark.objects.get_or_create(name=data["benchmark"])
263+
264+
if created:
265+
if "description" in data:
266+
b.description = data["description"]
267+
if "units" in data:
268+
b.units = data["units"]
269+
if "units_title" in data:
270+
b.units_title = data["units_title"]
271+
if "lessisbetter" in data:
272+
b.lessisbetter = data["lessisbetter"]
273+
b.full_clean()
274+
b.save()
275+
276+
try:
277+
rev = branch.revisions.get(commitid=data['commitid'])
278+
except Revision.DoesNotExist:
279+
rev_date = data.get("revision_date")
280+
# "None" (as string) can happen when we urlencode the POST data
281+
if not rev_date or rev_date in ["", "None"]:
282+
rev_date = datetime.today()
283+
rev = Revision(branch=branch, project=p, commitid=data['commitid'],
284+
date=rev_date)
285+
try:
286+
rev.full_clean()
287+
except ValidationError as e:
288+
return str(e), True
289+
if p.repo_type not in ("N", ""):
290+
try:
291+
saverevisioninfo(rev)
292+
except RuntimeError as e:
293+
logger.warning("unable to save revision %s info: %s", rev, e,
294+
exc_info=True)
295+
rev.save()
296+
297+
exe, created = Executable.objects.get_or_create(
298+
name=data['executable'],
299+
project=p
300+
)
301+
302+
try:
303+
r = Result.objects.get(
304+
revision=rev, executable=exe, benchmark=b, environment=env)
305+
except Result.DoesNotExist:
306+
r = Result(revision=rev, executable=exe, benchmark=b, environment=env)
307+
308+
r.value = data["result_value"]
309+
if 'result_date' in data:
310+
r.date = data["result_date"]
311+
elif rev.date:
312+
r.date = rev.date
313+
else:
314+
r.date = datetime.now()
315+
316+
r.std_dev = data.get('std_dev')
317+
r.val_min = data.get('min')
318+
r.val_max = data.get('max')
319+
320+
r.full_clean()
321+
r.save()
322+
323+
return (rev, exe, env), False

0 commit comments

Comments
 (0)