diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/templates/builddashboard.html')
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/builddashboard.html | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html new file mode 100644 index 0000000000..acf4d0a361 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html | |||
@@ -0,0 +1,218 @@ | |||
1 | {% extends "basebuildpage.html" %} | ||
2 | {% load humanize %} | ||
3 | {% load projecttags %} | ||
4 | |||
5 | {% block parentbreadcrumb %} | ||
6 | {{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}}) | ||
7 | {% endblock %} | ||
8 | |||
9 | {% block buildinfomain %} | ||
10 | <!-- page title --> | ||
11 | <div class="row-fluid span10"> | ||
12 | <div class="page-header"> | ||
13 | <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1> | ||
14 | </div> | ||
15 | </div> | ||
16 | |||
17 | <!-- build result bar --> | ||
18 | <div class="row-fluid span10 pull-right"> | ||
19 | <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}"> | ||
20 | <div class="row-fluid lead"> | ||
21 | <span class="pull-left"><strong> | ||
22 | {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%} | ||
23 | </strong> on | ||
24 | {{build.completed_on|date:"d/m/y H:i"}} | ||
25 | </span> | ||
26 | {% if build.warnings_no or build.errors_no %} | ||
27 | with | ||
28 | {% endif %} | ||
29 | {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %} | ||
30 | {% if build.errors_no %} | ||
31 | <span > <i class="icon-minus-sign red"></i><strong><a href="#errors" class="error show-errors"> {{build.errors_no}} error{{build.errors_no|pluralize}}</a></strong></span> | ||
32 | {% endif %} | ||
33 | {% if build.warnings_no %} | ||
34 | {% if build.errors_no %} | ||
35 | and | ||
36 | {% endif %} | ||
37 | <span > <i class="icon-warning-sign yellow"></i><strong><a href="#warnings" class="warning show-warnings"> {{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a></strong></span> | ||
38 | {% endif %} | ||
39 | <span class="pull-right">Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent|sectohms }}</a></span> | ||
40 | {%endif%} | ||
41 | </div> | ||
42 | </div> | ||
43 | </div> | ||
44 | |||
45 | {% if build.errors_no %} | ||
46 | <div class="accordion span10 pull-right" id="errors"> | ||
47 | <div class="accordion-group"> | ||
48 | <div class="accordion-heading"> | ||
49 | <a class="accordion-toggle error toggle-errors"> | ||
50 | <h2 id="error-toggle"> | ||
51 | <i class="icon-minus-sign"></i> | ||
52 | {{build.errors_no}} error{{build.errors_no|pluralize}} | ||
53 | </h2> | ||
54 | </a> | ||
55 | </div> | ||
56 | <div class="accordion-body collapse in" id="collapse-errors"> | ||
57 | <div class="accordion-inner"> | ||
58 | <div class="span10"> | ||
59 | {% for error in logmessages %}{% if error.level == 2 %} | ||
60 | <div class="alert alert-error"> | ||
61 | <pre>{{error.message}}</pre> | ||
62 | </div> | ||
63 | {% endif %}{% endfor %} | ||
64 | </div> | ||
65 | </div> | ||
66 | </div> | ||
67 | </div> | ||
68 | </div> | ||
69 | {% endif %} | ||
70 | |||
71 | {%if build.outcome == build.SUCCEEDED%} | ||
72 | <!-- built images --> | ||
73 | <div class="row-fluid span10 pull-right"> | ||
74 | {% if hasImages %} | ||
75 | <h2>Images</h2> | ||
76 | {% for target in targets %} | ||
77 | {% if target.target.is_image %} | ||
78 | <div class="well dashboard-section"> | ||
79 | <h3><a href="{% url 'target' build.pk target.target.pk %}">{{target.target}}</a> | ||
80 | </h3> | ||
81 | <dl class="dl-horizontal"> | ||
82 | <dt>Packages included</dt> | ||
83 | <dd><a href="{% url 'target' build.pk target.target.pk %}">{{target.npkg}}</a></dd> | ||
84 | <dt>Total package size</dt> | ||
85 | <dd>{{target.pkgsz|filtered_filesizeformat}}</dd> | ||
86 | {% if target.targetHasNoImages %} | ||
87 | </dl> | ||
88 | <div class="row-fluid"> | ||
89 | <div class="alert alert-info span7"> | ||
90 | <p> | ||
91 | <b>This build did not create any image files</b> | ||
92 | </p> | ||
93 | <p> | ||
94 | This is probably because valid image and license manifest | ||
95 | files from a previous build already exist in your | ||
96 | <code>.../poky/build/tmp/deploy</code> | ||
97 | directory. You can | ||
98 | also <a href="{% url 'targetpkg' build.pk target.target.pk %}">view the | ||
99 | license manifest information</a> in Toaster. | ||
100 | </p> | ||
101 | </div> | ||
102 | </div> | ||
103 | {% else %} | ||
104 | <dt> | ||
105 | <i class="icon-question-sign get-help" title="The location in disk of the license manifest, a document listing all packages installed in your image and their licenses"></i> | ||
106 | <a href="{% url 'targetpkg' build.pk target.target.pk %}">License manifest</a> | ||
107 | </dt> | ||
108 | <dd><code>{{target.target.license_manifest_path}}</code></dd> | ||
109 | <dt> | ||
110 | <i class="icon-question-sign get-help" title="Image files are stored in <code>/build/tmp/deploy/images/</code>"></i> | ||
111 | Image files | ||
112 | </dt> | ||
113 | <dd> | ||
114 | <ul> | ||
115 | {% for i in target.imageFiles %} | ||
116 | <li>{{i.path}} | ||
117 | ({{i.size|filtered_filesizeformat}})</li> | ||
118 | {% endfor %} | ||
119 | </ul> | ||
120 | </dd> | ||
121 | </dl> | ||
122 | {% endif %} | ||
123 | </div> | ||
124 | {% endif %} | ||
125 | {% endfor %} | ||
126 | |||
127 | {% endif %} | ||
128 | </div> | ||
129 | |||
130 | {%else%} | ||
131 | <!-- error dump --> | ||
132 | {%endif%} | ||
133 | |||
134 | <!-- build summary --> | ||
135 | <div class="row-fluid span10 pull-right"> | ||
136 | <h2>Build summary</h2> | ||
137 | <div class="well span4 dashboard-section" style="margin-left:0px;"> | ||
138 | <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4> | ||
139 | <dl> | ||
140 | <dt>Machine</dt><dd>{{build.machine}}</dd> | ||
141 | <dt>Distro</dt><dd>{{build.distro}}</dd> | ||
142 | <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%} | ||
143 | </dl> | ||
144 | </div> | ||
145 | <div class="well span4 dashboard-section"> | ||
146 | <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4> | ||
147 | <dl> | ||
148 | <dt>Total number of tasks</dt><dd><a href="{% url 'tasks' build.pk %}">{% query build.task_build order__gt=0 as alltasks %}{{alltasks.count}}</a></dd> | ||
149 | <dt> | ||
150 | Tasks executed | ||
151 | <i class="icon-question-sign get-help" title="'Executed' tasks are those that need to be run in order to generate the task output"></i> | ||
152 | </dt> | ||
153 | <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A1&count=25&search=&page=1&orderby=order%3A%2B">{% query build.task_build task_executed=1 order__gt=0 as exectask%}{{exectask.count}}</a></dd> | ||
154 | <dt> | ||
155 | Tasks not executed | ||
156 | <i class="icon-question-sign get-help" title="'Not executed' tasks don't need to run because their outcome is provided by another task"></i> | ||
157 | </dt> | ||
158 | <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A0&count=25&search=&page=1&orderby=order%3A%2B">{% query build.task_build task_executed=0 order__gt=0 as noexectask%}{{noexectask.count}}</a></dd> | ||
159 | <dt> | ||
160 | Reuse | ||
161 | <i class="icon-question-sign get-help" title="The percentage of 'not executed' tasks over the total number of tasks, which is a measure of the efficiency of your build"></i> | ||
162 | </dt> | ||
163 | <dd> | ||
164 | {% query build.task_build order__gt=0 as texec %} | ||
165 | {% if noexectask.count|multiply:100|divide:texec.count < 0 %} | ||
166 | 0 | ||
167 | {% else %} | ||
168 | {{noexectask.count|multiply:100|divide:texec.count}} | ||
169 | {% endif %} | ||
170 | % | ||
171 | </dd> | ||
172 | </dl> | ||
173 | </div> | ||
174 | <div class="well span4 dashboard-section"> | ||
175 | <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4> | ||
176 | <dl> | ||
177 | <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd> | ||
178 | <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd> | ||
179 | </dl> | ||
180 | </div> | ||
181 | </div> | ||
182 | |||
183 | {% if build.warnings_no %} | ||
184 | <div class="accordion span10 pull-right" id="warnings"> | ||
185 | <div class="accordion-group"> | ||
186 | <div class="accordion-heading"> | ||
187 | <a class="accordion-toggle warning toggle-warnings"> | ||
188 | <h2 id="warning-toggle"> | ||
189 | <i class="icon-warning-sign"></i> | ||
190 | {{build.warnings_no}} warning{{build.warnings_no|pluralize}} | ||
191 | </h2> | ||
192 | </a> | ||
193 | </div> | ||
194 | <div class="accordion-body collapse" id="collapse-warnings"> | ||
195 | <div class="accordion-inner"> | ||
196 | <div class="span10"> | ||
197 | {% for warning in logmessages %}{% if warning.level == 1 %} | ||
198 | <div class="alert alert-warning"> | ||
199 | <pre>{{warning.message}}</pre> | ||
200 | </div> | ||
201 | {% endif %}{% endfor %} | ||
202 | </div> | ||
203 | </div> | ||
204 | </div> | ||
205 | </div> | ||
206 | </div> | ||
207 | {% endif %} | ||
208 | |||
209 | <script type="text/javascript"> | ||
210 | $(document).ready(function() { | ||
211 | //show warnings section when requested from the previous page | ||
212 | if (location.href.search('#warnings') > -1) { | ||
213 | $('#collapse-warnings').addClass('in'); | ||
214 | } | ||
215 | }); | ||
216 | </script> | ||
217 | |||
218 | {% endblock %} | ||