summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui/templates
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/toastergui/templates')
-rw-r--r--bitbake/lib/toaster/toastergui/templates/base.html91
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html28
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basebuildpage.html80
-rw-r--r--bitbake/lib/toaster/toastergui/templates/baseprojectpage.html43
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_bottom.html95
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_top.html241
-rw-r--r--bitbake/lib/toaster/toastergui/templates/bfile.html24
-rw-r--r--bitbake/lib/toaster/toastergui/templates/bpackage.html108
-rw-r--r--bitbake/lib/toaster/toastergui/templates/build.html140
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builddashboard.html218
-rw-r--r--bitbake/lib/toaster/toastergui/templates/buildtime.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configuration.html73
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configvars.html130
-rw-r--r--bitbake/lib/toaster/toastergui/templates/cpuusage.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/dirinfo.html237
-rw-r--r--bitbake/lib/toaster/toastergui/templates/diskio.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/filtersnippet.html39
-rw-r--r--bitbake/lib/toaster/toastergui/templates/importlayer.html68
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layer.html34
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layerdetails.html159
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layers.html178
-rw-r--r--bitbake/lib/toaster/toastergui/templates/machines.html63
-rw-r--r--bitbake/lib/toaster/toastergui/templates/newproject.html44
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package.html36
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html99
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_built_detail.html65
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_detail_base.html146
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html110
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_detail.html44
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html50
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_tabs.html33
-rw-r--r--bitbake/lib/toaster/toastergui/templates/project.html366
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projectbuilds.html59
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projectconf.html62
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipe.html275
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipes.html110
-rw-r--r--bitbake/lib/toaster/toastergui/templates/tablesort.html38
-rw-r--r--bitbake/lib/toaster/toastergui/templates/target.html163
-rw-r--r--bitbake/lib/toaster/toastergui/templates/targets.html186
-rw-r--r--bitbake/lib/toaster/toastergui/templates/task.html283
-rw-r--r--bitbake/lib/toaster/toastergui/templates/tasks.html133
41 files changed, 4363 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
new file mode 100644
index 0000000000..9ef249aab3
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -0,0 +1,91 @@
1<!DOCTYPE html>
2{% load static %}
3<html>
4 <head>
5 <title>{% if objectname %} {{objectname|title}} - {% endif %}Toaster</title>
6<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css">
7<link rel="stylesheet" href="{% static 'css/bootstrap-responsive.min.css' %}" type='text/css'>
8<link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'>
9<link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'>
10<link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'>
11<meta name="viewport" content="width=device-width, initial-scale=1.0" />
12<script src="{% static 'js/jquery-2.0.3.min.js' %}">
13</script>
14<script src="{% static 'js/jquery.cookie.js' %}">
15</script>
16<script src="{% static 'js/bootstrap.min.js' %}">
17</script>
18<script src="{% static 'js/prettify.js' %}">
19</script>
20<script src="{% static 'js/main.js' %}">
21</script>
22<script>
23function reload_params(params) {
24 uri = window.location.href;
25 splitlist = uri.split("?");
26 url = splitlist[0], parameters=splitlist[1];
27 // deserialize the call parameters
28 if(parameters){
29 cparams = parameters.split("&");
30 }else{
31 cparams = []
32 }
33 nparams = {}
34 for (i = 0; i < cparams.length; i++) {
35 temp = cparams[i].split("=");
36 nparams[temp[0]] = temp[1];
37 }
38 // update parameter values
39 for (i in params) {
40 nparams[encodeURIComponent(i)] = encodeURIComponent(params[i]);
41 }
42 // serialize the structure
43 callparams = []
44 for (i in nparams) {
45 callparams.push(i+"="+nparams[i]);
46 }
47 window.location.href = url+"?"+callparams.join('&');
48
49}
50</script>
51
52{% block extraheadcontent %}
53{% endblock %}
54 </head>
55
56<body style="height: 100%">
57<div class="navbar navbar-static-top">
58 <div class="navbar-inner">
59 <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a>
60 <a class="brand" href="/">Toaster</a>
61 {%if MANAGED %}
62 <div class="btn-group pull-right">
63 <a class="btn" href="{% url 'newproject' %}">New project</a>
64 <button class="btn dropdown-toggle" data-toggle="dropdown">
65 <i class="icon-caret-down"></i>
66 </button>
67 <ul class="dropdown-menu">
68{% for prj in projects %}
69 <li><a href="{% url 'project' prj.id %}">{{prj.name}}</a></li>
70{% endfor %}
71 <li><hr/></li>
72 <li><a href="#">Clone project</a></li>
73 <li><a href="#">Export project</a></li>
74 <li><a href="#">Import project</a></li>
75 </ul>
76 </div>
77 {%endif%}
78 <a class="pull-right manual" target="_blank" href="http://www.yoctoproject.org/documentation/toaster-manual">
79 <i class="icon-book"></i>
80 Toaster manual
81 </a>
82 </div>
83</div>
84
85<div class="container-fluid">
86{% block pagecontent %}
87{% endblock %}
88</div>
89</body>
90</html>
91
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
new file mode 100644
index 0000000000..5149768517
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
@@ -0,0 +1,28 @@
1{% extends "base.html" %}
2{% load humanize %}
3{% block pagecontent %}
4
5<div class="row-fluid">
6<!-- Breadcrumbs -->
7 <div class="section">
8 <ul class="breadcrumb" id="breadcrumb">
9 <li><a href="{% url 'all-builds' %}">All builds</a></li>
10 <li><a href="{%url 'builddashboard' build.pk%}">{{build.target_set.all.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"}})</a></li>
11 {% block localbreadcrumb %}{% endblock %}
12 </ul>
13 <script>
14 $( function () {
15 $('#breadcrumb > li').append("<span class=\"divider\">→</span>");
16 $('#breadcrumb > li:last').addClass("active");
17 $('#breadcrumb > li:last > span').remove();
18 });
19 </script>
20 </div> <!--section-->
21
22 <!-- Begin container -->
23 {% block pagedetailinfomain %}{% endblock %}
24 <!-- End container -->
25
26</div>
27
28{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
new file mode 100644
index 0000000000..46110519e9
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
@@ -0,0 +1,80 @@
1{% extends "base.html" %}
2{% load projecttags %}
3{% load humanize %}
4{% block pagecontent %}
5
6
7 <div class="">
8<!-- Breadcrumbs -->
9 <div class="section">
10 <ul class="breadcrumb" id="breadcrumb">
11<li><a href="{% url 'all-builds' %}">All builds</a></li>
12 <li>
13 {% block parentbreadcrumb %}
14 <a href="{%url 'builddashboard' build.pk%}">
15 {{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"}})
16 </a>
17 {% endblock %}
18 </li>
19 {% block localbreadcrumb %}{% endblock %}
20 </ul>
21 <script>
22 $( function () {
23 $('#breadcrumb > li').append("<span class=\"divider\">→</span>");
24 $('#breadcrumb > li:last').addClass("active");
25 $('#breadcrumb > li:last > span').remove();
26 });
27 </script>
28 </div>
29
30 <div class="row-fluid">
31
32 <!-- begin left sidebar container -->
33 <div id="nav" class="span2">
34 <ul class="nav nav-list well">
35 {% if build.target_set.all.0.is_image and build.outcome == 0 %}
36 <li class="nav-header">Images</li>
37 {% block nav-target %}
38 {% for t in build.get_sorted_target_list %}
39 <li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
40 {% endfor %}
41 {% endblock %}
42 {% endif %}
43 <li class="nav-header">Build</li>
44 {% block nav-configuration %}
45 <li><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
46 {% endblock %}
47 {% block nav-tasks %}
48 <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
49 {% endblock %}
50 {% block nav-recipes %}
51 <li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
52 {% endblock %}
53 {% block nav-packages %}
54 <li><a href="{% url 'packages' build.pk %}">Packages</a></li>
55 {% endblock %}
56 <li class="nav-header">Performance</li>
57 {% block nav-buildtime %}
58 <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
59 {% endblock %}
60 {% block nav-cpuusage %}
61 <li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
62 {% endblock %}
63 {% block nav-diskio %}
64 <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
65 {% endblock %}
66 </ul>
67 </div>
68 <!-- end left sidebar container -->
69
70 <!-- Begin right container -->
71 {% block buildinfomain %}{% endblock %}
72 <!-- End right container -->
73
74
75 </div>
76 </div>
77
78
79{% endblock %}
80
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
new file mode 100644
index 0000000000..54edaaf27c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -0,0 +1,43 @@
1{% extends "base.html" %}
2{% load projecttags %}
3{% load humanize %}
4{% block pagecontent %}
5
6
7 <div class="">
8<!-- Breadcrumbs -->
9 <div class="section">
10 <ul class="breadcrumb" id="breadcrumb">
11 <li><a href="{% url 'all-builds' %}">All builds</a></li>
12 {% block parentbreadcrumb %}
13 {% if project %}
14 <li>
15 <a href="{%url 'project' project.id %}">{{project.name}}
16 </a>
17 </li>
18 {% endif %}
19 {% endblock %}
20 {% block localbreadcrumb %}{% endblock %}
21 </ul>
22 <script>
23 $( function () {
24 $('#breadcrumb > li').append("<span class=\"divider\">→</span>");
25 $('#breadcrumb > li:last').addClass("active");
26 $('#breadcrumb > li:last > span').remove();
27 });
28 </script>
29 </div>
30
31 <div class="row-fluid">
32
33 <!-- Begin right container -->
34 {% block projectinfomain %}{% endblock %}
35 <!-- End right container -->
36
37
38 </div>
39 </div>
40
41
42{% endblock %}
43
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
new file mode 100644
index 0000000000..e6b9506281
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
@@ -0,0 +1,95 @@
1 </tbody>
2 </table>
3
4<!-- Show pagination controls -->
5<div class="pagination pagination-centered">
6 <div class="pull-left">
7 Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.
8 </div>
9
10 <ul class="pagination" style="display: block-inline">
11{%if objects.has_previous %}
12 <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
13{%else%}
14 <li class="disabled"><a href="#">&laquo;</a></li>
15{%endif%}
16{% for i in objects.page_range %}
17 <li{%if i == objects.number %} class="active" {%endif%}><a href="javascript:reload_params({'page':{{i}}})">{{i}}</a></li>
18{% endfor %}
19{%if objects.has_next%}
20 <li><a href="javascript:reload_params({'page':{{objects.next_page_number}}})">&raquo;</a></li>
21{%else%}
22 <li class="disabled"><a href="#">&raquo;</a></li>
23{%endif%}
24 </ul>
25 <div class="pull-right">
26 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
27 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
28 {% with "2 5 10 25 50 100" as list%}
29 {% for i in list.split %}
30 <option value="{{i}}">{{i}}</option>
31 {% endfor %}
32 {% endwith %}
33 </select>
34 </div>
35</div>
36
37<!-- Update page display settings -->
38
39<script>
40 $(document).ready(function() {
41
42 // we load cookies for the column display
43 save = $.cookie('_displaycols_{{objectname}}');
44 if (save != undefined) {
45 setting = save.split(';');
46 for ( i = 0; i < setting.length; i++) {
47 if (setting[i].length > 0) {
48 splitlist = setting[i].split(':');
49 id = splitlist[0], v = splitlist[1];
50 if (v == 'true') {
51 $('.chbxtoggle#'+id).prop('checked', true);
52 }
53 else {
54 $('.chbxtoggle#'+id).prop('checked', false);
55 }
56 }
57 }
58 }
59
60 // load cookie for number of entries to be displayed on page
61 pagesize = $.cookie('count');
62 if (!pagesize)
63 pagesize = 10;
64 $('.pagesize option').prop('selected', false)
65 .filter('[value="' + pagesize + '"]')
66 .attr('selected', true);
67
68 $('.chbxtoggle').each(function () {
69 showhideTableColumn($(this).attr('id'), $(this).is(':checked'))
70 });
71
72 //turn edit columns dropdown into a multi-select menu
73 $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
74 e.stopPropagation();
75 });
76
77 //show tooltip with applied filter
78 $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true});
79
80 //progress bar tooltip
81 $('.progress, .lead span').tooltip({container:'table', placement:'top'});
82
83 $(".pagesize").change(function () {
84 reload_params({"count":$(this).val()});
85 // save cookie with pagesize
86 $.cookie("count", $(this).val(), { path : $(location).attr('pathname') });
87 });
88});
89</script>
90
91<!-- modal filter boxes -->
92 {% for tc in tablecols %}{% if tc.filter %}{% with objectname=objectname f=tc.filter %}
93 {% include "filtersnippet.html" %}
94 {% endwith %}{% endif %} {% endfor %}
95<!-- end modals -->
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
new file mode 100644
index 0000000000..e43eb2ce12
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -0,0 +1,241 @@
1{% load projecttags %}
2<!-- component to display a generic table -->
3 <script>
4
5 //
6 // most of the following javascript is for managing the 'Edit Columns'
7 // pop-up dialog and actions. the idea is that there are 2 types
8 // of actions: immediate - performed while the dialog is still
9 // visible - hide/show columns, and delayed - performed when the
10 // dialog becomes invisible - any resorting if necessary.
11 //
12 // When the dialog is open, an interval timer is set up to
13 // determine if the dialog is still visible. when the dialog
14 // closes - goes invisible, the delayed actions are performed.
15 //
16 // the interval timer and interrupt handler is a way of simulating
17 // an onclose event. there is probably a simpler way to do this
18 // however the pop-up window id was elusive.
19 //
20
21 var editColTimer;
22 var editColAction;
23
24 //
25 // this is the target function of the interval timeout.
26 // check to see if the dialog is visible. if the dialog
27 // has gone invisible since the last check, take any delayed
28 // actions indicated in the action list and clear the timer.
29 //
30
31 function checkVisible( ) {
32 editcol = document.getElementById( 'editcol' );
33 if ( editcol.offsetWidth <= 0 ) {
34 clearInterval( editColTimer );
35 editColTimer = false;
36 hideshowColumns( );
37 editColAction = [ ];
38 }
39 }
40
41 function filterTableRows(test) {
42 if (test.length > 0) {
43 var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
44 $('tr.data').map( function (i, el) {
45 (! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
46 });
47 } else
48 {
49 $('tr.data').show();
50 }
51 }
52
53 //
54 // determine the value of the indicated url arg.
55 // this is needed to determine whether a resort
56 // is necessary. it looks like a lot of gorp stuff
57 // but its actually pretty simple.
58 //
59
60 function getURLParameter( name ) {
61 return decodeURIComponent((new RegExp('[?|&]' + name + '=' +
62 '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g,
63 '%20'))||null
64 }
65
66 //
67 // when the dialog box goes invisible
68 // this function is called to interpret
69 // the action list and take any delayed actions necessary.
70 // the editColAction list is a hash table with
71 // the column name as the hash key, the hash value
72 // is a 2 element list. the first element is a flag
73 // indicating whether the column is on or off. the
74 // 2nd element is the sort order indicator for the column.
75 //
76
77 function hideshowColumns( ) {
78 for( var k in editColAction ) {
79 showhideDelayedTableAction( k, editColAction[ k ][ 0 ], editColAction[ k ][ 1 ]);
80 }
81 }
82
83 //
84 // this function actually performs the delayed table actions
85 // namely any resorting if necessary
86 //
87
88 function showhideDelayedTableAction( clname, sh, orderkey ) {
89 if ( !sh ) {
90 p = getURLParameter( "orderby" ).split( ":" )[ 0 ];
91 if ( p == orderkey ) {
92 reload_params({ 'orderby' : '{{default_orderby}}'});
93 }
94 }
95 }
96
97 //
98 // this function actually performs the immediate table actions
99 // namely any colums that need to be hidden/shown
100 //
101
102 function showhideImmediateTableAction( clname, sh, orderkey ) {
103 if ( sh ) {
104 $( '.' + clname ).show( 100 );
105 }
106 else {
107 $( '.' + clname ).hide( 100 );
108 }
109
110 // save cookie for all checkboxes
111 save = '';
112 $( '.chbxtoggle' ).each(function( ) {
113 if ( $( this ).attr( 'id' ) != undefined ) {
114 save += ';' + $( this ).attr( 'id' ) +':'+ $( this ).is( ':checked' )
115 }
116 });
117 $.cookie( '_displaycols_{{objectname}}', save );
118 save = '';
119 }
120
121 //
122 // this is the onclick handler for all of the check box
123 // items in edit columns dialog
124 //
125
126 function showhideTableColumn( clname, sh, orderkey ) {
127 editcol = document.getElementById( 'editcol' );
128 if ( editcol.offsetWidth <= 0 ) {
129
130 //
131 // this path is taken when the page is first
132 // getting initialized - no dialog visible,
133 // perform both the immediate and delayed actions
134 //
135
136 showhideImmediateTableAction( clname, sh, orderkey );
137 showhideDelayedTableAction( clname, sh, orderkey );
138 return;
139 }
140 if ( !editColTimer ) {
141
142 //
143 // we don't have a timer active so set one up
144 // and clear the action list
145 //
146
147 editColTimer = setInterval( checkVisible, 250 );
148 editColAction = [ ];
149 }
150
151 //
152 // save the action to be taken when the dialog closes
153 //
154
155 editColAction[ clname ] = [ sh, orderkey ];
156 showhideImmediateTableAction( clname, sh, orderkey );
157 }
158
159 //
160 // saves a cookie with selected order field
161 //
162 function saveOrderCookie( orderfield ) {
163 $.cookie("orderby", orderfield, { path: $(location).attr('pathname') });
164 }
165
166 </script>
167
168<!-- control header -->
169<div class="navbar">
170 <div class="navbar-inner">
171 <form class="navbar-search input-append pull-left" id="searchform">
172 <input class="input-xxlarge" id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{%endif%}
173 <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
174 <input type="hidden" name="page" value="1">
175 <button class="btn" type="submit" value="Search">Search</button>
176 </form>
177 <div class="pull-right">
178{% if tablecols %}
179 <div class="btn-group">
180 <button class="btn dropdown-toggle" data-toggle="dropdown">Edit columns
181 <span class="caret"></span>
182 </button>
183<!--
184 {{tablecols|sortcols}}
185-->
186 <ul id='editcol' class="dropdown-menu">
187 {% for i in tablecols|sortcols %}
188 <li>
189 <label {% if not i.clclass %} class="checkbox muted" {%else%} class="checkbox" {%endif%}>
190 <input type="checkbox" class="chbxtoggle"
191 {% if i.clclass %}
192 id="{{i.clclass}}"
193 value="ct{{i.name}}"
194 {% if not i.hidden %}
195 checked="checked"
196 {%endif%}
197 onclick="showhideTableColumn(
198 $(this).attr('id'),
199 $(this).is(':checked'),
200 '{{i.orderkey}}' )"
201 {%else%}
202 checked disabled
203 {% endif %}/> {{i.name}}
204 </label>
205 </li>
206 {% endfor %}
207 </ul>
208 </div>
209{% endif %}
210 <div style="display:inline">
211 <span class="divider-vertical"></span>
212 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
213 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
214 {% with "2 5 10 25 50 100" as list%}
215 {% for i in list.split %}
216 <option value="{{i}}">{{i}}</option>
217 {% endfor %}
218 {% endwith %}
219 </select>
220 </div>
221 </div>
222 </div> <!-- navbar-inner -->
223</div>
224
225<!-- the actual rows of the table -->
226 <table class="table table-bordered table-hover tablesorter" id="otable">
227 <thead>
228 <!-- Table header row; generated from "tablecols" entry in the context dict -->
229 <tr>
230 {% for tc in tablecols %}<th class="{{tc.dclass}} {{tc.clclass}}">
231 {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%}
232 {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })" onclick="saveOrderCookie('{{tc.orderfield}}')">{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%}
233 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
234 {%if tc.filter%}<div class="btn-group pull-right">
235 <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-small btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="icon-filter filtered"></i> </a>
236 </div>{%endif%}
237 </th>{% endfor %}
238 </tr>
239 </thead>
240 <tbody>
241
diff --git a/bitbake/lib/toaster/toastergui/templates/bfile.html b/bitbake/lib/toaster/toastergui/templates/bfile.html
new file mode 100644
index 0000000000..c7f59434a5
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/bfile.html
@@ -0,0 +1,24 @@
1{% extends "basebuildpage.html" %}
2
3{% block pagetitle %}Files for package {{objects.0.bpackage.name}} {% endblock %}
4{% block pagetable %}
5 {% if not objects %}
6 <p>No files were recorded for this package!</p>
7 {% else %}
8
9 <tr>
10 <th>Name</th>
11 <th>Size (Bytes)</th>
12 </tr>
13
14 {% for file in objects %}
15
16 <tr class="data">
17 <td>{{file.path}}</td>
18 <td>{{file.size}}</td>
19
20 {% endfor %}
21
22 {% endif %}
23
24{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
new file mode 100644
index 0000000000..2d4948be4b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -0,0 +1,108 @@
1{% extends "basebuildpage.html" %}
2
3{% load projecttags %}
4
5{% block localbreadcrumb %}
6<li>Packages</li>
7{% endblock %}
8
9{% block nav-packages %}
10 <li class="active"><a href="{% url 'packages' build.pk %}">Packages</a></li>
11{% endblock %}
12
13{% block buildinfomain %}
14<div class="span10">
15
16{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
17
18<!-- Empty - no data in database -->
19<div class="page-header">
20 <h1>
21 Packages
22 </h1>
23</div>
24<div class="alert alert-info lead">
25 <strong>No packages were built.</strong> How did this happen? Well, BitBake reuses as much stuff as possible.
26 If all of the packages needed were already built and available in your build infrastructure, BitBake
27 will not rebuild any of them. This might be slightly confusing, but it does make everything faster.
28</div>
29
30{% else %}
31
32<div class="page-header">
33 <h1>
34 {% if request.GET.search and objects.paginator.count > 0 %}
35 {{objects.paginator.count}} package{{objects.paginator.count|pluralize}} found
36 {%elif request.GET.search and objects.paginator.count == 0%}
37 No packages found
38 {%else%}
39 Packages
40 {%endif%}
41 </h1>
42</div>
43
44 {% if objects.paginator.count == 0 %}
45 <div class="row-fluid">
46 <div class="alert">
47 <form class="no-results input-append" id="searchform">
48 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
49 <button class="btn" type="submit" value="Search">Search</button>
50 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
51 </form>
52 </div>
53 </div>
54
55 {% else %}
56 {% include "basetable_top.html" %}
57
58 {% for package in objects %}
59
60 <tr class="data">
61
62 <!-- Package -->
63 <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.name}}</a></td>
64 <!-- Package Version -->
65 <td>{%if package.version%}<a href="{% url "package_built_detail" build.pk package.pk %}">{{package.version}}-{{package.revision}}</a>{%endif%}</td>
66 <!-- Package Size -->
67 <td class="size sizecol">{{package.size|filtered_filesizeformat}}</td>
68 <!-- License -->
69 <td class="license">{{package.license}}</td>
70
71 {%if package.recipe%}
72 <!-- Recipe -->
73 <td class="recipe__name"><a href="{% url "recipe" build.pk package.recipe.pk %}">{{package.recipe.name}}</a></td>
74 <!-- Recipe Version -->
75 <td class="recipe__version"><a href="{% url "recipe" build.pk package.recipe.pk %}">{{package.recipe.version}}</a></td>
76
77 <!-- Layer -->
78 <td class="recipe__layer_version__layer__name">{{package.recipe.layer_version.layer.name}}</td>
79 <!-- Layer branch -->
80 <td class="recipe__layer_version__branch">{{package.recipe.layer_version.branch}}</td>
81 <!-- Layer commit -->
82 <td class="recipe__layer_version__layer__commit">
83 <a class="btn"
84 data-content="<ul class='unstyled'>
85 <li>{{package.recipe.layer_version.commit}}</li>
86 </ul>">
87 {{package.recipe.layer_version.commit|truncatechars:13}}
88 </a>
89 </td>
90 <!-- Layer directory -->
91 <td class="recipe__layer_version__layer__local_path">{{package.recipe.layer_version.layer.local_path}}</td>
92 {%else%}
93 <td class="recipe__name"></td>
94 <td class="recipe__version"></td>
95 <td class="recipe__layer_version__layer__name"></td>
96 <td class="recipe__layer_version__branch"></td>
97 <td class="recipe__layer_version__layer__commit"></td>
98 <td class="recipe__layer_version__layer__local_path"></td>
99 {%endif%}
100
101 </tr>
102 {% endfor %}
103
104 {% include "basetable_bottom.html" %}
105 {% endif %} {# objects.paginator.count #}
106{% endif %} {# Empty #}
107</div>
108{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/build.html b/bitbake/lib/toaster/toastergui/templates/build.html
new file mode 100644
index 0000000000..faabd22f8b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/build.html
@@ -0,0 +1,140 @@
1{% extends "base.html" %}
2
3{% load static %}
4{% load projecttags %}
5{% load humanize %}
6
7{% block pagecontent %}
8<div class="row-fluid">
9 {% if not objects.paginator.count and not request.GET.filter and not request.GET.search %}
10 <!-- Empty - no data in database -->
11 <div class="hero-unit span12">
12 <button type="button" class="close" data-dismiss="alert">&times;</button>
13 <div class="row-fluid">
14 <div class="span6">
15 <h1>This is Toaster</h1>
16 <p>A web interface to <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
17 <p class="hero-actions">
18 <a class="btn btn-primary btn-large" href="https://www.yoctoproject.org/documentation/toaster-manual">Show me the manual</a>
19 <a class="btn btn-large" href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster">I want to contribute</a>
20 </p>
21 </div>
22 <div class="span5">
23 <a href="http://www.yoctoproject.org"><img src="{% static 'img/toaster.png' %}" class="thumbnail" alt="Yocto Project"/> </a>
24 </div>
25 </div>
26 </div>
27 {% endif %}
28
29 {%if mru.count > 0%}
30 <div class="page-header top-air">
31 <h1>
32 Recent Builds
33 </h1>
34 </div>
35 {% for build in mru %}
36 <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
37 <div class="row-fluid">
38 <div class="lead span5">
39 {%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}
40 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
41 <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
42 {% endif %}
43 <span data-toggle="tooltip" {%if build.target_set.all.count > 1%}title="Targets: {%for target in build.target_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|naturaltime}})</span>
44 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
45 </a>
46 {% endif %}
47 </div>
48 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
49 <div class="span2 lead">
50 {% if build.errors_no %}
51 <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>
52 {% endif %}
53 </div>
54 <div class="span2 lead">
55 {% if build.warnings_no %}
56 <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>
57 {% endif %}
58 </div>
59 <div class="lead pull-right">
60 Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent|sectohms }}</a>
61 </div>
62 {%endif%}{%if build.outcome == build.IN_PROGRESS %}
63 <div class="span4">
64 <div class="progress" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
65 <div style="width: {{build.completeper}}%;" class="bar"></div>
66 </div>
67 </div>
68 <div class="lead pull-right">ETA: in {{build.eta|naturaltime}}</div>
69 {%endif%}
70 </div>
71 </div>
72
73 {% endfor %}{%endif%}
74
75 {% if not objects.paginator.count and not request.GET.filter and not request.GET.search %}
76 <!-- Empty - no data in database -->
77 {% if mru.count == 0 %}
78 <div class="page-header top-air">
79 <h1>All builds</h1>
80 </div>
81 <div class="alert alert-info lead">
82 Toaster has not recorded any builds yet. Go build something with <a href="http://www.yoctoproject.org/docs/current/yocto-project-qs/yocto-project-qs.html#test-run">Knotty</a> or <a href="https://www.yoctoproject.org/documentation/hob-manual">Hob</a>
83 </div>
84 {% endif %}
85 {% else %}
86 <div class="page-header top-air">
87 <h1>
88 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
89 {{objects.paginator.count}} build{{objects.paginator.count|pluralize}} found
90 {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
91 No builds found
92 {%else%}
93 All builds
94 {%endif%}
95 </h1>
96 </div>
97
98 {% if objects.paginator.count == 0 %}
99 <div class="row-fluid">
100 <div class="alert">
101 <form class="no-results input-append" id="searchform">
102 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
103 <button class="btn" type="submit" value="Search">Search</button>
104 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button>
105 </form>
106 </div>
107 </div>
108
109
110 {% else %}
111 {% include "basetable_top.html" %}
112 <!-- Table data rows; the order needs to match the order of "tablecols" definitions; and the <td class value needs to match the tablecols clclass value for show/hide buttons to work -->
113 {% for build in objects %}
114 <tr class="data">
115 <td class="outcome"><a href="{% url "builddashboard" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a></td>
116 <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td>
117 <td class="machine"><a href="{% url "builddashboard" build.id %}">{{build.machine}}</a></td>
118 <td class="started_on"><a href="{% url "builddashboard" build.id %}">{{build.started_on|date:"d/m/y H:i"}}</a></td>
119 <td class="completed_on"><a href="{% url "builddashboard" build.id %}">{{build.completed_on|date:"d/m/y H:i"}}</a></td>
120 <td class="failed_tasks error">{% query build.task_build outcome=4 order__gt=0 as exectask%}{% if exectask.count == 1 %}<a href="{% url "task" build.id exectask.0.id %}">{{exectask.0.recipe.name}}.{{exectask.0.task_name}}</a>{% elif exectask.count > 1%}<a href="{% url "tasks" build.id %}?filter=outcome%3A4">{{exectask.count}}</a>{%endif%}</td>
121 <td class="errors_no">{% if build.errors_no %}<a class="errors_no error" href="{% url "builddashboard" build.id %}#errors">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>{%endif%}</td>
122 <td class="warnings_no">{% if build.warnings_no %}<a class="warnings_no warning" href="{% url "builddashboard" build.id %}#warnings">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>{%endif%}</td>
123 <td class="time"><a href="{% url "buildtime" build.id %}">{{build.timespent|sectohms}}</a></td>
124 <td class="log">{{build.cooker_log_path}}</td>
125 <td class="output">
126 {% if build.outcome == build.SUCCEEDED %}
127 <a href="{%url "builddashboard" build.id%}#images">{{fstypes|get_dict_value:build.id}}</a>
128 {% endif %}
129 </td>
130 </tr>
131
132 {% endfor %}
133
134
135 {% include "basetable_bottom.html" %}
136 {% endif %} {# objects.paginator.count #}
137{% endif %} {# empty #}
138</div><!-- end row-fluid-->
139
140{% endblock %}
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&nbsp;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&amp;count=25&amp;search=&amp;page=1&amp;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&amp;count=25&amp;search=&amp;page=1&amp;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 %}
1660
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 %}
diff --git a/bitbake/lib/toaster/toastergui/templates/buildtime.html b/bitbake/lib/toaster/toastergui/templates/buildtime.html
new file mode 100644
index 0000000000..ea84ae797c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/buildtime.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Build Time</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
new file mode 100644
index 0000000000..49a6a89d5c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -0,0 +1,73 @@
1{% extends "basebuildpage.html" %}
2{% load projecttags %}
3
4{% block localbreadcrumb %}
5<li>Configuration</li>
6{% endblock %}
7
8{% block nav-configuration %}
9 <li class="active"><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
10{% endblock %}
11
12{% block buildinfomain %}
13<!-- page title -->
14<div class="row-fluid span10">
15 <div class="page-header">
16 <h1>Configuration</h1>
17 </div>
18</div>
19
20<!-- configuration table -->
21<div class="row-fluid pull-right span10" id="navTab">
22<ul class="nav nav-pills">
23 <li class="active"><a href="#">Summary</a></li>
24 <li class=""><a href="{% url 'configvars' build.id %}">BitBake variables</a></li>
25</ul>
26
27 <!-- summary -->
28 <div id="summary" class="tab-pane active">
29 <h3>Build configuration</h3>
30 <dl class="dl-horizontal">
31 {%if BB_VERSION %}<dt>BitBake version</dt><dd>{{BB_VERSION}}</dd> {% endif %}
32 {%if BUILD_SYS %}<dt>Build system</dt><dd>{{BUILD_SYS}}</dd> {% endif %}
33 {%if NATIVELSBSTRING %}<dt>Host distribution</dt><dd>{{NATIVELSBSTRING}}</dd> {% endif %}
34 {%if TARGET_SYS %}<dt>Target system</dt><dd>{{TARGET_SYS}}</dd> {% endif %}
35 {%if MACHINE %}<dt>Machine</dt><dd>{{MACHINE}}</dd> {% endif %}
36 {%if DISTRO %}<dt>Distro</dt><dd>{{DISTRO}}</dd> {% endif %}
37 {%if DISTRO_VERSION %}<dt>Distro version</dt><dd>{{DISTRO_VERSION}}</dd> {% endif %}
38 {%if TUNE_FEATURES %}<dt>Tune features</dt><dd>{{TUNE_FEATURES}}</dd> {% endif %}
39 {%if TARGET_FPU %}<dt>Target FPU</dt><dd>{{TARGET_FPU}}</dd> {% endif %}
40 {%if targets.all %}<dt>Target(s)</dt>
41 <dd> <ul> {% for target in targets.all %}
42 <li>{{target.target}}{%if forloop.counter > 1 %}<br>{% endif %}</li>
43 {% endfor %} </ul> </dd> {% endif %}
44 </dl>
45 <h3>Layers</h3>
46 <div class="span9" style="margin-left:0px;">
47 <table class="table table-bordered table-hover">
48 <thead>
49 <tr>
50 <th>Layer</th>
51 <th>Layer branch</th>
52 <th>Layer commit</th>
53 <th>Layer directory</th>
54 </tr>
55 </thead>
56 <tbody>{% for lv in build.layer_version_build.all|dictsort:"layer.name" %}
57 <tr>
58 <td>{{lv.layer.name}}</td>
59 <td>{{lv.branch}}</td>
60 <td> <a class="btn" data-content="<ul class='unstyled'>
61 <li>{{lv.commit}}</li> </ul>">
62 {{lv.commit|truncatechars:13}}
63 </a></td>
64 <td>{{lv.layer.local_path}}</td>
65 </tr>{% endfor %}
66 </tbody>
67 </table>
68 </div>
69 </div>
70
71
72</div>
73{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
new file mode 100644
index 0000000000..1bd29aac0d
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -0,0 +1,130 @@
1{% extends "basebuildpage.html" %}
2{% load projecttags %}
3
4{% block localbreadcrumb %}
5<li>Configuration</li>
6{% endblock %}
7
8{% block nav-configuration %}
9 <li class="active"><a href="{% url 'configuration' build.pk %}">Configuration</a></li>
10{% endblock %}
11
12{% block buildinfomain %}
13<!-- page title -->
14<div class="row-fluid span10">
15 <div class="page-header">
16 <h1>
17 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
18 {{objects.paginator.count}} variable{{objects.paginator.count|pluralize}} found
19 {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
20 No variables found
21 {%else%}
22 Configuration
23 {%endif%}
24 </h1>
25 </div>
26</div>
27
28<!-- configuration table -->
29<div class="row-fluid pull-right span10" id="navTab">
30 <ul class="nav nav-pills">
31 <li class=""><a href="{% url 'configuration' build.id %}">Summary</a></li>
32 <li class="active"><a href="#" >BitBake variables</a></li>
33 </ul>
34
35 <!-- variables -->
36 <div id="variables" class="tab-pane">
37
38 {% if objects.paginator.count == 0 %}
39 <div class="row-fluid">
40 <div class="alert">
41 <form class="no-results input-append" id="searchform">
42 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
43 <button class="btn" type="submit" value="Search">Search</button>
44 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
45 </form>
46 </div>
47 </div>
48
49 {% else %}
50 {% include "basetable_top.html" %}
51
52 {% for variable in objects %}
53 <tr class="data">
54 <td class="variable_name"><a data-toggle="modal" href="#variable-{{variable.pk}}">{{variable.variable_name}}</a></td>
55 <td class="variable_value"><a data-toggle="modal" href="#variable-{{variable.pk}}">{{variable.variable_value|truncatechars:153}}</a></td>
56 <td class="file"><a data-toggle="modal" href="#variable-{{variable.pk}}">
57 {% if variable.vhistory.all %} {% autoescape off %}
58 {{variable.vhistory.all | filter_setin_files:file_filter }}
59 {% endautoescape %} {% endif %}
60 </a></td>
61 <td class="description">
62 {% if variable.description %}
63 {{variable.description}}
64 <a href="http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-{{variable.variable_name|variable_parent_name}}" target="_blank">
65 <i class="icon-share get-info"></i></a>
66 {% endif %}
67 </td>
68 </tr>
69{% endfor %}
70
71{% include "basetable_bottom.html" %}
72{% endif %}
73</div> <!-- endvariables -->
74
75<!-- file list popups -->
76{% for variable in objects %}
77 {% if variable.vhistory.count %}
78 <div id="variable-{{variable.pk}}" class="modal hide fade" tabindex="-1" role="dialog">
79 <div class="modal-header">
80 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
81 <h3>History of {{variable.variable_name}}</h3>
82 </div>
83 <div class="modal-body">
84 {% if variable.variable_value %}
85 {% if variable.variable_value|length < 570 %}
86 <h4>{{variable.variable_name}} value is:</h4>
87 <p>
88 {{variable.variable_value}}
89 </p>
90 {% else %}
91 <h4>{{variable.variable_name}} value is:</h4>
92 <p>
93 <span>{{variable.variable_value|string_slice:':570'}}
94 <span class="full"> {{variable.variable_value|string_slice:'570:'}}
95 </span>
96 <a class="btn btn-mini full-show">...</a>
97 </span>
98 </p>
99 <a class="btn btn-mini full-hide">Collapse variable value <i class="icon-caret-up"></i>
100 </a>
101 {% endif %}
102 {% else %}
103 <div class="alert alert-info">The value of <strong>{{variable.variable_name}}</strong> is an empty string</div>
104 {% endif %}
105 <h4>The value was set in the following configuration files:</h4>
106 <table class="table table-bordered table-hover">
107 <thead>
108 <tr>
109 <th>Order</th>
110 <th>Configuration file</th>
111 <th>Operation</th>
112 <th>Line number</th>
113 </tr>
114 </thead>
115 <tbody>
116 {% for vh in variable.vhistory.all %}
117 <tr>
118 <td>{{forloop.counter}}</td><td>{{vh.file_name}}</td><td>{{vh.operation}}</td><td>{{vh.line_number}}</td>
119 </tr>
120 {%endfor%}
121 </tbody>
122 </table>
123 </div>
124 </div>
125 {% endif %}
126{% endfor %}
127
128</div> <!-- buildinfomain -->
129
130{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/cpuusage.html b/bitbake/lib/toaster/toastergui/templates/cpuusage.html
new file mode 100644
index 0000000000..02f07b7605
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/cpuusage.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Cpu Usage</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/dirinfo.html b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
new file mode 100644
index 0000000000..11c709ac9a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
@@ -0,0 +1,237 @@
1{% extends "basebuildpage.html" %}
2{% block extraheadcontent %}
3{% load static %}
4<link rel="stylesheet" href="{% static 'css/jquery.treetable.css' %}" type="text/css">
5<link rel="stylesheet" href="{% static 'css/jquery.treetable.theme.toaster.css' %}" type="text/css">
6{% endblock extraheadcontent %}
7
8{% block localbreadcrumb %}
9<li>{{target.target}}</li>
10{% endblock localbreadcrumb%}
11
12{% block buildinfomain %}
13
14{% load static %}
15<script src="{% static 'js/jquery.treetable.js' %}">
16</script>
17{% load projecttags %}
18
19<script type='text/javascript'>
20 function setupTreetable() {
21 $("#dirtable").treetable({
22 expandable: true,
23 branchAttr: "ttBranch",
24 clickableNodeNames: true,
25 onNodeCollapse: function() {
26 /* Do nothing, keep cached */
27 },
28 onNodeExpand: function() {
29 var start = this.id;
30 var n = $("#dirtable").treetable("node", start);
31 if (this.children.length > 0) {
32 /* already was expanded once */
33 $("#dirtable").treetable("reveal", start);
34 }
35 else {
36 var url = "{% url "dirinfo_ajax" build.id target.id %}";
37 $.ajax({
38 async: false,
39 type : "GET",
40 url : url,
41 data : "start=" + start,
42 success : function(response) {
43 var objects = $.parseJSON(response);
44 addRows(n, objects)
45 },
46 error : function(jqXHR, textStatus, errorThrown ) {alert(textStatus + ":" + errorThrown)},
47 });
48 }
49 },
50 });
51 }
52 function td(data) {
53 if (data == null) {
54 data = '';
55 }
56 return '<td>' + data + '</td>'
57 }
58
59 function formatRow(o) {
60 /* setup tr-wide formatting */
61 var tr = '<tr class="';
62 if (o.link_to != null) {
63 tr += 'muted ';
64 }
65 if (o.isdir && o.childcount) {
66 tr += 'branch" data-tt-branch="true" ';
67 }
68 else {
69 tr += 'leaf" data-tt-branch="false" ';
70 }
71 tr += ' data-tt-id="' + o.fullpath +'" ';
72 if (o.parent != "/") {
73 tr += ' data-tt-parent-id="' + o.parent +'" ';
74 }
75 tr += '>';
76
77 /* setup td specific formatting */
78 var link_to = td(o.link_to);
79 var size = '<td class = "sizecol">' + o.size + '</td>'
80 var permission = td(o.permission);
81 var owner = td(o.owner);
82 var group = td(o.group);
83
84 /* handle the name column */
85 var name = null;;
86 var namespan=1;
87 if (o.isdir) {
88 if (o.link_to == null) {
89 namespan = 2;
90 if (o.package == null) {
91 namespan = 3;
92 }
93 }
94 var colspan = 'colspan="' + namespan + '"';
95 name = '<td class="content-directory"' + colspan + '>';
96 if (o.childcount) {
97 name += '<a href="">';
98 }
99 name += '<i class="icon-folder-close"></i>';
100 name += '&nbsp;' + o.name;
101 if (o.childcount) {
102 name += '</a>';
103 }
104 name += '</td>';
105 }
106 else {
107 name = '<td>';
108 if (o.link_to == null) {
109 name += '<i class="icon-file"></i>';
110 }
111 else {
112 name += '<i class="icon-hand-right"></i>';
113 }
114 name += '&nbsp;' + o.name;
115 name += '</td>';
116 }
117
118 /* handle the package column */
119 var package = null;
120 if (o.package != null) {
121 /* add link to included package page */
122 build_id = {{ build.id }};
123 target_id = {{ target.id }};
124 /* Create a url for a dummy package id of 0 */
125 dummy = "{% url 'package_included_detail' build.id target.id 0 %}"
126 /* fill in the package id */
127 url = dummy.substr(0, dummy.length-1) + o.package_id;
128 package = '<a href=' + url + '>' ;
129 package += o.package;
130 package += '</a>';
131 if (o.installed_package != o.package) {
132 /* make class muted and add hover help */
133 package += '<span class="muted"> as ' + o.installed_package + ' </span>';
134 package += '<i class="icon-question-sign get-help hover-help" ';
135 package += 'title="' + o.package + ' was renamed at packaging time and was installed in your image as ' + o.installed_package + '">';
136 package += '</i>';
137 }
138 }
139 package = td(package);
140
141 var cols1to3;
142 switch (namespan) {
143 case 3:
144 cols1to3 = name;
145 break;
146 case 2:
147 cols1to3 = name + package;
148 break;
149 default:
150 cols1to3 = name + link_to + package;
151 }
152 r = tr + cols1to3 + size + permission + owner + group + "</tr>"
153 return r;
154 }
155
156 function addRows(n, objs) {
157 rows = "";
158 for (i=0; i<objs.length; i++) {
159 rows += formatRow(objs[i]);
160 }
161 $("#dirtable").treetable("loadBranch", n, rows);
162 }
163
164 $.fn.isOffScreen = function(){
165 var win = $(window);
166 viewportBottom = win.scrollTop() + win.height();
167
168 var bounds = this.offset();
169 bounds.bottom = bounds.top + this.outerHeight();
170
171 return (bounds.bottom > viewportBottom);
172 };
173
174 function selectRow(path) {
175 var row = $('tr[data-tt-id="' + path + '"]');
176 row.addClass(" highlight");
177 if (row.isOffScreen()) {
178 $('html, body').animate({ scrollTop: row.offset().top - 150}, 2000);
179 }
180 }
181</script>
182
183<div class="span10">
184
185 <div class="page-header">
186 <h1> {{target.target}} </h1>
187 </div>
188
189 <ul class="nav nav-pills">
190 <li class="">
191 <a href="{% url 'target' build.id target.id %}">
192 <i class="icon-question-sign get-help" title="Of all the packages built, the subset installed in the root file system of this image"></i>
193 Packages included ({{target.package_count}} - {{packages_sum|filtered_filesizeformat}})
194 </a>
195 </li>
196 <li class="active">
197 <a href="{% url 'dirinfo' build.id target.id %}">
198 <i class="icon-question-sign get-help" title="The directories and files in the root file system of this image"></i>
199 Directory structure
200 </a>
201 </li>
202 </ul>
203
204 <div id="directory-structure" class="tab-pane active">
205 <table id="dirtable" class="table table-bordered table-hover treetable">
206 <thead>
207 <tr>
208 <th>Directory / File</th>
209 <th>Symbolic link to</th>
210 <th>Source package</th>
211 <th>Size</th>
212 <th>Permissions</th>
213 <th>Owner</th>
214 <th>Group</th>
215 </tr>
216 </thead>
217 <tbody>
218 <script type='text/javascript'>
219 setupTreetable();
220 addRows(null, {{ objects|safe }} );
221 {% if file_path %}
222 {% comment %}
223 link from package_included_detail specifies file path
224 {% endcomment %}
225 {% for dir_elem in dir_list %}
226 $("#dirtable").treetable("expandNode", "{{dir_elem}}");
227 {% endfor %}
228 selectRow("{{file_path}}");
229 {% endif %}
230 </script>
231 </tbody>
232 </table>
233 </div> <!-- directory-structure -->
234</div> <!-- span10 -->
235
236{% endblock buildinfomain %}
237
diff --git a/bitbake/lib/toaster/toastergui/templates/diskio.html b/bitbake/lib/toaster/toastergui/templates/diskio.html
new file mode 100644
index 0000000000..c5cef6f385
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/diskio.html
@@ -0,0 +1,4 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>Disk I/O</li>
4{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
new file mode 100644
index 0000000000..90ffd3de6c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
@@ -0,0 +1,39 @@
1{% load projecttags %}
2<!-- '{{f.class}}' filter -->
3<form id="filter_{{f.class}}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
4 <input type="hidden" name="search" value="{{request.GET.search}}"/>
5 <div class="modal-header">
6 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
7 {% if search_term %}
8 <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3>
9 {% else %}
10 <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
11 {% endif %}
12 </div>
13 <div class="modal-body">
14 <p>{{f.label}}</p>
15 <label class="radio">
16 <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value=""> All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} ({{total_count}})
17 </label>
18 {% for option in f.options %}
19 {% if option.2 %}
20 <label class="radio">
21 <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}"> {{option.0}} ({{option.2}})
22 {% else %}
23 <label class="radio muted">
24 <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}"> {{option.0}} ({{option.2}})
25 {% endif %}
26 {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %}
27 </label>
28 {% endfor %}
29 </div>
30 <div class="modal-footer">
31 <button type="submit" class="btn btn-primary">Apply</button>
32 {% if request.GET.filter %}
33 {% if request.GET.filter|string_remove_regex:':.*' != f.options.0.1|string_remove_regex:':.*' %}
34 <span class="help-inline pull-left">You can only apply one filter to the table. This filter will override the current filter.</span>
35 {% endif %}
36 {% endif %}
37 </div>
38</form>
39
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
new file mode 100644
index 0000000000..7e48eac66e
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -0,0 +1,68 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Layers</li>
7{% endblock %}
8
9{% block projectinfomain %}
10 <div class="page-header">
11 <h1>Import layer</h1>
12 </div>
13 <form>
14 {% if project %}
15 <span class="help-block" style="padding-left:19px;">The layer you are importing must be compatible with {{project.release.name}} ({{project.release.description}}), which is the release you are using in this project.</span>
16 {% endif %}
17 <fieldset class="air">
18 <legend>Layer repository information</legend>
19 <label>
20 Git repository URL
21 <i class="icon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories."></i>
22 </label>
23 <input id="repo" type="text" class="input-xxlarge" required>
24 <label class="project-form">
25 Repository subdirectory
26 <span class="muted">(optional)</span>
27 <i class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></i>
28 </label>
29 <input type="text" id="subdir">
30 <label class="project-form">Branch, tag or commit</label>
31 <input type="text" class="span4" id="layer-version" required>
32 <label class="project-form">
33 Layer name
34 <i class="icon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes"></i>
35 </label>
36 <input id="layer-name" type="text" required>
37 </fieldset>
38 <fieldset class="air">
39 <legend>
40 Layer dependencies
41 <span class="muted">(optional)</span>
42 <i class="icon-question-sign get-help heading-help" title="Other layers this layer depends upon"></i>
43 </legend>
44 <ul class="unstyled configuration-list">
45 <li>
46 <a href="" class="layer-info" title="OpenEmbedded | daisy">openembedded-core (meta)</a>
47 <i class="icon-trash"></i>
48 </li>
49 </ul>
50 <div class="input-append">
51 <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off"
52 data-provide="typeahead" data-source='
53 []
54 ' placeholder="Type a layer name" id="layer-dependency" class="input-xlarge">
55 <a class="btn" type="button" id="add-layer-dependency" disabled>
56 Add layer
57 </a>
58 </div>
59 <span class="help-inline">You can only add layers Toaster knows about</span>
60 </fieldset>
61 <div class="form-actions">
62 <a href="#dependencies-message" class="btn btn-primary btn-large" data-toggle="modal" data-target="#dependencies-message" disabled>Import and add to project</a>
63 <a href="layer-details-just-imported.html" class="btn btn-large" disabled>Just import for the moment</a>
64 <span class="help-inline" style="vertical-align: middle;">To import a layer, you need to enter a repository URL, a branch, tag or commit and a layer name</span>
65 </div>
66 </form>
67
68{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/layer.html b/bitbake/lib/toaster/toastergui/templates/layer.html
new file mode 100644
index 0000000000..410d766c60
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/layer.html
@@ -0,0 +1,34 @@
1{% extends "basetable.html" %}
2
3{% block pagename %}
4 <h1>Toaster - Layers</h1>
5{% endblock %}
6
7{% block pagetable %}
8 {% load projecttags %}
9
10 <tr>
11 <th>Name</th>
12 <th>Local Path</th>
13 <th>Layer Index URL</th>
14 <th>Known Versions</th>
15 </tr>
16
17 {% for layer in objects %}
18
19 <tr class="data">
20 <td>{{layer.name}}</td>
21 <td>{{layer.local_path}}</td>
22 <td><a href='{{layer.layer_index_url}}'>{{layer.layer_index_url}}</a></td>
23 <td><table>
24 {% for lv in layer.versions %}
25 <tr><td>
26 <a href="{% url "layer_versions_recipes" lv.id %}">({{lv.priority}}){{lv.branch}}:{{lv.commit}} ({{lv.count}} recipes)</a>
27 </td></tr>
28 {% endfor %}
29 </table></td>
30 </tr>
31
32 {% endfor %}
33
34{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
new file mode 100644
index 0000000000..78dc54bfd1
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -0,0 +1,159 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Layer Details</li>
7{% endblock %}
8
9{% block projectinfomain %}
10<div class="page-header">
11 <h1>Layer Details</h1>
12</div>
13
14 <div class="row-fluid span7 tabbable">
15 <ul class="nav nav-pills">
16 <li class="active">
17 <a data-toggle="tab" href="#information">Layer details</a>
18 </li>
19 <li>
20 <a data-toggle="tab" href="#targets">Targets (0)</a>
21 </li>
22 <li>
23 <a data-toggle="tab" href="#machines">Machines (0)</a>
24 </li>
25 <li>
26 <a data-toggle="tab" href="#classes">Classes (0)</a>
27 </li>
28 <li>
29 <a data-toggle="tab" href="#bbappends">bbappends (0)</a>
30 </li>
31 </ul>
32 <div class="tab-content">
33 <div name="information" id="information" class="tab-pane active">
34 <dl class="dl-horizontal">
35 <dt class="">
36 <i class="icon-question-sign get-help" title="Fetch/clone URL of the repository"></i>
37 Repository URL
38 </dt>
39 <dd>
40 <form id="change-repo-form" class="control-group">
41 <div class="input-append">
42 <input type="text" class="input-xlarge" id="type-repo" value="{{layerversion.layer.vcs_url}}">
43 <button id="apply-change-repo" class="btn" type="button">Change</button>
44 <!--a href="#" id="cancel-change-repo" class="btn btn-link">Cancel</a-->
45 </div>
46 <span class="help-block">Cloning this Git repository failed</span>
47 </form>
48 </dd>
49 <dt>
50 <i class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></i>
51 Repository subdirectory
52 </dt>
53 <dd>
54 <span id="subdir">{{layerversion.dirpath}}</span>
55 <i id="change-subdir" class="icon-pencil"></i>
56 <i id="delete-subdir" class="icon-trash"></i>
57 <form id="change-subdir-form" style="display:none;">
58 <div class="input-append">
59 <input type="text" id="type-subdir" value="meta-acer">
60 <button id="apply-change-subdir" class="btn" type="button">Change</button>
61 <a href="#" id="cancel-change-subdir" class="btn btn-link">Cancel</a>
62 </div>
63 </form>
64 </dd>
65 <dt>Brach, tag or commit</dt>
66 <dd>
67 {{layerversion.up_branch.name}}
68 <i class="icon-pencil"></i>
69 </dd>
70 <dt>
71 <i class="icon-question-sign get-help" title="The Yocto Project versions with which this layer is compatible. Currently Toaster supports Yocto Project 1.6 and 1.7"></i>
72 Yocto Project compatibility
73 </dt>
74 <dd>
75 <i class="icon-pencil"></i>
76 </dd>
77 <dt>
78 <i class="icon-question-sign get-help" title="Other layers this layer depends upon"></i>
79 Layer dependencies
80 </dt>
81 <dd>
82 <ul class="unstyled">
83 {% for ld in layer.dependencies.all %}
84 <li>
85 <a href="#">openembedded core (meta)</a>
86 <i class="icon-trash"></i>
87 </li>
88 {% endfor %}
89 </ul>
90 <div class="input-append">
91 <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off"
92 data-provide="typeahead" data-source='
93 '
94 placeholder="Type a layer name" id="layer-dependency">
95 <a class="btn" type="button" id="add-layer-dependency" disabled>
96 Add layer
97 </a>
98 </div>
99 <span class="help-block">You can only add layers Toaster knows about</span>
100 </dd>
101 </dl>
102 </div>
103 <div name="targets" id="targets" class="tab-pane">
104 <div class="alert alert-info">
105 <strong>There is no target data for {{layerversion.layer.name}} ... yet</strong> <br />
106 Toaster learns about layers as they are built. Once you have used {{layerversion.layer.name}} in a build, Toaster will show you
107 here the targets it provides.
108 </div>
109 </div>
110 <div name="machines" id="machines" class="tab-pane">
111 <div class="alert alert-info">
112 <strong>There is no machine data for {{layerversion.layer.name}} ... yet</strong> <br />
113 Toaster learns about layers as they are built. Once you have used {{layerversion.layer.name}} in a build, Toaster will show you
114 here the machines it provides.
115 </div>
116 </div>
117 </div>
118</div>
119<div class="row span4 well">
120<h2>About {{layerversion.layer.name}}</h2>
121<dl>
122
123 <dt>
124 Summary
125 <i class="icon-question-sign get-help" title="One-line description of the layer"></i>
126 </dt>
127 <dd>
128 <span >{{layerversion.layer.summary}}</span>
129 <i class="icon-pencil"></i>
130 </dd>
131 <!--form>
132 <textarea class="span12" rows="2"></textarea>
133 <button class="btn" type="button">Change</button>
134 <a href="#" class="btn btn-link">Cancel</a>
135 </form-->
136 <dt>
137 Description
138 </dt>
139 <dd>
140 <span >{{layerversion.layer.description}}</span>
141 <i class="icon-pencil"></i>
142 </dd>
143 <!--form>
144 <textarea class="span12" rows="6"></textarea>
145 <button class="btn" type="button">Change</button>
146 <a href="#" class="btn btn-link">Cancel</a>
147 </form-->
148 <dt>
149 Maintainer(s)
150 </dt>
151 <dd>
152 <span class="muted">Not set</span>
153 <i class="icon-pencil"></i>
154 </dd>
155</dl>
156</div>
157
158
159{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/layers.html b/bitbake/lib/toaster/toastergui/templates/layers.html
new file mode 100644
index 0000000000..281b72aec5
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/layers.html
@@ -0,0 +1,178 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Layers</li>
7{% endblock %}
8
9{% block projectinfomain %}
10 <div class="page-header">
11 <h1>
12 All layers
13 <i class="icon-question-sign get-help heading-help" title="This page lists all the layers compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created layers suitable for use on top of OpenEmbedded Core and any layers you have imported"></i>
14 </h1>
15 </div>
16 <!--div class="alert">
17 <div class="input-append" style="margin-bottom:0px;">
18 <input class="input-xxlarge" type="text" placeholder="Search layers" value="browser" />
19 <a class="add-on btn">
20 <i class="icon-remove"></i>
21 </a>
22 <button class="btn" type="button">Search</button>
23 <a class="btn btn-link" href="#">Show all layers</a>
24 </div>
25 </div-->
26 <div id="layer-added" class="alert alert-info lead" style="display:none;"></div>
27 <div id="layer-removed" class="alert alert-info lead" style="display:none;">
28 <button type="button" class="close" data-dismiss="alert">&times;</button>
29 <strong>1</strong> layer deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>
30 </div>
31
32
33{% include "basetable_top.html" %}
34 {% for lv in objects %}
35 <tr class="data">
36 <td class="layer"><a href="{% url 'layerdetails' lv.id %}">{{lv.layer.name}}</a></td>
37 <td class="description">{{lv.layer.summary}}</td>
38 <td class="source"><a href="{% url 'layerdetails' lv.pk %}">{{lv.layer_source.name}}</a></td>
39 <td class="git-repo"><a href="{% url 'layerdetails' lv.pk %}"><code>{{lv.layer.layer_index_url}}</code></a></td>
40 <td class="git-subdir" style="display: table-cell;"><a href="{% url 'layerdetails' lv.pk %}"><code>{{lv.dirpath}}</code></a></td>
41 <td class="branch">{% if lv.branch %}{{lv.branch}}{% else %}{{lv.up_branch.name}}{% endif %}</td>
42 <td class="dependencies">{% for lvs in lv.dependencies.all %}{{lvs.layer.name}}<br/>{%endfor%}</td>
43 <td class="add-layers">
44 <button id="remove-layer-{{lv.pk}}" class="btn btn-danger btn-block remove-layer" title="1 layer deleted" style="display:none;">
45 <i class="icon-trash"></i>
46 Delete layer
47 </button>
48 <button id="add-layer-{{lv.pk}}" class="btn btn-block add-layer" title="1 layer added">
49 <i class="icon-plus"></i>
50 Add layer
51 </button>
52 </td>
53 </tr>
54 {% endfor %}
55{% include "basetable_bottom.html" %}
56
57 <!-- Modals -->
58
59 <!-- 'Layer dependencies modal' -->
60 <div id="dependencies-message" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
61 <div class="modal-header">
62 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
63 <h3>meta-acer dependencies</h3>
64 </div>
65 <div class="modal-body">
66 <p><strong>meta-acer</strong> depends on some layers that are not added to your project. Select the ones you want to add:</p>
67 <ul class="unstyled">
68 <li>
69 <label class="checkbox">
70 <input type="checkbox" checked="checked">
71 meta-android
72 </label>
73 </li>
74 <li>
75 <label class="checkbox">
76 <input type="checkbox" checked="checked">
77 meta-oe
78 </label>
79 </li>
80 </ul>
81 </div>
82 <div class="modal-footer">
83 <button id="add-layer-dependencies" type="submit" class="btn btn-primary" data-dismiss="modal" >Add layers</button>
84 <button class="btn" data-dismiss="modal">Cancel</button>
85 </div>
86 </div>
87
88 <script src="assets/js/jquery-1.9.1.min.js" type='text/javascript'></script>
89 <script src="assets/js/jquery.tablesorter.min.js" type='text/javascript'></script>
90 <script src="assets/js/jquery-ui-1.10.3.custom.min.js"></script>
91 <script src="assets/js/bootstrap.min.js" type='text/javascript'></script>
92 <script src="assets/js/prettify.js" type='text/javascript'></script>
93 <script src="assets/js/jit.js" type='text/javascript'></script>
94 <script src="assets/js/main.js" type='text/javascript'></script>
95
96 <script>
97 $(document).ready(function() {
98
99 //show or hide selected columns on load
100 $("input:checkbox").each(function(){
101 var selectedType = $(this).val();
102 if($(this).is(":checked")){
103 $("."+selectedType).show();
104 }
105 else{
106 $("."+selectedType).hide();
107 }
108 });
109
110 // enable add layer button
111 $('#add-layer-with-deps').removeAttr('disabled');
112
113 //edit columns functionality (show / hide table columns)
114 $("input:checkbox").change();
115 $("input:checkbox").change(function(){
116 var selectedType = $(this).val();
117 if($(this).is(":checked")){
118 $("."+selectedType).show();
119 }
120 else{
121 $("."+selectedType).hide();
122 }
123 });
124
125 //turn edit columns dropdown into a multi-select menu
126 $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
127 e.stopPropagation();
128 });
129
130 //show tooltip with applied filter
131 $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true});
132
133 $('#filtered').click(function() {
134 $(this).tooltip('hide');
135 });
136
137 //show layer added tooltip
138 $("#remove-layer, #add-layer, #add-layer-with-deps2").tooltip({ trigger: 'manual' });
139
140 // add layer without dependencies
141 $("#add-layer").click(function(){
142 $('#layer-removed').hide();
143 $('#layer-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>1</strong> layer added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>').fadeIn();
144 $('#add-layer').tooltip('show');
145 $("#add-layer").hide();
146 $(".add-layers .tooltip").delay(2000).fadeOut(function(){
147 $("#remove-layer").delay(300).fadeIn();
148 });
149 });
150
151 // add layer with dependencies
152 $(document).on("click", "#add-layer-dependencies", function() {
153 $('#layer-removed').hide();
154 $('#layer-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>3</strong> layers added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-acer</a> and its dependencies <a href="#">meta-android</a> and <a href="#">meta-oe</a>').delay(400).fadeIn(function(){
155 $('#add-layer-with-deps').tooltip('show');
156 $("#add-layer-with-deps, #add-layer-with-deps").hide();
157 $(".add-layers .tooltip").delay(2000).fadeOut(function(){
158 $("#remove-layer-with-deps").delay(300).fadeIn();
159 });
160 });
161 });
162
163 // delete layer
164 $("#remove-layer").click(function(){
165 $('#layer-added').hide();
166 $('#layer-removed').show();
167 $('#remove-layer').tooltip('show');
168 $("#remove-layer").hide();
169 $(".add-layers .tooltip").delay(2000).fadeOut(function(){
170 $("#add-layer").delay(300).fadeIn();
171 });
172 });
173
174 });
175
176</script>
177
178{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/machines.html b/bitbake/lib/toaster/toastergui/templates/machines.html
new file mode 100644
index 0000000000..18e7485d50
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/machines.html
@@ -0,0 +1,63 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Machines</li>
7{% endblock %}
8
9{% block projectinfomain %}
10 <div class="page-header">
11 <h1>
12 All machines
13 <i class="icon-question-sign get-help heading-help" title="This page lists all the machines compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created targets suitable for use on top of OpenEmbedded Core and any targets you have imported"></i>
14 </h1>
15 </div>
16 <!--div class="alert">
17 <div class="input-append" style="margin-bottom:0px;">
18 <input class="input-xxlarge" type="text" placeholder="Search targets" value="browser" />
19 <a class="add-on btn">
20 <i class="icon-remove"></i>
21 </a>
22 <button class="btn" type="button">Search</button>
23 <a class="btn btn-link" href="#">Show all targets</a>
24 </div>
25 </div-->
26 <div id="target-added" class="alert alert-info lead" style="display:none;"></div>
27 <div id="target-removed" class="alert alert-info lead" style="display:none;">
28 <button type="button" class="close" data-dismiss="alert">&times;</button>
29 <strong>1</strong> target deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>
30 </div>
31
32
33{% include "basetable_top.html" %}
34 {% for o in objects %}
35 <tr class="data">
36 <td class="machine">
37 {{o.name}}
38 <a machine="_blank" href="http://layers.openembedded.org/layerindex/branch/master/machines/?q=3g-router-image"><i class="icon-share get-info"></i></a>
39 </td>
40 <td class="description">{{o.description}}</td>
41 <td class="machine-file">
42 <code>{{o.file_path}}</code>
43 <a href="http://github.com/embeddedgeeks/meta-embeddedgeeks/blob/master/machines-core/images/3g-router-image.bb" machine="_blank"><i class="icon-share get-info"></i></a>
44 </td>
45 <td class="layer"><a href="#">{{o.layer_version.layer.name}}</a></td>
46 <td class="source">{{o.layer_source.name}}</td>
47 <td class="branch">{{o.layer_version.commit}}</td>
48 <td class="build">
49 <a id="build-machine" href="project-with-machines.html?machine=3g-router-image" class="btn btn-block" style="display:none;">
50 Build machine
51 </a>
52 <a id="add-layer" href="#" class="btn btn-block nopop" title="1 layer added">
53 <i class="icon-plus"></i>
54 Add layer
55 <i class="icon-question-sign get-help" title="To build this machine, you must first add the meta-embeddedgeeks layer to your project"></i>
56 </a>
57 </td>
58 </tr>
59 {% endfor %}
60
61{% include "basetable_bottom.html" %}
62
63{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/newproject.html b/bitbake/lib/toaster/toastergui/templates/newproject.html
new file mode 100644
index 0000000000..12c4e9f07f
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/newproject.html
@@ -0,0 +1,44 @@
1{% extends "base.html" %}
2{% load projecttags %}
3{% load humanize %}
4{% block pagecontent %}
5<div class="row-fluid">
6 <div class="span6">
7 <div class="page-header">
8 <h1>Create a new project</h1>
9 </div>
10 <div class="container-fluid">
11 {% if alert %}
12 <div class="alert alert-error row-fluid" role="alert">{{alert}}</div>
13 {% endif %}
14 </div>
15 <form method="POST">{% csrf_token %}
16 <fieldset>
17 <label>Project name <span class="muted">(required)</span></label>
18 <input type="text" class="input-xlarge" required name="projectname" value="{{projectname}}">
19 <label class="project-form">
20 Project owner
21 <i class="icon-question-sign get-help" title="The go-to person for this project"></i>
22 </label>
23 <input type="text" name="username" value="{{username}}">
24 <label class="project-form">Owner's email</label>
25 <input type="email" class="input-large" name="email" value="{{email}}">
26 <label class="project-form">
27 Yocto Project version
28 <i class="icon-question-sign get-help" title="This sets the branch for the Yocto Project core layers (meta, meta-yocto and meta-yocto-bsp), and for the layers you use from the OpenEmbedded Metadata Index"></i>
29 </label>
30 <select name="projectversion" id="projectversion">
31 {% for release in releases %}
32 <option value="{{release.id}}"{%if projectversion == release.id %} selected{%endif%}>{{release.name}} ({{release.description}})</option>
33 {% endfor %}
34 </select>
35 </fieldset>
36
37 <div class="form-actions">
38 <input type="submit" class="btn btn-primary btn-large" value="Create project"/>
39 </div>
40 </form>
41 </div>
42 </div>
43 </div>
44{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package.html b/bitbake/lib/toaster/toastergui/templates/package.html
new file mode 100644
index 0000000000..1ba372608d
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package.html
@@ -0,0 +1,36 @@
1{% extends "basebuildpage.html" %}
2
3{% block pagetable %}
4 {% if not objects %}
5 <p>No packages were recorded for this target!</p>
6 {% else %}
7
8 <tr>
9 <th>Name</th>
10 <th>Version</th>
11 <th>Size (Bytes)</th>
12 <th>Recipe</th>
13 <th>Depends on</th>
14 </tr>
15
16 {% for package in objects %}
17
18 <tr class="data">
19 <td><a name="#{{package.name}}">{{package.name}}</a></td>
20 <td>{{package.version}}</td>
21 <td>{{package.size}}</td>
22 <td>{%if package.recipe %}<a name="{{package.recipe.name}}.{{package.package_name}}">
23 <a href="{% url "layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
24 <td>
25 <div style="height: 4em; overflow:auto">
26 {% for d in package.package_dependencies_source.all %}
27 <a href="#{{d.name}}">{{d.depends_on.name}}</a><br/>
28 {% endfor %}
29 </div>
30 </td>
31
32 {% endfor %}
33
34 {% endif %}
35
36{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
new file mode 100644
index 0000000000..e6f20c3300
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
@@ -0,0 +1,99 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block tabcontent %}
5 <ul class="nav nav-pills">
6 <li class="">
7 <a href="{% url 'package_built_detail' build.id package.id %}">
8 <i class="icon-question-sign get-help" title="Shows the files produced by this package."></i>
9 Generated files ({{package.buildfilelist_package.count}})
10 </a>
11 </li>
12 <li class="active">
13 <a href="{% url 'package_built_dependencies' build.id package.id %}">
14 <i class="icon-question-sign get-help" title="Shows the runtime packages required by this package."></i>
15 Runtime dependencies ({{dependency_count}})
16 </a>
17 </li>
18 </ul>
19 <div class="tab-content">
20 <div class="tab-pane active" id="dependencies">
21 {% ifequal runtime_deps|length 0 %}
22 <div class="alert alert-info">
23 <strong>{{package.fullpackagespec}}</strong> has no runtime dependencies.
24 </div>
25 {% else %}
26 <div class="alert alert-info">
27 <strong>{{package.fullpackagespec}}</strong> is <strong>not included</strong> in any image. This page shows you the projected runtime dependencies if you include <strong>{{package.fullpackagespec}}</strong> in future builds.
28 </div>
29 <table class="table table-bordered table-hover">
30 <thead>
31 <tr>
32 <th>Package</th>
33 <th>Version</th>
34 <th class="sizecol span2">Size</th>
35 </tr>
36 </thead>
37 <tbody>
38 {% for runtime_dep in runtime_deps %}
39 <tr {{runtime_dep.size|format_vpackage_rowclass}} >
40 {% if runtime_dep.size != -1 %}
41 <td>
42 <a href="{% url 'package_built_detail' build.id runtime_dep.depends_on_id %}">
43 {{runtime_dep.name}}
44 </a>
45 </td>
46 {% else %}
47 <td>
48 {{runtime_dep.name|format_vpackage_namehelp}}
49 </td>
50 {% endif %}
51 <td>{{runtime_dep.version}}</td>
52 <td class="sizecol">{{runtime_dep.size|filtered_filesizeformat}}</td>
53 </tr>
54 {% endfor %}
55 </tbody>
56 </table>
57 {% endifequal %}
58 {% ifnotequal other_deps|length 0 %}
59 <h3>Other runtime relationships</h3>
60 <table class="table table-bordered table-hover">
61 <thead>
62 <tr>
63 <th>Package</th>
64 <th>Version</th>
65 <th class="sizecol span2">Size</th>
66 <th>
67 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
68 Relationship type
69 </th>
70 </tr>
71 </thead>
72 <tbody>
73 {% for other_dep in other_deps %}
74 <tr {{other_dep.size|format_vpackage_rowclass}} >
75 {% if other_dep.size != -1 %}
76 <td>
77 <a href="{% url 'package_built_detail' build.id other_dep.depends_on_id %}">
78 {{other_dep.name}}
79 </a>
80 </td>
81 {% else %}
82 <td>
83 {{other_dep.name|format_vpackage_namehelp}}
84 </td>
85 {% endif %}
86 <td>{{other_dep.version}}</td>
87 <td class="sizecol">{{other_dep.size|filtered_filesizeformat}}</td>
88 <td>
89 {{other_dep.dep_type_display}}
90 <i class="icon-question-sign get-help hover-help" title="{{other_dep.dep_type_help}}" ></i>
91 </td>
92 </tr>
93 {% endfor %}
94 </tbody>
95 </table>
96 {% endifnotequal %}
97 </div> <!-- tab-pane -->
98 </div> <!-- tab-content -->
99{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_built_detail.html b/bitbake/lib/toaster/toastergui/templates/package_built_detail.html
new file mode 100644
index 0000000000..9be8ccb85c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_built_detail.html
@@ -0,0 +1,65 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block tabcontent %}
5 {% with packageFileCount=package.buildfilelist_package.count %}
6 <!-- Generated Files -->
7 {% if package.buildtargetlist_package.count == 0 %}
8 {# Not included case #}
9 <ul class="nav nav-pills">
10 <li class="active"> <a href="#">
11 <i class="icon-question-sign get-help" title="Files added to a root file system when you include {{package.name}} in an image"></i>
12 Generated files ({{packageFileCount}})
13 </a></li>
14 <li class=""><a href="{% url 'package_built_dependencies' build.id package.id %}">
15 <i class="icon-question-sign get-help" title="Projected runtime dependencies when you include {{package.name}} in an image"></i>
16 Runtime dependencies ({{dependency_count}})
17 </a></li>
18 </ul>
19 <div class="tab-content">
20 <div class="tab-pane active" id="files">
21 <!-- Package file list or if empty, alert pane -->
22 {% if packageFileCount > 0 %}
23 <div class="alert alert-info">
24 <strong>{{package.fullpackagespec}}</strong> is <strong>not included</strong> in any image. This page shows you the files added to an image root file system if you include <strong>{{package.fullpackagespec}}</strong> in future builds.
25 </div>
26 {% include "tablesort.html" %}
27 <tbody>
28 {% for file in objects %}
29 <tr>
30 <td class="path">{{file.path}}</td>
31 <td class="filesize sizecol">{{file.size|filtered_filesizeformat}}</td>
32 </tr>
33 {% endfor %}
34 </tbody>
35 </table>
36
37 {% else %}
38 <div class="alert alert-info">
39 <strong>{{package.fullpackagespec}}</strong> does not generate any files.
40 </div>
41 {% endif %}
42
43 </div> <!-- tab-pane active -->
44 </div> <!-- tab-content -->
45 {% else %}
46 {# Included case #}
47 <div class="tab-content">
48 <div class="tab-pane active">
49 <div class="lead well">
50 Package included in:
51 {% for itarget in package.buildtargetlist_package.all|dictsort:"target.target" %}
52 <a href="{% url 'package_included_detail' build.id itarget.target.id package.id %}">
53 {% if forloop.counter0 > 0 %}
54 ,&nbsp;
55 {% endif %}
56 {{itarget.target.target}}
57 </a>
58 {% endfor %}
59 </div>
60 </div> <!-- tab-pane active -->
61 </div> <!-- tab-content -->
62 {% endif %}
63
64 {% endwith %}
65{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
new file mode 100644
index 0000000000..cd015d3555
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
@@ -0,0 +1,146 @@
1{% extends "basebuilddetailpage.html" %}
2{% load projecttags %}
3
4{% block extraheadcontent %}
5 <!-- functions to format package 'installed_package' alias -->
6 <script>
7 function fmtAliasHelp(package_name, alias, hover) {
8 var r = null;
9 if (alias != null && alias != '') {
10 r = '<span class="muted"> as ' + alias + '&nbsp';
11 r += '<i class="icon-question-sign get-help';
12 if (hover) {
13 r+= ' hover-help';
14 }
15 else {
16 r+= ' heading-help';
17 }
18 r += '"';
19 title = package_name + ' was renamed at packaging time and was installed on your system as ' + alias;
20 r += ' title="' + title + '">';
21 r += '</i>';
22 r += '</span>';
23 document.write(r);
24 }
25 }
26 </script>
27{% endblock extraheadcontent %}
28{% block localbreadcrumb %}
29 {% if target %}
30 <li><a href="{% url "target" build.id target.id %}">{{target.target}}</a></li>
31 <li>{{package.fullpackagespec}} {% if package.alias %} as {{package.alias}}{% endif %}</li>
32 {% else %}
33 <li><a href="{% url "packages" build.id %}"> Packages </a></li>
34 <li>{{package.fullpackagespec}}</li>
35 {% endif %}
36{% endblock localbreadcrumb %}
37
38{% block pagedetailinfomain %}
39 <div class="row span11">
40 <div class="page-header">
41 {% block title %}
42 <h1>{{package.fullpackagespec}}</h1>
43 {% endblock title %}
44 </div> <!-- page-header -->
45 </div> <!-- row span11 page-header -->
46
47 {% block twocolumns %}
48 <div class="row span7 tabbable">
49 {% block tabcontent %}
50 {% endblock tabcontent %}
51 </div> <!-- row span7 -->
52
53 <div class="row span4 well">
54 <h2>Package information</h2>
55
56 <!-- info presented as definition list -->
57 <dl>
58 <dt>
59 Size
60 <i class="icon-question-sign get-help" title="The size of the package"></i>
61 </dt>
62 <dd>
63 {% comment %}
64 if recipe is absent, filesize is not 0
65 {% endcomment %}
66 {% if package.recipe_id > 0 %}
67 {{package.size|filtered_filesizeformat}}
68 {% if target.file_size %}
69 ({{package.size|multiply:100|divide:target.file_size}}% of included package size)
70 {% endif %}
71
72 {% endif %}
73 </dd>
74
75 <dt>
76 License
77 <i class="icon-question-sign get-help" title="The license under which this package is distributed"></i>
78 </dt>
79 <dd>{{package.license}}</dd>
80
81 {% comment %}
82 # Removed per review on 1/18/2014 until license data population
83 # problemse are resolved.
84 <dt>
85 License files
86 <i class="icon-question-sign get-help" title="Path to the license files that apply to the package"></i>
87 </dt>
88 <dd></dd>
89 {% endcomment %}
90
91 <dt>
92 Recipe
93 <i class="icon-question-sign get-help" title="The name of the recipe building this package"></i>
94 </dt>
95 <dd>
96 {% if package.recipe_id > 0 %}
97 <a href="{% url "recipe" build.id package.recipe_id %}"> {{package.recipe.name}} </a>
98 {% else %}
99 {{package.recipe.name}}
100 {% endif %}
101 </dd>
102
103 <dt>
104 Recipe version
105 <i class="icon-question-sign get-help" title="The version of the recipe building this package"></i>
106 </dt>
107 <dd>{{package.recipe.version}}</dd>
108
109 <dt>
110 Layer
111 <i class="icon-question-sign get-help" title="The name of the layer providing the recipe that builds this package"></i>
112 </dt>
113 <dd>
114 {{package.recipe.layer_version.layer.name}}
115 {% if package.recipe.layer_version.layer.name|format_none_and_zero != "" %}
116 {% comment %}
117 # Removed per team meeting of 1/29/2014 until
118 # decision on index search algorithm
119 <a href="http://layers.openembedded.org" target="_blank">
120 <i class="icon-share get-info"></i>
121 </a>
122 {% endcomment %}
123 {% endif %}
124 </dd>
125 {% if package.recipe.layer_version.branch %}
126 <dt>
127 Layer branch
128 <i class="icon-question-sign get-help" title="The Git branch of the layer providing the recipe that builds this package"></i>
129 </dt>
130 <dd>{{package.recipe.layer_version.branch}}</dd>
131 {% endif %}
132 <dt>
133 Layer commit
134 <i class="icon-question-sign get-help" title="The Git commit of the layer providing the recipe that builds this package"></i>
135 </dt>
136
137 <dd class="iscommit">{{package.recipe.layer_version.commit}}</dd>
138 <dt>
139 Layer directory
140 <i class="icon-question-sign get-help" title="Path to the layer providing the recipe that builds this package"></i>
141 </dt>
142 <dd><code>{{package.recipe.layer_version.layer.local_path}}</code></dd>
143 </dl>
144 </div> <!-- row4 well -->
145 {% endblock twocolumns %}
146{% endblock pagedetailinfomain %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
new file mode 100644
index 0000000000..642ca69568
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
@@ -0,0 +1,110 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block title %}
5 <h1>
6 {{package.fullpackagespec}}
7 <script> fmtAliasHelp("{{package.name}}", "{{package.alias}}", false) </script>
8 <small>({{target.target}})</small>
9 </h1>
10{% endblock title %}
11
12{% block tabcontent %}
13 {% with packageFileCount=package.buildfilelist_package.count %}
14 {% include "package_included_tabs.html" with active_tab="dependencies" %}
15 <div class="tab-content">
16 <div class="tab-pane active" id="dependencies">
17 {% ifnotequal runtime_deps|length 0 %}
18 <table class="table table-bordered table-hover">
19 <thead>
20 <tr>
21 <th>Package</th>
22 <th>Version</th>
23 <th class='sizecol span2'>Size</th>
24 </tr>
25 </thead>
26 <tbody>
27 {% for runtime_dep in runtime_deps %}
28 <tr {{runtime_dep.size|format_vpackage_rowclass}} >
29 {% if runtime_dep.size != -1 %}
30 <td>
31 <a href="{% url 'package_included_detail' build.id target.id runtime_dep.depends_on_id %}">
32 {{runtime_dep.name}}
33 </a>
34 <script>fmtAliasHelp("{{runtime_dep.name}}", "{{runtime_dep.alias}}", true)</script>
35 </td>
36 {% else %}
37 <td>
38 {{runtime_dep.name|format_vpackage_namehelp}}
39 </td>
40 {% endif %}
41 <td>{{runtime_dep.version}}&nbsp;</td>
42 <td class='sizecol'>{{runtime_dep.size|filtered_filesizeformat}}&nbsp;</td>
43 </tr>
44 {% endfor %}
45 </tbody>
46 </table>
47 {% else %}
48 <div class="alert alert-info">
49 <strong>{{package.fullpackagespec}}</strong> has no runtime dependencies.
50 </div>
51 {% endifnotequal %}
52
53 {% ifnotequal other_deps|length 0 %}
54 <h3>Other runtime relationships</h3>
55 <table class="table table-bordered table-hover">
56 <thead>
57 <tr>
58 <th>Package</th>
59 <th>Version</th>
60 <th class='sizecol span2'>Size</th>
61 <th>
62 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
63 Relationship type
64 </th>
65 </tr>
66 </thead>
67 <tbody>
68 {% for other_dep in other_deps %}
69 {% if other_dep.installed %}
70 <tr {{other_dep.size|format_vpackage_rowclass}}>
71 {% if other_dep.size != -1 %}
72 <td>
73 <a href="{% url 'package_included_detail' build.id target.id other_dep.depends_on_id %}">
74 {{other_dep.name}}
75 <script>
76 fmtAliasHelp("{{other_dep.name}}","{{other_dep.alias}}", true)
77 </script>
78 </a>
79 </td>
80 {% else %}
81 <td>
82 {{other_dep.name|format_vpackage_namehelp}}
83 </td>
84 {% endif %}
85 <td>{{other_dep.version}}&nbsp;</td>
86 <td class='sizecol'>{{other_dep.size|filtered_filesizeformat}}&nbsp;</td>
87 <td>
88 {{other_dep.dep_type_display}}
89 <i class="icon-question-sign get-help hover-help" title="{{other_dep.dep_type_help}}" ></i>
90 </td>
91 </tr>
92 {% else %}
93 <tr class="muted">
94 <td>{{other_dep.name}}</td>
95 <td>{{other_dep.version}}</td>
96 <td></td>
97 <td>
98 {{other_dep.dep_type_display}}
99 <i class="icon-question-sign get-help hover-help" title="{{other_dep.dep_type_help}}" ></i>
100 </td>
101 </tr>
102 {% endif %}
103 {% endfor %}
104 </tbody>
105 </table>
106 {% endifnotequal %}
107 </div> <!-- end tab-pane -->
108 </div> <!-- end tab content -->
109 {% endwith %}
110{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_detail.html b/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
new file mode 100644
index 0000000000..d2aa26eefa
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
@@ -0,0 +1,44 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block title %}
5 <h1>
6 {{package.fullpackagespec}}
7 <script>
8 fmtAliasHelp("{{package.name}}", "{{package.alias}}", false)
9 </script>
10 <small>({{target.target}})</small>
11 </h1>
12{% endblock title %}
13
14{% block tabcontent %}
15{% with packageFileCount=package.buildfilelist_package.count %}
16 {% include "package_included_tabs.html" with active_tab="detail" %}
17 <div class="tab-content">
18 <div class="tab-pane active" id="files">
19 {% if packageFileCount > 0 %}
20 {% include "tablesort.html" %}
21 <tbody>
22 {% for file in objects %}
23 <tr>
24 <td class="path">
25 <a href="{% url 'dirinfo_filepath' build.id target.id file.path %}">
26 {{file.path}}
27 </a>
28 </td>
29 <td class="filesize sizecol" >{{file.size|filtered_filesizeformat}}</td>
30 </tr>
31 {% endfor %}
32 </tbody>
33 </table>
34
35 {% else %}
36 <div class="alert alert-info">
37 <strong>{{package.fullpackagespec}}</strong> does not generate any files.
38 </div>
39 {% endif %}
40 </div> <!-- end tab-pane -->
41 </div> <!-- end tab content -->
42
43{% endwith %}
44{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
new file mode 100644
index 0000000000..a36464cad5
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
@@ -0,0 +1,50 @@
1{% extends "package_detail_base.html" %}
2{% load projecttags %}
3
4{% block title %}
5 <h1>
6 {{package.fullpackagespec}}
7 <script> fmtAliasHelp("{{package.name}}", "{{package.alias}}", false) </script>
8 <small>({{target.target}})</small>
9 </h1>
10{% endblock title %}
11
12{% block tabcontent %}
13 {% with packageFileCount=package.buildfilelist_package.count %}
14 {% include "package_included_tabs.html" with active_tab="reverse" %}
15 <div class="tab-content">
16 <div class="tab-pane active" id="brought-in-by">
17
18 {% ifequal reverse_deps|length 0 %}
19 <div class="alert alert-info">
20 <strong>{{package.fullpackagespec}}</strong> has no reverse runtime dependencies.
21 </div>
22 {% else %}
23 {% include "tablesort.html" %}
24 <tbody>
25 {% for reverse_dep in objects %}
26 <tr {{reverse_dep.size|format_vpackage_rowclass}} >
27 {% if reverse_dep.size != -1 %}
28 <td>
29 <a href="{% url 'package_included_detail' build.id target.id reverse_dep.package_id %}">
30 {{reverse_dep.package.name}}
31 </a>
32 <script>fmtAliasHelp("{{reverse_dep.name}}", "{{reverse_dep.alias}}", true)</script>
33 </td>
34 {% else %}
35 <td>
36 {{reverse_dep.name|format_vpackage_namehelp}}
37 </td>
38 {% endif %}
39
40 <td>{{reverse_dep.package.version}}&nbsp;</td>
41 <td class='sizecol'>{{reverse_dep.package.size|filtered_filesizeformat}}&nbsp;</td>
42 </tr>
43 {% endfor %}
44 </tbody>
45 </table>
46 {% endifequal %}
47 </div> <!-- end tab-pane -->
48 </div> <!-- end tab content -->
49 {% endwith %}
50{% endblock tabcontent %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_tabs.html b/bitbake/lib/toaster/toastergui/templates/package_included_tabs.html
new file mode 100644
index 0000000000..958aa8827b
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_tabs.html
@@ -0,0 +1,33 @@
1
2 <ul class="nav nav-pills">
3 {% if active_tab == "detail" %}
4 <li class="active">
5 {% else %}
6 <li class="">
7 {% endif %}
8 <a href="{% url 'package_included_detail' build.id target.id package.id %}">
9 <i class="icon-question-sign get-help" title="The files this package adds to the image root file system"></i>
10 Files in root file system ({{packageFileCount}})
11 </a>
12 </li>
13 {% if active_tab == "dependencies" %}
14 <li class="active">
15 {% else %}
16 <li class="">
17 {% endif %}
18 <a href="{% url 'package_included_dependencies' build.id target.id package.id %}">
19 <i class="icon-question-sign get-help" title="Package runtime dependencies"></i>
20 Runtime dependencies ({{dependency_count}})
21 </a>
22 </li>
23 {% if active_tab == "reverse" %}
24 <li class="active">
25 {% else %}
26 <li class="">
27 {% endif %}
28 <a href="{% url 'package_included_reverse_dependencies' build.id target.id package.id %}">
29 <i class="icon-question-sign get-help" title="The package runtime reverse dependencies (i.e. the packages in this image that depend on this package). Reverse dependencies reflect only the 'depends' dependency type"></i>
30 Reverse runtime dependencies ({{reverse_count}})
31 </a>
32 </li>
33 </ul>
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
new file mode 100644
index 0000000000..c3a470c54a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -0,0 +1,366 @@
1{% extends "base.html" %}
2{% load projecttags %}
3{% load humanize %}
4{% block pagecontent %}
5
6<script>
7
8var buildrequests = [];
9
10function targetInPage(targetname) {
11 return targetname in $("ul#target-list > li > a").map(function (i, x) {return x.text});
12}
13
14function setEventHandlers() {
15 $("i#del-target-icon").unbind().click(function (evt) {
16 console.log("del target", evt.target.attributes["x-data"].value);
17 postEditAjaxRequest({"targetDel": evt.target.attributes["x-data"].value});
18 });
19 $("button#add-target-button").unbind().click( function (evt) {
20 if ( $("input#target")[0].value.length == 0) {
21 alert("cannot add empty target");
22 return;
23 }
24 postEditAjaxRequest({"targetAdd" : $("input#target")[0].value});
25 });
26}
27
28function onEditPageUpdate(data) {
29 // update targets
30 var i; var orightml = "";
31
32 $("span#target-count").html(data.targets.length);
33 for (i = 0; i < data.targets.length; i++) {
34 if (! targetInPage(data.targets[i].target)) {
35 orightml += '<li><a href="#">'+data.targets[i].target;
36 if (data.targets[i].task != "" && data.targets[i].task !== null) {
37 orightml += " ("+data.targets[i].task+")";
38 }
39 orightml += '</a><i title="" data-original-title="" class="icon-trash" id="del-target-icon" x-data="'+data.targets[i].pk+'"></i></li>';
40 }
41 }
42
43 $("ul#target-list").html(orightml);
44
45 // update recent builds
46
47 setEventHandlers();
48}
49
50function onEditAjaxSuccess(data, textstatus) {
51 console.log("XHR returned:", data, "(" + textstatus + ")");
52 if (data.error != "ok") {
53 alert("error on request:\n" + data.error);
54 return;
55 }
56 onEditPageUpdate(data);
57}
58
59function onEditAjaxError(jqXHR, textstatus, error) {
60 alert("XHR errored:\n" + error + "\n(" + textstatus + ")");
61}
62
63function postEditAjaxRequest(reqdata) {
64 var ajax = $.ajax({
65 type:"POST",
66 data: $.param(reqdata),
67 url:"{% url 'xhr_projectedit' project.id%}",
68 headers: { 'X-CSRFToken': $.cookie("csrftoken")},
69 success: onEditAjaxSuccess,
70 error: onEditAjaxError,
71 })
72}
73
74
75
76
77$(document).ready(function () {
78 setEventHandlers();
79
80 /* Provide XHR calls for the "build" buttons.*/
81 $("button#build-all-button").click( function (evt) {
82 var ajax = $.ajax({
83 type:"POST",
84 url:"{% url 'xhr_projectbuild' project.id %}",
85 headers: { 'X-CSRFToken': $.cookie("csrftoken")},
86 success: function (data, textstatus) {
87 if (data.error != "ok") {
88 alert("XHR fail: " + data.error );
89 }
90 },
91 error: function (jqXHR, textstatus, error) { alert("XHR errored:" + error + "(" + textstatus + ")"); },
92 })
93 });
94});
95
96
97</script>
98
99
100 <div class="page-header">
101 <h1>
102 {{project.name}}
103 {% if project.build_set.all.count == 0 %}
104 <small>No builds yet</small>
105 {% else %}
106 <small><a href="#">{{project.build_set.all.count}} builds</a></small>
107 {% endif %}
108 </h1>
109 </div>
110
111
112 <div class="well">
113 <form class="build-form">
114 <div class="input-append input-prepend controls">
115 <input type="text" class="huge span7" placeholder="Type the target(s) you want to build" autocomplete="off" data-minLength="1" data-autocomplete="off"
116 data-provide="typeahead" data-source='["core-image-base [meta | daisy]",
117 "core-image-clutter [meta | daisy]",
118 "core-image-directfb [meta | daisy]",
119 "core-image-myimage [meta-imported-layer | 3e1dbabbf3&hellip;]",
120 "core-image-anotherimage [meta-imported-layer | master]",
121 "core-image-full-cmdline [meta | daisy]",
122 "core-image-lsb [meta | daisy]",
123 "core-image-lsb-dev [meta | daisy]",
124 "core-image-lsb-sdk [meta| daisy]",
125 "core-image-minimal [meta| daisy]"
126 ]'>
127 <a href="#" id="build-button" class="btn btn-large btn-primary" disabled>
128 Build
129 <i class="icon-question-sign get-help heading-help" style="margin-left: 5px;" title="Type the name of one or more targets you want to build, separated by a space. You can also specify a task by appending a semicolon and a task name to a target name, like so: <code>core-image-minimal:do_build</code>"></i>
130 </a>
131 </div>
132 <p>
133 <a href="all-targets.html" style="padding-right: 5px;">
134 View all targets
135 </a>
136 |
137 <a href="{% url 'projectbuilds' project.id%}" style="padding-left:5px;">
138 View all project builds ({{project.build_set.count}})
139 </a>
140 </form>
141 </div>
142
143
144
145
146
147 {% if builds|length > 0 or buildrequests|length > 0 %}
148 <h2 class="air">Recent Builds</h2>
149
150 <div id="scheduled-builds">
151 {% for br in buildrequests %}
152<div class="alert {% if br.0.state == br.0.REQ_FAILED%}alert-error{%else%}alert-info{%endif%}" id="build-request">
153 <div class="row-fluid">
154 <div class="lead span4">
155 <span>
156 {{br.0.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} {{br.1.machine.value}} (Created {{br.0.created}})
157 </span>
158 </div>
159 <div class="span2">
160 {{br.0.get_state_display}}
161 </div>
162 <div class="span8">
163{% if br.state == br.REQ_FAILED%}
164 {% for bre in br.0.brerror_set.all %} {{bre.errmsg}} ({{bre.errtype}}) <br/><hr/><code>{{bre.traceback}}</code>{%endfor%}
165{%endif%}
166 </div>
167
168 </div>
169</div>
170
171 {% endfor %}
172
173 </div>
174
175
176
177<!-- Lifted from build.html -->
178 {% for build in builds %}
179<div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
180 <div class="row-fluid">
181 <div class="lead span5">
182 {%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}
183 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
184 <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
185 {% endif %}
186 <span data-toggle="tooltip" {%if build.target_set.all.count > 1%}title="Targets: {%for target in build.target_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|naturaltime}})</span>
187 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
188 </a>
189 {% endif %}
190 </div>
191 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
192 <div class="span2 lead">
193 {% if build.errors_no %}
194 <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>
195 {% endif %}
196 </div>
197 <div class="span2 lead">
198 {% if build.warnings_no %}
199 <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>
200 {% endif %}
201 </div >
202 <div class="lead pull-right">
203 Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent|sectohms }}</a>
204 </div>
205 {%endif%}{%if build.outcome == build.IN_PROGRESS %}
206 <div class="span4">
207 <div class="progress" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
208 <div style="width: {{build.completeper}}%;" class="bar"></div>
209 </div>
210 </div>
211 <div class="lead pull-right">ETA: in {{build.eta|naturaltime}}</div>
212 {%endif%}
213 </div>
214 </div>
215 {% endfor %}
216<!-- end of lift-->
217 {%endif%}
218
219 <h2 class="air">Project configuration</h2>
220
221 <div class="row-fluid">
222
223 <div id="layer-container" class="well well-transparent span4">
224 <h3>
225 Add layers
226 <i data-original-title="OpenEmbedded organises metadata into modules called 'layers'. Layers allow you to isolate different types of customizations from each other. <a href='http://www.yoctoproject.org/docs/1.6.1/dev-manual/dev-manual.html#understanding-and-creating-layers' target='_blank'>More on layers</a>" class="icon-question-sign get-help heading-help" title=""></i>
227 </h3>
228 <form style="margin-top:20px;">
229 <div class="input-append">
230 <input class="input-xlarge" id="layer" autocomplete="off" placeholder="Type a layer name" data-provide="typeahead" data-source="" data-minlength="1" data-autocomplete="off" type="text">
231 <button id="add-layer" class="btn" disabled="">Add</button>
232 </div>
233 <div id="import-alert" class="alert alert-info" style="display:none;">
234 Toaster does not know about this layer. Please <a href="#">import it</a>
235 </div>
236 <div id="dependency-alert" class="alert alert-info" style="display:none;">
237 <p><strong>meta-tizen</strong> depends on the layers below. Check the ones you want to add: </p>
238 <ul class="unstyled">
239 {% for f in layer_dependency %}
240 <li>
241 <label class="checkbox">
242 <input checked="checked" type="checkbox">
243 meta-ruby
244 </label>
245 </li>
246 {% endfor %}
247 </ul>
248 <button id="add-layer-dependencies" class="btn btn-info add-layer">Add layers</button>
249 </div>
250
251 <p><a href="{% url 'importlayer' %}">Import your layer</a> | <a href="{% url 'layers'%}">View all layers</a></p>
252 </form>
253
254 <h4 class="air">
255 Added layers
256 <span class="muted counter">{{project.projectlayer_set.count}}</span>
257 <i data-original-title="Your added layers will be listed in this same order in your <code>bblayers.conf</code> file" class="icon-question-sign get-help heading-help" title=""></i>
258 </h4>
259 <ul class="unstyled configuration-list">
260 {% for pl in project.projectlayer_set.all %}
261 <li>
262 <a href="#">{{pl.layercommit.layer.name}} (<span class="layer-version">{{pl.layercommit.layer.layer_index_url}}</span>)</a>
263 {% if pl.optional %}
264 <i title="" data-original-title="" class="icon-trash" id="del-layer-icon" x-data="{{pl.pk}}"></i>
265 {% endif %}
266 </li>
267 {% endfor %}
268 </ul>
269 </div>
270
271 <div id="target-container" class="well well-transparent span4">
272 <h3>
273 Add targets
274 <i data-original-title="A target is what you want to build, usually an image recipe that produces a root file system" class="icon-question-sign get-help heading-help" title=""></i>
275 </h3>
276 <form style="margin-top:20px;">
277 <div class="input-append">
278 <input id="target" class="input-xlarge" autocomplete="off" placeholder="Type a target name" data-provide="typeahead" data-source="" data-minlength="1" data-autocomplete="off" type="text">
279 <button id="add-target-button" class="btn" type="button">Add</button>
280 </div>
281
282 <p><a href="{% url 'targets' %}" class="link">View all targets</a></p>
283 </form>
284 <h4 class="air">
285 Added targets
286 <span id="target-count" class="muted counter">{{project.projecttarget_set.count}}</span>
287 </h4>
288 <ul class="unstyled configuration-list" id="target-list">
289 {% for target in project.projecttarget_set.all %}
290 {% if target %}
291 <li>
292 <a href="#">{{target.target}}{% if target.task%} (target.task){%endif%}</a>
293 {% if target.notprovided %}
294 <i title="" data-original-title="" id="msg1" class="icon-exclamation-sign get-help-yellow" data-title="<strong>Target may not be provided</strong>" data-content="From the layer information it currently has, Toaster thinks this target is not provided by any of your added layers. If a target is not provided by one of your added layers, the build will fail.<h5>What Toaster suggests</h5><p>The <a href='#'>meta-abc</a> and <a href='#'>meta-efg</a> layers provide core-image-notprovided. You could add one of them to your project.</p><button class='btn btn-block'>Add meta-abc</button><button class='btn btn-block'>Add meta-efg</button><button id='dismiss1' class='btn btn-block btn-info'>Stop showing this message</button>"></i>
295 {% elif target.notknown %}
296 <i title="" data-original-title="" id="msg2" class="icon-exclamation-sign get-help-yellow" data-title="<strong>Target may not be provided</strong>" data-content="From the layer information it currently has, Toaster thinks this target is not provided by any of your added layers. If a target is not provided by one of your added layers, the build will fail.<h5>What Toaster suggests</h5><p>Review your added layers to make sure one of them provides core-image-unknown. Clicking on a layer name will give you all the information Toaster has about the layer. </p> <button class='btn btn-block btn-info'>Stop showing this message</button>"></i>
297 {% endif %}
298 <i title="" data-original-title="" class="icon-trash" id="del-target-icon" x-data="{{target.pk}}"></i>
299 </li>
300 {% endif %}
301 {% endfor %}
302
303
304 </ul>
305 </div>
306
307 <div class="well well-transparent span4">
308
309 <h3>
310 Project machine
311 <i class="icon-question-sign get-help heading-help" title="The machine is the hardware for which you want to build. You can only set one machine per project"></i>
312 </h3>
313 <p class="lead" id="selected-machine"> {{machine}}
314 <i id="change-machine" class="icon-pencil"></i>
315 </p>
316 <form id="select-machine">
317 <div class="alert alert-info">
318 <strong>Machine changes have a big impact on build outcome.</strong>
319 You cannot really compare the builds for the new machine with the previous ones.
320 </div>
321 <div class="input-append">
322 <input type="text" id="machine" autocomplete="off" value="qemux86" data-provide="typeahead"
323 data-minLength="1"
324 data-autocomplete="off"
325 data-source='[
326 ]'>
327 <button id="apply-change-machine" class="btn" type="button">Save</button>
328 <a href="#" id="cancel-machine" class="btn btn-link">Cancel</a>
329 </div>
330 <p><a href="{% url 'machines' %}" class="link">View all machines</a></p>
331 </form>
332 <p class="link-action">
333 <a href="{% url 'projectconf' project.id %}" class="link">Edit configuration variables</a>
334 <i class="icon-question-sign get-help heading-help" title="You can set other project configuration options here. Each option, like everything else in the build system, is a variable - value pair"></i>
335 </p>
336
337 </div>
338
339
340 </div>
341
342 <h2>Project details</h2>
343
344 <div class="well well-transparent">
345 <h3>Project name</h3>
346 <p class="lead">
347 {{project.name}}
348 <i title="" data-original-title="" class="icon-pencil"></i>
349 </p>
350 <h3>Project owner</h3>
351 <p class="lead">
352 {{puser.username}}
353 <i title="" data-original-title="" class="icon-pencil"></i>
354 </p>
355 <h3>Owner's email</h3>
356 <p class="lead">
357 {{puser.email}}
358 <i title="" data-original-title="" class="icon-pencil"></i>
359 </p>
360 <h3>Yocto Project version</h3>
361 <p class="lead">
362 {{project.release.name}} - {{project.release.description}}
363 <i title="" data-original-title="" class="icon-pencil"></i>
364 </p>
365 </div>
366{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
new file mode 100644
index 0000000000..8c5942c7cb
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
@@ -0,0 +1,59 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Project builds</li>
7{% endblock %}
8
9{% block projectinfomain %}
10 <div class="page-header">
11 <h1>
12 All builds
13 <i class="icon-question-sign get-help heading-help" title="This page lists all the layers compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created layers suitable for use on top of OpenEmbedded Core and any layers you have imported"></i>
14 </h1>
15 </div>
16 <!--div class="alert">
17 <div class="input-append" style="margin-bottom:0px;">
18 <input class="input-xxlarge" type="text" placeholder="Search layers" value="browser" />
19 <a class="add-on btn">
20 <i class="icon-remove"></i>
21 </a>
22 <button class="btn" type="button">Search</button>
23 <a class="btn btn-link" href="#">Show all layers</a>
24 </div>
25 </div-->
26 <div id="layer-added" class="alert alert-info lead" style="display:none;"></div>
27 <div id="layer-removed" class="alert alert-info lead" style="display:none;">
28 <button type="button" class="close" data-dismiss="alert">&times;</button>
29 <strong>1</strong> layer deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>
30 </div>
31
32
33{% include "basetable_top.html" %}
34 {% for build in objects %}
35 <tr class="data">
36 <td class="outcome"><a href="{% url "builddashboard" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a></td>
37 <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td>
38 <td class="machine"><a href="{% url "builddashboard" build.id %}">{{build.machine}}</a></td>
39 <td class="started_on"><a href="{% url "builddashboard" build.id %}">{{build.started_on|date:"d/m/y H:i"}}</a></td>
40 <td class="completed_on"><a href="{% url "builddashboard" build.id %}">{{build.completed_on|date:"d/m/y H:i"}}</a></td>
41 <td class="failed_tasks error">{% query build.task_build outcome=4 order__gt=0 as exectask%}{% if exectask.count == 1 %}<a href="{% url "task" build.id exectask.0.id %}">{{exectask.0.recipe.name}}.{{exectask.0.task_name}}</a>{% elif exectask.count > 1%}<a href="{% url "tasks" build.id %}?filter=outcome%3A4">{{exectask.count}}</a>{%endif%}</td>
42 <td class="errors_no">{% if build.errors_no %}<a class="errors_no error" href="{% url "builddashboard" build.id %}#errors">{{build.errors_no}} error{{build.errors_no|pluralize}}</a>{%endif%}</td>
43 <td class="warnings_no">{% if build.warnings_no %}<a class="warnings_no warning" href="{% url "builddashboard" build.id %}#warnings">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>{%endif%}</td>
44 <td class="time"><a href="{% url "buildtime" build.id %}">{{build.timespent|sectohms}}</a></td>
45 <td class="log">{{build.cooker_log_path}}</td>
46 <td class="output">
47 {% if build.outcome == build.SUCCEEDED %}
48 <a href="{%url "builddashboard" build.id%}#images">{{fstypes|get_dict_value:build.id}}</a>
49 {% endif %}
50 </td>
51 </tr>
52
53 {% endfor %}
54{% include "basetable_bottom.html" %}
55
56 <!-- Modals -->
57
58
59{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
new file mode 100644
index 0000000000..e8b0c39f25
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -0,0 +1,62 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Project configuration</li>
7{% endblock %}
8
9{% block projectinfomain %}
10 <div class="page-header">
11 <h1>Configuration Variables</h1>
12 </div>
13
14 <div style="padding-left:19px;">
15
16 <dl class="dl-vertical">
17 {% for c in configvars %}
18 <dt>
19 {{c.name}}
20 <i class="icon-question-sign get-help" title="{{c.desc}}"></i>
21 </dt>
22 <dd class="lead">
23 <span id="distro">{{c.value}}</span>
24 <i class="icon-pencil" id="change-distro-icon"></i>
25 <form id="change-distro-form" style="display:none;">
26 <div class="input-append">
27 <input type="text" id="new-distro" value="poky tiny">
28 <button id="apply-change-distro" class="btn" type="button">Save</button>
29 <button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button>
30 </div>
31 </form>
32 </dd>
33 {% endfor %}
34
35
36 </dl>
37 <form id="variable-form">
38 <fieldset style="padding-left:0px;">
39 <legend>Add variable</legend>
40 <label>
41 Variable
42 <i class="icon-question-sign get-help" title="Variable names are case sensitive, cannot have spaces, and can only include letters, numbers, underscores and dashes"></i>
43 </label>
44 <input id="variable" type="text" placeholder="Type variable name">
45 <label>Value</label>
46 <input id="value" type="text" placeholder="Type variable value">
47 <div style="display:block;margin-top:10px;">
48 <a href="#" class="btn save" disabled>
49 Add variable
50 </a>
51 </div>
52 </fieldset>
53 </form>
54 <!--button id="add-variable" class="btn air">
55 <i class="icon-plus"></i>
56 Add variable
57 </button-->
58
59 </div>
60
61
62{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
new file mode 100644
index 0000000000..a830ba9fb8
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -0,0 +1,275 @@
1{% extends "basebuilddetailpage.html" %}
2
3{% load projecttags %}
4
5{% block localbreadcrumb %}
6<li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
7<li>{{object.name}}_{{object.version}} </li>
8{% endblock %}
9
10{% block pagedetailinfomain %}
11
12<!-- Begin container -->
13
14<div class="row span11">
15 <div class="page-header">
16 <h1>{{object.name}}_{{object.version}}</h1>
17 </div>
18</div>
19
20<div class="row span7 tabbable">
21 <ul class="nav nav-pills">
22 <li class="active">
23 <a href="#information" data-toggle="tab">
24 <i class="icon-question-sign get-help" title="Build-related information about the recipe"></i>
25 Recipe details
26 </a>
27 </li>
28 <li>
29 <a href="#packages-built" data-toggle="tab">
30 <i class="icon-question-sign get-help" title="The packaged output resulting from building the recipe"></i>
31 Packages ({{packages.count}})
32 </a>
33 </li>
34 <li>
35 <a href="#dependencies" data-toggle="tab">
36 <i class="icon-question-sign get-help" title="The recipe build-time dependencies (i.e. other recipes)"></i>
37 Build dependencies ({{object.r_dependencies_recipe.all.count}})
38 </a>
39 </li>
40 <li>
41 <a href="#brought-in-by" data-toggle="tab">
42 <i class="icon-question-sign get-help" title="The recipe build-time reverse dependencies (i.e. the recipes that depend on this recipe)"></i>
43 Reverse build dependencies ({{object.r_dependencies_depends.all.count}})
44 </a>
45 </li>
46 </ul>
47 <div class="tab-content">
48 <div class="tab-pane active" id="information" name="information">
49 <dl class="dl-horizontal">
50 <dt>
51 <i class="icon-question-sign get-help" title="The name of the layer providing the recipe"></i>
52 Layer
53 </dt>
54 <dd>{{layer.name}}</dd>
55 <dt>
56 <i class="icon-question-sign get-help" title="Path to the layer providing the recipe"></i>
57 Layer directory
58 </dt>
59 <dd><code>{{layer.local_path}}</code></dd>
60 <dt>
61 <i class="icon-question-sign get-help" title="Path to the recipe .bb file"></i>
62 Recipe file
63 </dt>
64 <dd><code>{{object.file_path}}</code></dd>
65 {% if layer_version.branch %}
66 <dt>
67 <i class="icon-question-sign get-help" title="The Git branch of the layer providing the recipe"></i>
68 Layer branch
69 </dt>
70 <dd>{{layer_version.branch}}</dd>
71 {% endif %}
72 <dt>
73 <i class="icon-question-sign get-help" title="The Git commit of the layer providing the recipe"></i>
74 Layer commit
75 </dt>
76 <dd class="iscommit">{{layer_version.commit}}</dd>
77 </dl>
78
79 <h2 class="details">Tasks</h2>
80 {% if not tasks %}
81 <div class="alert alert-info">
82 <strong>{{object.name}}_{{object.version}}</strong> does not have any tasks in this build.
83 </div>
84 {% else %}
85 <table class="table table-bordered table-hover">
86 <thead>
87 <th>
88 <i class="icon-question-sign get-help" title="The running sequence of each task in the build"></i>
89 Order
90 </th>
91 <th>
92 <i class="icon-question-sign get-help" title="The name of the task"></i>
93 Task
94 </th>
95 <th>
96 <i class="icon-question-sign get-help" title="This value tells you if a task had to run (executed) in order to generate the task output, or if the output was provided by another task and therefore the task didn't need to run (not executed)"></i>
97 Executed
98 </th>
99 <th>
100 <i class="icon-question-sign get-help" title="This column tells you if 'executed' tasks succeeded or failed. The column also tells you why 'not executed' tasks did not need to run"></i>
101 Outcome
102 </th>
103 <th>
104 <i class="icon-question-sign get-help" title="This column tells you if a task tried to restore output from the <code>sstate-cache</code> directory or mirrors, and reports the result: Succeeded, Failed or File not in cache"></i>
105 Cache attempt
106 </th>
107 </thead>
108 <tbody>
109
110 {% for task in tasks %}
111
112 <tr {{ task|task_color }} >
113
114 <td><a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.order}}</a></td>
115 <td>
116 <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.task_name}}</a>
117 {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="" data-original-title="{{task.get_description}}"></i> {% endif %}
118 </td>
119
120 <td><a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_executed_display}}</a></td>
121
122 <td>
123 <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_outcome_display}} </a>
124 <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
125 </td>
126 <td>
127 {% ifnotequal task.sstate_result task.SSTATE_NA %}
128 <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_sstate_result_display}}</a>
129 {% endifnotequal %}
130 </td>
131
132 </tr>
133
134 {% endfor %}
135 </tbody>
136 </table>
137 {% endif %}
138 </div>
139 <div class="tab-pane" id="packages-built" name="packages-built">
140 {% if not packages %}
141 <div class="alert alert-info">
142 <strong>{{object.name}}_{{object.version}}</strong> does not build any packages.
143 </div>
144 {% else %}
145 <table class="table table-bordered table-hover" style="margin-top:10px;">
146 <thead>
147 <tr>
148 <th>
149 Package
150 </th>
151 <th>
152 Version
153 </th>
154 <th class="sizecol span2">
155 Size
156 </th>
157 </tr>
158 </thead>
159 <tbody>
160
161 {% for package in packages|dictsort:"name" %}
162
163 <tr>
164 <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.name}}</a></td>
165 <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.version}}_{{package.revision}}</a></td>
166 <td class="sizecol"><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.size|filtered_filesizeformat}}</a></td>
167 </tr>
168
169 {% endfor %}
170
171 </tbody>
172 </table>
173 {% endif %}
174 </div>
175 <div class="tab-pane" id="dependencies" name="dependencies">
176
177 {% if not object.r_dependencies_recipe.all %}
178 <div class="alert alert-info">
179 <strong>{{object.name}}_{{object.version}}</strong> has no build dependencies.
180 </div>
181 {% else %}
182 <table class="table table-bordered table-hover">
183 <thead>
184 <tr>
185 <th>
186 Recipe
187 </th>
188 <th>
189 Version
190 </th>
191 </tr>
192 </thead>
193 <tbody>
194
195 {% for rr in object.r_dependencies_recipe.all|dictsort:"depends_on.name" %}
196 <tr>
197 <td><a href="{% url "recipe" build.pk rr.depends_on.pk %}">{{rr.depends_on.name}}</a></td>
198 <td><a href="{% url "recipe" build.pk rr.depends_on.pk %}">{{rr.depends_on.version}}</a></td>
199 </tr>
200 {% endfor %}
201
202 </tbody>
203 </table>
204 {% endif %}
205
206 </div>
207 <div class="tab-pane" id="brought-in-by" name="brought-in-by">
208
209 {% if not object.r_dependencies_depends.all %}
210 <div class="alert alert-info">
211 <strong>{{object.name}}_{{object.version}}</strong> has no reverse build dependencies.
212 </div>
213 {% else %}
214 <table class="table table-bordered table-hover">
215 <thead>
216 <tr>
217 <th>
218 Recipe
219 </th>
220 <th>
221 Version
222 </th>
223 </tr>
224 </thead>
225 <tbody>
226
227 {% for rr in object.r_dependencies_depends.all|dictsort:"recipe.name" %}
228 <tr>
229 <td><a href="{% url "recipe" build.pk rr.recipe.pk %}">{{rr.recipe.name}}</a></td>
230 <td><a href="{% url "recipe" build.pk rr.recipe.pk %}">{{rr.recipe.version}}</a></td>
231 </tr>
232 {% endfor %}
233
234 </tbody>
235 </table>
236 {% endif %}
237
238 </div>
239 </div>
240</div>
241
242<div class="row span4 well">
243 <h2>About {{object.name}}</h2>
244 <dl>
245 {% if object.summary %}
246 <dt>Summary</dt>
247 <dd><p>{{object.summary}}</p></dd>
248 {% endif %}
249 {% if object.description %}
250 <dt>Description</dt>
251 <dd><p>{{object.description}}</dd>
252 {% endif %}
253 {% if object.homepage %}
254 <dt>Homepage</dt>
255 <dd><a href="{{object.homepage}}">{{object.homepage}}</a></dd>
256 {% endif %}
257 {% if object.bugtracker %}
258 <dt>Bugtracker</dt>
259 <dd><a href="{{object.bugtracker}}">{{object.bugtracker}}</a></dd>
260 {% endif %}
261 {% if object.section %}
262 <dt>
263 Section
264 <i class="icon-question-sign get-help" title="The section in which recipes should be categorized"></i>
265 </dt>
266 <dd>{{object.section}}</dd>
267 {% endif %}
268 {% if object.license %}
269 <dt>License</dt>
270 <dd>{{object.license}}</dd>
271 {% endif %}
272 </dl>
273</div>
274
275{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
new file mode 100644
index 0000000000..791a487a81
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -0,0 +1,110 @@
1{% extends "basebuildpage.html" %}
2
3{% load projecttags %}
4
5{% block localbreadcrumb %}
6<li>Recipes</li>
7{% endblock %}
8
9{% block nav-recipes %}
10 <li class="active"><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
11{% endblock %}
12
13{% block buildinfomain %}
14<div class="span10">
15<div class="page-header">
16<h1>
17 {% if request.GET.search and objects.paginator.count > 0 %}
18 {{objects.paginator.count}} recipe{{objects.paginator.count|pluralize}} found
19 {%elif request.GET.search and objects.paginator.count == 0%}
20 No recipes found
21 {%else%}
22 Recipes
23 {%endif%}
24 </h1>
25</div>
26
27{% if objects.paginator.count == 0 %}
28 <div class="row-fluid">
29 <div class="alert">
30 <form class="no-results input-append" id="searchform">
31 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
32 <button class="btn" type="submit" value="Search">Search</button>
33 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
34 </form>
35 </div>
36 </div>
37
38{% else %}
39{% include "basetable_top.html" %}
40
41 {% for recipe in objects %}
42
43 <tr class="data">
44 <td><a href="{% url "recipe" build.pk recipe.pk %}">{{recipe.name}}</a></td>
45 <td><a href="{% url "recipe" build.pk recipe.pk %}">{{recipe.version}}</a></td>
46 <!-- Depends -->
47 <td class="depends_on">
48 {% with deps=recipe_deps|get_dict_value:recipe.pk %}
49 {% with count=deps|length %}
50 {% if count %}
51 <a class="btn"
52 title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies"
53 data-content="<ul class='unstyled'>
54 {% for i in deps|dictsort:"depends_on.name"%}
55 <li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
56 {% endfor %}
57 </ul>">
58 {{count}}
59 </a>
60 {% endif %}
61 {% endwith %}
62 {% endwith %}
63 </td>
64 <!-- Brought in by -->
65 <td class="depends_by">
66 {% with revs=recipe_revs|get_dict_value:recipe.pk %}
67 {% with count=revs|length %}
68 {% if count %}
69 <a class="btn"
70 title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies"
71 data-content="<ul class='unstyled'>
72 {% for i in revs|dictsort:"recipe.name" %}
73 <li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li>
74 {% endfor %}
75 </ul>">
76 {{count}}
77 </a>
78 {% endif %}
79 {% endwith %}
80 {% endwith %}
81 </td>
82 <!-- Recipe file -->
83 <td class="recipe_file">{{recipe.file_path}}</td>
84 <!-- Section -->
85 <td class="recipe_section">{{recipe.section}}</td>
86 <!-- License -->
87 <td class="recipe_license">{{recipe.license}}</td>
88 <!-- Layer -->
89 <td class="layer_version__layer__name">{{recipe.layer_version.layer.name}}</td>
90 <!-- Layer branch -->
91 <td class="layer_version__branch">{{recipe.layer_version.branch}}</td>
92 <!-- Layer commit -->
93 <td class="layer_version__layer__commit">
94 <a class="btn"
95 data-content="<ul class='unstyled'>
96 <li>{{recipe.layer_version.commit}}</li>
97 </ul>">
98 {{recipe.layer_version.commit|truncatechars:13}}
99 </a>
100 </td>
101 <!-- Layer directory -->
102 <td class="layer_version__layer__local_path">{{recipe.layer_version.layer.local_path}}</td>
103 </tr>
104
105 {% endfor %}
106
107{% include "basetable_bottom.html" %}
108{% endif %}
109</div>
110{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/tablesort.html b/bitbake/lib/toaster/toastergui/templates/tablesort.html
new file mode 100644
index 0000000000..bf311b6edd
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/tablesort.html
@@ -0,0 +1,38 @@
1{% load projecttags %}
2<!-- component to display a generic table -->
3 {% if disable_sort %}
4 <table class="table table-bordered table-hover" id="detail_table">
5 <thead>
6 <tr>
7 {% for tc in tablecols %}
8 <th class="{{tc.dclass}} {{tc.clclass}}">
9 {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%}
10 {{tc.name}}
11 </th>
12 {% endfor %}
13 </tr>
14 </thead>
15 {% else %}
16 <table class="table table-bordered table-hover tablesorter" id="otable">
17 <thead>
18 <!-- Table header row; generated from "tablecols" entry in the context dict -->
19 <tr>
20 {% for tc in tablecols %}
21 <th class="{{tc.dclass}} {{tc.clclass}}">
22 {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%}
23 {%if tc.orderfield%}
24 <a {%if tc.ordericon%} class="sorted" {%endif%}
25 href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })" >
26 {{tc.name}}
27 </a>
28 {%else%}
29 <span class="muted">
30 {{tc.name}}
31 </span>
32 {%endif%}
33 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
34 </th>
35 {% endfor %}
36 </tr>
37 </thead>
38 {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
new file mode 100644
index 0000000000..564fd27162
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -0,0 +1,163 @@
1{% extends "basebuildpage.html" %}
2{% block localbreadcrumb %}
3<li>{{target.target}}</li>
4{% endblock localbreadcrumb%}
5
6{% load projecttags %}
7
8{% block nav-target %}
9 {% for t in build.get_sorted_target_list %}
10 {% ifequal target.pk t.pk %}
11 <li class="active"><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
12 {% else %}
13 <li><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li>
14 {% endifequal %}
15 {% endfor %}
16{% endblock %}
17
18{% block buildinfomain %}
19
20<div class="row-fluid span10">
21 <div class="page-header">
22 <h1>
23 {% if request.GET.search and objects.paginator.count > 0 %}
24 {{objects.paginator.count}} package{{objects.paginator.count|pluralize}} found
25 {% elif request.GET.search and objects.paginator.count == 0 %}
26 No packages found
27 {% else %}
28 {{target.target}}
29 {% endif %}
30 </h1>
31 </div>
32</div>
33
34<div class="row-fluid pull-right span10" id="navTab">
35 <ul class="nav nav-pills">
36 <li class="active">
37 <a href="#target">
38 <i class="icon-question-sign get-help" title="Of all the packages built, the subset installed in the root file system of this image"></i>
39 Packages included ({{target.package_count}} - {{packages_sum|filtered_filesizeformat}})
40 </a>
41 </li>
42 <li>
43 <a href="{% url 'dirinfo' build.id target.id %}">
44 <i class="icon-question-sign get-help" title="The directories and files in the root file system of this image"></i>
45 Directory structure
46 </a>
47 </li>
48 </ul>
49
50 <div id="image-packages" class="tab-pane">
51
52 {% if objects.paginator.count == 0 %}
53 <div class="row-fluid">
54 <div class="alert">
55 <form class="no-results input-append" id="searchform">
56 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
57 <button class="btn" type="submit" value="Search">Search</button>
58 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
59 </form>
60 </div>
61 </div>
62
63
64 {% else %}
65 {% include "basetable_top.html" %}
66 {% for package in objects %}
67 <tr>
68 <td class="package_name">
69 <a href="{% url 'package_included_detail' build.id target.id package.id %}">
70 {{package.name}}
71 </a>
72 {% if package.installed_name and package.name != package.installed_name %}
73 <span class="muted"> as {{package.installed_name}}</span>
74 <i class="icon-question-sign get-help hover-help" title='{{package.name|add:" was renamed at packaging time and was installed in your image as "|add:package.installed_name}}'></i>
75 {% endif %}
76 </td>
77 <td class="package_version">
78 <a href="{% url 'package_included_detail' build.id target.id package.id %}">
79 {{package.version|filtered_packageversion:package.revision}}
80 </a>
81 </td>
82 <td class="size sizecol">
83 {{package.size|filtered_installedsize:package.installed_size|filtered_filesizeformat}}
84 </td>
85 <td class="size_over_total sizecol">
86 {{package|filter_sizeovertotal:packages_sum}}
87 </td>
88 <td class="license">
89 {{package.license}}
90 </td>
91 <td class="depends">
92 {% with deps=package.runtime_dependencies %}
93 {% with deps_count=deps|length %}
94 {% if deps_count > 0 %}
95 <a class="btn"
96 title="<a href='{% url "package_included_dependencies" build.id target.id package.id %}'>{{package.name}}</a> dependencies"
97 data-content="<ul class='unstyled'>
98 {% for i in deps|dictsort:'depends_on.name' %}
99 <li><a href='{% url "package_included_detail" build.pk target.id i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
100 {% endfor %}
101 </ul>">
102 {{deps_count}}
103 </a>
104 {% endif %}
105 {% endwith %}
106 {% endwith %}
107 </td>
108 <td class="brought_in_by">
109 {% with rdeps=package.reverse_runtime_dependencies %}
110 {% with rdeps_count=rdeps|length %}
111 {% if rdeps_count > 0 %}
112 <a class="btn"
113 title="<a href='{% url "package_included_reverse_dependencies" build.id target.id package.id %}'>{{package.name}}</a> reverse dependencies"
114 data-content="<ul class='unstyled'>
115 {% for i in rdeps|dictsort:'package.name' %}
116 <li><a href='{% url "package_included_detail" build.id target.id i.package.id %}'>{{i.package.name}}</a></li>
117 {% endfor %}
118 </ul>">
119 {{rdeps_count}}
120 </a>
121 {% endif %}
122 {% endwith %}
123 {% endwith %}
124 </td>
125 <td class="recipe_name">
126 {% if package.recipe.version %}
127 <a href="{% url 'recipe' build.id package.recipe_id %}">
128 {{ package.recipe.name }}
129 </a>
130 {% endif %}
131 </td>
132 <td class="recipe_version">
133 {% if package.recipe.version %}
134 <a href="{% url 'recipe' build.id package.recipe_id %}">
135 {{ package.recipe.version }}
136 </a>
137 {% endif %}
138 </td>
139 <td class="layer_name">
140 {{ package.recipe.layer_version.layer.name }}
141 </td>
142 <td class="layer_branch">
143 {{ package.recipe.layer_version.branch}}
144 </td>
145 <td class="layer_commit">
146 <a class="btn"
147 data-content="<ul class='unstyled'>
148 <li>{{package.recipe.layer_version.commit}}</li>
149 </ul>">
150 {{package.recipe.layer_version.commit|truncatechars:13}}
151 </a>
152 </td>
153 <td class="layer_directory">
154 {{ package.recipe.layer_version.layer.local_path }}
155 </td>
156 </tr>
157 {% endfor %}
158
159 {% include "basetable_bottom.html" %}
160 {% endif %}
161 </div> <!-- tabpane -->
162</div> <!--span 10-->
163{% endblock buildinfomain %}
diff --git a/bitbake/lib/toaster/toastergui/templates/targets.html b/bitbake/lib/toaster/toastergui/templates/targets.html
new file mode 100644
index 0000000000..3afdf0a5e9
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/targets.html
@@ -0,0 +1,186 @@
1{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5{% block localbreadcrumb %}
6<li>Targets</li>
7{% endblock %}
8
9{% block projectinfomain %}
10 <div class="page-header">
11 <h1>
12 All targets
13 <i class="icon-question-sign get-help heading-help" title="This page lists all the targets compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created targets suitable for use on top of OpenEmbedded Core and any targets you have imported"></i>
14 </h1>
15 </div>
16 <!--div class="alert">
17 <div class="input-append" style="margin-bottom:0px;">
18 <input class="input-xxlarge" type="text" placeholder="Search targets" value="browser" />
19 <a class="add-on btn">
20 <i class="icon-remove"></i>
21 </a>
22 <button class="btn" type="button">Search</button>
23 <a class="btn btn-link" href="#">Show all targets</a>
24 </div>
25 </div-->
26 <div id="target-added" class="alert alert-info lead" style="display:none;"></div>
27 <div id="target-removed" class="alert alert-info lead" style="display:none;">
28 <button type="button" class="close" data-dismiss="alert">&times;</button>
29 <strong>1</strong> target deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>
30 </div>
31
32
33{% include "basetable_top.html" %}
34 {% for o in objects %}
35 <tr class="data">
36 <td class="target">
37 {{o.name}} ({{o.id}}, {{o.up_id}})
38 <a target="_blank" href="{{o.get_layersource_view_url}}"><i class="icon-share get-info"></i></a>
39 </td>
40 <td class="version">{{o.version}}</td>
41 <td class="description">{{o.description}}</td>
42 <td class="recipe-file">
43 <code>{{o.file_path}}</code>
44 <a href="{{o.get_vcs_link_url}}" target="_blank"><i class="icon-share get-info"></i></a>
45 </td>
46 <td class="target-section">{{o.section}}</td>
47 <td class="license">{{o.license}}</td>
48 <td class="layer"><a href="#">{{o.layer_version.layer.name}}</a></td>
49 <td class="source">{{o.layer_source.name}}</td>
50 <td class="branch">{{o.layer_version.commit}}</td>
51 <td class="build">
52 <a id="build-target" href="project-with-targets.html?target=3g-router-image" class="btn btn-block" style="display:none;">
53 Build target
54 </a>
55 <a id="add-layer" href="#" class="btn btn-block nopop" title="1 layer added">
56 <i class="icon-plus"></i>
57 Add layer
58 <i class="icon-question-sign get-help" title="To build this target, you must first add the meta-embeddedgeeks layer to your project"></i>
59 </a>
60 </td>
61 </tr>
62 {% endfor %}
63{% include "basetable_bottom.html" %}
64
65 <!-- Modals -->
66
67 <!-- 'Layer dependencies modal' -->
68 <div id="dependencies-message" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
69 <div class="modal-header">
70 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
71 <h3>meta-acer dependencies</h3>
72 </div>
73 <div class="modal-body">
74 <p><strong>meta-acer</strong> depends on some targets that are not added to your project. Select the ones you want to add:</p>
75 <ul class="unstyled">
76 <li>
77 <label class="checkbox">
78 <input type="checkbox" checked="checked">
79 meta-android
80 </label>
81 </li>
82 <li>
83 <label class="checkbox">
84 <input type="checkbox" checked="checked">
85 meta-oe
86 </label>
87 </li>
88 </ul>
89 </div>
90 <div class="modal-footer">
91 <button id="add-target-dependencies" type="submit" class="btn btn-primary" data-dismiss="modal" >Add targets</button>
92 <button class="btn" data-dismiss="modal">Cancel</button>
93 </div>
94 </div>
95
96 <script src="assets/js/jquery-1.9.1.min.js" type='text/javascript'></script>
97 <script src="assets/js/jquery.tablesorter.min.js" type='text/javascript'></script>
98 <script src="assets/js/jquery-ui-1.10.3.custom.min.js"></script>
99 <script src="assets/js/bootstrap.min.js" type='text/javascript'></script>
100 <script src="assets/js/prettify.js" type='text/javascript'></script>
101 <script src="assets/js/jit.js" type='text/javascript'></script>
102 <script src="assets/js/main.js" type='text/javascript'></script>
103
104 <script>
105 $(document).ready(function() {
106
107 //show or hide selected columns on load
108 $("input:checkbox").each(function(){
109 var selectedType = $(this).val();
110 if($(this).is(":checked")){
111 $("."+selectedType).show();
112 }
113 else{
114 $("."+selectedType).hide();
115 }
116 });
117
118 // enable add target button
119 $('#add-target-with-deps').removeAttr('disabled');
120
121 //edit columns functionality (show / hide table columns)
122 $("input:checkbox").change();
123 $("input:checkbox").change(function(){
124 var selectedType = $(this).val();
125 if($(this).is(":checked")){
126 $("."+selectedType).show();
127 }
128 else{
129 $("."+selectedType).hide();
130 }
131 });
132
133 //turn edit columns dropdown into a multi-select menu
134 $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
135 e.stopPropagation();
136 });
137
138 //show tooltip with applied filter
139 $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true});
140
141 $('#filtered').click(function() {
142 $(this).tooltip('hide');
143 });
144
145 //show target added tooltip
146 $("#remove-target, #add-target, #add-target-with-deps2").tooltip({ trigger: 'manual' });
147
148 // add target without dependencies
149 $("#add-target").click(function(){
150 $('#target-removed').hide();
151 $('#target-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>1</strong> target added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>').fadeIn();
152 $('#add-target').tooltip('show');
153 $("#add-target").hide();
154 $(".add-targets .tooltip").delay(2000).fadeOut(function(){
155 $("#remove-target").delay(300).fadeIn();
156 });
157 });
158
159 // add target with dependencies
160 $(document).on("click", "#add-target-dependencies", function() {
161 $('#target-removed').hide();
162 $('#target-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>3</strong> targets added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-acer</a> and its dependencies <a href="#">meta-android</a> and <a href="#">meta-oe</a>').delay(400).fadeIn(function(){
163 $('#add-target-with-deps').tooltip('show');
164 $("#add-target-with-deps, #add-target-with-deps").hide();
165 $(".add-targets .tooltip").delay(2000).fadeOut(function(){
166 $("#remove-target-with-deps").delay(300).fadeIn();
167 });
168 });
169 });
170
171 // delete target
172 $("#remove-target").click(function(){
173 $('#target-added').hide();
174 $('#target-removed').show();
175 $('#remove-target').tooltip('show');
176 $("#remove-target").hide();
177 $(".add-targets .tooltip").delay(2000).fadeOut(function(){
178 $("#add-target").delay(300).fadeIn();
179 });
180 });
181
182 });
183
184</script>
185
186{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
new file mode 100644
index 0000000000..3c4a3d4893
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -0,0 +1,283 @@
1{% extends "basebuilddetailpage.html" %}
2
3{% load projecttags %}
4{% load humanize %}
5
6{% block localbreadcrumb %}
7<li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
8<li>{{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}}</li>
9{% endblock %}
10
11{% block pagedetailinfomain %}
12
13<div class="row span11">
14 <div class="page-header">
15 <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1>
16 </div>
17
18{# Outcome section #}
19<h2 {{ task|task_color:True }}>
20 {{task.get_outcome_display}}
21 <i class="icon-question-sign get-help heading-help" title="{{task.get_outcome_help}}"></i>
22</h2>
23{%if task.task_executed %}
24 {# executed tasks outcome #}
25 <dl class="dl-horizontal">
26 {% if task.logfile %}
27 <dt>
28 <i class="icon-question-sign get-help" title="Path the task log file"></i> Log file
29 </dt>
30 <dd>
31 <code>{{task.logfile}}</code>
32 </dd>
33 {% endif %}
34 {# show stack trace for failed task #}
35 {% if task.outcome == task.OUTCOME_FAILED and log_head %}
36 <h3>Python stack trace</h3>
37 <div>
38 <pre style="min-height:160px;">
39 <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-mini">...</a>
40 <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;">
41 <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-mini collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre>
42 </div>
43 {% endif %}
44 </dl>
45{% else %}
46{# not executed tasks outcome #}
47 {% if task.outcome == task.OUTCOME_PREBUILT %}
48 {% if not showing_matches %}
49 <a class="btn" href="javascript:reload_params({'show_matches' : 'true' })">Match to tasks in previous builds <i class="icon-question-sign get-help" style="margin-top:20px;" title="This shows you a list of tasks from previous builds with the same signature generated from the same inputs as used in the prebuilt task. Any of them could be the task that generated the output this prebuilt task is reusing"></i></a>
50 {% elif matching_tasks %}
51 <h3 class="details">Prebuilt task could be based on
52 <i class="icon-question-sign get-help heading-help" title="This table shows a list of tasks from previous builds with the same signature generated from the same inputs as used in the prebuilt task. Any of them could be the task that generated the output this prebuilt task is reusing"></i>
53 </h3>
54 <table class="table table-bordered table-hover">
55 <thead>
56 <th>
57 <i class="icon-question-sign get-help" title="The name of the recipe to which each task applies"></i>
58 Recipe
59 </th>
60 <th>
61 <i class="icon-question-sign get-help" title="The name of the task"></i>
62 Task
63 </th>
64 <th>
65 <i class="icon-question-sign get-help" title="This value tells you if a task had to run (executed) in order to generate the task output, or if the output was provided by another task and therefore the task didn't need to run (not executed)"></i>
66 Executed
67 </th>
68 <th>
69 <i class="icon-question-sign get-help" title="This column tells you if 'executed' tasks succeeded or failed. The column also tells you why 'not executed' tasks did not need to run"></i>
70 Outcome
71 </th>
72 <th>
73 <i class="icon-question-sign get-help" title="The date and time the build finished"></i>
74 Build completed on
75 </th>
76 </thead>
77 <tbody>
78 {% for match in matching_tasks %}
79 <tr {{ match|task_color }}>
80 <td>
81 <a href="{%url "task" match.build.pk match.pk%}">{{match.recipe.name}}</a>
82 </td>
83 <td>
84 <a href="{%url "task" match.build.pk match.pk%}">{{match.task_name}}</a>
85 </td>
86 <td>
87 <a href="{%url "task" match.build.pk match.pk%}">{{match.get_executed_display}}</a>
88 </td>
89 <td>
90 <a href="{%url "task" match.build.pk match.pk%}">{{match.get_outcome_display}} </a><i class="icon-question-sign get-help hover-help" title="{{match.get_outcome_help}}"></i>
91 </td>
92 <td>
93 <a href="{%url "task" match.build.pk match.pk%}">{{match.build.completed_on|date:"d/m/y H:i"}}</a>
94 </td>
95 </tr>
96 {% endfor %}
97 </tbody>
98 </table>
99 {% else %}
100 <p class="alert">
101 <strong> We have found no tasks matching this prebuilt task</strong><br/>
102 The task you are looking for could belong to a build for which Toaster has no data.
103 </p>
104 {% endif %}
105 {% elif task.outcome == task.OUTCOME_COVERED %}
106 <dl class="dl-horizontal">
107 <dt>
108 <i class="icon-question-sign get-help" title="The task providing the outcome of this task"></i> Task covered by
109 </dt>
110 <dd>
111 <ul>
112 {% for t in covered_by %}
113 <li>
114 <a href="{%url 'task' t.build.pk t.pk%}"
115 class="task-info"
116 title="{{t.get_executed_display}} | {{t.get_outcome_display}}">
117 {{t.recipe.name}}_{{t.recipe.version}}
118 {{t.task_name}}
119 </a>
120 </li>
121 {% endfor %}
122 </ul>
123 </dd>
124 </dl>
125 {%elif task.outcome == task.OUTCOME_CACHED%}
126 <dl class="dl-horizontal">
127 <dt>
128 <i class="icon-question-sign get-help" title="Path the task log file"></i> Log file
129 </dt>
130 <dd>
131 <code>{% for t in task.get_related_setscene %} {{t.logfile}} {% endfor %}</code>
132 </dd>
133 </dl>
134 {%elif task.outcome == task.OUTCOME_EMPTY%}
135 <div class="alert alert-info details">
136 This task is empty because it has the <code>noexec</code> flag set to <code>1</code>, or the task function is empty
137 </div>
138 {% endif %}
139{% endif %}
140
141{# Execution section #}
142 {% if task.task_executed %}
143 <h2>
144 Executed
145 <i class="icon-question-sign get-help heading-help" title="'Executed' tasks are those that need to run in order to generate the task output"></i>
146 {% else %}
147 <h2 class="muted">
148 Not Executed
149 <i class="icon-question-sign get-help heading-help" title="'Not executed' tasks don't need to run because their outcome is provided by another task"></i>
150 {% endif %}
151 </h2>
152<dl class="dl-horizontal">
153 <dt>
154 <i class="icon-question-sign get-help" title="To make builds more efficient, the build system detects changes in the 'inputs' to a given task by creating a 'task signature'. If the signature changes, the build system assumes the inputs have changed and the task needs to be rerun"></i>
155 Task inputs signature
156 </dt>
157 <dd>
158 {{task.sstate_checksum}}
159 </dd>
160 {% if task.sstate_result != task.SSTATE_NA %}
161 </dl>
162 <div class="alert alert-info">Attempting to restore output from sstate cache
163 <i class="icon-question-sign get-help get-help-blue" title="The build system is searching for the task output in your <code>sstate-cache</code> directory and mirrors. If the build system finds the task output, it will reuse it instead of building it from scratch by running the real task. Reusing the task output makes the build faster"></i>
164 </div>
165 <dl class="dl-horizontal">
166 <dt>
167 <i class="icon-question-sign get-help" title="The name of the file searched for in your <code>sstate-cache</code> directory and mirrors"></i>
168 File searched for
169 </dt>
170 <dd><code>{{task.path_to_sstate_obj}}</code></dd>
171 <dt>
172 <i class="icon-question-sign get-help" title="The locations searched for the above file (i.e. your <code>sstate-cache</code> directory and any mirrors you have set up)"></i>
173 URI(s) searched
174 </dt>
175 <dd><ul>{% for uri in uri_list %}<li><code>{{uri}}</code></li>{% endfor %}</ul></dd>
176 </dl>
177 {% endif %}
178 {% if task.sstate_result == task.SSTATE_MISS %}
179 <div class="alert alert-info">
180 <strong>File not in sstate cache.</strong> Running the real task instead.
181 </div>
182 {% elif task.sstate_result == task.SSTATE_FAILED%}
183 <div class="alert">
184 <strong>Failed</strong> to restore output from sstate cache. The file was found but could not be unpacked.
185 </div>
186 <dl class="dl-horizontal">
187 <dt>
188 <i class="icon-question-sign get-help" title="Path to the cache attempt log file"></i>
189 Log file
190 </dt>
191 <dd><code>{{task.logfile}}</code></dd>
192 <dt>
193 <i class="icon-question-sign get-help" title="How long it took the cache attempt to finish in seconds"></i>
194 Time (secs)
195 </dt>
196 <dd>{{task.elapsed_time|format_none_and_zero}}</dd>
197 </dl>
198 <div class="alert alert-info">
199 Running the real task instead.
200 </div>
201 {% elif task.sstate_result == task.SSTATE_RESTORED %}
202 <div class="alert alert-info">
203 Output <strong>successfully restored</strong> from sstate cache.
204 </div>
205 {% endif %}
206 <dl class="dl-horizontal">
207 <dt>
208 <i class="icon-question-sign get-help" title="The running sequence of each task in the build"></i>
209 Task order
210 </dt>
211 <dd><a href="{%url "tasks_task" build.pk task.order %}#{{task.order}}">{{task.order}}</a></dd>
212 {% if task.task_executed %}
213 <dt>
214 <i class="icon-question-sign get-help" title="Indicates if this task executes a Python or Shell function(s)"></i>
215 Task script type
216 </dt>
217 <dd>{{task.get_script_type_display}}</dd>
218 {% endif %}
219<!--
220 <dt>
221 <i class="icon-question-sign get-help" title="The code executed by the task"></i>
222 Task executable output
223 </dt>
224 <dd><code>{{task.source_url}}</code></dd>
225-->
226 <dt>
227 <i class="icon-question-sign get-help" title="Task dependency chain (i.e. other tasks)"></i>
228 Dependencies
229 </dt>
230 <dd>
231 <ul>
232 {% for dep in deps %}
233 <li><a href="{%url 'task' dep.build.pk dep.pk%}" class="task-info" title="{{dep.get_executed_display}} | {{dep.get_outcome_display}}">{{dep.recipe.name}}_{{dep.recipe.version}} <span class="task-name">{{dep.task_name}}</span></a></li>
234 {% empty %}
235 <li class="muted">This task has no dependencies</li>
236 {% endfor %}
237 </ul>
238 </dd>
239 <dt>
240 <i class="icon-question-sign get-help" title="Tasks that depend on this task"></i>
241 Reverse dependencies
242 </dt>
243 <dd>
244 <ul>
245 {% for dep in rdeps %}
246 <li><a href="{%url 'task' dep.build.pk dep.pk%}" class="task-info" title="{{dep.get_executed_display}} | {{dep.get_outcome_display}}">{{dep.recipe.name}}_{{dep.recipe.version}} <span class="task-name">{{dep.task_name}}</span></a></li>
247 {% empty %}
248 <li class="muted">This task has no reverse dependencies</li>
249 {% endfor %}
250 </ul>
251</dl>
252
253{# Performance section - shown only for executed tasks #}
254{%if task.elapsed_time or task.cpu_usage or task.disk_io %}
255 <h2 class="details">Performance</h2>
256{% endif %}
257 <dl class="dl-horizontal">
258 {% if task.elapsed_time %}
259 <dt>
260 <i class="icon-question-sign get-help" title="How long it took the task to finish in seconds"></i>
261 Time (secs)
262 </dt>
263 <dd>{{task.elapsed_time|format_none_and_zero|floatformat:2}}</dd>
264 {% endif %}
265 {% if task.cpu_usage > 0 %}
266 <dt>
267 <i class="icon-question-sign get-help" title="The percentage of task CPU utilization"></i>
268 CPU usage
269 </dt>
270 <dd>{{task.cpu_usage|format_none_and_zero|floatformat:2}}%</dd>
271 {% endif %}
272 {% if task.disk_io > 0 %}
273 <dt>
274 <i class="icon-question-sign get-help" title="Number of miliseconds the task spent doing disk input and output"></i>
275 Disk I/O (ms)
276 </dt>
277 <dd>{{task.disk_io|format_none_and_zero}}</dd>
278 {% endif %}
279 </dl>
280
281</div>
282{% endblock %}
283
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
new file mode 100644
index 0000000000..d0c6f4e326
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -0,0 +1,133 @@
1{% extends "basebuildpage.html" %}
2{% load projecttags %}
3
4{% block localbreadcrumb %}
5<li>{{title}}</li>
6{% endblock %}
7
8{% block nav-tasks %}
9 {% if 'Tasks' == title %}
10 <li class="active"><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
11 {% else %}
12 <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
13 {% endif %}
14{% endblock %}
15{% block nav-buildtime %}
16 {% if 'Time' == title %}
17 <li class="active"><a href="{% url 'buildtime' build.pk %}">Time</a></li>
18 {% else %}
19 <li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
20 {% endif %}
21{% endblock %}
22{% block nav-cpuusage %}
23 {% if 'CPU usage' == title %}
24 <li class="active"><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
25 {% else %}
26 <li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
27 {% endif %}
28{% endblock %}
29{% block nav-diskio %}
30 {% if 'Disk I/O' == title %}
31 <li class="active"><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
32 {% else %}
33 <li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
34 {% endif %}
35{% endblock %}
36
37{% block buildinfomain %}
38<div class="span10">
39{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
40 <!-- Empty - no data in database -->
41 <div class="page-header">
42 <h1>{{title}}</h1>
43 </div>
44 <div class="alert alert-info lead">
45 No data was recorded for this build.
46 </div>
47
48{% else %}
49
50 <div class="page-header">
51 <h1>
52 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
53 {{objects.paginator.count}} task{{objects.paginator.count|pluralize}} found
54 {%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
55 No tasks found
56 {%else%}
57 {{title}}
58 {%endif%}
59 </h1>
60 </div>
61
62 {% if objects.paginator.count == 0 %}
63 <div class="row-fluid">
64 <div class="alert">
65 <form class="no-results input-append" id="searchform">
66 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
67 <button class="btn" type="submit" value="Search">Search</button>
68 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
69 </form>
70 </div>
71 </div>
72
73
74 {% else %}
75 {% include "basetable_top.html" %}
76
77 {% for task in objects %}
78 <tr {{ task|task_color }} id="{{task.order}}">
79 <td class="order">
80 <a href="{%url "task" build.pk task.pk%}">{{task.order}}</a>
81 </td>
82 <td class="recipe_name" >
83 <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.name}}</a>
84 </td>
85 <td class="recipe_version">
86 <a href="{% url "recipe" build.pk task.recipe.pk %}">{{task.recipe.version}}</a>
87 </td>
88 <td class="task_name">
89 <a href="{%url "task" build.pk task.pk%} ">{{task.task_name}}</a> {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="{{task.get_description}}"></i> {% endif %}
90 </td>
91 <td class="executed">
92 <a href="{%url "task" build.pk task.pk%} ">{{task.get_executed_display}}</a>
93 </td>
94 <td class="outcome">
95 <a href="{%url "task" build.pk task.pk%} ">{{task.get_outcome_display}} </a>
96 <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i>
97 </td>
98 <td class="cache_attempt">
99 <a href="{%url "task" build.pk task.pk%} ">{{task.get_sstate_result_display|format_none_and_zero}}</a>
100 </td>
101 <td class="time_taken">
102 {{task.elapsed_time|format_none_and_zero|floatformat:2}}
103 </td>
104 <td class="cpu_used">
105 {{task.cpu_usage|format_none_and_zero|floatformat:2}}{% if task.cpu_usage %}%{% endif %}
106 </td>
107 <td class="disk_io">
108 {{task.disk_io|format_none_and_zero}}
109 </td>
110 <td class="task_log">
111 {{task.logfile}}
112 </td>
113 </tr>
114 {% endfor %}
115
116 {% include "basetable_bottom.html" %}
117 {% endif %} {# objects.paginator.count #}
118{% endif %} {# empty #}
119</div>
120
121<script type="text/javascript">
122
123 $(document).ready(function() {
124 // enable blue hightlight animation for the order link
125 if (location.href.search('#') > -1) {
126 var task_order = location.href.split('#')[1];
127 $("#" + task_order).addClass("highlight");
128 }
129 });
130
131</script>
132
133{% endblock %}