Skip to content

Commit dec272f

Browse files
committed
allow more than one DEF_EXECUTABLES to show on historic graph
1 parent abc817f commit dec272f

6 files changed

Lines changed: 64 additions & 47 deletions

File tree

codespeed/commits/git.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ def getlogs(endrev, startrev):
6464
p, stdout, stderr = execute_command(cmd, working_copy)
6565

6666
if p.returncode != 0:
67-
raise CommitLogError("%s returned %s: %s" % (
68-
" ".join(cmd), p.returncode, stderr))
67+
raise CommitLogError(f"'%s' in '%s' returned %s: %s" % (
68+
" ".join(cmd), working_copy, p.returncode, stderr))
6969
logs = []
7070
for log in filter(None, stdout.split('\x1e')):
7171
(short_commit_id, commit_id, date_t, author_name, author_email,

codespeed/results.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def save_result(data, update_repo=True):
7373
b.save()
7474

7575
try:
76-
rev = branch.revisions.get(commitid=data['commitid'])
76+
rev = branch.revisions.get(commitid=data['commitid'].split(":")[-1])
7777
except Revision.DoesNotExist:
7878
rev_date = data.get("revision_date")
7979
# "None" (as string) can happen when we urlencode the POST data

codespeed/views.py

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def get_context_data(self, **kwargs):
6969
context = super(HomeView, self).get_context_data(**kwargs)
7070
context['show_reports'] = settings.SHOW_REPORTS
7171
context['show_historical'] = settings.SHOW_HISTORICAL
72-
historical_settings = ['SHOW_HISTORICAL', 'DEF_BASELINE', 'DEF_EXECUTABLE']
72+
historical_settings = ['SHOW_HISTORICAL', 'DEF_BASELINE', 'DEF_EXECUTABLES']
7373
if not all(getattr(settings, var) for var in historical_settings):
7474
context['show_historical'] = False
7575
return context
@@ -78,8 +78,8 @@ def get_context_data(self, **kwargs):
7878
baseline_exe = Executable.objects.get(
7979
name=settings.DEF_BASELINE['executable'])
8080
context['baseline'] = baseline_exe
81-
def_name = settings.DEF_EXECUTABLE['name']
82-
def_project = Project.objects.get(name=settings.DEF_EXECUTABLE['project'])
81+
def_name = settings.DEF_EXECUTABLES[0]['name']
82+
def_project = Project.objects.get(name=settings.DEF_EXECUTABLES[0]['project'])
8383
default_exe = Executable.objects.get(name=def_name,
8484
project=def_project,
8585
)
@@ -103,42 +103,52 @@ def gethistoricaldata(request):
103103
# Fetch Baseline data, filter by executable
104104
baseline_exe = Executable.objects.get(
105105
name=settings.DEF_BASELINE['executable'])
106-
baseline_revs = Revision.objects.filter(
107-
branch__project=baseline_exe.project).order_by('-date')
108-
baseline_lastrev = baseline_revs[0]
109-
for rev in baseline_revs:
110-
baseline_results = Result.objects.filter(
111-
executable=baseline_exe, revision=rev, environment=env)
112-
if baseline_results:
113-
baseline_lastrev = rev
114-
break
115-
if len(baseline_results) == 0:
106+
tag=settings.DEF_BASELINE['revision']
107+
rev = Revision.objects.filter(branch__project=baseline_exe.project, tag=tag)
108+
if len(rev) < 1:
109+
return HttpResponse(json.dumps(
110+
f"Could not find {tag=} for {settings.DEF_BASELINE['executable']} in database")
111+
)
112+
rev0 = rev[0]
113+
baseline_results = Result.objects.filter(
114+
executable=baseline_exe, revision=rev0, environment=env)
115+
if not baseline_results:
116116
logger.error('Could not find results for {} rev="{}" env="{}"'.format(
117-
baseline_exe, baseline_lastrev, env))
117+
baseline_exe, rev0, env))
118118
data['baseline'] = '{} {}'.format(
119-
settings.DEF_BASELINE['executable'], baseline_lastrev.tag)
120-
121-
def_name = settings.DEF_EXECUTABLE['name']
122-
def_project = Project.objects.get(name=settings.DEF_EXECUTABLE['project'])
123-
default_exe = Executable.objects.get(name=def_name, project=def_project)
124-
default_branch = Branch.objects.get(
125-
name=default_exe.project.default_branch,
126-
project=default_exe.project)
119+
settings.DEF_BASELINE['executable'], rev0.tag)
127120

128-
# Fetch tagged revisions for executable
129-
default_taggedrevs = Revision.objects.filter(
130-
branch=default_branch
131-
).exclude(tag="").order_by('date')
132121
default_results = {}
133-
for rev in default_taggedrevs:
134-
res = Result.objects.filter(
135-
executable=default_exe, revision=rev, environment=env)
136-
if not res:
137-
logger.info('no results for %s %s %s' % (str(default_exe), str(rev), str(env)))
138-
continue
139-
default_results[rev.tag] = res
140-
data['tagged_revs'] = [rev.tag for rev in default_taggedrevs if rev.tag in default_results]
122+
all_taggedrevs = []
123+
for executable in settings.DEF_EXECUTABLES:
124+
_def_name = executable['name']
125+
_def_project = Project.objects.get(name=executable['project'])
126+
_default_exe = Executable.objects.get(name=_def_name, project=_def_project)
127+
_default_branch = Branch.objects.get(
128+
name=_default_exe.project.default_branch,
129+
project=_default_exe.project)
130+
131+
# Fetch tagged revisions for executable
132+
default_taggedrevs = Revision.objects.filter(
133+
branch=_default_branch
134+
).exclude(tag="").order_by('date')
135+
all_taggedrevs += default_taggedrevs
136+
for rev in default_taggedrevs:
137+
res = Result.objects.filter(
138+
executable=_default_exe, revision=rev, environment=env)
139+
if not res:
140+
logger.info("no results for '%s' '%s' '%s'" % (str(_default_exe), str(rev), str(env)))
141+
continue
142+
default_results[rev.tag] = res
143+
data['tagged_revs'] = [rev.tag for rev in all_taggedrevs if rev.tag in default_results]
141144
# Fetch data for latest results
145+
executable = settings.DEF_EXECUTABLES[0]
146+
def_name = executable['name']
147+
def_project = Project.objects.get(name=executable['project'])
148+
default_exe = Executable.objects.get(name=def_name, project=def_project)
149+
default_branch = Branch.objects.get(
150+
name=default_exe.project.default_branch,
151+
project=default_exe.project)
142152
revs = Revision.objects.filter(
143153
branch=default_branch).order_by('-date')[:100]
144154
default_lastrev = None
@@ -896,7 +906,7 @@ def displaylogs(request):
896906
log['commit_browse_url'] = project.commit_browsing_url.format(**log)
897907

898908
return render(
899-
request,
909+
request,
900910
'codespeed/changes_logs.html',
901911
{
902912
'error': error, 'logs': logs,

codespeed/views_data.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,11 @@ def getbaselineexecutables(include_tags=None):
104104

105105
def getdefaultexecutable():
106106
default = None
107-
if (hasattr(settings, 'DEF_EXECUTABLE') and
108-
settings.DEF_EXECUTABLE is not None):
107+
if (hasattr(settings, 'DEF_EXECUTABLES') and
108+
settings.DEF_EXECUTABLES is not None):
109109
try:
110-
def_name = settings.DEF_EXECUTABLE['name']
111-
def_project = Project.objects.get(name=settings.DEF_EXECUTABLE['project'])
110+
def_name = settings.DEF_EXECUTABLES[0]['name']
111+
def_project = Project.objects.get(name=settings.DEF_EXECUTABLES[0]['project'])
112112
default = Executable.objects.get(name=def_name, project=def_project)
113113
except Executable.DoesNotExist:
114114
pass

speed_pypy/settings.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,11 @@
8989

9090
SHOW_REPORTS = False
9191
SHOW_HISTORICAL = True
92-
DEF_BASELINE = {'executable': 'cpython', 'revision': '3.6.8'}
93-
DEF_EXECUTABLE = {'name': 'pypy3.9-jit-64', 'project': 'PyPy3.9'}
92+
DEF_BASELINE = {'executable': 'cpython', 'revision': '3.7.6'}
93+
DEF_EXECUTABLES = [
94+
{'name': 'pypy3.10-jit-64', 'project': 'PyPy3.10'},
95+
{'name': 'pypy3.9-jit-64', 'project': 'PyPy3.9'},
96+
]
9497
DEF_ENVIRONMENT = 'benchmarker'
9598

9699

speed_pypy/templates/home.html

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ <h3>How fast is {{ default_exe.project }}?</h3>
3333
<p class="plot-caption">Plot 1: The above plot represents {{ default_exe.project }} ({{ default_exe }}) benchmark times normalized to {{ baseline }}. Smaller is better.</p>
3434
<p>It depends greatly on the type of task being performed. The geometric average of all benchmarks is <span id="geomean"></span> or <strong id="geofaster"></strong> times <em>faster</em> than {{ baseline }}</p>
3535

36-
<h3>How has {{ default_exe.project }} performance evolved over time?</h3>
36+
<h3>How has PyPy performance evolved over time?</h3>
3737
<div id="historical-plot"></div>
3838
<p class="plot-caption">Plot 2: Speedup compared to {{ baseline }}, using the inverse of the geometric average of normalized times, out of <span id="num_of_benchs"></span> benchmarks (see <a href="http://dl.acm.org/citation.cfm?id=5673" title="How not to lie with statistics: the correct way to summarize benchmark results">paper</a> on why the geometric mean is better for normalized results).</p>
3939
</div>
@@ -81,6 +81,10 @@ <h3>How has {{ default_exe.project }} performance evolved over time?</h3>
8181
$("#baseline-comparison-plot").html(getLoadText('Error retrieving data', 0));
8282
return 1;
8383
}
84+
if (typeof data === 'string' || data instanceof String) {
85+
$("#baseline-comparison-plot").html(getLoadText('Error retrieving data ' + data, 0));
86+
return 1;
87+
}
8488
var trunk_geomean = 1;
8589
var tagged_data = new Array();
8690
for (i in data['tagged_revs']) {
@@ -169,7 +173,7 @@ <h3>How has {{ default_exe.project }} performance evolved over time?</h3>
169173
for (var i in data['tagged_revs']) {
170174
ticks.push(data['tagged_revs'][i]);
171175
}
172-
ticks.push('latest');
176+
ticks.push('latest {{ default_exe.project }}');
173177
var geolabels = new Array();
174178
for (var i in geomeans) {
175179
geolabels.push(geomeans[i].toFixed(2) + "x");
@@ -197,7 +201,7 @@ <h3>How has {{ default_exe.project }} performance evolved over time?</h3>
197201
},
198202
yaxis:{
199203
min: 0,
200-
tickOptions:{formatString:'%.2f'}
204+
tickOptions:{formatString:'%.1f'}
201205
}
202206
}
203207
};

0 commit comments

Comments
 (0)