* [PATCH 00/14] Toaster patchset
@ 2015-01-27 14:27 Alex DAMIAN
2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN
` (13 more replies)
0 siblings, 14 replies; 16+ messages in thread
From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw)
To: bitbake-devel; +Cc: Alexandru DAMIAN
From: Alexandru DAMIAN <alexandru.damian@intel.com>
Hello,
This is a Toaster bug fixing patchset, clearing up issues in the Project interface.
The patches have been reviewed on the toaster mailing list. Can you please pull
at your own convenience ?
Cheers,
Alex
The following changes since commit 9b5b1bd7d77e3f5886f6c557d3b750de1f6d6025:
siggen: Ensure taskdata default functions exist in base class (2015-01-23 14:39:40 +0000)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib adamian/20150127-submission-bb
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=adamian/20150127-submission-bb
Alexandru DAMIAN (1):
toastergui: update project build listing
Alexandru Damian (1):
toasterui: do not filter images by extension
Belen Barros Pena (12):
toaster: make layouts consistent
toaster: apply common styles to right hand column of detail pages
toastergui: Generic message for the layer details empty states
toastergui: remove redundant style declaration
toastergui: consistent add / remove layer notifications
toastergui: give the add dependencies form some breathing space
toastergui: add 'show all' link to no results page
toastergui: set column width in layer details page
toastergui: hide table controls when when less than 10 entries
toastergui: consistent capitals in button
toastergui: remove recipe id links to the layer index
toastergui: alignment fix
lib/bb/ui/buildinfohelper.py | 2 +-
lib/toaster/bldcontrol/models.py | 9 ++
lib/toaster/toastergui/static/css/default.css | 5 +-
lib/toaster/toastergui/static/js/layerdetails.js | 14 +--
.../toastergui/templates/baseprojectpage.html | 12 +--
.../toastergui/templates/buildrequestdetails.html | 67 ++++++++++++++
lib/toaster/toastergui/templates/layerdetails.html | 65 ++++++-------
.../toastergui/templates/managed_builds.html | 18 ++--
.../toastergui/templates/managed_mrb_section.html | 42 ++++++---
.../toastergui/templates/package_detail_base.html | 2 +-
lib/toaster/toastergui/templates/project.html | 4 +-
.../toastergui/templates/projectbuilds.html | 20 ++--
lib/toaster/toastergui/templates/recipe.html | 6 +-
lib/toaster/toastergui/urls.py | 2 +
lib/toaster/toastergui/views.py | 103 +++++++++++++--------
15 files changed, 248 insertions(+), 123 deletions(-)
create mode 100644 lib/toaster/toastergui/templates/buildrequestdetails.html
--
1.9.1
^ permalink raw reply [flat|nested] 16+ messages in thread* [PATCH 01/14] toaster: make layouts consistent 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 02/14] toaster: apply common styles to right hand column of detail pages Alex DAMIAN ` (12 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel; +Cc: Alexandru DAMIAN From: Belen Barros Pena <belen.barros.pena@intel.com> The layer details page should have the same layout as all other detail pages (recipes, packages). For this to happen, the basebuilddetailpage.html and baseprojectpage.html templates should use the same layout, and so should the layerdetails.html and recipe.html templates. This patch also capitalises the string 'All layers' in the breadcrumb of layerdetails.html as all other breadcrumb elements. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> --- lib/toaster/toastergui/templates/baseprojectpage.html | 12 ++++-------- lib/toaster/toastergui/templates/layerdetails.html | 17 ++++------------- lib/toaster/toastergui/templates/project.html | 4 ++-- 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/lib/toaster/toastergui/templates/baseprojectpage.html b/lib/toaster/toastergui/templates/baseprojectpage.html index 95a9f47..e140925 100644 --- a/lib/toaster/toastergui/templates/baseprojectpage.html +++ b/lib/toaster/toastergui/templates/baseprojectpage.html @@ -4,7 +4,7 @@ {% block pagecontent %} - <div class=""> + <div class="row-fluid"> <!-- Breadcrumbs --> <div class="section"> <ul class="breadcrumb" id="breadcrumb"> @@ -28,14 +28,10 @@ </script> </div> - <div> + <!-- Begin main page container --> + {% block projectinfomain %}{% endblock %} + <!-- End main container --> - <!-- Begin main page container --> - {% block projectinfomain %}{% endblock %} - <!-- End main container --> - - - </div> </div> diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 5bed0f8..22e99e0 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -3,7 +3,7 @@ {% load humanize %} {% load static %} {% block localbreadcrumb %} -<li><a href="{% url 'layers' %}">All Layers</a></li> +<li><a href="{% url 'layers' %}">All layers</a></li> <li> {{layerversion.layer.name}} ({{layerversion.commit|truncatechars:13}}) </li> @@ -63,18 +63,13 @@ {% endif %} {% include "layers_dep_modal.html" %} - <div class="container-fluid top-padded"> - <div class="row-fluid"> - <div class="span11"> + <div class="row-fluid span11"> <div class="page-header"> <h1>{{layerversion.layer.name}} <small class="commit" data-toggle="tooltip" title="{{layerversion.commit}}">({{layerversion.commit|truncatechars:13}})</small></h1> </div> - </div> </div> - <div class="row-fluid"> - <div class="span7"> - <div class="tabbable"> + <div class="row-fluid span7 tabbable"> <div class="alert alert-info lead" id="alert-area" style="display:none"> <button type="button" class="close" id="dismiss-alert" data-dismiss="alert">×</button> <span id="alert-msg"></span> @@ -91,7 +86,6 @@ <a data-toggle="tab" href="#machines" id="machines-tab">Machines ({{total_machines}})</a> </li> </ul> - </div> <div class="tab-content"> <span class="button-place"> {% if layer_in_project == 0 %} @@ -435,7 +429,7 @@ </div> </div> </div> - <div class="row span4 well"> + <div class="row-fluid span4 well"> <h2>About {{layerversion.layer.name}}</h2> <dl> @@ -480,7 +474,4 @@ </dl> </div> - </div> - </div> - </div> {% endblock %} diff --git a/lib/toaster/toastergui/templates/project.html b/lib/toaster/toastergui/templates/project.html index b8579e4..3b75d19 100644 --- a/lib/toaster/toastergui/templates/project.html +++ b/lib/toaster/toastergui/templates/project.html @@ -91,7 +91,7 @@ vim: expandtab tabstop=2 <div class="well"> <form class="build-form" ng-submit="buildNamedTarget()"> <div class="input-append controls"> - <input type="text" class="huge span7" placeholder="Type the target(s) you want to build" autocomplete="off" ng-model="targetName" typeahead="e.name for e in getAutocompleteSuggestions('targets', $viewValue)|filter:$viewValue" typeahead-template-url="suggestion_details" ng-disabled="!layers.length"/> + <input type="text" class="huge input-xxlarge" placeholder="Type the target(s) you want to build" autocomplete="off" ng-model="targetName" typeahead="e.name for e in getAutocompleteSuggestions('targets', $viewValue)|filter:$viewValue" typeahead-template-url="suggestion_details" ng-disabled="!layers.length"/> <button type="submit" class="btn btn-large btn-primary" ng-disabled="!targetName.length"> Build </button> @@ -337,7 +337,7 @@ vim: expandtab tabstop=2 <p class="link-action"> <a href="{% url 'projectconf' project.id %}" class="link">Edit configuration variables</a> <i data-original-title="You can set other project configuration options here. Each option, like everything else in the build system, is a variable - value pair" class="icon-question-sign get-help heading-help" title=""></i> - </p> + </p> </div> </div> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 02/14] toaster: apply common styles to right hand column of detail pages 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN 2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 03/14] toastergui: Generic message for the layer details empty states Alex DAMIAN ` (11 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> Layer, recipe and package details pages have a right column with additional information. This commit standardises the formatting of the content in that right column across all these pages by creating a new css class .item-info in default.css Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/static/css/default.css | 3 +-- lib/toaster/toastergui/templates/layerdetails.html | 2 +- lib/toaster/toastergui/templates/package_detail_base.html | 2 +- lib/toaster/toastergui/templates/recipe.html | 6 +++--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/toaster/toastergui/static/css/default.css b/lib/toaster/toastergui/static/css/default.css index a3fa0dd..5eeeea4 100644 --- a/lib/toaster/toastergui/static/css/default.css +++ b/lib/toaster/toastergui/static/css/default.css @@ -38,7 +38,7 @@ dd code, .alert code { white-space: pre-wrap; word-break: break-all; word-wrap: dd ul { list-style-type: none; margin: 0px; } dt, dd {line-height: 25px; } dd li { line-height: 25px; } -dd p { line-height: 20px; } +.item-info dd { line-height: 20px; margin-bottom: 10px; } /* Style the filter modal dialogs */ .modal { width: 800px; margin-left: -400px; } @@ -200,7 +200,6 @@ dl textarea { resize: vertical; } .lead .help-block { font-size: 14px; line-height: 20px; font-weight: normal; } .button-place .btn { margin: 0 0 20px 0; } .tooltip-inner { max-width: 250px; } -dd > span { line-height: 20px; } .new-build { padding: 20px; } .new-build li { line-height: 30px; } .new-build h6 { margin: 10px 0 0 0; color: #5a5a5a; } diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 22e99e0..9286df6 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -431,7 +431,7 @@ </div> <div class="row-fluid span4 well"> <h2>About {{layerversion.layer.name}}</h2> - <dl> + <dl class="item-info"> <dt> Summary diff --git a/lib/toaster/toastergui/templates/package_detail_base.html b/lib/toaster/toastergui/templates/package_detail_base.html index dfeba55..ad75454 100644 --- a/lib/toaster/toastergui/templates/package_detail_base.html +++ b/lib/toaster/toastergui/templates/package_detail_base.html @@ -54,7 +54,7 @@ <h2>Package information</h2> <!-- info presented as definition list --> - <dl> + <dl class="item-info"> <dt> Size <i class="icon-question-sign get-help" title="The size of the package"></i> diff --git a/lib/toaster/toastergui/templates/recipe.html b/lib/toaster/toastergui/templates/recipe.html index b20c65e..d91768d 100644 --- a/lib/toaster/toastergui/templates/recipe.html +++ b/lib/toaster/toastergui/templates/recipe.html @@ -250,14 +250,14 @@ <div class="row span4 well"> <h2>About {{object.name}}</h2> - <dl> + <dl class="item-info"> {% if object.summary %} <dt>Summary</dt> - <dd><p>{{object.summary}}</p></dd> + <dd>{{object.summary}}</dd> {% endif %} {% if object.description %} <dt>Description</dt> - <dd><p>{{object.description}}</dd> + <dd>{{object.description}}</dd> {% endif %} {% if object.homepage %} <dt>Homepage</dt> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 03/14] toastergui: Generic message for the layer details empty states 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN 2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN 2015-01-27 14:27 ` [PATCH 02/14] toaster: apply common styles to right hand column of detail pages Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 04/14] toastergui: remove redundant style declaration Alex DAMIAN ` (10 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> In the layer details page, change the message you see when the number of targets or machines provided by a layer is 0, either because that's what's reported by a layer index instance, or because Toaster does not have any information about the layer. The new message is more generic, in order to fit layers from all layer sources. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/templates/layerdetails.html | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 9286df6..207197bce 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -184,9 +184,7 @@ <div name="targets" id="targets" class="tab-pane"> {% if total_targets == 0 %} <div class="alert alert-info"> - <strong>There is no target data for {{layerversion.layer.name}} ... yet</strong> <br /> - Toaster learns about layers as they are built. Once you have used {{layerversion.layer.name}} in a build, Toaster will show you - here the targets it provides. + There is no target information for the <strong> {{layerversion.layer.name}} </strong> layer. </div> {% else %} @@ -313,9 +311,7 @@ <div name="machines" id="machines" class="tab-pane"> {% if total_machines == 0 %} <div class="alert alert-info"> - <strong>There is no machine data for {{layerversion.layer.name}} ... yet</strong> <br /> - Toaster learns about layers as they are built. Once you have used {{layerversion.layer.name}} in a build, Toaster will show you - here the machines it provides. + There is no machine information for the <strong>{{layerversion.layer.name}}</strong> layer. </div> {% else %} -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 04/14] toastergui: remove redundant style declaration 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (2 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 03/14] toastergui: Generic message for the layer details empty states Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 05/14] toastergui: consistent add / remove layer notifications Alex DAMIAN ` (9 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> The bottom margin for dd tags nested inside forms is set twice. Delete one of them. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/static/css/default.css | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/toaster/toastergui/static/css/default.css b/lib/toaster/toastergui/static/css/default.css index 5eeeea4..cb27342 100644 --- a/lib/toaster/toastergui/static/css/default.css +++ b/lib/toaster/toastergui/static/css/default.css @@ -184,7 +184,6 @@ a code:hover { color: #005580; } .control-group { margin-bottom: 0px; } #project-details form { margin: 0px; } dd form { margin: 10px 0 0 0; } -dd form { margin-bottom: 0px; } dl textarea { resize: vertical; } .navbar-fixed-top { z-index: 1; } .popover { z-index: 2; } -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 05/14] toastergui: consistent add / remove layer notifications 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (3 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 04/14] toastergui: remove redundant style declaration Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 06/14] toastergui: give the add dependencies form some breathing space Alex DAMIAN ` (8 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> In my struggle to ensure consistency in the format and content of the notifications we show when you add and remove layers to a project, I've: * added the project name to the notifications in the layer details page * removed the 'Go to project configuration' link from the notifications in the layer details page This changes align the notifications we show in the layer details page with the ones we show in the 'all' pages. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/static/js/layerdetails.js | 10 ++++++---- lib/toaster/toastergui/templates/layerdetails.html | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/toaster/toastergui/static/js/layerdetails.js b/lib/toaster/toastergui/static/js/layerdetails.js index 41cbf4b..2addecd 100644 --- a/lib/toaster/toastergui/static/js/layerdetails.js +++ b/lib/toaster/toastergui/static/js/layerdetails.js @@ -211,7 +211,7 @@ function layerDetailsPageInit (ctx) { addRmLayerBtn.prepend("<span class=\"icon-trash\"></span>"); if (depsList) { - alertMsg.append("You have added <strong>"+(depsList.length+1)+"</strong> layers: <span id=\"layer-affected-name\"></span> and its dependencies "); + alertMsg.append("You have added <strong>"+(depsList.length+1)+"</strong> layers to <a id=\"project-affected-name\"></a>: <span id=\"layer-affected-name\"></span> and its dependencies "); /* Build the layer deps list */ depsList.map(function(layer, i){ @@ -227,7 +227,7 @@ function layerDetailsPageInit (ctx) { alertMsg.append(link); }); } else { - alertMsg.append("You have added <strong>1</strong> layer: <span id=\"layer-affected-name\"></span>"); + alertMsg.append("You have added <strong>1</strong> layer to <a id=\"project-affected-name\"></a>: <span id=\"layer-affected-name\"></span>"); } } else { /* disable and switch all the button states */ @@ -252,10 +252,12 @@ function layerDetailsPageInit (ctx) { break; } - alertMsg.append("You have deleted <strong>1</strong> layer: <span id=\"layer-affected-name\"></span>"); + alertMsg.append("You have deleted <strong>1</strong> layer from <a id=\"project-affected-name\"></a>: <span id=\"layer-affected-name\"></span>"); } - alertMsg.children("#layer-affected-name").text(ctx.layerVersion.name); + alertMsg.children("#layer-affected-name").html("<strong>" + ctx.layerVersion.name + "</strong>"); + alertMsg.children("#project-affected-name").text(ctx.projectName); + alertMsg.children("#project-affected-name").attr("href", ctx.projectPageUrl); $("#alert-area").show(); } diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 207197bce..a89ffb0 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -23,6 +23,7 @@ xhrDataTypeaheadUrl : "{% url 'xhr_datatypeahead' %}", xhrUpdateLayerUrl : "{% url 'xhr_updatelayer' %}", projectId : {{project.id}}, + projectName : "{{project.name}}", numTargets : {{total_targets}}, numMachines: {{machines|length}}, layerVersion : { @@ -73,7 +74,6 @@ <div class="alert alert-info lead" id="alert-area" style="display:none"> <button type="button" class="close" id="dismiss-alert" data-dismiss="alert">×</button> <span id="alert-msg"></span> - <p style="margin-top:10px;"><a href="{% url 'project' project.id %}">Go to project configuration</a></p> </div> <ul class="nav nav-pills"> <li class="active"> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 06/14] toastergui: give the add dependencies form some breathing space 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (4 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 05/14] toastergui: consistent add / remove layer notifications Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 07/14] toastergui: add 'show all' link to no results page Alex DAMIAN ` (7 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> In the editable version of the layer details page, the form to add dependencies needs some distance from the dependency list. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/static/css/default.css | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/toaster/toastergui/static/css/default.css b/lib/toaster/toastergui/static/css/default.css index cb27342..1095254 100644 --- a/lib/toaster/toastergui/static/css/default.css +++ b/lib/toaster/toastergui/static/css/default.css @@ -206,6 +206,7 @@ dl textarea { resize: vertical; } .new-build form { margin: 5px 0 0; } .new-build .input-append { margin-bottom: 0; } #build-selected { margin-top: 15px; } +div.add-deps { margin-top: 15px; } .animate-repeat { -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 07/14] toastergui: add 'show all' link to no results page 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (5 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 06/14] toastergui: give the add dependencies form some breathing space Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 08/14] toastergui: set column width in layer details page Alex DAMIAN ` (6 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> When you search for targets or machines in the layer details page and your search returns no results, you should see a 'show all' link that you can click to clear the search and display all table entries. [YOCTO #7218] Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/static/js/layerdetails.js | 4 ++-- lib/toaster/toastergui/templates/layerdetails.html | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/toaster/toastergui/static/js/layerdetails.js b/lib/toaster/toastergui/static/js/layerdetails.js index 2addecd..2793225 100644 --- a/lib/toaster/toastergui/static/js/layerdetails.js +++ b/lib/toaster/toastergui/static/js/layerdetails.js @@ -381,12 +381,12 @@ function layerDetailsPageInit (ctx) { }); /* Clear the current search selection and reload the results */ - $("#target-search-clear").click(function(){ + $(".target-search-clear").click(function(){ $("#target-search").val(""); $(this).parents("form").submit(); }); - $("#machine-search-clear").click(function(){ + $(".machine-search-clear").click(function(){ $("#machine-search").val(""); $(this).parents("form").submit(); }); diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index a89ffb0..f8f2d7a 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -205,11 +205,14 @@ <input type="text" id="target-search" name="targets_search" placeholder="Search targets" class="input-xlarge" value="{{request.GET.targets_search}}"> {% if request.GET.targets_search %} - <a class="add-on btn" id="target-search-clear"> + <a class="add-on btn target-search-clear"> <i class="icon-remove"></i> </a> {% endif %} <button type="submit" class="btn">Search</button> + {% if targets.paginator.count == 0 %} + <button type="submit" class="btn btn-link target-search-clear">Show all targets</a> + {% endif %} </form> {% endif %} @@ -332,11 +335,14 @@ <input type="text" id="machine-search" name="machines_search" placeholder="Search machines" class="input-xlarge" value="{{request.GET.machines_search}}"> {% if request.GET.machines_search %} - <a class="add-on btn" id="machine-search-clear"> + <a class="add-on btn machine-search-clear"> <i class="icon-remove"></i> </a> {% endif %} <button type="submit" class="btn">Search</button> + {% if machines.paginator.count == 0 %} + <button type="submit" class="btn btn-link machine-search-clear">Show all machines</a> + {% endif %} </form> {% endif %} -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 08/14] toastergui: set column width in layer details page 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (6 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 07/14] toastergui: add 'show all' link to no results page Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 09/14] toastergui: hide table controls when when less than 10 entries Alex DAMIAN ` (5 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> Set the width of the action columns to span2 to stop the buttons from wrapping as much as possible. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/templates/layerdetails.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index f8f2d7a..6c5e785 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -254,7 +254,7 @@ Target version </th> <th class="span4">Description</th> - <th>Build target</th> + <th class="span2">Build target</th> </tr> </thead> <tbody> @@ -380,7 +380,7 @@ {% endif %} </th> <th>Description</th> - <th>Select machine</th> + <th class="span2">Select machine</th> </tr> </thead> <tbody> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 09/14] toastergui: hide table controls when when less than 10 entries 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (7 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 08/14] toastergui: set column width in layer details page Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 10/14] toastergui: consistent capitals in button Alex DAMIAN ` (4 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> The 'show rows' and pagination controls in the layer details page should only show when there are more than 10 entries in a table. [YOCTO #7217] Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/templates/layerdetails.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 6c5e785..1daf9b9 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -223,6 +223,7 @@ </div> {% else %} + {% if total_targets > 10 %} <div class="pull-right"> <span class="help-inline" style="padding-top:5px;">Show rows:</span> <select style="margin-top:5px;margin-bottom:0px;" class="pagesize"> @@ -237,6 +238,7 @@ {% endwith %} </select> </div> + {% endif %} </div> <table class="table table-bordered table-hover"> @@ -274,6 +276,7 @@ </tbody> </table> + {% if total_targets > 10 %} <!-- Show pagination controls --> <div class="pagination"> <ul> @@ -308,6 +311,7 @@ </div> {% endif %} {% endif %} + {% endif %} </div> @@ -351,8 +355,10 @@ </div> <!-- end row-fluid --> </div> + {% else %} + {% if total_machines > 10 %} <div class="pull-right"> <span class="help-inline" style="padding-top:5px;">Show rows:</span> <select style="margin-top:5px;margin-bottom:0px;" class="pagesize"> @@ -367,6 +373,8 @@ {% endwith %} </select> </div> + {% endif %} + </div> <table class="table table-bordered table-hover"> @@ -394,6 +402,7 @@ </tbody> </table> + {% if total_machines > 10 %} <!-- Show pagination controls --> <div class="pagination"> <ul> @@ -428,6 +437,7 @@ </div> {% endif %} {% endif %} + {% endif %} </div> </div> </div> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 10/14] toastergui: consistent capitals in button 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (8 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 09/14] toastergui: hide table controls when when less than 10 entries Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 11/14] toastergui: remove recipe id links to the layer index Alex DAMIAN ` (3 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> Capitalise correctly the 'Build target' button label in the layer details page: it should match the table heading. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/templates/layerdetails.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 1daf9b9..2b57561 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -270,7 +270,7 @@ </td> <td>{{target.version}}</td> <td>{{target.summary}}</td> - <td><button class="btn btn-block build-target-btn" data-target-name="{{target.name}}" {% if layer_in_project == 0 %}disabled="disabled"{% endif %} >Build Target</button></td> + <td><button class="btn btn-block build-target-btn" data-target-name="{{target.name}}" {% if layer_in_project == 0 %}disabled="disabled"{% endif %} >Build target</button></td> </tr> {% endfor %} </tbody> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 11/14] toastergui: remove recipe id links to the layer index 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (9 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 10/14] toastergui: consistent capitals in button Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 12/14] toastergui: alignment fix Alex DAMIAN ` (2 subsequent siblings) 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel From: Belen Barros Pena <belen.barros.pena@intel.com> Toaster cannot use the recipe id to link to the layer index, because recipe ids can change. We need to search by the recipe name instead. This patch removes the recipe id link from the layer details page and replaces it with a search by the recipe name. It also makes sure links to the layer index open in a new tab/window. [YOCTO #7194] [YOCTO #7193] Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> --- lib/toaster/toastergui/templates/layerdetails.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 2b57561..84a21d7 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -265,7 +265,7 @@ <td> {{target.name}} {% if target.up_id %} - <a href="http://layers.openembedded.org/layerindex/recipe/{{target.up_id}}/" class="icon-share get-info"></a> + <a href="{{target.get_layersource_view_url}}" class="icon-share get-info" target="_blank"></a> {% endif %} </td> <td>{{target.version}}</td> -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 12/14] toastergui: alignment fix 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (10 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 11/14] toastergui: remove recipe id links to the layer index Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 13/14] toasterui: do not filter images by extension Alex DAMIAN 2015-01-27 14:27 ` [PATCH 14/14] toastergui: update project build listing Alex DAMIAN 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel; +Cc: Alexandru DAMIAN From: Belen Barros Pena <belen.barros.pena@intel.com> Align horizontally the pagination and show rows controls at the bottom of the layer details page. Signed-off-by: Belen Barros Pena <belen.barros.pena@intel.com> Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> --- lib/toaster/toastergui/templates/layerdetails.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 84a21d7..4ffd071 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -295,8 +295,8 @@ {%endif%} </ul> <div class="pull-right"> - <span class="help-inline" style="padding-top:5px;">Show rows:</span> - <select style="margin-top:5px;margin-bottom:0px;" class="pagesize"> + <span class="help-inline" style="padding-bottom:10px;">Show rows:</span> + <select class="pagesize"> {% with "10 25 50 100 150" as list%} {% for i in list.split %} {% if request.session.limit == i %} @@ -421,8 +421,8 @@ {%endif%} </ul> <div class="pull-right"> - <span class="help-inline" style="padding-top:5px;">Show rows:</span> - <select style="margin-top:5px;margin-bottom:0px;" class="pagesize"> + <span class="help-inline" style="padding-bottom:10px;">Show rows:</span> + <select class="pagesize"> {% with "10 25 50 100 150" as list%} {% for i in list.split %} {% if request.session.limit == i %} -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 13/14] toasterui: do not filter images by extension 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (11 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 12/14] toastergui: alignment fix Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 2015-01-27 14:27 ` [PATCH 14/14] toastergui: update project build listing Alex DAMIAN 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel; +Cc: Alexandru Damian From: Alexandru Damian <alexandru.damian@intel.com> ToasterUI filters build artifacts by extension in order to determine if a build artifact is an image or not. Using IMAGE_FSTYPES for this purpose is not correct as the varible value holding image extensions is just a coincidence. So we just look if the filename contains the "rootfs" magic string, which is a pretty good approximation. [YOCTO #7213] Signed-off-by: Alexandru Damian <alexandru.damian@intel.com> --- lib/bb/ui/buildinfohelper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bb/ui/buildinfohelper.py b/lib/bb/ui/buildinfohelper.py index be0de6b..4e2d4a7 100644 --- a/lib/bb/ui/buildinfohelper.py +++ b/lib/bb/ui/buildinfohelper.py @@ -770,7 +770,7 @@ class BuildInfoHelper(object): if t.is_image == True: output_files = list(evdata.viewkeys()) for output in output_files: - if t.target in output and output.split('.rootfs.')[1] in image_fstypes: + if t.target in output and 'rootfs' in output and not output.endswith(".manifest"): self.orm_wrapper.save_target_image_file_information(t, output, evdata[output]) def update_artifact_image_file(self, event): -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 14/14] toastergui: update project build listing 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN ` (12 preceding siblings ...) 2015-01-27 14:27 ` [PATCH 13/14] toasterui: do not filter images by extension Alex DAMIAN @ 2015-01-27 14:27 ` Alex DAMIAN 13 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-01-27 14:27 UTC (permalink / raw) To: bitbake-devel; +Cc: Alexandru DAMIAN From: Alexandru DAMIAN <alexandru.damian@intel.com> We update the build listings in the project mode to enable proper display and selection of build requests that do not have an actual build object because the bitbake process did not start. We add a page to display error details for build requests that did not start a build. Fixing errors and misspelling in build sections. Sorting by "timespent" is disabled for build-listing pages. [YOCTO #7165] [YOCTO #7156] [YOCTO #7196] [YOCTO #7188] Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> --- lib/toaster/bldcontrol/models.py | 9 ++ .../toastergui/templates/buildrequestdetails.html | 67 ++++++++++++++ .../toastergui/templates/managed_builds.html | 18 ++-- .../toastergui/templates/managed_mrb_section.html | 42 ++++++--- .../toastergui/templates/projectbuilds.html | 20 ++-- lib/toaster/toastergui/urls.py | 2 + lib/toaster/toastergui/views.py | 103 +++++++++++++-------- 7 files changed, 193 insertions(+), 68 deletions(-) create mode 100644 lib/toaster/toastergui/templates/buildrequestdetails.html diff --git a/lib/toaster/bldcontrol/models.py b/lib/toaster/bldcontrol/models.py index 2386d23..dc4afca 100644 --- a/lib/toaster/bldcontrol/models.py +++ b/lib/toaster/bldcontrol/models.py @@ -113,6 +113,15 @@ class BuildRequest(models.Model): created = models.DateTimeField(auto_now_add = True) updated = models.DateTimeField(auto_now = True) + def get_duration(self): + return (self.updated - self.created).total_seconds() + + def get_sorted_target_list(self): + tgts = self.brtarget_set.order_by( 'target' ); + return( tgts ); + + def get_machine(self): + return self.brvariable_set.get(name="MACHINE").value # These tables specify the settings for running an actual build. # They MUST be kept in sync with the tables in orm.models.Project* diff --git a/lib/toaster/toastergui/templates/buildrequestdetails.html b/lib/toaster/toastergui/templates/buildrequestdetails.html new file mode 100644 index 0000000..2a4571f --- /dev/null +++ b/lib/toaster/toastergui/templates/buildrequestdetails.html @@ -0,0 +1,67 @@ +{% extends "baseprojectpage.html" %} + +{% load static %} +{% load projecttags %} +{% load humanize %} + +{% block localbreadcrumb %} +<li> {{buildrequest.get_sorted_target_list.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} ({{buildrequest.updated|date:"d/m/y H:i"}}) </li> +{% endblock %} + +{% block projectinfomain %} + <!-- begin content --> + + <div class="row-fluid"> + + <!-- end left sidebar container --> + <!-- Begin right container --> + <div class="span10"> + <div class="page-header"> + <h1> + <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} </span> + + </h1> + </div> + <div class="alert alert-error"> + <p class="lead"> + <strong>Failed</strong> + on {{ buildrequest.updated|date:'d/m/y H:i' }} + with + + <i class="icon-minus-sign error" style="margin-left:6px;"></i> + <strong><a class="error accordion-toggle toggle-errors" href="#errors"> + {{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}} + </a></strong> + <span class="pull-right">Build time: {{buildrequest.get_duration|sectohms}}</span> + </p> + </div> + + <div class="accordion" id="errors" name="errors"> + <div class="accordion-group"> + <div class="accordion-heading"> + <a class="accordion-toggle error toggle-errors"> + <h2> + <i class="icon-minus-sign"></i> + {{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}} + </h2> + </a> + </div> + <div class="accordion-body collapse in" id="collapse-errors"> + <div class="accordion-inner"> + <div class="span10"> + {% for error in buildrequest.brerror_set.all %} + <div class="alert alert-error"> + ERROR: <div class="air well"><pre>{{error.errmsg}}</pre></div> + </div> + {% endfor %} + </div> + </div> + </div> + + </div> + </div> + </div> + </div> <!-- end of row-fluid --> + + +{%endblock%} diff --git a/lib/toaster/toastergui/templates/managed_builds.html b/lib/toaster/toastergui/templates/managed_builds.html index 5944dc4..183be76 100644 --- a/lib/toaster/toastergui/templates/managed_builds.html +++ b/lib/toaster/toastergui/templates/managed_builds.html @@ -35,10 +35,10 @@ </div> - {% else %} + {% else %} {# We have builds to display #} {% include "basetable_top_buildprojects.html" %} <!-- 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 --> - {% for br in objects %}{% if br.build %} {% with build=br.build %} {# if we have a build, just display it #} + {% for buildrequest in objects %}{% if buildrequest.build %} {% with build=buildrequest.build %} {# if we have a build, just display it #} <tr class="data"> <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> <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td> @@ -61,7 +61,7 @@ <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> - {% if MANAGED and build.project %} + {% if MANAGED and build.project and build.buildartifact_set.count %} <a href="{% url 'build_artifact' build.id "cookerlog" build.id %}"> <i class="icon-download-alt" title="" data-original-title="Download build log"></i> </a> @@ -96,21 +96,21 @@ <tr class="data"> <td class="outcome">{% if buildrequest.state == buildrequest.REQ_FAILED %}<i class="icon-minus-sign error"></i>{%else%}FIXME_build_request_state{%endif%}</td> <td class="target"> - <span data-toggle="tooltip" {%if br.brtarget_set.all.count > 1%}title="Targets: {%for target in br.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{br.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} </span> + <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}"><span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} </span></a> </td> <td class="machine"> - {{br.machine}} + <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}">{{buildrequest.machine}}</a> </td> <td class="started_on"> - {{br.created|date:"d/m/y H:i"}} + <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}">{{buildrequest.created|date:"d/m/y H:i"}}</a> </td> <td class="completed_on"> - {{br.updated|date:"d/m/y H:i"}} + <a href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}">{{buildrequest.updated|date:"d/m/y H:i"}}</a> </td> <td class="failed_tasks error"> - {{br.brerror_set.all.0.errmsg|whitespace_slice:":32"}} </td> <td class="errors_no"> + <a class="errors_no error" href="{% url "buildrequestdetails" buildrequest.project.id buildrequest.id %}#errors">{{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}}</a> </td> <td class="warnings_no"> </td> @@ -120,7 +120,7 @@ <td class="output"> {# we have no output here #} </td> <td class="project"> - <a href="{% url 'project' br.project.id %}">{{br.project.name}}</a> + <a href="{% url 'project' buildrequest.project.id %}">{{buildrequest.project.name}}</a> </td> </tr> {%endif%} diff --git a/lib/toaster/toastergui/templates/managed_mrb_section.html b/lib/toaster/toastergui/templates/managed_mrb_section.html index da5a3f7..d2ffdcd 100644 --- a/lib/toaster/toastergui/templates/managed_mrb_section.html +++ b/lib/toaster/toastergui/templates/managed_mrb_section.html @@ -26,7 +26,7 @@ <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}"> {% endif %} <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%} - </span> + </span> {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %} </a> {% endif %} @@ -71,24 +71,42 @@ {% else %} {# we use the project's page recent build design #} - <div class="alert {% if buildrequest.state == buildrequest.REQ_FAILED %}alert-error{% else %}alert-info{% endif %}"> - <div class="row-fluid"> + + <div class="alert {% if buildrequest.state == buildrequest.REQ_FAILED %}alert-error{% else %}alert-info{% endif %} project-name"> + <span class="label label-danger"> {{buildrequest.project.name}} </span> + <div class="row-fluid"> + {% if buildrequest.state == buildrequest.REQ_FAILED %} - <div class="lead span3"> - <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} </span> + <div class="span3 lead"> + <a href="{%url 'buildrequestdetails' buildrequest.project.id buildrequest.pk%}" class="error"> + <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} </span> + </a> + </div> + <div class="span2 lead"> + {% if buildrequest.updated|format_build_date %} + {{ buildrequest.updated|date:'d/m/y H:i' }} + {% else %} + {{ buildrequest.updated|date:'H:i' }} + {% endif %} + </div> + <div class="span2 lead"> + {% if buildrequest.brerror_set.all.count %} + <i class="icon-minus-sign red"></i> <a href="{%url 'buildrequestdetails' buildrequest.project.id buildrequest.pk %}#errors" class="error">{{buildrequest.brerror_set.all.count}} error{{buildrequest.brerror_set.all.count|pluralize}}</a> + {% endif %} </div> - <div > + <div class="span2 lead"> {# there are no warnings for buildrequests #} </div> - <div class="row-fluid"> - {% for e in buildrequest.brerror_set.all|slice:":3" %} - <div class="air well"> - <pre>{{e.errmsg|whitespace_slice:":150"}}</pre> - </div> - {% endfor %} + <div class="lead "> + <span class="lead{%if not MANAGED or not buildrequest.project%} pull-right{%endif%}"> + Build time: <a href="{% url 'buildrequestdetails' buildrequest.project.id buildrequest.pk %}">{{ buildrequest.get_duration|sectohms }}</a> + </span> + <button class="btn btn-danger pull-right" onclick='scheduleBuild({% url 'xhr_projectbuild' buildrequest.project.id as bpi%}{{bpi|json}}, {{buildrequest.project.name|json}}, {{buildrequest.get_sorted_target_list|mapselect:'target'|json}})'>Run again</button> + </div> + {% elif buildrequest.state == buildrequest.REQ_QUEUED %} <div class="lead span5"> diff --git a/lib/toaster/toastergui/templates/projectbuilds.html b/lib/toaster/toastergui/templates/projectbuilds.html index 8f9172c..2a8bd58 100644 --- a/lib/toaster/toastergui/templates/projectbuilds.html +++ b/lib/toaster/toastergui/templates/projectbuilds.html @@ -13,11 +13,11 @@ No builds found {% else %} - {% if request.GET.filter or request.GET.search %} - {{objects.paginator.count}} builds found - {% else %} + {% if request.GET.filter or request.GET.search %} + {{objects.paginator.count}} builds found + {% else %} Project builds <small>({{objects.paginator.count}})</small> - {% endif %} + {% endif %} {% endif %} <i class="icon-question-sign get-help heading-help" title="This page lists all the builds for the current project"></i> </h1> @@ -89,23 +89,23 @@ <tr class="data"> - <td class="outcome">{% if buildrequest.state == buildrequest.REQ_FAILED %}<i class="icon-minus-sign error"></i>{%else%}FIXME_build_request_state{%endif%}</td> + <td class="outcome">{% if br.state == br.REQ_FAILED %}<i class="icon-minus-sign error"></i>{%else%}FIXME_build_request_state{%endif%}</td> <td class="target"> - <span data-toggle="tooltip" {%if br.brtarget_set.all.count > 1%}title="Targets: {%for target in br.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{br.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} </span> + <a href="{% url "buildrequestdetails" br.project.id br.id %}"><span data-toggle="tooltip" {%if br.brtarget_set.all.count > 1%}title="Targets: {%for target in br.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{br.brtarget_set.all.0.target}} {%if br.brtarget_set.all.count > 1%}(+ {{br.brtarget_set.all.count|add:"-1"}}){%endif%} </span></a> </td> <td class="machine"> - {{br.machine}} + <a href="{% url "buildrequestdetails" br.project.id br.id %}">{{br.machine}}</a> </td> <td class="started_on"> - {{br.created|date:"d/m/y H:i"}} + <a href="{% url "buildrequestdetails" br.project.id br.id %}">{{br.created|date:"d/m/y H:i"}}</a> </td> <td class="completed_on"> - {{br.updated|date:"d/m/y H:i"}} + <a href="{% url "buildrequestdetails" br.project.id br.id %}">{{br.updated|date:"d/m/y H:i"}}</a> </td> <td class="failed_tasks error"> - {{br.brerror_set.all.0.errmsg|whitespace_slice:":32"}} </td> <td class="errors_no"> + <a class="errors_no error" href="{% url "buildrequestdetails" br.project.id br.id %}#errors">{{br.brerror_set.all.count}} error{{br.brerror_set.all.count|pluralize}}</a> </td> <td class="warnings_no"> </td> diff --git a/lib/toaster/toastergui/urls.py b/lib/toaster/toastergui/urls.py index 8c3b5a8..1c83090 100644 --- a/lib/toaster/toastergui/urls.py +++ b/lib/toaster/toastergui/urls.py @@ -97,6 +97,8 @@ urlpatterns = patterns('toastergui.views', url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), + # dashboard for failed build requests + url(r'^project/(?P<pid>\d+)/buildrequest/(?P<brid>\d+)$', 'buildrequestdetails', name='buildrequestdetails'), # default redirection url(r'^$', RedirectView.as_view( url= 'landing')), diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py index e718ced..6ccbf54 100755 --- a/lib/toaster/toastergui/views.py +++ b/lib/toaster/toastergui/views.py @@ -22,7 +22,7 @@ import operator,re import HTMLParser -from django.db.models import Q, Sum +from django.db.models import Q, Sum, Count from django.db import IntegrityError from django.shortcuts import render, redirect from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable @@ -117,7 +117,8 @@ def _redirect_parameters(view, g, mandatory_parameters, *args, **kwargs): return redirect(url + "?%s" % urllib.urlencode(params), *args, **kwargs) FIELD_SEPARATOR = ":" -VALUE_SEPARATOR = "!" +AND_VALUE_SEPARATOR = "!" +OR_VALUE_SEPARATOR = "|" DESCENDING = "-" def __get_q_for_val(name, value): @@ -126,20 +127,31 @@ def __get_q_for_val(name, value): if "AND" in value: return reduce(operator.and_, map(lambda x: __get_q_for_val(name, x), [ x for x in value.split("AND") ])) if value.startswith("NOT"): - kwargs = { name : value.strip("NOT") } + value = value[3:] + if value == 'None': + value = None + kwargs = { name : value } return ~Q(**kwargs) else: + if value == 'None': + value = None kwargs = { name : value } return Q(**kwargs) def _get_filtering_query(filter_string): search_terms = filter_string.split(FIELD_SEPARATOR) - keys = search_terms[0].split(VALUE_SEPARATOR) - values = search_terms[1].split(VALUE_SEPARATOR) + and_keys = search_terms[0].split(AND_VALUE_SEPARATOR) + and_values = search_terms[1].split(AND_VALUE_SEPARATOR) + + and_query = [] + for kv in zip(and_keys, and_values): + or_keys = kv[0].split(OR_VALUE_SEPARATOR) + or_values = kv[1].split(OR_VALUE_SEPARATOR) + querydict = dict(zip(or_keys, or_values)) + and_query.append(reduce(operator.or_, map(lambda x: __get_q_for_val(x, querydict[x]), [k for k in querydict]))) - querydict = dict(zip(keys, values)) - return reduce(operator.and_, map(lambda x: __get_q_for_val(x, querydict[x]), [k for k in querydict])) + return reduce(operator.and_, [k for k in and_query]) def _get_toggle_order(request, orderkey, reverse = False): if reverse: @@ -169,13 +181,13 @@ def _validate_input(input, model): return None, invalid # Check we have an equal number of terms both sides of the colon - if len(input_list[0].split(VALUE_SEPARATOR)) != len(input_list[1].split(VALUE_SEPARATOR)): + if len(input_list[0].split(AND_VALUE_SEPARATOR)) != len(input_list[1].split(AND_VALUE_SEPARATOR)): invalid = "Not all arg names got values" return None, invalid + str(input_list) # Check we are looking for a valid field valid_fields = model._meta.get_all_field_names() - for field in input_list[0].split(VALUE_SEPARATOR): + for field in input_list[0].split(AND_VALUE_SEPARATOR): if not reduce(lambda x, y: x or y, map(lambda x: field.startswith(x), [ x for x in valid_fields ])): return None, (field, [ x for x in valid_fields ]) @@ -216,6 +228,7 @@ def _search_tuple(request, model): def _get_queryset(model, queryset, filter_string, search_term, ordering_string, ordering_secondary=''): if filter_string: filter_query = _get_filtering_query(filter_string) +# raise Exception(filter_query) queryset = queryset.filter(filter_query) else: queryset = queryset.all() @@ -1780,12 +1793,13 @@ if toastermain.settings.MANAGED: # for that object type. copypasta for all needed table searches (filter_string, search_term, ordering_string) = _search_tuple(request, BuildRequest) # we don't display in-progress or deleted builds - queryset_all = buildrequests - queryset_with_search = _get_queryset(BuildRequest, queryset_all, None, search_term, ordering_string, '-updated') - queryset = _get_queryset(BuildRequest, queryset_all, filter_string, search_term, ordering_string, '-updated') + queryset_all = buildrequests.exclude(state = BuildRequest.REQ_DELETED) + queryset_all = queryset_all.annotate(Count('brerror')) + queryset_with_search = _get_queryset(BuildRequest, queryset_all, filter_string, search_term, ordering_string, '-updated') + # retrieve the objects that will be displayed in the table; builds a paginator and gets a page range to display - build_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1)) + build_info = _build_page_range(Paginator(queryset_with_search, pagesize), request.GET.get('page', 1)) # build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds) # most recent build is like projects' most recent builds, but across all projects @@ -1842,8 +1856,8 @@ if toastermain.settings.MANAGED: 'filter' : {'class' : 'outcome', 'label': 'Show:', 'options' : [ - ('Successful builds', 'state:' + str(BuildRequest.REQ_COMPLETED), queryset_with_search.filter(state=str(BuildRequest.REQ_COMPLETED)).count()), # this is the field search expression - ('Failed builds', 'state:'+ str(BuildRequest.REQ_FAILED), queryset_with_search.filter(state=str(BuildRequest.REQ_FAILED)).count()), + ('Successful builds', 'state:' + str(BuildRequest.REQ_COMPLETED), queryset_all.filter(state=str(BuildRequest.REQ_COMPLETED)).count()), # this is the field search expression + ('Failed builds', 'state:'+ str(BuildRequest.REQ_FAILED), queryset_all.filter(state=str(BuildRequest.REQ_FAILED)).count()), ] } }, @@ -1865,9 +1879,9 @@ if toastermain.settings.MANAGED: 'filter' : {'class' : 'created', 'label': 'Show:', 'options' : [ - ("Today's builds" , 'created__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(created__gte=timezone.now()).count()), - ("Yesterday's builds", 'created__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(created__gte=(timezone.now()-timedelta(hours=24))).count()), - ("This week's builds", 'created__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(created__gte=(timezone.now()-timedelta(days=7))).count()), + ("Today's builds" , 'created__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_all.filter(created__gte=timezone.now()).count()), + ("Yesterday's builds", 'created__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_all.filter(created__gte=(timezone.now()-timedelta(hours=24))).count()), + ("This week's builds", 'created__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_all.filter(created__gte=(timezone.now()-timedelta(days=7))).count()), ] } }, @@ -1879,9 +1893,9 @@ if toastermain.settings.MANAGED: 'filter' : {'class' : 'updated', 'label': 'Show:', 'options' : [ - ("Today's builds", 'updated__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(updated__gte=timezone.now()).count()), - ("Yesterday's builds", 'updated__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(updated__gte=(timezone.now()-timedelta(hours=24))).count()), - ("This week's builds", 'updated__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(updated__gte=(timezone.now()-timedelta(days=7))).count()), + ("Today's builds", 'updated__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_all.filter(updated__gte=timezone.now()).count()), + ("Yesterday's builds", 'updated__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_all.filter(updated__gte=(timezone.now()-timedelta(hours=24))).count()), + ("This week's builds", 'updated__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_all.filter(updated__gte=(timezone.now()-timedelta(days=7))).count()), ] } }, @@ -1890,8 +1904,10 @@ if toastermain.settings.MANAGED: 'filter' : {'class' : 'failed_tasks', 'label': 'Show:', 'options' : [ - ('Build with failed tasks', 'build__task_build__outcome:4', queryset_with_search.filter(build__task_build__outcome=4).count()), - ('Build without failed tasks', 'build__task_build__outcome:NOT4', queryset_with_search.filter(~Q(build__task_build__outcome=4)).count()), + ('Builds with failed tasks', 'build__task_build__outcome:%d' % Task.OUTCOME_FAILED, + queryset_all.filter(build__task_build__outcome=Task.OUTCOME_FAILED).count()), + ('Builds without failed tasks', 'build__task_build__outcome:%d' % Task.OUTCOME_FAILED, + queryset_all.filter(~Q(build__task_build__outcome=Task.OUTCOME_FAILED)).count()), ] } }, @@ -1903,8 +1919,10 @@ if toastermain.settings.MANAGED: 'filter' : {'class' : 'errors_no', 'label': 'Show:', 'options' : [ - ('Build with errors', 'build__errors_no__gte:1', queryset_with_search.filter(build__errors_no__gte=1).count()), - ('Build without errors', 'build__errors_no:0', queryset_with_search.filter(build__errors_no=0).count()), + ('Builds with errors', 'build|build__errors_no__gt:None|0', + queryset_all.filter(Q(build=None) | Q(build__errors_no__gt=0)).count()), + ('Builds without errors', 'build__errors_no:0', + queryset_all.filter(build__errors_no=0).count()), ] } }, @@ -1916,8 +1934,8 @@ if toastermain.settings.MANAGED: 'filter' : {'class' : 'build__warnings_no', 'label': 'Show:', 'options' : [ - ('Build with warnings','build__warnings_no__gte:1', queryset_with_search.filter(build__warnings_no__gte=1).count()), - ('Build without warnings','build__warnings_no:0', queryset_with_search.filter(build__warnings_no=0).count()), + ('Builds with warnings','build__warnings_no__gte:1', queryset_all.filter(build__warnings_no__gte=1).count()), + ('Builds without warnings','build__warnings_no:0', queryset_all.filter(build__warnings_no=0).count()), ] } }, @@ -2016,7 +2034,7 @@ if toastermain.settings.MANAGED: context = { "project" : prj, - "completedbuilds": Build.objects.filter(project = prj).exclude(outcome = Build.IN_PROGRESS), + "completedbuilds": BuildRequest.objects.filter(project_id = pid).exclude(state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED), "prj" : {"name": prj.name, "release": { "id": prj.release.pk, "name": prj.release.name, "desc": prj.release.description}}, #"buildrequests" : prj.buildrequest_set.filter(state=BuildRequest.REQ_QUEUED), "builds" : _project_recent_build_list(prj), @@ -2061,7 +2079,7 @@ if toastermain.settings.MANAGED: try: if request.method != "POST": raise BadParameterException("invalid method") - request.session['project_id'] = pid + request.session['project_id'] = pid prj = Project.objects.get(id = pid) @@ -2167,11 +2185,11 @@ if toastermain.settings.MANAGED: try: prj = None if request.GET.has_key('project_id'): - prj = Project.objects.get(pk = request.GET['project_id']) + prj = Project.objects.get(pk = request.GET['project_id']) elif 'project_id' in request.session: prj = Project.objects.get(pk = request.session['project_id']) - else: - raise Exception("No valid project selected") + else: + raise Exception("No valid project selected") def _lv_to_dict(x): @@ -2819,10 +2837,10 @@ if toastermain.settings.MANAGED: vars_blacklist = { 'DL_DR','PARALLEL_MAKE','BB_NUMBER_THREADS','SSTATE_DIR', - 'BB_DISKMON_DIRS','BB_NUMBER_THREADS','CVS_PROXY_HOST','CVS_PROXY_PORT', - 'DL_DIR','PARALLEL_MAKE','SSTATE_DIR','SSTATE_DIR','SSTATE_MIRRORS','TMPDIR', - 'all_proxy','ftp_proxy','http_proxy ','https_proxy' - } + 'BB_DISKMON_DIRS','BB_NUMBER_THREADS','CVS_PROXY_HOST','CVS_PROXY_PORT', + 'DL_DIR','PARALLEL_MAKE','SSTATE_DIR','SSTATE_DIR','SSTATE_MIRRORS','TMPDIR', + 'all_proxy','ftp_proxy','http_proxy ','https_proxy' + } vars_fstypes = { 'btrfs','cpio','cpio.gz','cpio.lz4','cpio.lzma','cpio.xz','cramfs', @@ -2874,7 +2892,7 @@ if toastermain.settings.MANAGED: def projectbuilds(request, pid): template = 'projectbuilds.html' - buildrequests = BuildRequest.objects.exclude(project_id = pid, state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED) + buildrequests = BuildRequest.objects.filter(project_id = pid).exclude(state__lte = BuildRequest.REQ_INPROGRESS).exclude(state=BuildRequest.REQ_DELETED) try: context, pagesize, orderby = _build_list_helper(request, buildrequests) @@ -3012,6 +3030,14 @@ if toastermain.settings.MANAGED: } return render(request, template, context) + def buildrequestdetails(request, pid, brid): + template = "buildrequestdetails.html" + context = { + 'buildrequest' : BuildRequest.objects.get(pk = brid, project_id = pid) + } + return render(request, template, context) + + else: # these are pages that are NOT available in interactive mode def managedcontextprocessor(request): @@ -3256,3 +3282,6 @@ else: def xhr_updatelayer(request): raise Exception("page not available in interactive mode") + + def buildrequestdetails(request, pid, brid): + raise Exception("page not available in interactive mode") -- 1.9.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 00/14] Toaster patchset @ 2015-03-17 13:28 Alex DAMIAN 0 siblings, 0 replies; 16+ messages in thread From: Alex DAMIAN @ 2015-03-17 13:28 UTC (permalink / raw) To: bitbake-devel; +Cc: Dave Lerner, David Reyna From: Alexandru DAMIAN <alexandru.damian@intel.com> Hello, This is a toaster patchset that fixes various issues in the interface, and in build process. Can you please pull ? Thanks, Alex The following changes since commit 4b07195405b124ff39703e1ddc226dee420fed22: toaster: Fix the orderkey to match the column (2015-03-16 17:43:51 +0000) are available in the git repository at: git://git.yoctoproject.org/poky-contrib adamian/20150317-submission-bb http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=adamian/20150317-submission-bb Alexandru DAMIAN (7): toasterui: improve info in the toaster_ui.log toaster: targets page performance improvement toastergui: fix machines page search toastergui: builds and projects outcome filter toaster: do not throw exception on misconfigured data toasterui: fix error message parameter toastergui: recipe and layer identification Belen Barros Pena (1): toaster: display bitbake output after process start Dave Lerner (1): toaster: leave cancel enabled for release change David Reyna (3): toaster: Incorrect breadcrumb behaviour in the project page toaster: display machine and project values in input fields toaster: insure IMAGE_INSTALL_append values have a space prefix Michael Wood (2): toaster: Add cancel build to latest build section toaster: tasks trigger the select related tables before ordering lib/bb/ui/buildinfohelper.py | 31 ++++++++++++---- lib/bb/ui/toasterui.py | 8 +++++ lib/toaster/bldcontrol/localhostbecontroller.py | 14 +++++--- lib/toaster/orm/models.py | 14 ++++---- lib/toaster/toastergui/static/js/libtoaster.js | 28 +++++++++++++++ .../toastergui/templates/baseprojectpage.html | 6 ++++ .../toastergui/templates/managed_mrb_section.html | 42 +++++++++------------- lib/toaster/toastergui/templates/mrb_section.html | 39 -------------------- lib/toaster/toastergui/templates/project.html | 6 ++-- lib/toaster/toastergui/templates/projectconf.html | 18 ++++++---- lib/toaster/toastergui/templates/projects.html | 2 +- lib/toaster/toastergui/views.py | 35 ++++++++++++------ 12 files changed, 138 insertions(+), 105 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2015-03-20 14:38 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-01-27 14:27 [PATCH 00/14] Toaster patchset Alex DAMIAN 2015-01-27 14:27 ` [PATCH 01/14] toaster: make layouts consistent Alex DAMIAN 2015-01-27 14:27 ` [PATCH 02/14] toaster: apply common styles to right hand column of detail pages Alex DAMIAN 2015-01-27 14:27 ` [PATCH 03/14] toastergui: Generic message for the layer details empty states Alex DAMIAN 2015-01-27 14:27 ` [PATCH 04/14] toastergui: remove redundant style declaration Alex DAMIAN 2015-01-27 14:27 ` [PATCH 05/14] toastergui: consistent add / remove layer notifications Alex DAMIAN 2015-01-27 14:27 ` [PATCH 06/14] toastergui: give the add dependencies form some breathing space Alex DAMIAN 2015-01-27 14:27 ` [PATCH 07/14] toastergui: add 'show all' link to no results page Alex DAMIAN 2015-01-27 14:27 ` [PATCH 08/14] toastergui: set column width in layer details page Alex DAMIAN 2015-01-27 14:27 ` [PATCH 09/14] toastergui: hide table controls when when less than 10 entries Alex DAMIAN 2015-01-27 14:27 ` [PATCH 10/14] toastergui: consistent capitals in button Alex DAMIAN 2015-01-27 14:27 ` [PATCH 11/14] toastergui: remove recipe id links to the layer index Alex DAMIAN 2015-01-27 14:27 ` [PATCH 12/14] toastergui: alignment fix Alex DAMIAN 2015-01-27 14:27 ` [PATCH 13/14] toasterui: do not filter images by extension Alex DAMIAN 2015-01-27 14:27 ` [PATCH 14/14] toastergui: update project build listing Alex DAMIAN -- strict thread matches above, loose matches on Subject: below -- 2015-03-17 13:28 [PATCH 00/14] Toaster patchset Alex DAMIAN
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox