diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/templates')
31 files changed, 2923 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..9ca9c9ac3b --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/base.html | |||
@@ -0,0 +1,74 @@ | |||
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> | ||
23 | function 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 | <a class="pull-right manual" target="_blank" href="http://www.yoctoproject.org/documentation/toaster-manual"> | ||
62 | <i class="icon-book"></i> | ||
63 | Toaster manual | ||
64 | </a> | ||
65 | </div> | ||
66 | </div> | ||
67 | |||
68 | <div class="container-fluid"> | ||
69 | {% block pagecontent %} | ||
70 | {% endblock %} | ||
71 | </div> | ||
72 | </body> | ||
73 | </html> | ||
74 | |||
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html new file mode 100755 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/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html new file mode 100644 index 0000000000..ac14363798 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html | |||
@@ -0,0 +1,85 @@ | |||
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}}})">«</a></li> | ||
13 | {%else%} | ||
14 | <li class="disabled"><a href="#">«</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}}})">»</a></li> | ||
21 | {%else%} | ||
22 | <li class="disabled"><a href="#">»</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 %}<option{%if i == request.GET.count %} selected{%endif%}>{{i}}</option> | ||
30 | {% endfor %} | ||
31 | {% endwith %} | ||
32 | </select> | ||
33 | </div> | ||
34 | </div> | ||
35 | |||
36 | <!-- Update page display settings --> | ||
37 | |||
38 | <script> | ||
39 | $(document).ready(function() { | ||
40 | |||
41 | // we load cookies for the column display | ||
42 | save = $.cookie('_displaycols_{{objectname}}'); | ||
43 | if (save != undefined) { | ||
44 | setting = save.split(';'); | ||
45 | for ( i = 0; i < setting.length; i++) { | ||
46 | if (setting[i].length > 0) { | ||
47 | splitlist = setting[i].split(':'); | ||
48 | id = splitlist[0], v = splitlist[1]; | ||
49 | if (v == 'true') { | ||
50 | $('.chbxtoggle#'+id).prop('checked', true); | ||
51 | } | ||
52 | else { | ||
53 | $('.chbxtoggle#'+id).prop('checked', false); | ||
54 | } | ||
55 | } | ||
56 | } | ||
57 | } | ||
58 | |||
59 | $('.chbxtoggle').each(function () { | ||
60 | showhideTableColumn($(this).attr('id'), $(this).is(':checked')) | ||
61 | }); | ||
62 | |||
63 | //turn edit columns dropdown into a multi-select menu | ||
64 | $('.dropdown-menu input, .dropdown-menu label').click(function(e) { | ||
65 | e.stopPropagation(); | ||
66 | }); | ||
67 | |||
68 | //show tooltip with applied filter | ||
69 | $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true}); | ||
70 | |||
71 | //progress bar tooltip | ||
72 | $('.progress, .lead span').tooltip({container:'table', placement:'top'}); | ||
73 | |||
74 | $(".pagesize").change(function () { | ||
75 | console.log("page size change"); | ||
76 | reload_params({"count":$(this).val()}); ; | ||
77 | }); | ||
78 | }); | ||
79 | </script> | ||
80 | |||
81 | <!-- modal filter boxes --> | ||
82 | {% for tc in tablecols %}{% if tc.filter %}{% with objectname=objectname f=tc.filter %} | ||
83 | {% include "filtersnippet.html" %} | ||
84 | {% endwith %}{% endif %} {% endfor %} | ||
85 | <!-- 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..22c389799a --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html | |||
@@ -0,0 +1,87 @@ | |||
1 | {% load projecttags %} | ||
2 | <!-- component to display a generic table --> | ||
3 | <script> | ||
4 | function showhideTableColumn(clname, sh) { | ||
5 | if (sh) $('.' + clname).show(100); | ||
6 | else $('.' + clname).hide(100); | ||
7 | |||
8 | // save cookie for all checkboxes | ||
9 | save = ''; | ||
10 | $('.chbxtoggle').each(function() { if ($(this).attr('id') != undefined) { save += ';' + $(this).attr('id') +':'+ $(this).is(':checked')} }) | ||
11 | $.cookie('_displaycols_{{objectname}}', save); | ||
12 | save = ''; | ||
13 | } | ||
14 | |||
15 | |||
16 | function filterTableRows(test) { | ||
17 | if (test.length > 0) { | ||
18 | var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') }); | ||
19 | $('tr.data').map( function (i, el) { | ||
20 | (! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show(); | ||
21 | }); | ||
22 | } else | ||
23 | { | ||
24 | $('tr.data').show(); | ||
25 | } | ||
26 | } | ||
27 | </script> | ||
28 | |||
29 | <!-- control header --> | ||
30 | <div class="navbar"> | ||
31 | <div class="navbar-inner"> | ||
32 | <form class="navbar-search input-append pull-left" id="searchform"> | ||
33 | <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%} | ||
34 | <input type="hidden" name="orderby" value="{{request.GET.orderby}}"> | ||
35 | <input type="hidden" name="page" value="1"> | ||
36 | <input type="hidden" name="count" value="{{request.GET.count}}"> | ||
37 | <button class="btn" type="submit" value="Search">Search</button> | ||
38 | </form> | ||
39 | <div class="pull-right"> | ||
40 | {% if tablecols %} | ||
41 | <div class="btn-group"> | ||
42 | <button class="btn dropdown-toggle" data-toggle="dropdown">Edit columns | ||
43 | <span class="caret"></span> | ||
44 | </button> | ||
45 | <!-- | ||
46 | {{tablecols|sortcols}} | ||
47 | --> | ||
48 | <ul class="dropdown-menu">{% for i in tablecols|sortcols %} | ||
49 | <li> | ||
50 | <label {% if not i.clclass %} class="checkbox muted" {%else%} class="checkbox" {%endif%}> | ||
51 | <input type="checkbox" class="chbxtoggle" {% if i.clclass %}id="{{i.clclass}}" value="ct{{i.name}}" {% if not i.hidden %}checked="checked"{%endif%} onchange="showhideTableColumn($(this).attr('id'), $(this).is(':checked'))" {%else%} checked disabled {% endif %}/> {{i.name}} | ||
52 | </label> | ||
53 | </li>{% endfor %} | ||
54 | </ul> | ||
55 | </div> | ||
56 | {% endif %} | ||
57 | <div style="display:inline"> | ||
58 | <span class="divider-vertical"></span> | ||
59 | <span class="help-inline" style="padding-top:5px;">Show rows:</span> | ||
60 | <select style="margin-top:5px;margin-bottom:0px;" class="pagesize"> | ||
61 | {% with "2 5 10 25 50 100" as list%} | ||
62 | {% for i in list.split %} <option{%if i == request.GET.count %} selected{%endif%}>{{i}}</option> | ||
63 | {% endfor %} | ||
64 | {% endwith %} | ||
65 | </select> | ||
66 | </div> | ||
67 | </div> | ||
68 | </div> <!-- navbar-inner --> | ||
69 | </div> | ||
70 | |||
71 | <!-- the actual rows of the table --> | ||
72 | <table class="table table-bordered table-hover tablesorter" id="otable"> | ||
73 | <thead> | ||
74 | <!-- Table header row; generated from "tablecols" entry in the context dict --> | ||
75 | <tr> | ||
76 | {% for tc in tablecols %}<th class="{{tc.dclass}} {{tc.clclass}}"> | ||
77 | {%if tc.qhelp%}<i class="icon-question-sign get-help" title="{{tc.qhelp}}"></i>{%endif%} | ||
78 | {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })" >{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%} | ||
79 | {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%} | ||
80 | {%if tc.filter%}<div class="btn-group pull-right"> | ||
81 | <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> | ||
82 | </div>{%endif%} | ||
83 | </th>{% endfor %} | ||
84 | </tr> | ||
85 | </thead> | ||
86 | <tbody> | ||
87 | |||
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">×</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..fa4b194eb9 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html | |||
@@ -0,0 +1,198 @@ | |||
1 | {% extends "basebuildpage.html" %} | ||
2 | {% load humanize %} | ||
3 | {% load projecttags %} | ||
4 | |||
5 | {% block parentbreadcrumb %} | ||
6 | {{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}}) | ||
7 | {% endblock %} | ||
8 | |||
9 | {% block buildinfomain %} | ||
10 | <!-- page title --> | ||
11 | <div class="row-fluid span10"> | ||
12 | <div class="page-header"> | ||
13 | <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1> | ||
14 | </div> | ||
15 | </div> | ||
16 | |||
17 | <!-- build result bar --> | ||
18 | <div class="row-fluid span10 pull-right"> | ||
19 | <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}"> | ||
20 | <div class="row-fluid lead"> | ||
21 | <span class="pull-left"><strong> | ||
22 | {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%} | ||
23 | </strong> on | ||
24 | {{build.completed_on|date:"d/m/y H:i"}} | ||
25 | </span> | ||
26 | {% if build.warnings_no or build.errors_no %} | ||
27 | with | ||
28 | {% endif %} | ||
29 | {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %} | ||
30 | {% if build.errors_no %} | ||
31 | <span > <i class="icon-minus-sign red"></i><strong><a href="#errors" class="error show-errors"> {{build.errors_no}} error{{build.errors_no|pluralize}}</a></strong></span> | ||
32 | {% endif %} | ||
33 | {% if build.warnings_no %} | ||
34 | {% if build.errors_no %} | ||
35 | and | ||
36 | {% endif %} | ||
37 | <span > <i class="icon-warning-sign yellow"></i><strong><a href="#warnings" class="warning show-warnings"> {{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a></strong></span> | ||
38 | {% endif %} | ||
39 | <span class="pull-right">Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent|sectohms }}</a></span> | ||
40 | {%endif%} | ||
41 | </div> | ||
42 | </div> | ||
43 | </div> | ||
44 | |||
45 | {% if build.errors_no %} | ||
46 | <div class="accordion span10 pull-right" id="errors"> | ||
47 | <div class="accordion-group"> | ||
48 | <div class="accordion-heading"> | ||
49 | <a class="accordion-toggle error toggle-errors"> | ||
50 | <h2 id="error-toggle"> | ||
51 | <i class="icon-minus-sign"></i> | ||
52 | {{build.errors_no}} error{{build.errors_no|pluralize}} | ||
53 | </h2> | ||
54 | </a> | ||
55 | </div> | ||
56 | <div class="accordion-body collapse in" id="collapse-errors"> | ||
57 | <div class="accordion-inner"> | ||
58 | <div class="span10"> | ||
59 | {% for error in logmessages %}{% if error.level == 2 %} | ||
60 | <div class="alert alert-error"> | ||
61 | <pre>{{error.message}}</pre> | ||
62 | </div> | ||
63 | {% endif %}{% endfor %} | ||
64 | </div> | ||
65 | </div> | ||
66 | </div> | ||
67 | </div> | ||
68 | </div> | ||
69 | {% endif %} | ||
70 | |||
71 | {%if build.outcome == build.SUCCEEDED%} | ||
72 | <!-- built images --> | ||
73 | <div class="row-fluid span10 pull-right"> | ||
74 | {% if hasImages %} | ||
75 | <h2>Images</h2> | ||
76 | {% for target in targets %} | ||
77 | {% if target.target.is_image %} | ||
78 | <div class="well dashboard-section"> | ||
79 | <h3><a href="{% url 'target' build.pk target.target.pk %}">{{target.target}}</a> | ||
80 | </h3> | ||
81 | <dl class="dl-horizontal"> | ||
82 | <dt>Packages included</dt> | ||
83 | <dd><a href="{% url 'target' build.pk target.target.pk %}">{{target.npkg}}</a></dd> | ||
84 | <dt>Total package size</dt> | ||
85 | <dd>{{target.pkgsz|filtered_filesizeformat}}</dd> | ||
86 | <dt> | ||
87 | <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> | ||
88 | <a href="{% url 'target' build.pk target.target.pk %}">License manifest</a> | ||
89 | </dt> | ||
90 | <dd><code>{{target.target.license_manifest_path}}</code></dd> | ||
91 | <dt> | ||
92 | <i class="icon-question-sign get-help" title="Image files are stored in <code>/build/tmp/deploy/images/</code>"></i> | ||
93 | Image files | ||
94 | </dt> | ||
95 | <dd> | ||
96 | <ul> | ||
97 | {% for i in target.imageFiles %} | ||
98 | <li>{{i.path}} | ||
99 | ({{i.size|filtered_filesizeformat}})</li> | ||
100 | {% endfor %} | ||
101 | </ul> | ||
102 | </dd> | ||
103 | </dl> | ||
104 | </div> | ||
105 | {% endif %} | ||
106 | {% endfor %} | ||
107 | {% endif %} | ||
108 | </div> | ||
109 | |||
110 | {%else%} | ||
111 | <!-- error dump --> | ||
112 | {%endif%} | ||
113 | |||
114 | <!-- build summary --> | ||
115 | <div class="row-fluid span10 pull-right"> | ||
116 | <h2>Build summary</h2> | ||
117 | <div class="well span4 dashboard-section" style="margin-left:0px;"> | ||
118 | <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4> | ||
119 | <dl> | ||
120 | <dt>Machine</dt><dd>{{build.machine}}</dd> | ||
121 | <dt>Distro</dt><dd>{{build.distro}}</dd> | ||
122 | <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%} | ||
123 | </dl> | ||
124 | </div> | ||
125 | <div class="well span4 dashboard-section"> | ||
126 | <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4> | ||
127 | <dl> | ||
128 | <dt>Total number of tasks</dt><dd><a href="{% url 'tasks' build.pk %}">{{build.task_build.all.count}}</a></dd> | ||
129 | <dt> | ||
130 | Tasks executed | ||
131 | <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> | ||
132 | </dt> | ||
133 | <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A1&count=25&search=&page=1&orderby=order%3A%2B">{% query build.task_build task_executed=1 order__gt=0 as exectask%}{{exectask.count}}</a></dd> | ||
134 | <dt> | ||
135 | Tasks not executed | ||
136 | <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> | ||
137 | </dt> | ||
138 | <dd><a href="{% url 'tasks' build.pk %}?filter=task_executed%3A0&count=25&search=&page=1&orderby=order%3A%2B">{% query build.task_build task_executed=0 order__gt=0 as noexectask%}{{noexectask.count}}</a></dd> | ||
139 | <dt> | ||
140 | Reuse | ||
141 | <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> | ||
142 | </dt> | ||
143 | <dd> | ||
144 | {% query build.task_build order__gt=0 as texec %} | ||
145 | {% if noexectask.count|multiply:100|divide:texec.count < 0 %} | ||
146 | 0 | ||
147 | {% else %} | ||
148 | {{noexectask.count|multiply:100|divide:texec.count}} | ||
149 | {% endif %} | ||
150 | % | ||
151 | </dd> | ||
152 | </dl> | ||
153 | </div> | ||
154 | <div class="well span4 dashboard-section"> | ||
155 | <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4> | ||
156 | <dl> | ||
157 | <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd> | ||
158 | <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd> | ||
159 | </dl> | ||
160 | </div> | ||
161 | </div> | ||
162 | |||
163 | {% if build.warnings_no %} | ||
164 | <div class="accordion span10 pull-right" id="warnings"> | ||
165 | <div class="accordion-group"> | ||
166 | <div class="accordion-heading"> | ||
167 | <a class="accordion-toggle warning toggle-warnings"> | ||
168 | <h2 id="warning-toggle"> | ||
169 | <i class="icon-warning-sign"></i> | ||
170 | {{build.warnings_no}} warning{{build.warnings_no|pluralize}} | ||
171 | </h2> | ||
172 | </a> | ||
173 | </div> | ||
174 | <div class="accordion-body collapse" id="collapse-warnings"> | ||
175 | <div class="accordion-inner"> | ||
176 | <div class="span10"> | ||
177 | {% for warning in logmessages %}{% if warning.level == 1 %} | ||
178 | <div class="alert alert-warning"> | ||
179 | <pre>{{warning.message}}</pre> | ||
180 | </div> | ||
181 | {% endif %}{% endfor %} | ||
182 | </div> | ||
183 | </div> | ||
184 | </div> | ||
185 | </div> | ||
186 | </div> | ||
187 | {% endif %} | ||
188 | |||
189 | <script type="text/javascript"> | ||
190 | $(document).ready(function() { | ||
191 | //show warnings section when requested from the previous page | ||
192 | if (location.href.search('#warnings') > -1) { | ||
193 | $('#collapse-warnings').addClass('in'); | ||
194 | } | ||
195 | }); | ||
196 | </script> | ||
197 | |||
198 | {% 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..749ae242ea --- /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 += ' ' + 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 += ' ' + 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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/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/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..a0c5a1e4f0 --- /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" data-toggle="tooltip" 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" data-toggle="tooltip" 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..0fe01165da --- /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" data-toggle="tooltip" 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" data-toggle="tooltip" 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 | , | ||
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..5888513486 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html | |||
@@ -0,0 +1,145 @@ | |||
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 + ' '; | ||
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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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 | |||
126 | <dt> | ||
127 | Layer branch | ||
128 | <i class="icon-question-sign get-help" data-toggle="tooltip" 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 | <dt> | ||
132 | Layer commit | ||
133 | <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git commit of the layer providing the recipe that builds this package"></i> | ||
134 | </dt> | ||
135 | |||
136 | <dd class="iscommit">{{package.recipe.layer_version.commit}}</dd> | ||
137 | <dt> | ||
138 | Layer directory | ||
139 | <i class="icon-question-sign get-help" data-toggle="tooltip" title="Path to the layer providing the recipe that builds this package"></i> | ||
140 | </dt> | ||
141 | <dd><code>{{package.recipe.layer_version.layer.local_path}}</code></dd> | ||
142 | </dl> | ||
143 | </div> <!-- row4 well --> | ||
144 | {% endblock twocolumns %} | ||
145 | {% 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}} </td> | ||
42 | <td class='sizecol'>{{runtime_dep.size|filtered_filesizeformat}} </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}} </td> | ||
86 | <td class='sizecol'>{{other_dep.size|filtered_filesizeformat}} </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}} </td> | ||
41 | <td class='sizecol'>{{reverse_dep.package.size|filtered_filesizeformat}} </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..0140b03c05 --- /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" data-toggle="tooltip" 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" data-toggle="tooltip" 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/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html new file mode 100644 index 0000000000..6e9cd23424 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/recipe.html | |||
@@ -0,0 +1,273 @@ | |||
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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" 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" data-toggle="tooltip" title="Path to the recipe .bb file"></i> | ||
62 | Recipe file | ||
63 | </dt> | ||
64 | <dd><code>{{object.file_path}}</code></dd> | ||
65 | <dt> | ||
66 | <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git branch of the layer providing the recipe"></i> | ||
67 | Layer branch | ||
68 | </dt> | ||
69 | <dd>{{layer_version.branch}}</dd> | ||
70 | <dt> | ||
71 | <i class="icon-question-sign get-help" data-toggle="tooltip" title="The Git commit of the layer providing the recipe"></i> | ||
72 | Layer commit | ||
73 | </dt> | ||
74 | <dd class="iscommit">{{layer_version.commit}}</dd> | ||
75 | </dl> | ||
76 | |||
77 | <h2 class="details">Tasks</h2> | ||
78 | {% if not tasks %} | ||
79 | <div class="alert alert-info"> | ||
80 | <strong>{{object.name}}_{{object.version}}</strong> does not have any tasks in this build. | ||
81 | </div> | ||
82 | {% else %} | ||
83 | <table class="table table-bordered table-hover"> | ||
84 | <thead> | ||
85 | <th> | ||
86 | <i class="icon-question-sign get-help" title="The running sequence of each task in the build"></i> | ||
87 | Order | ||
88 | </th> | ||
89 | <th> | ||
90 | <i class="icon-question-sign get-help" title="The name of the task"></i> | ||
91 | Task | ||
92 | </th> | ||
93 | <th> | ||
94 | <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> | ||
95 | Executed | ||
96 | </th> | ||
97 | <th> | ||
98 | <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> | ||
99 | Outcome | ||
100 | </th> | ||
101 | <th> | ||
102 | <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> | ||
103 | Cache attempt | ||
104 | </th> | ||
105 | </thead> | ||
106 | <tbody> | ||
107 | |||
108 | {% for task in tasks %} | ||
109 | |||
110 | <tr {{ task|task_color }} > | ||
111 | |||
112 | <td><a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.order}}</a></td> | ||
113 | <td> | ||
114 | <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.task_name}}</a> | ||
115 | {% if task.get_description %}<i class="icon-question-sign get-help hover-help" title="" data-original-title="{{task.get_description}}"></i> {% endif %} | ||
116 | </td> | ||
117 | |||
118 | <td><a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_executed_display}}</a></td> | ||
119 | |||
120 | <td> | ||
121 | <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_outcome_display}} </a> | ||
122 | <i class="icon-question-sign get-help hover-help" title="{{task.get_outcome_help}}"></i> | ||
123 | </td> | ||
124 | <td> | ||
125 | {% ifnotequal task.sstate_result task.SSTATE_NA %} | ||
126 | <a {{ task|task_color }} href="{% url "task" build.pk task.pk %}">{{task.get_sstate_result_display}}</a> | ||
127 | {% endifnotequal %} | ||
128 | </td> | ||
129 | |||
130 | </tr> | ||
131 | |||
132 | {% endfor %} | ||
133 | </tbody> | ||
134 | </table> | ||
135 | {% endif %} | ||
136 | </div> | ||
137 | <div class="tab-pane" id="packages-built" name="packages-built"> | ||
138 | {% if not packages %} | ||
139 | <div class="alert alert-info"> | ||
140 | <strong>{{object.name}}_{{object.version}}</strong> does not build any packages. | ||
141 | </div> | ||
142 | {% else %} | ||
143 | <table class="table table-bordered table-hover" style="margin-top:10px;"> | ||
144 | <thead> | ||
145 | <tr> | ||
146 | <th> | ||
147 | Package | ||
148 | </th> | ||
149 | <th> | ||
150 | Version | ||
151 | </th> | ||
152 | <th class="sizecol span2"> | ||
153 | Size | ||
154 | </th> | ||
155 | </tr> | ||
156 | </thead> | ||
157 | <tbody> | ||
158 | |||
159 | {% for package in packages|dictsort:"name" %} | ||
160 | |||
161 | <tr> | ||
162 | <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.name}}</a></td> | ||
163 | <td><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.version}}_{{package.revision}}</a></td> | ||
164 | <td class="sizecol"><a href="{% url "package_built_detail" build.pk package.pk %}">{{package.size|filtered_filesizeformat}}</a></td> | ||
165 | </tr> | ||
166 | |||
167 | {% endfor %} | ||
168 | |||
169 | </tbody> | ||
170 | </table> | ||
171 | {% endif %} | ||
172 | </div> | ||
173 | <div class="tab-pane" id="dependencies" name="dependencies"> | ||
174 | |||
175 | {% if not object.r_dependencies_recipe.all %} | ||
176 | <div class="alert alert-info"> | ||
177 | <strong>{{object.name}}_{{object.version}}</strong> has no build dependencies. | ||
178 | </div> | ||
179 | {% else %} | ||
180 | <table class="table table-bordered table-hover"> | ||
181 | <thead> | ||
182 | <tr> | ||
183 | <th> | ||
184 | Recipe | ||
185 | </th> | ||
186 | <th> | ||
187 | Version | ||
188 | </th> | ||
189 | </tr> | ||
190 | </thead> | ||
191 | <tbody> | ||
192 | |||
193 | {% for rr in object.r_dependencies_recipe.all|dictsort:"depends_on.name" %} | ||
194 | <tr> | ||
195 | <td><a href="{% url "recipe" build.pk rr.depends_on.pk %}">{{rr.depends_on.name}}</a></td> | ||
196 | <td><a href="{% url "recipe" build.pk rr.depends_on.pk %}">{{rr.depends_on.version}}</a></td> | ||
197 | </tr> | ||
198 | {% endfor %} | ||
199 | |||
200 | </tbody> | ||
201 | </table> | ||
202 | {% endif %} | ||
203 | |||
204 | </div> | ||
205 | <div class="tab-pane" id="brought-in-by" name="brought-in-by"> | ||
206 | |||
207 | {% if not object.r_dependencies_depends.all %} | ||
208 | <div class="alert alert-info"> | ||
209 | <strong>{{object.name}}_{{object.version}}</strong> has no reverse build dependencies. | ||
210 | </div> | ||
211 | {% else %} | ||
212 | <table class="table table-bordered table-hover"> | ||
213 | <thead> | ||
214 | <tr> | ||
215 | <th> | ||
216 | Recipe | ||
217 | </th> | ||
218 | <th> | ||
219 | Version | ||
220 | </th> | ||
221 | </tr> | ||
222 | </thead> | ||
223 | <tbody> | ||
224 | |||
225 | {% for rr in object.r_dependencies_depends.all|dictsort:"recipe.name" %} | ||
226 | <tr> | ||
227 | <td><a href="{% url "recipe" build.pk rr.recipe.pk %}">{{rr.recipe.name}}</a></td> | ||
228 | <td><a href="{% url "recipe" build.pk rr.recipe.pk %}">{{rr.recipe.version}}</a></td> | ||
229 | </tr> | ||
230 | {% endfor %} | ||
231 | |||
232 | </tbody> | ||
233 | </table> | ||
234 | {% endif %} | ||
235 | |||
236 | </div> | ||
237 | </div> | ||
238 | </div> | ||
239 | |||
240 | <div class="row span4 well"> | ||
241 | <h2>About {{object.name}}</h2> | ||
242 | <dl> | ||
243 | {% if object.summary %} | ||
244 | <dt>Summary</dt> | ||
245 | <dd><p>{{object.summary}}</p></dd> | ||
246 | {% endif %} | ||
247 | {% if object.description %} | ||
248 | <dt>Description</dt> | ||
249 | <dd><p>{{object.description}}</dd> | ||
250 | {% endif %} | ||
251 | {% if object.homepage %} | ||
252 | <dt>Homepage</dt> | ||
253 | <dd><a href="{{object.homepage}}">{{object.homepage}}</a></dd> | ||
254 | {% endif %} | ||
255 | {% if object.bugtracker %} | ||
256 | <dt>Bugtracker</dt> | ||
257 | <dd><a href="{{object.bugtracker}}">{{object.bugtracker}}</a></dd> | ||
258 | {% endif %} | ||
259 | {% if object.section %} | ||
260 | <dt> | ||
261 | Section | ||
262 | <i class="icon-question-sign get-help" data-toggle="tooltip" title="The section in which recipes should be categorized"></i> | ||
263 | </dt> | ||
264 | <dd>{{object.section}}</dd> | ||
265 | {% endif %} | ||
266 | {% if object.license %} | ||
267 | <dt>License</dt> | ||
268 | <dd>{{object.license}}</dd> | ||
269 | {% endif %} | ||
270 | </dl> | ||
271 | </div> | ||
272 | |||
273 | {% endblock %} | ||
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html new file mode 100755 index 0000000000..907b83d269 --- /dev/null +++ b/bitbake/lib/toaster/toastergui/templates/recipes.html | |||
@@ -0,0 +1,102 @@ | |||
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 | {% if recipe.r_dependencies_recipe.all.count %} | ||
49 | <a class="btn" | ||
50 | title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies" | ||
51 | data-content="<ul class='unstyled'> | ||
52 | {% for i in recipe.r_dependencies_recipe.all|dictsort:"depends_on.name"%} | ||
53 | <li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li> | ||
54 | {% endfor %} | ||
55 | </ul>"> | ||
56 | {{recipe.r_dependencies_recipe.all.count}} | ||
57 | </a> | ||
58 | {% endif %} | ||
59 | </td> | ||
60 | <!-- Brought in by --> | ||
61 | <td class="depends_by"> | ||
62 | {% if recipe.r_dependencies_depends.all.count %} | ||
63 | <a class="btn" | ||
64 | title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies" | ||
65 | data-content="<ul class='unstyled'> | ||
66 | {% for i in recipe.r_dependencies_depends.all|dictsort:"recipe.name"%} | ||
67 | <li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li> | ||
68 | {% endfor %} | ||
69 | </ul>"> | ||
70 | {{recipe.r_dependencies_depends.all.count}} | ||
71 | </a> | ||
72 | {% endif %} | ||
73 | </td> | ||
74 | <!-- Recipe file --> | ||
75 | <td class="recipe_file">{{recipe.file_path}}</td> | ||
76 | <!-- Section --> | ||
77 | <td class="recipe_section">{{recipe.section}}</td> | ||
78 | <!-- License --> | ||
79 | <td class="recipe_license">{{recipe.license}}</td> | ||
80 | <!-- Layer --> | ||
81 | <td class="layer_version__layer__name">{{recipe.layer_version.layer.name}}</td> | ||
82 | <!-- Layer branch --> | ||
83 | <td class="layer_version__branch">{{recipe.layer_version.branch}}</td> | ||
84 | <!-- Layer commit --> | ||
85 | <td class="layer_version__layer__commit"> | ||
86 | <a class="btn" | ||
87 | data-content="<ul class='unstyled'> | ||
88 | <li>{{recipe.layer_version.commit}}</li> | ||
89 | </ul>"> | ||
90 | {{recipe.layer_version.commit|truncatechars:13}} | ||
91 | </a> | ||
92 | </td> | ||
93 | <!-- Layer directory --> | ||
94 | <td class="layer_version__layer__local_path">{{recipe.layer_version.layer.local_path}}</td> | ||
95 | </tr> | ||
96 | |||
97 | {% endfor %} | ||
98 | |||
99 | {% include "basetable_bottom.html" %} | ||
100 | {% endif %} | ||
101 | </div> | ||
102 | {% 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..3a0c4d7998 --- /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" data-toggle="tooltip" 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" data-toggle="tooltip" 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="package-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/task.html b/bitbake/lib/toaster/toastergui/templates/task.html new file mode 100644 index 0000000000..455599932c --- /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;" data-toggle="tooltip" 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..77d38b00de --- /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="" data-original-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 %} | ||