<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.yoctoproject.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ddalex</id>
	<title>Yocto Project - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.yoctoproject.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ddalex"/>
	<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/Special:Contributions/Ddalex"/>
	<updated>2026-04-14T11:14:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Testing_Toaster&amp;diff=15571</id>
		<title>Testing Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Testing_Toaster&amp;diff=15571"/>
		<updated>2015-08-19T09:52:56Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: Created page with &amp;quot;Category:Toaster  Toaster has 4 testing suites, targeted at verifying different parts of the system. This document briefly describes each testing suite.   == Django Unit T...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
&lt;br /&gt;
Toaster has 4 testing suites, targeted at verifying different parts of the system. This document briefly describes each testing suite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Django Unit Tests ==&lt;br /&gt;
&lt;br /&gt;
Toaster is primarely a Django application. As such, it makes use of the Django test system that runs unit tests on mock data to ensure pieces of functionality work as expected, and prevent regressions.&lt;br /&gt;
&lt;br /&gt;
To run the django unit tests, invoke them as with any Django test suite&lt;br /&gt;
&lt;br /&gt;
    ./bitbake/lib/toaster/manage.py test&lt;br /&gt;
&lt;br /&gt;
To add unit tests, simply add needed tests to the _tests.py_ file in the module you&#039;re editing.&lt;br /&gt;
&lt;br /&gt;
== Toaster Test System (TTS) ==&lt;br /&gt;
&lt;br /&gt;
The TTS is a suite aimed at running integration and acceptance tests. Currently, it verifying the correct syntax and form of the Python code, tries to start Toaster in both modes, and runs HTML5 validation on HTML-returning pages.&lt;br /&gt;
&lt;br /&gt;
The tests are designed to be triggered through a continuous integration system. &lt;br /&gt;
&lt;br /&gt;
To start manually it, run the tts test runner:&lt;br /&gt;
&lt;br /&gt;
    ./bitbake/lib/toaster/contrib/tts/runner.py&lt;br /&gt;
&lt;br /&gt;
== The oe-selftest toaster tests ==&lt;br /&gt;
&lt;br /&gt;
These tests are verifying the correctness of the data gathered by the build process - it tests the bitbake/lib/bb/ui/toasterui.py and bitbake/lib/bb/ui/buildinfohelper.py files and the interface to the bitbake server process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The selenium automated UI tests ==&lt;br /&gt;
&lt;br /&gt;
The automated UI tests are targeted at validating and identifying regressions in the UI pages. These tests are based on the Selenium framework to drive interactions in the interface.&lt;br /&gt;
&lt;br /&gt;
To run the selenium tests, please use:&lt;br /&gt;
&lt;br /&gt;
    ./ bitbake/lib/toaster/contrib/tts/toasteruitest&lt;br /&gt;
&lt;br /&gt;
   ./bitbake/lib/toaster/contrib/tts/toasteruitest/run_toastertests.py&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=15569</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=15569"/>
		<updated>2015-08-19T09:17:10Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Toaster How-to&amp;#039;s */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to OpenEmbedded and BitBake. You might have heard it is a replacement for [https://www.yoctoproject.org/documentation/hob-manual Hob]. The answer is &amp;quot;it will be at some point, but not yet&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
Toaster can run in various modes and setups. To ease out the understanding of documentation, we review here the terminology used throughout the documentation.&lt;br /&gt;
&lt;br /&gt;
* Interactive mode - this is the mode released with Yocto Project Release 1.6. Functional components consist of a build recording component, &#039;toasterui&#039;, and a build stats and inspection user interface, the &#039;toastergui&#039;. It is started with the command sequence listed below, and the builds are started using normal bitbake command line&lt;br /&gt;
&lt;br /&gt;
 $ source oe-init-build-env&lt;br /&gt;
 $ source toaster start&lt;br /&gt;
&lt;br /&gt;
* Managed  mode - in this mode Toaster handles the build configuration GUI (through Project pages), and build scheduling and execution, in addition to the features launched with Yocto Project Release 1.6. The builds are triggered through the web interface, &lt;br /&gt;
the user as no direct access to the bitbake command line.&lt;br /&gt;
&lt;br /&gt;
** Local managed mode, in short _local_, is the out-of-box mode available after a poky/ checkout. It allows the user to perform build on his local machine source code, with a local build directory, and is intended to help the user discover the interface, and configure and run local builds. You can launch it with&lt;br /&gt;
&lt;br /&gt;
 $ ./bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
** Remote managed mode, or [[hosted Toaster]], is intended to be the production setup for running Toaster in organizations supporting multiple users and using customized Toaster installations.&lt;br /&gt;
&lt;br /&gt;
=== Toaster How-to&#039;s ===&lt;br /&gt;
&lt;br /&gt;
Specific pages with Toaster how-tos are available below.&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [[Testing Toaster]]&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]] - documentation for Interactive mode&lt;br /&gt;
* [[Setting up a hosted managed mode for Toaster]] - configure and run build through Toaster itself, providing a service for your users&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual-17 How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[File:Working_with_design.pdf]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.9 design | Scope and design (1.9)]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design (1.7 - 1.8)]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;br /&gt;
&lt;br /&gt;
=== In progress documentation ===&lt;br /&gt;
&lt;br /&gt;
We are currently preparing the documentation for the Toaster build functionality. The content here is just a brain dump of what we need to cover (in no particular order). Feel free to add and create content as you see fit:&lt;br /&gt;
&lt;br /&gt;
*[[Using virtualenv]]&lt;br /&gt;
*[[Toaster configuration]] - explain releases, layer sources, BitBake versions and default project configurations &lt;br /&gt;
*[[Set up Toaster locally]] - explain the set up process and the local version of the localconf.json file&lt;br /&gt;
*[[Set up production instance]] - explain the Django admin interface and the remove version of the localconf.json file&lt;br /&gt;
*[[manage.py commands]] - this should include an explanation of lsupdates&lt;br /&gt;
*[[Custom layer index]] - explain how to create your own layer index&lt;br /&gt;
*[[Start Toaster in managed mode]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=15568</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=15568"/>
		<updated>2015-08-19T09:16:50Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* About Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to OpenEmbedded and BitBake. You might have heard it is a replacement for [https://www.yoctoproject.org/documentation/hob-manual Hob]. The answer is &amp;quot;it will be at some point, but not yet&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
Toaster can run in various modes and setups. To ease out the understanding of documentation, we review here the terminology used throughout the documentation.&lt;br /&gt;
&lt;br /&gt;
* Interactive mode - this is the mode released with Yocto Project Release 1.6. Functional components consist of a build recording component, &#039;toasterui&#039;, and a build stats and inspection user interface, the &#039;toastergui&#039;. It is started with the command sequence listed below, and the builds are started using normal bitbake command line&lt;br /&gt;
&lt;br /&gt;
 $ source oe-init-build-env&lt;br /&gt;
 $ source toaster start&lt;br /&gt;
&lt;br /&gt;
* Managed  mode - in this mode Toaster handles the build configuration GUI (through Project pages), and build scheduling and execution, in addition to the features launched with Yocto Project Release 1.6. The builds are triggered through the web interface, &lt;br /&gt;
the user as no direct access to the bitbake command line.&lt;br /&gt;
&lt;br /&gt;
** Local managed mode, in short _local_, is the out-of-box mode available after a poky/ checkout. It allows the user to perform build on his local machine source code, with a local build directory, and is intended to help the user discover the interface, and configure and run local builds. You can launch it with&lt;br /&gt;
&lt;br /&gt;
 $ ./bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
** Remote managed mode, or [[hosted Toaster]], is intended to be the production setup for running Toaster in organizations supporting multiple users and using customized Toaster installations.&lt;br /&gt;
&lt;br /&gt;
=== Toaster How-to&#039;s ===&lt;br /&gt;
&lt;br /&gt;
Specific pages with Toaster how-tos are available below.&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]] - documentation for Interactive mode&lt;br /&gt;
* [[Setting up a hosted managed mode for Toaster]] - configure and run build through Toaster itself, providing a service for your users&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual-17 How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[File:Working_with_design.pdf]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.9 design | Scope and design (1.9)]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design (1.7 - 1.8)]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;br /&gt;
&lt;br /&gt;
=== In progress documentation ===&lt;br /&gt;
&lt;br /&gt;
We are currently preparing the documentation for the Toaster build functionality. The content here is just a brain dump of what we need to cover (in no particular order). Feel free to add and create content as you see fit:&lt;br /&gt;
&lt;br /&gt;
*[[Using virtualenv]]&lt;br /&gt;
*[[Toaster configuration]] - explain releases, layer sources, BitBake versions and default project configurations &lt;br /&gt;
*[[Set up Toaster locally]] - explain the set up process and the local version of the localconf.json file&lt;br /&gt;
*[[Set up production instance]] - explain the Django admin interface and the remove version of the localconf.json file&lt;br /&gt;
*[[manage.py commands]] - this should include an explanation of lsupdates&lt;br /&gt;
*[[Custom layer index]] - explain how to create your own layer index&lt;br /&gt;
*[[Start Toaster in managed mode]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15143</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15143"/>
		<updated>2015-07-15T17:15:24Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Gotchas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Procedure:&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
 find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git log -n1 -p&lt;br /&gt;
 # review the changes; if all ok, sign off the patch, and continue&lt;br /&gt;
 git commit --amend -s&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 ~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
 # edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
 ~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Submitting patches for prior releases ====&lt;br /&gt;
&lt;br /&gt;
The procedure is the same, but using the prior release as the base branch instead of the &amp;quot;master&amp;quot; branch in bitbake.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that you add the name of the prior release for which the patchset is intended in the prefix of the patchset, as parameter to the &amp;quot;create-pull-request&amp;quot; command, e.g. &#039;&#039;&#039;-p 1.26&#039;&#039;&#039; for the 1.26 branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Gotchas ====&lt;br /&gt;
&lt;br /&gt;
Sometimes the mailer will refuse to send patches, especially on binary or long-line files. The proper way to go around that is to reply to the patchset you&#039;ve submitted to the mailing list, asking for a git pull directly from the poky-contrib branch.&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15142</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15142"/>
		<updated>2015-07-15T17:14:37Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Submitting patch sets for integration upstream */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Procedure:&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
 find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git log -n1 -p&lt;br /&gt;
 # review the changes; if all ok, sign off the patch, and continue&lt;br /&gt;
 git commit --amend -s&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 ~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
 # edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
 ~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Submitting patches for prior releases ====&lt;br /&gt;
&lt;br /&gt;
The procedure is the same, but using the prior release as the base branch instead of the &amp;quot;master&amp;quot; branch in bitbake.&lt;br /&gt;
&lt;br /&gt;
Also, make sure that you add the name of the prior release for which the patchset is intended in the prefix of the patchset, as parameter to the &amp;quot;create-pull-request&amp;quot; command, e.g. &#039;&#039;&#039;-p 1.26&#039;&#039;&#039; for the 1.26 branch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Gotchas ====&lt;br /&gt;
&lt;br /&gt;
Sometimes the mailer will refuse to send patches, especially on binary or long-line files. The proper way to go around that is to reply to the patchset you&#039;ve submitted to the mailing list&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15141</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15141"/>
		<updated>2015-07-15T17:08:44Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Submitting patch sets for integration upstream */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Procedure:&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
 find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git log -n1 -p&lt;br /&gt;
 # review the changes; if all ok, sign off the patch, and continue&lt;br /&gt;
 git commit --amend -s&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
# edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15140</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15140"/>
		<updated>2015-07-15T17:07:58Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Submitting patch sets for integration upstream */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Procedure:&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
 find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git log -n1 -p&lt;br /&gt;
 # review the changes; if all ok, sign off the patch, and continue&lt;br /&gt;
 git commit --amend -s&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
# edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15139</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15139"/>
		<updated>2015-07-15T17:07:26Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Submitting patch sets for integration upstream */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
 find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git log -n1 -p&lt;br /&gt;
 # review the changes; if all ok, sign off the patch, and continue&lt;br /&gt;
 git commit --amend -s&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
# edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15138</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15138"/>
		<updated>2015-07-15T17:06:56Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Submitting patch sets for integration upstream */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
 find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 git log -n1 -p&lt;br /&gt;
 # if ok&lt;br /&gt;
 git commit --amend -s&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
# edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15137</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15137"/>
		<updated>2015-07-15T17:06:18Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
# Export the toaster patches from the &amp;quot;ownname/work_branch&amp;quot; bitbake directory to the patches/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
 cd ~/poky/bitbake &amp;amp;&amp;amp; git format-patch -o ~/patches/ --relative &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Create a submission branch in the bitbake/ git checkout and import the patches exported from poky/; &amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Make sure that the patchset is rebased on top of the latest master branch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
cd ~/bitbake/ &amp;amp;&amp;amp; git checkout origin/master -b submission &amp;amp;&amp;amp; git pull&lt;br /&gt;
find ~/patches/ -type f -name *patch | sort -n | xargs -n1 git am&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Now we need to review this branch. All patches must be signed-off as reviewed by the upstreamer, which cannot be author of the patch.&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git rebase -i origin/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#: and edit each patch in part (s/^pick/edit/) to add your signature&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git log -n1 -p&lt;br /&gt;
# if ok&lt;br /&gt;
git commit --amend -s&lt;br /&gt;
git rebase --continue&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# push the submission patch to poky-contrib (yes, the bitbake/ tree can be pushed as branch to the poky-contrib repo&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
git push poky-contrib submission:ownname/bitbake_submission&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# and use the &amp;quot;create-pull-request&amp;quot; and &amp;quot;send-pull-request&amp;quot; from the poky/ repository in the poky/scripts/ directory to create a pull request and submit it to bitbake-devel@lists.openembedded.org; yes, you use the poky scripts in the bitbake/ directory&lt;br /&gt;
#: &amp;lt;code&amp;gt;&lt;br /&gt;
~/poky/scripts/create-pull-request -u poky-contrib -b ownname/bitbake_submission&lt;br /&gt;
# edit the patchset message in the pull-XXXX/0000-*.patch&lt;br /&gt;
~/poky/scripts/send-pull-request pull-XXXX/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15136</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15136"/>
		<updated>2015-07-15T16:31:32Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Submitting patch sets for integration upstream */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15135</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15135"/>
		<updated>2015-07-15T16:30:28Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Submitting patches ==&lt;br /&gt;
&lt;br /&gt;
Publishing your patches to Toaster is a two step process.&lt;br /&gt;
# Sending patches to Toaster Project for review&lt;br /&gt;
# Submitting the patches that you reviewed to the upstream repository&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
All contributions must be upstreamed to the Bitbake repository in order to make it to the &amp;quot;master&amp;quot; branch of the poky/ repository.&lt;br /&gt;
&lt;br /&gt;
=== Sending patches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sending branches to Toaster Project ===&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
=== Submitting patch sets for integration upstream ===&lt;br /&gt;
&lt;br /&gt;
All Toaster patches need to be submitted upstream to the Bitbake repository. Since development happens on the poky repository, but the patches need to be merged to the Bitbake repository, the following process should be executed.&lt;br /&gt;
&lt;br /&gt;
* You will need a bitbake/ checkout separated from  your current poky/ checkout. You can use one at the same level, e.g. ~/poky/ and ~/bitbake/ are your checkout directories.&lt;br /&gt;
* Make sure you have a clean directory which you can use to store the patches during the transition from poky/ to bitbake/. e.g. ~/patches&lt;br /&gt;
* Let&#039;s assume you are on the &amp;quot;ownname/work_branch&amp;quot; branch in the poky/ tree at the and on the &amp;quot;master&amp;quot; branch in the bitbake/ tree&lt;br /&gt;
&lt;br /&gt;
# Make sure that the ~/patches directory exists and it is clean&lt;br /&gt;
#: &amp;lt;code&amp;gt; &lt;br /&gt;
mkdir -p ~/patches &amp;amp;&amp;amp; rm -f ~/patches/*&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15134</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=15134"/>
		<updated>2015-07-15T16:04:32Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== What can I do? ==&lt;br /&gt;
&lt;br /&gt;
The [https://bugzilla.yoctoproject.org/buglist.cgi?product=Toaster Yocto Project Bugzilla instance] lists all the things that need to be done:&lt;br /&gt;
&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design available&amp;lt;/strong&amp;gt; in the Whiteboard field, there is a design specification document attached to the issue that you should follow. Send questions / comments about it to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list]&lt;br /&gt;
* If the issue says &amp;lt;strong&amp;gt;GUI design pending&amp;lt;/strong&amp;gt; in the Whiteboard field, there is some design work still to be done. Feel free to take the issue and send an email to the [https://lists.yoctoproject.org/listinfo/toaster Toaster mailing list] to find out why the design work is not done yet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
For development of Toaster we recommend setting up a local install of Toaster. General install instructions are available in the main [https://www.yoctoproject.org/documentation/toaster-manual Toaster documentation]&lt;br /&gt;
&lt;br /&gt;
Clone the poky repository&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install a python virtual environment to sandbox the python modules from your OS.&lt;br /&gt;
Enter Activate the python virtual environment in your current shell.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ virtualenv venv&lt;br /&gt;
    $ source ./venv/bin/activate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the python module dependencies for Toaster&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ pip install -r ./bitbake/toaster-requirements.txt&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the setup and start script, follow instructions displayed&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
     $ TOASTER_MANAGED=1 TOASTER_DEVEL=1 ./bitbake/bin/toaster&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sending patches to Toaster Project ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit message should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    bitbake: toaster: &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    long(er) description&lt;br /&gt;
&lt;br /&gt;
    [YOCTO #0000]&lt;br /&gt;
&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@domain.com&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where YOCTO #0000 is the related bug number if there is one. Signed off by with your git commit -s credentials.&lt;br /&gt;
&lt;br /&gt;
We accept patches on the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] by &amp;quot;git send-email&amp;quot; please include in your subject line &amp;quot;[review-request][PATCH]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git send-email HEAD^  --subject-prefix=&amp;quot;review-request][PATCH&amp;quot; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available on the [http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines openembedded wiki]&lt;br /&gt;
&lt;br /&gt;
More help learning git is available on [https://try.github.io github] and [http://git-scm.com/documentation/ the official documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sending branches to Toaster Project ==&lt;br /&gt;
&lt;br /&gt;
If you wish to submit whole branches please use the poky-contrib repository see [[Poky Contributions#Poky_Contrib_Branch]] for setup guide.&lt;br /&gt;
&lt;br /&gt;
Once you have pushed a branch please then send an email to the [https://www.yoctoproject.org/tools-resources/community/mailing-lists toaster mailing list] with the subject in the following format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 [review-request] my_branch_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the body of the email it&#039;s useful to describe your branch&#039;s functionality, which commits and a link to the git web.&lt;br /&gt;
&lt;br /&gt;
If you need any assistance please post on the mailing list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Submitting changes upstream ===&lt;br /&gt;
&lt;br /&gt;
Toaster code lives in Bitbake repository at [http://git.openembedded.org/bitbake/|http://git.openembedded.org/bitbake/].&lt;br /&gt;
&lt;br /&gt;
== Code syle guide ==&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
Django has a template language which allows us to render pages based on the data (context). We use the template language to setup the initial state of the page and to create re-usable components that can be included in other pages.&lt;br /&gt;
&lt;br /&gt;
The recommend template code style is as follows&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  {# Maintaining indentation #}&lt;br /&gt;
  {% if %}&lt;br /&gt;
   &amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% else %}&lt;br /&gt;
   &amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;&lt;br /&gt;
  {% endif %}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% comment %}&lt;br /&gt;
This is a longer comment that describes all the things&lt;br /&gt;
that are below in quite a bit of detail because they&#039;re&lt;br /&gt;
a little more difficult to understand.&lt;br /&gt;
{% endcomment %}&lt;br /&gt;
&lt;br /&gt;
{% for layer in layers_list %}&lt;br /&gt;
 {{layer}}&lt;br /&gt;
{% endfor %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{var}}&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
{# Maintaining indentation #}&lt;br /&gt;
{%if%}&amp;lt;p&amp;gt;this&amp;lt;/p&amp;gt;{%else%}&amp;lt;p&amp;gt;that&amp;lt;/p&amp;gt;{%endif%}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{#This is a longer comment that describes all the things that are below in quite a bit of detail because they&#039;re a little more difficult to understand. #}&lt;br /&gt;
{%for o in layers_list%}{{o}}{%endfor%}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Maintain indentation as you would with other languages&lt;br /&gt;
* White space after &#039;%&#039;&lt;br /&gt;
* Comment blocks for longer comments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* These hold some numbers */&lt;br /&gt;
var oneVar = 1;&lt;br /&gt;
var twoVar = 2;&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = {&lt;br /&gt;
  cheddar : 1,&lt;br /&gt;
  stilton : 2,&lt;br /&gt;
  emmental : 3, &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function doThingsHere(){&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* If one equals two do some other things and make sure that&lt;br /&gt;
 * if the the click handler is setup correctly.&lt;br /&gt;
 */&lt;br /&gt;
if (one === two) {&lt;br /&gt;
  var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
  oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
  $(this).click(function (event){&lt;br /&gt;
    alert(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;#little-mouse&amp;quot;).focusout(function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
  noThingHere();&lt;br /&gt;
else&lt;br /&gt;
  doThingHere();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// These hold some numbers&lt;br /&gt;
oneVar = 1&lt;br /&gt;
twoVar = 2&lt;br /&gt;
&lt;br /&gt;
var cheesesTypes = { cheddar : 1, stilton : 2,  emmental : 3, }&lt;br /&gt;
&lt;br /&gt;
function doThingsHere ()&lt;br /&gt;
{&lt;br /&gt;
return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//If one equals two do some other things and make sure that if the the click handler is setup correctly.&lt;br /&gt;
if( one === two ) {&lt;br /&gt;
var cheese = &amp;quot;cheddar&amp;quot;;&lt;br /&gt;
oneVar = doThingsHere();&lt;br /&gt;
&lt;br /&gt;
    $(this).click(function(event){ alert(&amp;quot;Hello&amp;quot;); });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;little-mouse&amp;quot;).addEventListener(&amp;quot;focusout&amp;quot;, function(){&lt;br /&gt;
  alert(&amp;quot;bye&amp;quot;)&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
if (oneVar)&lt;br /&gt;
{&lt;br /&gt;
  noThingHere();&lt;br /&gt;
} else {  doThingHere(); }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* Variables should be marked with &amp;quot;var&amp;quot; &lt;br /&gt;
* Semicolons should be used&lt;br /&gt;
* Keep as close to 80 cols as possible&lt;br /&gt;
* Use 2 space per indentation&lt;br /&gt;
* Open curly braces after parenthesis for functions and close on a new line&lt;br /&gt;
* Use camelCase for function names and variable names &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make use of running your Javascript through jshint we have a .jshint configuration file in that js directory (toastergui/static/js)&lt;br /&gt;
&lt;br /&gt;
e.g. install jshint and add to your current PATH, then run:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ npm install jshint; export PATH=$PATH:$PWD/node_modules/.bin/&lt;br /&gt;
 $ jshint ./toastergui/static/js/base.js&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== HTML ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yes please:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;something-area&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;p class=&amp;quot;important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p id=&amp;quot;important-text&amp;gt;This is some text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;No thank you:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p class=&amp;quot;Important&amp;quot;&amp;gt;This is some text&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;somethingarea&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p id=&amp;quot;ImportantText&amp;quot;&amp;gt;This is&lt;br /&gt;
some text&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 2 space indentation&lt;br /&gt;
* Lower case, ids hyphenated when multiple words&lt;br /&gt;
* No duplicate ids &lt;br /&gt;
&lt;br /&gt;
* Run your HTML through a [http://validator.w3.org/#validate_by_input HTML validator] available for [http://validator.w3.org/source/ local install]. The w3c validator it&#039;s self doesn&#039;t currently validate html5, it uses as a back end [https://validator.github.io/validator/ Nu Html Checker] which can be installed as a standalone service, full instructions in the readme.&lt;br /&gt;
&lt;br /&gt;
Quick install instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir html5-validator &amp;amp;&amp;amp; cd html5-validator&lt;br /&gt;
 $ export JAVA_HOME=/usr/lib/jvm/java-6-openjdk&lt;br /&gt;
 $ git clone https://github.com/validator/validator.git&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
 $ python build/build.py all&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML can be indented quickly using tidy, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 tidy -xml --indent auto --indent-spaces 2 --quiet yes -w -1 --show-body-only yes  ./index.html &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Lenient [https://www.python.org/dev/peps/pep-0008 pep8]&lt;br /&gt;
Ignoring most of the whitespace around character issues (E124,E203,E201,E265,E303,E302,E231) see toaster/.pep8 and [http://pep8.readthedocs.org/en/latest/intro.html#error-codes error code list]&lt;br /&gt;
&lt;br /&gt;
Fix all issues identified by running code through pep8. We have a fairly lenient config file (toaster/.pep8).&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pep8 ./toastergui/urls.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run code through pylint and fix identified issues - Some can be reasonably ignored such as doc strings for every function or star-args. No pylintrc config provided here as most issues identified are highly contextual and should be ignored on a case by case basis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 $ pylint ./toastergui/views.py&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Design_feedback&amp;diff=15040</id>
		<title>Design feedback</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Design_feedback&amp;diff=15040"/>
		<updated>2015-07-06T12:21:48Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* &amp;quot;Normal&amp;quot; builds vs. &amp;quot;custom image recipe&amp;quot; builds */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Feedback ==&lt;br /&gt;
&lt;br /&gt;
=== Content and labeling ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: creating an image recipe, I find the text in the modal too long, anything more than 2 sentences and my attention span is over!&lt;br /&gt;
&lt;br /&gt;
BELEN: I am sure we can improve that text to make it shorter.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: BTW, thinking of the naming, I would suggest &amp;quot;Custom recipes&amp;quot;, because it&#039;s not clear from the links that I can actually configure something there.&lt;br /&gt;
&lt;br /&gt;
BELEN: Happy to review the labeling, as usual. I would add the word &amp;quot;image&amp;quot; though, because you cannot create custom software recipes or package groups: only image recipes. So it would be something like &amp;quot;Custom image recipes&amp;quot;. Would that work?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: maybe we should change the terminology from Add/Delete?&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, everybody is screaming for this :) I will change it, but it needs to be changed across Toaster, not just in the image customisation process.&lt;br /&gt;
&lt;br /&gt;
=== Creating an image recipe ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I found it confusing that I entered a name and clicked create but have not actually created anything&lt;br /&gt;
&lt;br /&gt;
BELEN: mmm, this one is interesting. What makes you think that you have not created anything? &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
MICHAEL: what about something like suggestion1.png  (attached) this brings it more into line with import layer/create new project/form based activity.&lt;br /&gt;
&lt;br /&gt;
BELEN: that is quite similar to Tiago&#039;s sketches. I shied away from that approach for 2 reasons:&lt;br /&gt;
&lt;br /&gt;
# Because I find it crowded and lacking on clear priorities. There is a lot of content and controls in this screen. Most of them we need to deactivate until a name for the image recipe has been set. I am sure there are things we could do in visual design to improve the balance in such a screen, but not in this first go. The question that immediately comes to my mind when I see it is: if I cannot manipulate these content and controls, why are you showing them to me? That&#039;s why I sticked to the 2-step approach: give this a name first, so that we can create the image recipe, then, once created, you can proceed to &amp;quot;configure&amp;quot; it. &lt;br /&gt;
#Because it meant we need 2 different custom image recipe pages: one for when you are creating the image for the first time (with the steps numbered and the name field at the top), and a second one for when you are editing the image recipe after creating it (with the name you gave before as the heading 1, and no steps). Splitting the naming step from the custom image recipe page means that we can use exactly the same page for both circumstances, which I think is good. &lt;br /&gt;
&lt;br /&gt;
The above is just the rationale behind my design, just to make this clear. I believe your suggestion would also work. To figure out which one would work better, we would need to test them, and unfortunately we don&#039;t have time for that right now. But I am sure we can work together to come up with something. It would be good to hear a bit more about the reasons why you prefer your suggestion.&lt;br /&gt;
&lt;br /&gt;
=== Select a base image recipe ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I was looking for a way to &amp;quot;de/re/select&amp;quot; an image, we don&#039;t quite have the same concept here as the machines selection that I was expecting, where you can always select regardless of whether it&#039;s already selected.&lt;br /&gt;
&lt;br /&gt;
BELEN: just to make sure I understand, do you mean the fact that you get a &#039;selected&#039; badge next to the selected base image recipe? The initial designs for machines also indicated which machine was selected with a similar badge, until it was pointed out to me that there is no way for us to know which layer is actually providing the machine you are setting. The only thing we know for sure is the name of the machine. I do not think is critical to indicate which is the selected base image recipe in the table: you already have it on the image summary (the well1 on the right hand side). So maybe we can survive without that.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: When configuring an image, I would suggest dropping the &amp;quot;Base image recipe&amp;quot; concept, because we can&#039;t follow on updates from the base image recipe after the custom recipe was created, and this will confuse the user.&lt;br /&gt;
&lt;br /&gt;
BELEN: and what do users do instead? Do they start they custom image recipes from a blank slate? That will most likely result in an image that doesn&#039;t build. Do you have an alternative starting point in mind?&lt;br /&gt;
&lt;br /&gt;
ALEX: The users would start from an already existing image, as they do now. What I&#039;m suggesting is dropping the tab of possible base images, and the ability to change the base image for a custom image once the custom image recipe is created. This is the same point as below, just pointing to the tab.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Also, the tab with the Base image recipe in My Image details, allowing the user to change the base image for a recipe, should be taken out, since we cannot change the base image recipe after the initial selection.&lt;br /&gt;
&lt;br /&gt;
BELEN: Not allowing people to change their minds about the selected base image recipe is a bit draconian. It means that if you select the wrong base image by mistake, you will be forced to discard the custom image recipe, and restart from scratch. A bit harsh. After discussing this with Paul, it turns out the agreement was the following: if you change the base image recipe, we&#039;ll drop the initial list of packages and any deletions you might have done on it (we will warn you about that before you change the base image). Ideally we would be able to remember any packages you have added, but if this is not feasible, we might be able to survive without it. I need to design this.&lt;br /&gt;
&lt;br /&gt;
ALEX: When storing a custom image recipe, we have two options: store an absolute list of packages, or store a reference to a base image and a difference for the list of packages. These options are available only while working within the Toaster instance - once you export your recipe, you have to export an absolute list of packages. &lt;br /&gt;
&lt;br /&gt;
Each approach has advantages and disadvantages. The functionality described above requires storing a reference + difference, in order to be able to change the base image. The reference+difference approach has the advantage of changing the package list based on the image features and current configuration, and following the upstream changes, and the disadvantage of needing parsing on each project configuration change, and possibly changing the image package list outside user&#039;s control (when the upstream base image changes).&lt;br /&gt;
&lt;br /&gt;
=== Custom image summary (right column) ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I was expecting the pencil to do the same as other pencils and activate text input boxes. Obviously if you&#039;re on the Add/Delete packages page you can&#039;t change the base image like that so maybe not having these  pencils would be better. I was also unsure as what the change version/licence would do.&lt;br /&gt;
&lt;br /&gt;
BELEN: Most of the pencil icons will activate text input boxes, it&#039;s just that I didn&#039;t prototype the interaction because we already know how they work (we are just reusing the existing interaction). The pencils are the way you can change the name, the version and the license for your custom image recipe. The only exception is the pencil icon next to the base image recipe. That would be a link to the &#039;Select a base image recipe&#039; page. I agree this is not consistent. In general, I think the idea of that image summary is good, but the content could be improved: so maybe we&#039;ll look into a better way to organise it and better labelling for the different items.&lt;br /&gt;
&lt;br /&gt;
=== Adding / removing layers ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: If you&#039;ve selected an image recipe and then remove the layer that provides it... what happens?&lt;br /&gt;
&lt;br /&gt;
BELEN: heh, didn&#039;t think of this one :) Any changes in the layer list, adding or removing, will trigger a parsing. Once the parsing is finished, we could flag the fact that the base image recipe is no longer provided by any project layers. But, if you have removed the layer that provides the base image recipe, I would like to think nothing happens, since we would have created a new .bb file that doesn&#039;t depend on the original image recipe. If we decide that the custom image recipe should inherit the base image recipe, well, then we would have a problem: we would need to force people to select a new base image recipe. Paul can probably clarify what would really happen, so I&#039;ll make sure to ask him. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: The &amp;quot;Add A Layer&amp;quot; panel on the right hand side, I would&#039;ve expected it to be a pop-up like in the configuration page, not take me to the Compatible layers. It completely takes me out of the context of what I was doing - I want to customize a image for MinnowMax, I want to add minnowmax and be done, not go to a different page, and then have no idea how to return in a single click.&lt;br /&gt;
&lt;br /&gt;
BELEN: you are right. We can probably just replicate the mechanism we have in the basic configuration page: an &#039;add layer&#039; form with links to view all the layers and to import a layer. So if you know what you are doing, you can add the layer you need without exiting the image configuration page.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
DAVID: The new page can add layers in place which is nice, and I see how you can use it to parse and show that layer&#039;s package count. However, it appears that if I change my mind about the layer I have to go out to the layer page to remove it? Could perhaps the &amp;quot;undo&amp;quot; feature also be made available here? Or a layer delete icon?&lt;br /&gt;
&lt;br /&gt;
BELEN: See the [[#The &#039;Undo&#039; feature]] below. You can delete layers in these pages using the &#039;delete&#039; icon in the Project Layers section (right-hand column). The ability to delete layers creates other issues though, as pointed by Michael above. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Also, when deleting / adding a layer in-page, the recipes available would just appear/disappear from the &amp;quot;available recipes&amp;quot; table.&lt;br /&gt;
&lt;br /&gt;
BELEN: Which one is the &amp;quot;available recipes&amp;quot; table? The one listing all the base image recipes you can choose from? If yes, those don&#039;t disappear if you delete a layer. Because we will know about them from the layer index, we list them always, and we allow you to select them by adding the required layer first. When you remove a layer, what changes is the button that you see next to the base image recipe.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: The Build Image recipe/ Download recipe file / Delete image recipe buttons are somewhat easy to miss, they look a bit like progress buttons or other tabs. I wonder if they would be better off in &#039;.well&#039; 1. The Build button could be more noticeable.&lt;br /&gt;
&lt;br /&gt;
ALEX: In the &amp;quot;My image recipe&amp;quot;, I am not sure why the primary actions that you can take on the recipe (Build, Download, Delete) are tucked away in the right hand side, when my focus is on the left hand side, where I get drawn to the image name. Maybe we can move the buttons, make them bigger, as to be clear they are the primary action you do with a customized image ?&lt;br /&gt;
&lt;br /&gt;
BELEN: agreed. I tried many options, but I wasn&#039;t particularly happy with any of them. I&#039;ll give this another go.&lt;br /&gt;
&lt;br /&gt;
=== Dependency size ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: In general if you can avoid having data in a table that for each one requires extra data looking up the tables will be much faster/efficient. For example we have the dependencies button with total size displayed. It should be really quick to count the number of dependences, but much slower if we also have to retrieve the objects to get the data in them, such as &amp;quot;name&amp;quot; and &amp;quot;size&amp;quot;.  If we can do that by making it &amp;quot;on demand&amp;quot; that&#039;s much better, e.g. you click the button and it fetches this extra data.&lt;br /&gt;
&lt;br /&gt;
BELEN: this was my initial approach. From the UI perspective, it is also tidier. Then Ed asked to see this information without having to click, and I decided to give it a try to see how it would look like. I agree it is better to present it when you select a certain dependency, so I will revert to that. Sorry Ed :/&lt;br /&gt;
&lt;br /&gt;
=== Displaying image contents ===&lt;br /&gt;
&lt;br /&gt;
DAVID: Can we add a filter so that we can show just the packages that we can delete? The use case is trimming the image, where we want the 100 packages that we wish to examine for removal not to be lost in the possible 1000&#039;s packages that are available to add.&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, absolutely. The prototype does not include filters, but the intention is adding at least the one you are asking for.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: How do I know what&#039;s in my image in at a certain moment ?&lt;br /&gt;
 &lt;br /&gt;
BELEN: We will provide a filter for that, as explained in above. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: It would be great if I could have two tables in the image customization page - the current contents of the image, and the packages that are available. When selecting/removing a package, a package would disappear from a list and appear in the second one.&lt;br /&gt;
&lt;br /&gt;
BELEN: This is a nice idea, but I don&#039;t think we have space for 2 tables. I toyed with the concept of a list of added packages that populates as you add things, to provide better visibility of your changes. This list would be on the right hand column, with the other custom image recipe information (name, version, etc). Would that do?&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
DAVID: I will admit that I was thrown by the new status pop-up, because not only does it cover things up on my page, I also generally associate them with spam and ad-ware. I understand your use for showing an action in progress, but we already had a metaphor for that in the progress/status bars inserted (when applicable) at the top of the page. Why a new metaphor? What does it add that the regular model does not? I know that it does stay visible while you for example scroll, but is that a hard requirement?&lt;br /&gt;
&lt;br /&gt;
BELEN: Just to be sure, I guess you are talking about the fixed-positioned notifications that appear when you perform an action (for example, adding a layer). Their main advantage over our current notification system is that they are always visible. Since these notifications are the way Toaster provides feedback to users about their actions, that&#039;s a significant advantage. They are also a relatively common way of presenting notification nowadays (Dropbox uses them, just to give a random example, but so do lots of other web apps). Another common way is &amp;quot;pop from top&amp;quot; messages, like these ones:&lt;br /&gt;
&lt;br /&gt;
https://css-tricks.com/pop-from-top-notification/&lt;br /&gt;
&lt;br /&gt;
They have an example here: &lt;br /&gt;
&lt;br /&gt;
https://css-tricks.com/examples/PopFromTopMessage/&lt;br /&gt;
&lt;br /&gt;
I gave those a quick try, but didn&#039;t play nice with the fixed top bar we are currently using in Toaster. &lt;br /&gt;
&lt;br /&gt;
I can tweak the design a bit to make the fixed-positioned notifications less offensive (smaller, with less shadow, for example). If you would like to find a completely different way to handle notifications, let&#039;s open a Bugzilla entry and I can definitely do that at a later stage. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
DAVID: I also do not understand the dangling part, where I have to manual cancel it to make it go away. For example, I understand for example its use in the add layer parsing progress, but when it is done and says &amp;quot;Layer Information updated&amp;quot; why do I have to manually kill it? Could it at least go away on its own after a moment, and let that be the clue that the process completed?&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, this we can definitely do. We just need to come up with the right time interval. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: I subscribe to David&#039;s view that the popups are annoying and unnecessary.&lt;br /&gt;
&lt;br /&gt;
BELEN: they are not popups, just to be clear. Popups are modal. These things do not prevent you from interacting with the interface until you take action on them.  &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: I would suggest using box alerts as they are currently implemented, to avoid obscuring the screen, and divert user&#039;s attention. The feedback for immediate actions should not be in your face.&lt;br /&gt;
&lt;br /&gt;
BELEN: well, it kind of needs to be. Feedback is incredibly important in interfaces: users must know the state of the system and the outcome of their actions. Notifications should be therefore visible (the ones we have right now not always are), and that&#039;s why so many web applications are using fix-positioned ones like these to provide feedback to users. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Ditto for the &amp;quot;data loading&amp;quot; spinner, let&#039;s make it a bit more obscure. &lt;br /&gt;
&lt;br /&gt;
BELEN: Michael and I spent a good deal of time trying to work out the best way to present this using the standard UI widgets that come with Bootstrap. I still think the way it is right now is the best way we can currently make it. That doesn&#039;t mean it cannot be improved. I am sure Levi will be ok with including a &#039;data loading&#039; UI component in the library he is creating for Toaster.&lt;br /&gt;
&lt;br /&gt;
=== The &#039;Undo&#039; feature ===&lt;br /&gt;
&lt;br /&gt;
DAVID: The &amp;quot;Undo&amp;quot; feature though is nice!&lt;br /&gt;
&lt;br /&gt;
BELEN: &amp;quot;undo&amp;quot; features are very, very nice, I agree. I&#039;ve added it here as suggested by the rest of the design contributors, but the reality is that I don&#039;t expect it to be part of the image customisation feature, that&#039;s why I don&#039;t really mention it in the video. &amp;quot;Undo&amp;quot; should probably be designed and implemented and an application-wide feature, which means it should work for pretty much all actions. This poses a certain problem for us, since &amp;quot;undoing&amp;quot; adding a layer might not be as easy as &amp;quot;undoing&amp;quot; removing a package from a custom image recipe. What I mean by this is that &#039;undo&#039; requires some thought. We can open a Bugzilla entry to design an &amp;quot;Undo&amp;quot; feature for Toaster, but it will not be part of the image customisation work.&lt;br /&gt;
&lt;br /&gt;
=== Layer parsing and package count ===&lt;br /&gt;
&lt;br /&gt;
DAVID: Speaking of layer parsing, don&#039;t we already have an idea of the package count per layer from the &amp;quot;all packages&amp;quot; table?&lt;br /&gt;
&lt;br /&gt;
BELEN: I am a bit confused by the &amp;quot;package count per layer&amp;quot; sentence. In the image customisation process, what matters is not the package count per layer, but the package count per base image recipe, which is the very important information when you need to decide which image recipe you should use as a starting point.&lt;br /&gt;
&lt;br /&gt;
=== Package groups ===&lt;br /&gt;
&lt;br /&gt;
DAVID: How does this interface deal with &amp;quot;package groups&amp;quot;? People will ask.&lt;br /&gt;
&lt;br /&gt;
http://www.yoctoproject.org/docs/1.8/dev-manual/dev-manual.html#usingpoky-extend-customimage-customtasks&lt;br /&gt;
&lt;br /&gt;
BELEN: I&#039;m afraid it doesn&#039;t. We know that at some point we&#039;ll need to distinguish package groups from other recipes, and break them up, i.e. allow people to remove packages from package groups. But during the high level design discussions we came to the conclusion that it would be too hard to do in version 1 - see page 11 of the initial design document&lt;br /&gt;
&lt;br /&gt;
https://wiki.yoctoproject.org/wiki/images/3/31/Image_customisation_in_Toaster.pdf&lt;br /&gt;
&lt;br /&gt;
=== Concerns about package removal ===&lt;br /&gt;
 &lt;br /&gt;
DAVID: Adding packages is easy, but we (WR) have found that removing them is weirdly hard. I am very curious how the backend package removal/exclusion is being done, and who is doing it. In any case, we should have disclaimers in place.&lt;br /&gt;
&lt;br /&gt;
* Some removed packages appear anyway in the image, because sometimes the dependency information in the packages are not complete nor correct.&lt;br /&gt;
&lt;br /&gt;
* Some removed packages will break the build or the runtime, even though the dependencies say it should be ok. Users should be encouraged to test their changes early and often, and we may want to help save their bacon with checkpoints (based on the last successful build?) or multiple undo&#039;s so that they can back up to a working state rather than re-starting from scratch. Just saying.&lt;br /&gt;
&lt;br /&gt;
BELEN: I cannot answer your question about package removal (maybe Paul?), but good to be warned about potential problems and possible solutions. They might not make version 1, but we can definitely enhance the functionality in subsequent releases.&lt;br /&gt;
&lt;br /&gt;
ALEX: This is a limitation of the way metadata is structured and tested. Th​e YP developers often miss correct dependency linking because the actual dependencies for a package (e.g. installed libraries) were already satisfied by another chain, so they miss specifying the dependency in the metadata. This problem will be re-occuring during Toaster use, and until we clean up the dependencies metadata, we need to tell the users exactly what&#039;s going on - and enable them to timely submit error reports about the invalid metadata. This is the only way we can actually clean everything up.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Normal&amp;quot; builds vs. &amp;quot;custom image recipe&amp;quot; builds ===&lt;br /&gt;
&lt;br /&gt;
ALEX: I think it should be easy to build your own recipes in the Configuration page. The text entry with the build button should be no longer the primary means of starting a build, now that we can configure the build itself. I would suggest adding a &amp;quot;My image recipes&amp;quot; box in the style of &amp;quot;Most build recipes&amp;quot; in the Configuration, with two big buttons : &amp;quot;Build selected&amp;quot; and &amp;quot;New image recipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
BELEN: right, I am a bit confused about this suggestion. We decided to &amp;quot;isolate&amp;quot; the builds of custom image recipes from &amp;quot;normal&amp;quot; builds to make sure we didn&#039;t have to deal with pushing layers to Git repos. To make this separation (which is by no means ideal) as clear as possible, we agreed to create a separate &amp;quot;My image recipes&amp;quot; section, from which you cannot start &amp;quot;normal&amp;quot; builds, and from where you start only builds of you custom image recipes. If you want to integrate your custom image recipe into your &amp;quot;normal&amp;quot; builds you need to download the .bb file and add it to your custom layer, then import that custom layer into Toaster. Please read page 5 of the high-level design document available here &lt;br /&gt;
&lt;br /&gt;
https://wiki.yoctoproject.org/wiki/images/3/31/Image_customisation_in_Toaster.pdf&lt;br /&gt;
&lt;br /&gt;
The above is what the initial design workshop concluded. I think we are all most definitely open to new ideas, but they must involve a solution to the problem of which layer do custom image recipes go to. &lt;br /&gt;
&lt;br /&gt;
ALEX: Maybe I overstated my suggestion - it was asking simply to add an extra box launch already-configured custom images in the Configuration page, not changing the page structure. &lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: For a new user, it&#039;s not obvious how to start configuring the image contents, in the sense that &amp;quot;My image recipes&amp;quot; isn&#039;t the most obvious place one would start to configure a build, which is why people actually look for into Toaster. I would suggest making &amp;quot;Type the target you want to build&amp;quot; and Build button in a section similar to, and on top of the &amp;quot;Latest builds&amp;quot; section. And add, in that section, in the project page, a bit link &amp;quot;Configure the image contents&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
BELEN: Again, I am confused. There is now a build form not only above the &amp;quot;latest builds&amp;quot; section, but also in all project configuration pages, in exactly the same place so that it remains easy to find for users. That component is removed from the &amp;quot;My image recipes&amp;quot; pages because we concluded we should separate their builds from &amp;quot;normal&amp;quot; builds as explained above. Your &amp;quot;configure the image contents&amp;quot; suggestion would conflate both types of builds. Again, this is something I would love to do, but we would need a way to handle the question of which layer do custom image recipes go to.&lt;br /&gt;
&lt;br /&gt;
ALEX: I am not sure I fully understand the separation between the two types of builds - I did not understand the separation. In my mind, there is one single type of builds.&lt;br /&gt;
&lt;br /&gt;
The custom recipes will got in an ad-hoc temporary layer created by Toaster in all cases, and this layer will show up in the build data. I suppose that there will be no obscuring of this information.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: It seems a bit strange that I can navigate to most of the Project options via the left hand menu, but not to image recipes. The user-defined image recipes are Project-specific, and I think they are at the same level with the &amp;quot;Image recipes&amp;quot; and &amp;quot;Software recipes&amp;quot;, but in the &amp;quot;CONFIGURATION&amp;quot; category.  I don&#039;t think that having a duplicate link as a tab is a problem, but I get frustrated by the disappearance of the left-hand-menu in the My Image Recipes.&lt;br /&gt;
&lt;br /&gt;
BELEN: This is once more a consequence of the agreed separation between &amp;quot;normal&amp;quot; and custom image recipe builds. In the project page: the &amp;quot;builds&amp;quot; content spans both, the &amp;quot;configuration&amp;quot; content belongs to the &amp;quot;normal&amp;quot; builds context, and the &amp;quot;my image recipes&amp;quot; content belongs to the custom image recipes context. The latter 2 are kept separate as the outcome of the initial design workshop suggested should be done.&lt;br /&gt;
&lt;br /&gt;
ALEX: Maybe we should revisit this in a face-to-face meeting ?&lt;br /&gt;
&lt;br /&gt;
=== New build button ===&lt;br /&gt;
&lt;br /&gt;
ALEX: Please drop the &amp;quot;New build&amp;quot; button. That button is a stop-gap measure to launching build commands, but now we&#039;re not simply issue-ing build commands, we are actually configuring the build. Even if you are an experienced user, it&#039;s opaque form - small and with very little information - makes it difficult to use.&lt;br /&gt;
&lt;br /&gt;
BELEN: mmm, drop it from where? It is nowhere in the image customisation process. The purpose of the &#039;new build&#039; button is allow you to build for any project from anywhere. I still think that&#039;s a handy thing to have, although I have no evidence to back that up. I am ok with reconsidering that feature, but not as part of this review, which is supposed to be about the image customisation design.&lt;br /&gt;
&lt;br /&gt;
ALEX: ahm, right, dropping it from the top toolbar, next to the New Project button. Not part of the image customization though, but the thought was triggered by being in the Custom image page and seeing multiple Build buttons.&lt;br /&gt;
&lt;br /&gt;
== Design ARs ==&lt;br /&gt;
&lt;br /&gt;
* Find a way to show that the number of packages shown after parsing is a best guess&lt;br /&gt;
* In the &#039;my image recipes&#039; table, see if there is a way we can see a build button in the last table column, consistent with how all other recipes are displayed &lt;br /&gt;
* Review the content in the &#039;name your image recipe&#039; modal. The help text is too long, and the heading should match somehow the button clicked (&#039;new image recipe&#039;). Consider change to a page, like in projects. &lt;br /&gt;
* Change &#039;my image recipes&#039; to &#039;custom image recipes&#039; &lt;br /&gt;
* Change &#039;add / delete&#039; to &#039;add / remove&#039; across Toaster&lt;br /&gt;
* Talk to Michael about his suggested alternative to the image customisation page (with the name at the top as step 1, and the tabs afterwards as step 2)&lt;br /&gt;
* Confirm with Michael if I should remove the &#039;selected&#039; badge in the base image recipes table &lt;br /&gt;
* Design the &#039;changing my base image&#039; workflow. All the initial packages and any of them you have deleted will be lost. We should ideally keep the list of packages you added, but what if any of them already exists in the new base image? Think all this through. &lt;br /&gt;
* Remove the pencil next to the base image recipe in the right column summary: its behaviour would be inconsistent with all other pencils in Toaster. Also, changing the base image recipe has big impact, so it should probably not be too easy.&lt;br /&gt;
* Review the content of the right column summary&lt;br /&gt;
* Asking Paul what would happen in the image customisation process if you remove the layer providing the base image for a custom image recipe&lt;br /&gt;
* Add the &#039;add layer&#039; form as is in the configuration page to the Project layers section in the right hand column&lt;br /&gt;
* Review the presentation of the main page actions (build / download / delete)&lt;br /&gt;
* Remove the dependency size info from the button and put it inside the popover&lt;br /&gt;
* Add the needed filters&lt;br /&gt;
* Add a list of packages added to the image summary in the right column&lt;br /&gt;
* Make the fixed-positioned notifications less offensive (check the shadow and size)&lt;br /&gt;
* Define the time interval after which the fixed notifications fade out&lt;br /&gt;
* Ask Levi to design a &#039;loading&#039; component for the UI library&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Design_feedback&amp;diff=15039</id>
		<title>Design feedback</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Design_feedback&amp;diff=15039"/>
		<updated>2015-07-06T11:03:52Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* New build button */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Feedback ==&lt;br /&gt;
&lt;br /&gt;
=== Content and labeling ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: creating an image recipe, I find the text in the modal too long, anything more than 2 sentences and my attention span is over!&lt;br /&gt;
&lt;br /&gt;
BELEN: I am sure we can improve that text to make it shorter.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: BTW, thinking of the naming, I would suggest &amp;quot;Custom recipes&amp;quot;, because it&#039;s not clear from the links that I can actually configure something there.&lt;br /&gt;
&lt;br /&gt;
BELEN: Happy to review the labeling, as usual. I would add the word &amp;quot;image&amp;quot; though, because you cannot create custom software recipes or package groups: only image recipes. So it would be something like &amp;quot;Custom image recipes&amp;quot;. Would that work?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: maybe we should change the terminology from Add/Delete?&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, everybody is screaming for this :) I will change it, but it needs to be changed across Toaster, not just in the image customisation process.&lt;br /&gt;
&lt;br /&gt;
=== Creating an image recipe ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I found it confusing that I entered a name and clicked create but have not actually created anything&lt;br /&gt;
&lt;br /&gt;
BELEN: mmm, this one is interesting. What makes you think that you have not created anything? &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
MICHAEL: what about something like suggestion1.png  (attached) this brings it more into line with import layer/create new project/form based activity.&lt;br /&gt;
&lt;br /&gt;
BELEN: that is quite similar to Tiago&#039;s sketches. I shied away from that approach for 2 reasons:&lt;br /&gt;
&lt;br /&gt;
# Because I find it crowded and lacking on clear priorities. There is a lot of content and controls in this screen. Most of them we need to deactivate until a name for the image recipe has been set. I am sure there are things we could do in visual design to improve the balance in such a screen, but not in this first go. The question that immediately comes to my mind when I see it is: if I cannot manipulate these content and controls, why are you showing them to me? That&#039;s why I sticked to the 2-step approach: give this a name first, so that we can create the image recipe, then, once created, you can proceed to &amp;quot;configure&amp;quot; it. &lt;br /&gt;
#Because it meant we need 2 different custom image recipe pages: one for when you are creating the image for the first time (with the steps numbered and the name field at the top), and a second one for when you are editing the image recipe after creating it (with the name you gave before as the heading 1, and no steps). Splitting the naming step from the custom image recipe page means that we can use exactly the same page for both circumstances, which I think is good. &lt;br /&gt;
&lt;br /&gt;
The above is just the rationale behind my design, just to make this clear. I believe your suggestion would also work. To figure out which one would work better, we would need to test them, and unfortunately we don&#039;t have time for that right now. But I am sure we can work together to come up with something. It would be good to hear a bit more about the reasons why you prefer your suggestion.&lt;br /&gt;
&lt;br /&gt;
=== Select a base image recipe ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I was looking for a way to &amp;quot;de/re/select&amp;quot; an image, we don&#039;t quite have the same concept here as the machines selection that I was expecting, where you can always select regardless of whether it&#039;s already selected.&lt;br /&gt;
&lt;br /&gt;
BELEN: just to make sure I understand, do you mean the fact that you get a &#039;selected&#039; badge next to the selected base image recipe? The initial designs for machines also indicated which machine was selected with a similar badge, until it was pointed out to me that there is no way for us to know which layer is actually providing the machine you are setting. The only thing we know for sure is the name of the machine. I do not think is critical to indicate which is the selected base image recipe in the table: you already have it on the image summary (the well1 on the right hand side). So maybe we can survive without that.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: When configuring an image, I would suggest dropping the &amp;quot;Base image recipe&amp;quot; concept, because we can&#039;t follow on updates from the base image recipe after the custom recipe was created, and this will confuse the user.&lt;br /&gt;
&lt;br /&gt;
BELEN: and what do users do instead? Do they start they custom image recipes from a blank slate? That will most likely result in an image that doesn&#039;t build. Do you have an alternative starting point in mind?&lt;br /&gt;
&lt;br /&gt;
ALEX: The users would start from an already existing image, as they do now. What I&#039;m suggesting is dropping the tab of possible base images, and the ability to change the base image for a custom image once the custom image recipe is created. This is the same point as below, just pointing to the tab.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Also, the tab with the Base image recipe in My Image details, allowing the user to change the base image for a recipe, should be taken out, since we cannot change the base image recipe after the initial selection.&lt;br /&gt;
&lt;br /&gt;
BELEN: Not allowing people to change their minds about the selected base image recipe is a bit draconian. It means that if you select the wrong base image by mistake, you will be forced to discard the custom image recipe, and restart from scratch. A bit harsh. After discussing this with Paul, it turns out the agreement was the following: if you change the base image recipe, we&#039;ll drop the initial list of packages and any deletions you might have done on it (we will warn you about that before you change the base image). Ideally we would be able to remember any packages you have added, but if this is not feasible, we might be able to survive without it. I need to design this.&lt;br /&gt;
&lt;br /&gt;
ALEX: When storing a custom image recipe, we have two options: store an absolute list of packages, or store a reference to a base image and a difference for the list of packages. These options are available only while working within the Toaster instance - once you export your recipe, you have to export an absolute list of packages. &lt;br /&gt;
&lt;br /&gt;
Each approach has advantages and disadvantages. The functionality described above requires storing a reference + difference, in order to be able to change the base image. The reference+difference approach has the advantage of changing the package list based on the image features and current configuration, and following the upstream changes, and the disadvantage of needing parsing on each project configuration change, and possibly changing the image package list outside user&#039;s control (when the upstream base image changes).&lt;br /&gt;
&lt;br /&gt;
=== Custom image summary (right column) ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I was expecting the pencil to do the same as other pencils and activate text input boxes. Obviously if you&#039;re on the Add/Delete packages page you can&#039;t change the base image like that so maybe not having these  pencils would be better. I was also unsure as what the change version/licence would do.&lt;br /&gt;
&lt;br /&gt;
BELEN: Most of the pencil icons will activate text input boxes, it&#039;s just that I didn&#039;t prototype the interaction because we already know how they work (we are just reusing the existing interaction). The pencils are the way you can change the name, the version and the license for your custom image recipe. The only exception is the pencil icon next to the base image recipe. That would be a link to the &#039;Select a base image recipe&#039; page. I agree this is not consistent. In general, I think the idea of that image summary is good, but the content could be improved: so maybe we&#039;ll look into a better way to organise it and better labelling for the different items.&lt;br /&gt;
&lt;br /&gt;
=== Adding / removing layers ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: If you&#039;ve selected an image recipe and then remove the layer that provides it... what happens?&lt;br /&gt;
&lt;br /&gt;
BELEN: heh, didn&#039;t think of this one :) Any changes in the layer list, adding or removing, will trigger a parsing. Once the parsing is finished, we could flag the fact that the base image recipe is no longer provided by any project layers. But, if you have removed the layer that provides the base image recipe, I would like to think nothing happens, since we would have created a new .bb file that doesn&#039;t depend on the original image recipe. If we decide that the custom image recipe should inherit the base image recipe, well, then we would have a problem: we would need to force people to select a new base image recipe. Paul can probably clarify what would really happen, so I&#039;ll make sure to ask him. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: The &amp;quot;Add A Layer&amp;quot; panel on the right hand side, I would&#039;ve expected it to be a pop-up like in the configuration page, not take me to the Compatible layers. It completely takes me out of the context of what I was doing - I want to customize a image for MinnowMax, I want to add minnowmax and be done, not go to a different page, and then have no idea how to return in a single click.&lt;br /&gt;
&lt;br /&gt;
BELEN: you are right. We can probably just replicate the mechanism we have in the basic configuration page: an &#039;add layer&#039; form with links to view all the layers and to import a layer. So if you know what you are doing, you can add the layer you need without exiting the image configuration page.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
DAVID: The new page can add layers in place which is nice, and I see how you can use it to parse and show that layer&#039;s package count. However, it appears that if I change my mind about the layer I have to go out to the layer page to remove it? Could perhaps the &amp;quot;undo&amp;quot; feature also be made available here? Or a layer delete icon?&lt;br /&gt;
&lt;br /&gt;
BELEN: See the [[#The &#039;Undo&#039; feature]] below. You can delete layers in these pages using the &#039;delete&#039; icon in the Project Layers section (right-hand column). The ability to delete layers creates other issues though, as pointed by Michael above. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Also, when deleting / adding a layer in-page, the recipes available would just appear/disappear from the &amp;quot;available recipes&amp;quot; table.&lt;br /&gt;
&lt;br /&gt;
BELEN: Which one is the &amp;quot;available recipes&amp;quot; table? The one listing all the base image recipes you can choose from? If yes, those don&#039;t disappear if you delete a layer. Because we will know about them from the layer index, we list them always, and we allow you to select them by adding the required layer first. When you remove a layer, what changes is the button that you see next to the base image recipe.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: The Build Image recipe/ Download recipe file / Delete image recipe buttons are somewhat easy to miss, they look a bit like progress buttons or other tabs. I wonder if they would be better off in &#039;.well&#039; 1. The Build button could be more noticeable.&lt;br /&gt;
&lt;br /&gt;
ALEX: In the &amp;quot;My image recipe&amp;quot;, I am not sure why the primary actions that you can take on the recipe (Build, Download, Delete) are tucked away in the right hand side, when my focus is on the left hand side, where I get drawn to the image name. Maybe we can move the buttons, make them bigger, as to be clear they are the primary action you do with a customized image ?&lt;br /&gt;
&lt;br /&gt;
BELEN: agreed. I tried many options, but I wasn&#039;t particularly happy with any of them. I&#039;ll give this another go.&lt;br /&gt;
&lt;br /&gt;
=== Dependency size ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: In general if you can avoid having data in a table that for each one requires extra data looking up the tables will be much faster/efficient. For example we have the dependencies button with total size displayed. It should be really quick to count the number of dependences, but much slower if we also have to retrieve the objects to get the data in them, such as &amp;quot;name&amp;quot; and &amp;quot;size&amp;quot;.  If we can do that by making it &amp;quot;on demand&amp;quot; that&#039;s much better, e.g. you click the button and it fetches this extra data.&lt;br /&gt;
&lt;br /&gt;
BELEN: this was my initial approach. From the UI perspective, it is also tidier. Then Ed asked to see this information without having to click, and I decided to give it a try to see how it would look like. I agree it is better to present it when you select a certain dependency, so I will revert to that. Sorry Ed :/&lt;br /&gt;
&lt;br /&gt;
=== Displaying image contents ===&lt;br /&gt;
&lt;br /&gt;
DAVID: Can we add a filter so that we can show just the packages that we can delete? The use case is trimming the image, where we want the 100 packages that we wish to examine for removal not to be lost in the possible 1000&#039;s packages that are available to add.&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, absolutely. The prototype does not include filters, but the intention is adding at least the one you are asking for.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: How do I know what&#039;s in my image in at a certain moment ?&lt;br /&gt;
 &lt;br /&gt;
BELEN: We will provide a filter for that, as explained in above. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: It would be great if I could have two tables in the image customization page - the current contents of the image, and the packages that are available. When selecting/removing a package, a package would disappear from a list and appear in the second one.&lt;br /&gt;
&lt;br /&gt;
BELEN: This is a nice idea, but I don&#039;t think we have space for 2 tables. I toyed with the concept of a list of added packages that populates as you add things, to provide better visibility of your changes. This list would be on the right hand column, with the other custom image recipe information (name, version, etc). Would that do?&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
DAVID: I will admit that I was thrown by the new status pop-up, because not only does it cover things up on my page, I also generally associate them with spam and ad-ware. I understand your use for showing an action in progress, but we already had a metaphor for that in the progress/status bars inserted (when applicable) at the top of the page. Why a new metaphor? What does it add that the regular model does not? I know that it does stay visible while you for example scroll, but is that a hard requirement?&lt;br /&gt;
&lt;br /&gt;
BELEN: Just to be sure, I guess you are talking about the fixed-positioned notifications that appear when you perform an action (for example, adding a layer). Their main advantage over our current notification system is that they are always visible. Since these notifications are the way Toaster provides feedback to users about their actions, that&#039;s a significant advantage. They are also a relatively common way of presenting notification nowadays (Dropbox uses them, just to give a random example, but so do lots of other web apps). Another common way is &amp;quot;pop from top&amp;quot; messages, like these ones:&lt;br /&gt;
&lt;br /&gt;
https://css-tricks.com/pop-from-top-notification/&lt;br /&gt;
&lt;br /&gt;
They have an example here: &lt;br /&gt;
&lt;br /&gt;
https://css-tricks.com/examples/PopFromTopMessage/&lt;br /&gt;
&lt;br /&gt;
I gave those a quick try, but didn&#039;t play nice with the fixed top bar we are currently using in Toaster. &lt;br /&gt;
&lt;br /&gt;
I can tweak the design a bit to make the fixed-positioned notifications less offensive (smaller, with less shadow, for example). If you would like to find a completely different way to handle notifications, let&#039;s open a Bugzilla entry and I can definitely do that at a later stage. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
DAVID: I also do not understand the dangling part, where I have to manual cancel it to make it go away. For example, I understand for example its use in the add layer parsing progress, but when it is done and says &amp;quot;Layer Information updated&amp;quot; why do I have to manually kill it? Could it at least go away on its own after a moment, and let that be the clue that the process completed?&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, this we can definitely do. We just need to come up with the right time interval. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: I subscribe to David&#039;s view that the popups are annoying and unnecessary.&lt;br /&gt;
&lt;br /&gt;
BELEN: they are not popups, just to be clear. Popups are modal. These things do not prevent you from interacting with the interface until you take action on them.  &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: I would suggest using box alerts as they are currently implemented, to avoid obscuring the screen, and divert user&#039;s attention. The feedback for immediate actions should not be in your face.&lt;br /&gt;
&lt;br /&gt;
BELEN: well, it kind of needs to be. Feedback is incredibly important in interfaces: users must know the state of the system and the outcome of their actions. Notifications should be therefore visible (the ones we have right now not always are), and that&#039;s why so many web applications are using fix-positioned ones like these to provide feedback to users. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Ditto for the &amp;quot;data loading&amp;quot; spinner, let&#039;s make it a bit more obscure. &lt;br /&gt;
&lt;br /&gt;
BELEN: Michael and I spent a good deal of time trying to work out the best way to present this using the standard UI widgets that come with Bootstrap. I still think the way it is right now is the best way we can currently make it. That doesn&#039;t mean it cannot be improved. I am sure Levi will be ok with including a &#039;data loading&#039; UI component in the library he is creating for Toaster.&lt;br /&gt;
&lt;br /&gt;
=== The &#039;Undo&#039; feature ===&lt;br /&gt;
&lt;br /&gt;
DAVID: The &amp;quot;Undo&amp;quot; feature though is nice!&lt;br /&gt;
&lt;br /&gt;
BELEN: &amp;quot;undo&amp;quot; features are very, very nice, I agree. I&#039;ve added it here as suggested by the rest of the design contributors, but the reality is that I don&#039;t expect it to be part of the image customisation feature, that&#039;s why I don&#039;t really mention it in the video. &amp;quot;Undo&amp;quot; should probably be designed and implemented and an application-wide feature, which means it should work for pretty much all actions. This poses a certain problem for us, since &amp;quot;undoing&amp;quot; adding a layer might not be as easy as &amp;quot;undoing&amp;quot; removing a package from a custom image recipe. What I mean by this is that &#039;undo&#039; requires some thought. We can open a Bugzilla entry to design an &amp;quot;Undo&amp;quot; feature for Toaster, but it will not be part of the image customisation work.&lt;br /&gt;
&lt;br /&gt;
=== Layer parsing and package count ===&lt;br /&gt;
&lt;br /&gt;
DAVID: Speaking of layer parsing, don&#039;t we already have an idea of the package count per layer from the &amp;quot;all packages&amp;quot; table?&lt;br /&gt;
&lt;br /&gt;
BELEN: I am a bit confused by the &amp;quot;package count per layer&amp;quot; sentence. In the image customisation process, what matters is not the package count per layer, but the package count per base image recipe, which is the very important information when you need to decide which image recipe you should use as a starting point.&lt;br /&gt;
&lt;br /&gt;
=== Package groups ===&lt;br /&gt;
&lt;br /&gt;
DAVID: How does this interface deal with &amp;quot;package groups&amp;quot;? People will ask.&lt;br /&gt;
&lt;br /&gt;
http://www.yoctoproject.org/docs/1.8/dev-manual/dev-manual.html#usingpoky-extend-customimage-customtasks&lt;br /&gt;
&lt;br /&gt;
BELEN: I&#039;m afraid it doesn&#039;t. We know that at some point we&#039;ll need to distinguish package groups from other recipes, and break them up, i.e. allow people to remove packages from package groups. But during the high level design discussions we came to the conclusion that it would be too hard to do in version 1 - see page 11 of the initial design document&lt;br /&gt;
&lt;br /&gt;
https://wiki.yoctoproject.org/wiki/images/3/31/Image_customisation_in_Toaster.pdf&lt;br /&gt;
&lt;br /&gt;
=== Concerns about package removal ===&lt;br /&gt;
 &lt;br /&gt;
DAVID: Adding packages is easy, but we (WR) have found that removing them is weirdly hard. I am very curious how the backend package removal/exclusion is being done, and who is doing it. In any case, we should have disclaimers in place.&lt;br /&gt;
&lt;br /&gt;
* Some removed packages appear anyway in the image, because sometimes the dependency information in the packages are not complete nor correct.&lt;br /&gt;
&lt;br /&gt;
* Some removed packages will break the build or the runtime, even though the dependencies say it should be ok. Users should be encouraged to test their changes early and often, and we may want to help save their bacon with checkpoints (based on the last successful build?) or multiple undo&#039;s so that they can back up to a working state rather than re-starting from scratch. Just saying.&lt;br /&gt;
&lt;br /&gt;
BELEN: I cannot answer your question about package removal (maybe Paul?), but good to be warned about potential problems and possible solutions. They might not make version 1, but we can definitely enhance the functionality in subsequent releases.&lt;br /&gt;
&lt;br /&gt;
ALEX: This is a limitation of the way metadata is structured and tested. Th​e YP developers often miss correct dependency linking because the actual dependencies for a package (e.g. installed libraries) were already satisfied by another chain, so they miss specifying the dependency in the metadata. This problem will be re-occuring during Toaster use, and until we clean up the dependencies metadata, we need to tell the users exactly what&#039;s going on - and enable them to timely submit error reports about the invalid metadata. This is the only way we can actually clean everything up.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Normal&amp;quot; builds vs. &amp;quot;custom image recipe&amp;quot; builds ===&lt;br /&gt;
&lt;br /&gt;
ALEX: I think it should be easy to build your own recipes in the Configuration page. The text entry with the build button should be no longer the primary means of starting a build, now that we can configure the build itself. I would suggest adding a &amp;quot;My image recipes&amp;quot; box in the style of &amp;quot;Most build recipes&amp;quot; in the Configuration, with two big buttons : &amp;quot;Build selected&amp;quot; and &amp;quot;New image recipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
BELEN: right, I am a bit confused about this suggestion. We decided to &amp;quot;isolate&amp;quot; the builds of custom image recipes from &amp;quot;normal&amp;quot; builds to make sure we didn&#039;t have to deal with pushing layers to Git repos. To make this separation (which is by no means ideal) as clear as possible, we agreed to create a separate &amp;quot;My image recipes&amp;quot; section, from which you cannot start &amp;quot;normal&amp;quot; builds, and from where you start only builds of you custom image recipes. If you want to integrate your custom image recipe into your &amp;quot;normal&amp;quot; builds you need to download the .bb file and add it to your custom layer, then import that custom layer into Toaster. Please read page 5 of the high-level design document available here &lt;br /&gt;
&lt;br /&gt;
https://wiki.yoctoproject.org/wiki/images/3/31/Image_customisation_in_Toaster.pdf&lt;br /&gt;
&lt;br /&gt;
The above is what the initial design workshop concluded. I think we are all most definitely open to new ideas, but they must involve a solution to the problem of which layer do custom image recipes go to. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: For a new user, it&#039;s not obvious how to start configuring the image contents, in the sense that &amp;quot;My image recipes&amp;quot; isn&#039;t the most obvious place one would start to configure a build, which is why people actually look for into Toaster. I would suggest making &amp;quot;Type the target you want to build&amp;quot; and Build button in a section similar to, and on top of the &amp;quot;Latest builds&amp;quot; section. And add, in that section, in the project page, a bit link &amp;quot;Configure the image contents&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
BELEN: Again, I am confused. There is now a build form not only above the &amp;quot;latest builds&amp;quot; section, but also in all project configuration pages, in exactly the same place so that it remains easy to find for users. That component is removed from the &amp;quot;My image recipes&amp;quot; pages because we concluded we should separate their builds from &amp;quot;normal&amp;quot; builds as explained above. Your &amp;quot;configure the image contents&amp;quot; suggestion would conflate both types of builds. Again, this is something I would love to do, but we would need a way to handle the question of which layer do custom image recipes go to.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: It seems a bit strange that I can navigate to most of the Project options via the left hand menu, but not to image recipes. The user-defined image recipes are Project-specific, and I think they are at the same level with the &amp;quot;Image recipes&amp;quot; and &amp;quot;Software recipes&amp;quot;, but in the &amp;quot;CONFIGURATION&amp;quot; category.  I don&#039;t think that having a duplicate link as a tab is a problem, but I get frustrated by the disappearance of the left-hand-menu in the My Image Recipes.&lt;br /&gt;
&lt;br /&gt;
BELEN: This is once more a consequence of the agreed separation between &amp;quot;normal&amp;quot; and custom image recipe builds. In the project page: the &amp;quot;builds&amp;quot; content spans both, the &amp;quot;configuration&amp;quot; content belongs to the &amp;quot;normal&amp;quot; builds context, and the &amp;quot;my image recipes&amp;quot; content belongs to the custom image recipes context. The latter 2 are kept separate as the outcome of the initial design workshop suggested should be done.&lt;br /&gt;
&lt;br /&gt;
=== New build button ===&lt;br /&gt;
&lt;br /&gt;
ALEX: Please drop the &amp;quot;New build&amp;quot; button. That button is a stop-gap measure to launching build commands, but now we&#039;re not simply issue-ing build commands, we are actually configuring the build. Even if you are an experienced user, it&#039;s opaque form - small and with very little information - makes it difficult to use.&lt;br /&gt;
&lt;br /&gt;
BELEN: mmm, drop it from where? It is nowhere in the image customisation process. The purpose of the &#039;new build&#039; button is allow you to build for any project from anywhere. I still think that&#039;s a handy thing to have, although I have no evidence to back that up. I am ok with reconsidering that feature, but not as part of this review, which is supposed to be about the image customisation design.&lt;br /&gt;
&lt;br /&gt;
ALEX: ahm, right, dropping it from the top toolbar, next to the New Project button. Not part of the image customization though, but the thought was triggered by being in the Custom image page and seeing multiple Build buttons.&lt;br /&gt;
&lt;br /&gt;
== Design ARs ==&lt;br /&gt;
&lt;br /&gt;
* Find a way to show that the number of packages shown after parsing is a best guess&lt;br /&gt;
* In the &#039;my image recipes&#039; table, see if there is a way we can see a build button in the last table column, consistent with how all other recipes are displayed &lt;br /&gt;
* Review the content in the &#039;name your image recipe&#039; modal. The help text is too long, and the heading should match somehow the button clicked (&#039;new image recipe&#039;). Consider change to a page, like in projects. &lt;br /&gt;
* Change &#039;my image recipes&#039; to &#039;custom image recipes&#039; &lt;br /&gt;
* Change &#039;add / delete&#039; to &#039;add / remove&#039; across Toaster&lt;br /&gt;
* Talk to Michael about his suggested alternative to the image customisation page (with the name at the top as step 1, and the tabs afterwards as step 2)&lt;br /&gt;
* Confirm with Michael if I should remove the &#039;selected&#039; badge in the base image recipes table &lt;br /&gt;
* Design the &#039;changing my base image&#039; workflow. All the initial packages and any of them you have deleted will be lost. We should ideally keep the list of packages you added, but what if any of them already exists in the new base image? Think all this through. &lt;br /&gt;
* Remove the pencil next to the base image recipe in the right column summary: its behaviour would be inconsistent with all other pencils in Toaster. Also, changing the base image recipe has big impact, so it should probably not be too easy.&lt;br /&gt;
* Review the content of the right column summary&lt;br /&gt;
* Asking Paul what would happen in the image customisation process if you remove the layer providing the base image for a custom image recipe&lt;br /&gt;
* Add the &#039;add layer&#039; form as is in the configuration page to the Project layers section in the right hand column&lt;br /&gt;
* Review the presentation of the main page actions (build / download / delete)&lt;br /&gt;
* Remove the dependency size info from the button and put it inside the popover&lt;br /&gt;
* Add the needed filters&lt;br /&gt;
* Add a list of packages added to the image summary in the right column&lt;br /&gt;
* Make the fixed-positioned notifications less offensive (check the shadow and size)&lt;br /&gt;
* Define the time interval after which the fixed notifications fade out&lt;br /&gt;
* Ask Levi to design a &#039;loading&#039; component for the UI library&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Design_feedback&amp;diff=15038</id>
		<title>Design feedback</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Design_feedback&amp;diff=15038"/>
		<updated>2015-07-06T10:59:07Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Select a base image recipe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Feedback ==&lt;br /&gt;
&lt;br /&gt;
=== Content and labeling ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: creating an image recipe, I find the text in the modal too long, anything more than 2 sentences and my attention span is over!&lt;br /&gt;
&lt;br /&gt;
BELEN: I am sure we can improve that text to make it shorter.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: BTW, thinking of the naming, I would suggest &amp;quot;Custom recipes&amp;quot;, because it&#039;s not clear from the links that I can actually configure something there.&lt;br /&gt;
&lt;br /&gt;
BELEN: Happy to review the labeling, as usual. I would add the word &amp;quot;image&amp;quot; though, because you cannot create custom software recipes or package groups: only image recipes. So it would be something like &amp;quot;Custom image recipes&amp;quot;. Would that work?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: maybe we should change the terminology from Add/Delete?&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, everybody is screaming for this :) I will change it, but it needs to be changed across Toaster, not just in the image customisation process.&lt;br /&gt;
&lt;br /&gt;
=== Creating an image recipe ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I found it confusing that I entered a name and clicked create but have not actually created anything&lt;br /&gt;
&lt;br /&gt;
BELEN: mmm, this one is interesting. What makes you think that you have not created anything? &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
MICHAEL: what about something like suggestion1.png  (attached) this brings it more into line with import layer/create new project/form based activity.&lt;br /&gt;
&lt;br /&gt;
BELEN: that is quite similar to Tiago&#039;s sketches. I shied away from that approach for 2 reasons:&lt;br /&gt;
&lt;br /&gt;
# Because I find it crowded and lacking on clear priorities. There is a lot of content and controls in this screen. Most of them we need to deactivate until a name for the image recipe has been set. I am sure there are things we could do in visual design to improve the balance in such a screen, but not in this first go. The question that immediately comes to my mind when I see it is: if I cannot manipulate these content and controls, why are you showing them to me? That&#039;s why I sticked to the 2-step approach: give this a name first, so that we can create the image recipe, then, once created, you can proceed to &amp;quot;configure&amp;quot; it. &lt;br /&gt;
#Because it meant we need 2 different custom image recipe pages: one for when you are creating the image for the first time (with the steps numbered and the name field at the top), and a second one for when you are editing the image recipe after creating it (with the name you gave before as the heading 1, and no steps). Splitting the naming step from the custom image recipe page means that we can use exactly the same page for both circumstances, which I think is good. &lt;br /&gt;
&lt;br /&gt;
The above is just the rationale behind my design, just to make this clear. I believe your suggestion would also work. To figure out which one would work better, we would need to test them, and unfortunately we don&#039;t have time for that right now. But I am sure we can work together to come up with something. It would be good to hear a bit more about the reasons why you prefer your suggestion.&lt;br /&gt;
&lt;br /&gt;
=== Select a base image recipe ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I was looking for a way to &amp;quot;de/re/select&amp;quot; an image, we don&#039;t quite have the same concept here as the machines selection that I was expecting, where you can always select regardless of whether it&#039;s already selected.&lt;br /&gt;
&lt;br /&gt;
BELEN: just to make sure I understand, do you mean the fact that you get a &#039;selected&#039; badge next to the selected base image recipe? The initial designs for machines also indicated which machine was selected with a similar badge, until it was pointed out to me that there is no way for us to know which layer is actually providing the machine you are setting. The only thing we know for sure is the name of the machine. I do not think is critical to indicate which is the selected base image recipe in the table: you already have it on the image summary (the well1 on the right hand side). So maybe we can survive without that.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: When configuring an image, I would suggest dropping the &amp;quot;Base image recipe&amp;quot; concept, because we can&#039;t follow on updates from the base image recipe after the custom recipe was created, and this will confuse the user.&lt;br /&gt;
&lt;br /&gt;
BELEN: and what do users do instead? Do they start they custom image recipes from a blank slate? That will most likely result in an image that doesn&#039;t build. Do you have an alternative starting point in mind?&lt;br /&gt;
&lt;br /&gt;
ALEX: The users would start from an already existing image, as they do now. What I&#039;m suggesting is dropping the tab of possible base images, and the ability to change the base image for a custom image once the custom image recipe is created. This is the same point as below, just pointing to the tab.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Also, the tab with the Base image recipe in My Image details, allowing the user to change the base image for a recipe, should be taken out, since we cannot change the base image recipe after the initial selection.&lt;br /&gt;
&lt;br /&gt;
BELEN: Not allowing people to change their minds about the selected base image recipe is a bit draconian. It means that if you select the wrong base image by mistake, you will be forced to discard the custom image recipe, and restart from scratch. A bit harsh. After discussing this with Paul, it turns out the agreement was the following: if you change the base image recipe, we&#039;ll drop the initial list of packages and any deletions you might have done on it (we will warn you about that before you change the base image). Ideally we would be able to remember any packages you have added, but if this is not feasible, we might be able to survive without it. I need to design this.&lt;br /&gt;
&lt;br /&gt;
ALEX: When storing a custom image recipe, we have two options: store an absolute list of packages, or store a reference to a base image and a difference for the list of packages. These options are available only while working within the Toaster instance - once you export your recipe, you have to export an absolute list of packages. &lt;br /&gt;
&lt;br /&gt;
Each approach has advantages and disadvantages. The functionality described above requires storing a reference + difference, in order to be able to change the base image. The reference+difference approach has the advantage of changing the package list based on the image features and current configuration, and following the upstream changes, and the disadvantage of needing parsing on each project configuration change, and possibly changing the image package list outside user&#039;s control (when the upstream base image changes).&lt;br /&gt;
&lt;br /&gt;
=== Custom image summary (right column) ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: I was expecting the pencil to do the same as other pencils and activate text input boxes. Obviously if you&#039;re on the Add/Delete packages page you can&#039;t change the base image like that so maybe not having these  pencils would be better. I was also unsure as what the change version/licence would do.&lt;br /&gt;
&lt;br /&gt;
BELEN: Most of the pencil icons will activate text input boxes, it&#039;s just that I didn&#039;t prototype the interaction because we already know how they work (we are just reusing the existing interaction). The pencils are the way you can change the name, the version and the license for your custom image recipe. The only exception is the pencil icon next to the base image recipe. That would be a link to the &#039;Select a base image recipe&#039; page. I agree this is not consistent. In general, I think the idea of that image summary is good, but the content could be improved: so maybe we&#039;ll look into a better way to organise it and better labelling for the different items.&lt;br /&gt;
&lt;br /&gt;
=== Adding / removing layers ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: If you&#039;ve selected an image recipe and then remove the layer that provides it... what happens?&lt;br /&gt;
&lt;br /&gt;
BELEN: heh, didn&#039;t think of this one :) Any changes in the layer list, adding or removing, will trigger a parsing. Once the parsing is finished, we could flag the fact that the base image recipe is no longer provided by any project layers. But, if you have removed the layer that provides the base image recipe, I would like to think nothing happens, since we would have created a new .bb file that doesn&#039;t depend on the original image recipe. If we decide that the custom image recipe should inherit the base image recipe, well, then we would have a problem: we would need to force people to select a new base image recipe. Paul can probably clarify what would really happen, so I&#039;ll make sure to ask him. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: The &amp;quot;Add A Layer&amp;quot; panel on the right hand side, I would&#039;ve expected it to be a pop-up like in the configuration page, not take me to the Compatible layers. It completely takes me out of the context of what I was doing - I want to customize a image for MinnowMax, I want to add minnowmax and be done, not go to a different page, and then have no idea how to return in a single click.&lt;br /&gt;
&lt;br /&gt;
BELEN: you are right. We can probably just replicate the mechanism we have in the basic configuration page: an &#039;add layer&#039; form with links to view all the layers and to import a layer. So if you know what you are doing, you can add the layer you need without exiting the image configuration page.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
DAVID: The new page can add layers in place which is nice, and I see how you can use it to parse and show that layer&#039;s package count. However, it appears that if I change my mind about the layer I have to go out to the layer page to remove it? Could perhaps the &amp;quot;undo&amp;quot; feature also be made available here? Or a layer delete icon?&lt;br /&gt;
&lt;br /&gt;
BELEN: See the [[#The &#039;Undo&#039; feature]] below. You can delete layers in these pages using the &#039;delete&#039; icon in the Project Layers section (right-hand column). The ability to delete layers creates other issues though, as pointed by Michael above. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Also, when deleting / adding a layer in-page, the recipes available would just appear/disappear from the &amp;quot;available recipes&amp;quot; table.&lt;br /&gt;
&lt;br /&gt;
BELEN: Which one is the &amp;quot;available recipes&amp;quot; table? The one listing all the base image recipes you can choose from? If yes, those don&#039;t disappear if you delete a layer. Because we will know about them from the layer index, we list them always, and we allow you to select them by adding the required layer first. When you remove a layer, what changes is the button that you see next to the base image recipe.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: The Build Image recipe/ Download recipe file / Delete image recipe buttons are somewhat easy to miss, they look a bit like progress buttons or other tabs. I wonder if they would be better off in &#039;.well&#039; 1. The Build button could be more noticeable.&lt;br /&gt;
&lt;br /&gt;
ALEX: In the &amp;quot;My image recipe&amp;quot;, I am not sure why the primary actions that you can take on the recipe (Build, Download, Delete) are tucked away in the right hand side, when my focus is on the left hand side, where I get drawn to the image name. Maybe we can move the buttons, make them bigger, as to be clear they are the primary action you do with a customized image ?&lt;br /&gt;
&lt;br /&gt;
BELEN: agreed. I tried many options, but I wasn&#039;t particularly happy with any of them. I&#039;ll give this another go.&lt;br /&gt;
&lt;br /&gt;
=== Dependency size ===&lt;br /&gt;
&lt;br /&gt;
MICHAEL: In general if you can avoid having data in a table that for each one requires extra data looking up the tables will be much faster/efficient. For example we have the dependencies button with total size displayed. It should be really quick to count the number of dependences, but much slower if we also have to retrieve the objects to get the data in them, such as &amp;quot;name&amp;quot; and &amp;quot;size&amp;quot;.  If we can do that by making it &amp;quot;on demand&amp;quot; that&#039;s much better, e.g. you click the button and it fetches this extra data.&lt;br /&gt;
&lt;br /&gt;
BELEN: this was my initial approach. From the UI perspective, it is also tidier. Then Ed asked to see this information without having to click, and I decided to give it a try to see how it would look like. I agree it is better to present it when you select a certain dependency, so I will revert to that. Sorry Ed :/&lt;br /&gt;
&lt;br /&gt;
=== Displaying image contents ===&lt;br /&gt;
&lt;br /&gt;
DAVID: Can we add a filter so that we can show just the packages that we can delete? The use case is trimming the image, where we want the 100 packages that we wish to examine for removal not to be lost in the possible 1000&#039;s packages that are available to add.&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, absolutely. The prototype does not include filters, but the intention is adding at least the one you are asking for.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: How do I know what&#039;s in my image in at a certain moment ?&lt;br /&gt;
 &lt;br /&gt;
BELEN: We will provide a filter for that, as explained in above. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: It would be great if I could have two tables in the image customization page - the current contents of the image, and the packages that are available. When selecting/removing a package, a package would disappear from a list and appear in the second one.&lt;br /&gt;
&lt;br /&gt;
BELEN: This is a nice idea, but I don&#039;t think we have space for 2 tables. I toyed with the concept of a list of added packages that populates as you add things, to provide better visibility of your changes. This list would be on the right hand column, with the other custom image recipe information (name, version, etc). Would that do?&lt;br /&gt;
&lt;br /&gt;
=== Notifications ===&lt;br /&gt;
&lt;br /&gt;
DAVID: I will admit that I was thrown by the new status pop-up, because not only does it cover things up on my page, I also generally associate them with spam and ad-ware. I understand your use for showing an action in progress, but we already had a metaphor for that in the progress/status bars inserted (when applicable) at the top of the page. Why a new metaphor? What does it add that the regular model does not? I know that it does stay visible while you for example scroll, but is that a hard requirement?&lt;br /&gt;
&lt;br /&gt;
BELEN: Just to be sure, I guess you are talking about the fixed-positioned notifications that appear when you perform an action (for example, adding a layer). Their main advantage over our current notification system is that they are always visible. Since these notifications are the way Toaster provides feedback to users about their actions, that&#039;s a significant advantage. They are also a relatively common way of presenting notification nowadays (Dropbox uses them, just to give a random example, but so do lots of other web apps). Another common way is &amp;quot;pop from top&amp;quot; messages, like these ones:&lt;br /&gt;
&lt;br /&gt;
https://css-tricks.com/pop-from-top-notification/&lt;br /&gt;
&lt;br /&gt;
They have an example here: &lt;br /&gt;
&lt;br /&gt;
https://css-tricks.com/examples/PopFromTopMessage/&lt;br /&gt;
&lt;br /&gt;
I gave those a quick try, but didn&#039;t play nice with the fixed top bar we are currently using in Toaster. &lt;br /&gt;
&lt;br /&gt;
I can tweak the design a bit to make the fixed-positioned notifications less offensive (smaller, with less shadow, for example). If you would like to find a completely different way to handle notifications, let&#039;s open a Bugzilla entry and I can definitely do that at a later stage. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
DAVID: I also do not understand the dangling part, where I have to manual cancel it to make it go away. For example, I understand for example its use in the add layer parsing progress, but when it is done and says &amp;quot;Layer Information updated&amp;quot; why do I have to manually kill it? Could it at least go away on its own after a moment, and let that be the clue that the process completed?&lt;br /&gt;
&lt;br /&gt;
BELEN: yes, this we can definitely do. We just need to come up with the right time interval. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: I subscribe to David&#039;s view that the popups are annoying and unnecessary.&lt;br /&gt;
&lt;br /&gt;
BELEN: they are not popups, just to be clear. Popups are modal. These things do not prevent you from interacting with the interface until you take action on them.  &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: I would suggest using box alerts as they are currently implemented, to avoid obscuring the screen, and divert user&#039;s attention. The feedback for immediate actions should not be in your face.&lt;br /&gt;
&lt;br /&gt;
BELEN: well, it kind of needs to be. Feedback is incredibly important in interfaces: users must know the state of the system and the outcome of their actions. Notifications should be therefore visible (the ones we have right now not always are), and that&#039;s why so many web applications are using fix-positioned ones like these to provide feedback to users. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: Ditto for the &amp;quot;data loading&amp;quot; spinner, let&#039;s make it a bit more obscure. &lt;br /&gt;
&lt;br /&gt;
BELEN: Michael and I spent a good deal of time trying to work out the best way to present this using the standard UI widgets that come with Bootstrap. I still think the way it is right now is the best way we can currently make it. That doesn&#039;t mean it cannot be improved. I am sure Levi will be ok with including a &#039;data loading&#039; UI component in the library he is creating for Toaster.&lt;br /&gt;
&lt;br /&gt;
=== The &#039;Undo&#039; feature ===&lt;br /&gt;
&lt;br /&gt;
DAVID: The &amp;quot;Undo&amp;quot; feature though is nice!&lt;br /&gt;
&lt;br /&gt;
BELEN: &amp;quot;undo&amp;quot; features are very, very nice, I agree. I&#039;ve added it here as suggested by the rest of the design contributors, but the reality is that I don&#039;t expect it to be part of the image customisation feature, that&#039;s why I don&#039;t really mention it in the video. &amp;quot;Undo&amp;quot; should probably be designed and implemented and an application-wide feature, which means it should work for pretty much all actions. This poses a certain problem for us, since &amp;quot;undoing&amp;quot; adding a layer might not be as easy as &amp;quot;undoing&amp;quot; removing a package from a custom image recipe. What I mean by this is that &#039;undo&#039; requires some thought. We can open a Bugzilla entry to design an &amp;quot;Undo&amp;quot; feature for Toaster, but it will not be part of the image customisation work.&lt;br /&gt;
&lt;br /&gt;
=== Layer parsing and package count ===&lt;br /&gt;
&lt;br /&gt;
DAVID: Speaking of layer parsing, don&#039;t we already have an idea of the package count per layer from the &amp;quot;all packages&amp;quot; table?&lt;br /&gt;
&lt;br /&gt;
BELEN: I am a bit confused by the &amp;quot;package count per layer&amp;quot; sentence. In the image customisation process, what matters is not the package count per layer, but the package count per base image recipe, which is the very important information when you need to decide which image recipe you should use as a starting point.&lt;br /&gt;
&lt;br /&gt;
=== Package groups ===&lt;br /&gt;
&lt;br /&gt;
DAVID: How does this interface deal with &amp;quot;package groups&amp;quot;? People will ask.&lt;br /&gt;
&lt;br /&gt;
http://www.yoctoproject.org/docs/1.8/dev-manual/dev-manual.html#usingpoky-extend-customimage-customtasks&lt;br /&gt;
&lt;br /&gt;
BELEN: I&#039;m afraid it doesn&#039;t. We know that at some point we&#039;ll need to distinguish package groups from other recipes, and break them up, i.e. allow people to remove packages from package groups. But during the high level design discussions we came to the conclusion that it would be too hard to do in version 1 - see page 11 of the initial design document&lt;br /&gt;
&lt;br /&gt;
https://wiki.yoctoproject.org/wiki/images/3/31/Image_customisation_in_Toaster.pdf&lt;br /&gt;
&lt;br /&gt;
=== Concerns about package removal ===&lt;br /&gt;
 &lt;br /&gt;
DAVID: Adding packages is easy, but we (WR) have found that removing them is weirdly hard. I am very curious how the backend package removal/exclusion is being done, and who is doing it. In any case, we should have disclaimers in place.&lt;br /&gt;
&lt;br /&gt;
* Some removed packages appear anyway in the image, because sometimes the dependency information in the packages are not complete nor correct.&lt;br /&gt;
&lt;br /&gt;
* Some removed packages will break the build or the runtime, even though the dependencies say it should be ok. Users should be encouraged to test their changes early and often, and we may want to help save their bacon with checkpoints (based on the last successful build?) or multiple undo&#039;s so that they can back up to a working state rather than re-starting from scratch. Just saying.&lt;br /&gt;
&lt;br /&gt;
BELEN: I cannot answer your question about package removal (maybe Paul?), but good to be warned about potential problems and possible solutions. They might not make version 1, but we can definitely enhance the functionality in subsequent releases.&lt;br /&gt;
&lt;br /&gt;
ALEX: This is a limitation of the way metadata is structured and tested. Th​e YP developers often miss correct dependency linking because the actual dependencies for a package (e.g. installed libraries) were already satisfied by another chain, so they miss specifying the dependency in the metadata. This problem will be re-occuring during Toaster use, and until we clean up the dependencies metadata, we need to tell the users exactly what&#039;s going on - and enable them to timely submit error reports about the invalid metadata. This is the only way we can actually clean everything up.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Normal&amp;quot; builds vs. &amp;quot;custom image recipe&amp;quot; builds ===&lt;br /&gt;
&lt;br /&gt;
ALEX: I think it should be easy to build your own recipes in the Configuration page. The text entry with the build button should be no longer the primary means of starting a build, now that we can configure the build itself. I would suggest adding a &amp;quot;My image recipes&amp;quot; box in the style of &amp;quot;Most build recipes&amp;quot; in the Configuration, with two big buttons : &amp;quot;Build selected&amp;quot; and &amp;quot;New image recipe&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
BELEN: right, I am a bit confused about this suggestion. We decided to &amp;quot;isolate&amp;quot; the builds of custom image recipes from &amp;quot;normal&amp;quot; builds to make sure we didn&#039;t have to deal with pushing layers to Git repos. To make this separation (which is by no means ideal) as clear as possible, we agreed to create a separate &amp;quot;My image recipes&amp;quot; section, from which you cannot start &amp;quot;normal&amp;quot; builds, and from where you start only builds of you custom image recipes. If you want to integrate your custom image recipe into your &amp;quot;normal&amp;quot; builds you need to download the .bb file and add it to your custom layer, then import that custom layer into Toaster. Please read page 5 of the high-level design document available here &lt;br /&gt;
&lt;br /&gt;
https://wiki.yoctoproject.org/wiki/images/3/31/Image_customisation_in_Toaster.pdf&lt;br /&gt;
&lt;br /&gt;
The above is what the initial design workshop concluded. I think we are all most definitely open to new ideas, but they must involve a solution to the problem of which layer do custom image recipes go to. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: For a new user, it&#039;s not obvious how to start configuring the image contents, in the sense that &amp;quot;My image recipes&amp;quot; isn&#039;t the most obvious place one would start to configure a build, which is why people actually look for into Toaster. I would suggest making &amp;quot;Type the target you want to build&amp;quot; and Build button in a section similar to, and on top of the &amp;quot;Latest builds&amp;quot; section. And add, in that section, in the project page, a bit link &amp;quot;Configure the image contents&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
BELEN: Again, I am confused. There is now a build form not only above the &amp;quot;latest builds&amp;quot; section, but also in all project configuration pages, in exactly the same place so that it remains easy to find for users. That component is removed from the &amp;quot;My image recipes&amp;quot; pages because we concluded we should separate their builds from &amp;quot;normal&amp;quot; builds as explained above. Your &amp;quot;configure the image contents&amp;quot; suggestion would conflate both types of builds. Again, this is something I would love to do, but we would need a way to handle the question of which layer do custom image recipes go to.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
ALEX: It seems a bit strange that I can navigate to most of the Project options via the left hand menu, but not to image recipes. The user-defined image recipes are Project-specific, and I think they are at the same level with the &amp;quot;Image recipes&amp;quot; and &amp;quot;Software recipes&amp;quot;, but in the &amp;quot;CONFIGURATION&amp;quot; category.  I don&#039;t think that having a duplicate link as a tab is a problem, but I get frustrated by the disappearance of the left-hand-menu in the My Image Recipes.&lt;br /&gt;
&lt;br /&gt;
BELEN: This is once more a consequence of the agreed separation between &amp;quot;normal&amp;quot; and custom image recipe builds. In the project page: the &amp;quot;builds&amp;quot; content spans both, the &amp;quot;configuration&amp;quot; content belongs to the &amp;quot;normal&amp;quot; builds context, and the &amp;quot;my image recipes&amp;quot; content belongs to the custom image recipes context. The latter 2 are kept separate as the outcome of the initial design workshop suggested should be done.&lt;br /&gt;
&lt;br /&gt;
=== New build button ===&lt;br /&gt;
&lt;br /&gt;
ALEX: Please drop the &amp;quot;New build&amp;quot; button. That button is a stop-gap measure to launching build commands, but now we&#039;re not simply issue-ing build commands, we are actually configuring the build. Even if you are an experienced user, it&#039;s opaque form - small and with very little information - makes it difficult to use.&lt;br /&gt;
&lt;br /&gt;
BELEN: mmm, drop it from where? It is nowhere in the image customisation process. The purpose of the &#039;new build&#039; button is allow you to build for any project from anywhere. I still think that&#039;s a handy thing to have, although I have no evidence to back that up. I am ok with reconsidering that feature, but not as part of this review, which is supposed to be about the image customisation design.&lt;br /&gt;
&lt;br /&gt;
== Design ARs ==&lt;br /&gt;
&lt;br /&gt;
* Find a way to show that the number of packages shown after parsing is a best guess&lt;br /&gt;
* In the &#039;my image recipes&#039; table, see if there is a way we can see a build button in the last table column, consistent with how all other recipes are displayed &lt;br /&gt;
* Review the content in the &#039;name your image recipe&#039; modal. The help text is too long, and the heading should match somehow the button clicked (&#039;new image recipe&#039;). Consider change to a page, like in projects. &lt;br /&gt;
* Change &#039;my image recipes&#039; to &#039;custom image recipes&#039; &lt;br /&gt;
* Change &#039;add / delete&#039; to &#039;add / remove&#039; across Toaster&lt;br /&gt;
* Talk to Michael about his suggested alternative to the image customisation page (with the name at the top as step 1, and the tabs afterwards as step 2)&lt;br /&gt;
* Confirm with Michael if I should remove the &#039;selected&#039; badge in the base image recipes table &lt;br /&gt;
* Design the &#039;changing my base image&#039; workflow. All the initial packages and any of them you have deleted will be lost. We should ideally keep the list of packages you added, but what if any of them already exists in the new base image? Think all this through. &lt;br /&gt;
* Remove the pencil next to the base image recipe in the right column summary: its behaviour would be inconsistent with all other pencils in Toaster. Also, changing the base image recipe has big impact, so it should probably not be too easy.&lt;br /&gt;
* Review the content of the right column summary&lt;br /&gt;
* Asking Paul what would happen in the image customisation process if you remove the layer providing the base image for a custom image recipe&lt;br /&gt;
* Add the &#039;add layer&#039; form as is in the configuration page to the Project layers section in the right hand column&lt;br /&gt;
* Review the presentation of the main page actions (build / download / delete)&lt;br /&gt;
* Remove the dependency size info from the button and put it inside the popover&lt;br /&gt;
* Add the needed filters&lt;br /&gt;
* Add a list of packages added to the image summary in the right column&lt;br /&gt;
* Make the fixed-positioned notifications less offensive (check the shadow and size)&lt;br /&gt;
* Define the time interval after which the fixed notifications fade out&lt;br /&gt;
* Ask Levi to design a &#039;loading&#039; component for the UI library&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=File:Toasterconf.json.txt.patch&amp;diff=14157</id>
		<title>File:Toasterconf.json.txt.patch</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=File:Toasterconf.json.txt.patch&amp;diff=14157"/>
		<updated>2015-02-09T17:39:55Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: uploaded a new version of &amp;amp;quot;File:Toasterconf.json.txt.patch&amp;amp;quot;: Fixed to proper JSON&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sample configuration file for setting up hosted-version managed-mode Toaster.&lt;br /&gt;
&lt;br /&gt;
Available as a patch.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13847</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13847"/>
		<updated>2014-11-26T14:02:08Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Using Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to OpenEmbedded and BitBake. You might have heard it is a replacement for [https://www.yoctoproject.org/documentation/hob-manual Hob]. The answer is &amp;quot;it will be at some point, but not yet&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
Toaster can run in various modes and setups. To ease out the understanding of documentation, we review here the terminology used throughout the documentation.&lt;br /&gt;
&lt;br /&gt;
* Interactive mode - this is the mode released with Yocto Project Release 1.6. Functional components consist of a build recording component, &#039;toasterui&#039;, and a build stats and inspection user interface, the &#039;toastergui&#039;. It is started with the command sequence listed below, and the builds are started using normal bitbake command line&lt;br /&gt;
&lt;br /&gt;
 $ source oe-init-build-env&lt;br /&gt;
 $ source toaster start&lt;br /&gt;
&lt;br /&gt;
* Managed  mode - in this mode Toaster handles the build configuration GUI (through Project pagess), and build scheduling and execution, in addition to the features launched with Yocto Project Release 1.6. The builds are triggered through the web interface, &lt;br /&gt;
the user as no direct access to the bitbake command line.&lt;br /&gt;
&lt;br /&gt;
** Local managed mode, in short _local_, is the out-of-box mode available after a poky/ checkout. It allows the user to perform build on his local machine source code, with a local build directory, and is intended to help the user discover the interface, and configure and run local builds. You can launch it with&lt;br /&gt;
&lt;br /&gt;
 $ ./bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
** Remote managed mode, or [[hosted Toaster]], is intended to be the production setup for running Toaster in organizations supporting multiple users and using customized Toaster installations.&lt;br /&gt;
&lt;br /&gt;
=== Toaster How-to&#039;s ===&lt;br /&gt;
&lt;br /&gt;
Specific pages with Toaster how-tos are available below.&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]] - documentation for Interactive mode, for building with the Autobuilder/BuildBot/Jenkins&lt;br /&gt;
* [[Setting up a hosted managed mode for Toaster]] - configure and run build through Toaster itself, providing a service for your users&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual-17 How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;br /&gt;
&lt;br /&gt;
=== In progress documentation ===&lt;br /&gt;
&lt;br /&gt;
We are currently preparing the documentation for the Toaster build functionality. The content here is just a brain dump of what we need to cover (in no particular order). Feel free to add and create content as you see fit:&lt;br /&gt;
&lt;br /&gt;
*[[Using virtualenv]]&lt;br /&gt;
*[[Toaster configuration]] - explain releases, layer sources, BitBake versions and default project configurations &lt;br /&gt;
*[[Set up Toaster locally]] - explain the set up process and the local version of the localconf.json file&lt;br /&gt;
*[[Set up production instance]] - explain the Django admin interface and the remove version of the localconf.json file&lt;br /&gt;
*[[manage.py commands]] - this should include an explanation of lsupdates&lt;br /&gt;
*[[Custom layer index]] - explain how to create your own layer index&lt;br /&gt;
*[[Start Toaster in managed mode]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13846</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13846"/>
		<updated>2014-11-26T14:01:51Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to OpenEmbedded and BitBake. You might have heard it is a replacement for [https://www.yoctoproject.org/documentation/hob-manual Hob]. The answer is &amp;quot;it will be at some point, but not yet&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
Toaster can run in various modes and setups. To ease out the understanding of documentation, we review here the terminology used throughout the documentation.&lt;br /&gt;
&lt;br /&gt;
* Interactive mode - this is the mode released with Yocto Project Release 1.6. Functional components consist of a build recording component, &#039;toasterui&#039;, and a build stats and inspection user interface, the &#039;toastergui&#039;. It is started with the command sequence listed below, and the builds are started using normal bitbake command line&lt;br /&gt;
&lt;br /&gt;
 $ source oe-init-build-env&lt;br /&gt;
 $ source toaster start&lt;br /&gt;
&lt;br /&gt;
* Managed  mode - in this mode Toaster handles the build configuration GUI (through Project pagess), and build scheduling and execution, in addition to the features launched with Yocto Project Release 1.6. The builds are triggered through the web interface, &lt;br /&gt;
the user as no direct access to the bitbake command line.&lt;br /&gt;
&lt;br /&gt;
** Local managed mode, in short _local_, is the out-of-box mode available after a poky/ checkout. It allows the user to perform build on his local machine source code, with a local build directory, and is intended to help the user discover the interface, and configure and run local builds. You can launch it with&lt;br /&gt;
&lt;br /&gt;
 $ ./bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
** Remote managed mode, or [[hosted Toaster]], is intended to be the production setup for running Toaster in organizations supporting multiple users and using customized Toaster installations.&lt;br /&gt;
&lt;br /&gt;
=== Toaster How-to&lt;br /&gt;
&lt;br /&gt;
Specific pages with Toaster how-tos are available below.&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]] - documentation for Interactive mode, for building with the Autobuilder/BuildBot/Jenkins&lt;br /&gt;
* [[Setting up a hosted managed mode for Toaster]] - configure and run build through Toaster itself, providing a service for your users&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual-17 How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;br /&gt;
&lt;br /&gt;
=== In progress documentation ===&lt;br /&gt;
&lt;br /&gt;
We are currently preparing the documentation for the Toaster build functionality. The content here is just a brain dump of what we need to cover (in no particular order). Feel free to add and create content as you see fit:&lt;br /&gt;
&lt;br /&gt;
*[[Using virtualenv]]&lt;br /&gt;
*[[Toaster configuration]] - explain releases, layer sources, BitBake versions and default project configurations &lt;br /&gt;
*[[Set up Toaster locally]] - explain the set up process and the local version of the localconf.json file&lt;br /&gt;
*[[Set up production instance]] - explain the Django admin interface and the remove version of the localconf.json file&lt;br /&gt;
*[[manage.py commands]] - this should include an explanation of lsupdates&lt;br /&gt;
*[[Custom layer index]] - explain how to create your own layer index&lt;br /&gt;
*[[Start Toaster in managed mode]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Setting_up_a_production_instance_of_Toaster&amp;diff=13845</id>
		<title>Setting up a production instance of Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Setting_up_a_production_instance_of_Toaster&amp;diff=13845"/>
		<updated>2014-11-26T13:53:26Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* 2. Enable build logging to the common SQL server for each build directory you are using */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page explains how to set up Toaster separately from the hardware running your Yocto Project builds. Do it this way if you want to share a single instance of Toaster across multiple users and build servers.&lt;br /&gt;
&lt;br /&gt;
== Setting up a Toaster Instance on a Remote Host ==&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, starting Toaster causes three things happen:&lt;br /&gt;
&lt;br /&gt;
* A BitBake server starts&lt;br /&gt;
&lt;br /&gt;
* The Toaster UI starts, which connects to the BitBake server on one side and to the SQL database on the other side&lt;br /&gt;
&lt;br /&gt;
* The web server starts, which reads the database and displays the web user interface&lt;br /&gt;
&lt;br /&gt;
Situations exist, however, where you might want to have multiple instances of Toaster running on various remote machines. You can create this situation by basically modifying how Toaster starts and where the common SQL database resides. You are able to do this because it is not required that Toaster starts the above set of components in order to run. Minimally, an instance of Toaster requires just one of the components to run. Consequently, you are free to manually start as many or few of the components as you need rather than using the Toaster script to cause all three things to happen.&lt;br /&gt;
&lt;br /&gt;
The concepts for setting up multiple instances of Toaster revolve around maintaining a common SQL database and Web server that show data from that common database and then setting up separate instances of BitBake servers and Toaster user interfaces for each separate BitBake build directory. Note that the common SQL database and the Web server show data from all the various BitBake builds. Setting the SQL database outside of any BitBake build directories maintains a&lt;br /&gt;
separation layer between the various builds.&lt;br /&gt;
&lt;br /&gt;
The database is persistent because the logging database is set up external to the database server (e.g. MySQL). It is not even necessary to run the BitBake servers, the SQL server, and the Web server on the same machine. Each component can be run on its own machine.&lt;br /&gt;
&lt;br /&gt;
== Steps to get set up ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Set up the SQL Logging Server and the Web Server ===&lt;br /&gt;
&lt;br /&gt;
You can use any SQL server out of the box (e.g. &amp;lt;code&amp;gt;apt-get install mysgl-server&amp;lt;/code&amp;gt; works for an Ubuntu system). If you are concerned about performance, you might want to hand-tune the server. You must set up proper username and password access for the server. You need administration rights for the mysql root account. Realize that this is not the same thing as root access on the machine.&lt;br /&gt;
&lt;br /&gt;
Clone a separate, local Git repository of the Toaster master branch to use for running the Web server. You do not perform builds on this tree. You need to create this local repository away from any build areas.&lt;br /&gt;
&lt;br /&gt;
In the separately cloned tree for the Web server, edit the &amp;lt;code&amp;gt;bitbake/lib/toaster/toastermain/settings.py&amp;lt;/code&amp;gt; file so that the &amp;lt;code&amp;gt;DATABASES&amp;lt;/code&amp;gt; value points to the previously created database server. Use the username and password you established earlier.&lt;br /&gt;
&lt;br /&gt;
Run the database sync scripts to create the needed tables as follows:&lt;br /&gt;
&lt;br /&gt;
     $ python bitbake/lib/toaster/manage.py syncdb&lt;br /&gt;
     $ python bitbake/lib/toaster/manage.py migrate orm&lt;br /&gt;
&lt;br /&gt;
Note: It is important, for toaster running in 1.6 mode, to not sync bldcontrol (only used in 1.7 mode).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start the Web server using the following command:&lt;br /&gt;
&lt;br /&gt;
     $ python bitbake/lib/toaster/manage.py runserver&lt;br /&gt;
&lt;br /&gt;
... or in the background:&lt;br /&gt;
&lt;br /&gt;
     $ nohup python bitbake/lib/toaster/manage.py runserver 2&amp;gt;toaster_web.log &amp;gt;toaster_web.log &amp;amp;&lt;br /&gt;
&lt;br /&gt;
=== 2. Enable build logging to the common SQL server for each build directory you are using ===&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;_build local_ bitbake/lib/toaster/toastermain/settings.py&amp;lt;/code&amp;gt; to alter the &amp;lt;code&amp;gt;DATABASES&amp;lt;/code&amp;gt; value to point to the common SQL logging server.&lt;br /&gt;
&lt;br /&gt;
Create the required conf/toaster.conf file as per Bitbake extra options on &amp;quot;https://wiki.yoctoproject.org/wiki/Setting_up_a_local_instance_of_Toaster&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Start the BitBake server using the following command:&lt;br /&gt;
&lt;br /&gt;
     $ bitbake --postread conf/toaster.conf --server-only -t xmlrpc -B localhost:0 &amp;amp;&amp;amp; export BBSERVER=localhost:-1&lt;br /&gt;
&lt;br /&gt;
Start the logging user interface using the following command:&lt;br /&gt;
&lt;br /&gt;
     $ nohup bitbake --observe-only -u toasterui &amp;gt;toaster_ui.log &amp;amp;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; No hard-coded ports are used as there is enough code to run autodiscovery for ports to prevent collisions.&lt;br /&gt;
&lt;br /&gt;
At this point, you are ready to run your builds using commands such as:&lt;br /&gt;
&lt;br /&gt;
     $ bitbake core-image-minimal&lt;br /&gt;
&lt;br /&gt;
When you are finished, you need to kill the BitBake server for that particular build area:&lt;br /&gt;
&lt;br /&gt;
     $ bitbake -m&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify that it all works ===&lt;br /&gt;
&lt;br /&gt;
You should examine the logs and be sure that the logging worked, that data is persistent, and that data from multiple builds from different areas was supported.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13776</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13776"/>
		<updated>2014-11-17T18:15:04Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Using Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to OpenEmbedded and BitBake. You might have heard it is a replacement for [https://www.yoctoproject.org/documentation/hob-manual Hob]. The answer is &amp;quot;it will be at some point, but not yet&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
Toaster can run in various modes and setups. To ease out the understanding of documentation, we review here the terminology used throughout the documentation.&lt;br /&gt;
&lt;br /&gt;
* Interactive mode - this is the mode released with Yocto Project Release 1.6. Functional components consist of a build recording component, &#039;toasterui&#039;, and a build stats and inspection user interface, the &#039;toastergui&#039;. It is started with the command sequence listed below, and the builds are started using normal bitbake command line&lt;br /&gt;
&lt;br /&gt;
 $ source oe-init-build-env&lt;br /&gt;
 $ source toaster start&lt;br /&gt;
&lt;br /&gt;
* Managed  mode - in this mode Toaster handles the build configuration GUI (through Project pagess), and build scheduling and execution, in addition to the features launched with Yocto Project Release 1.6. The builds are triggered through the web interface, &lt;br /&gt;
the user as no direct access to the bitbake command line.&lt;br /&gt;
&lt;br /&gt;
** Local managed mode, in short _local_, is the out-of-box mode available after a poky/ checkout. It allows the user to perform build on his local machine source code, with a local build directory, and is intended to help the user discover the interface, and configure and run local builds. You can launch it with&lt;br /&gt;
&lt;br /&gt;
 $ ./bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
** Remote managed mode, or [[hosted Toaster]], is intended to be the production setup for running Toaster in organizations supporting multiple users and using customized Toaster installations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Specific pages with Toaster how-tos are available below.&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual-17 How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;br /&gt;
&lt;br /&gt;
=== In progress documentation ===&lt;br /&gt;
&lt;br /&gt;
We are currently preparing the documentation for the Toaster build functionality. The content here is just a brain dump of what we need to cover (in no particular order). Feel free to add and create content as you see fit:&lt;br /&gt;
&lt;br /&gt;
*[[Using virtualenv]]&lt;br /&gt;
*[[Toaster configuration]] - explain releases, layer sources, BitBake versions and default project configurations &lt;br /&gt;
*[[Set up Toaster locally]] - explain the set up process and the local version of the localconf.json file&lt;br /&gt;
*[[Set up production instance]] - explain the Django admin interface and the remove version of the localconf.json file&lt;br /&gt;
*[[manage.py commands]] - this should include an explanation of lsupdates&lt;br /&gt;
*[[Custom layer index]] - explain how to create your own layer index&lt;br /&gt;
*[[Start Toaster in managed mode]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13773</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13773"/>
		<updated>2014-11-17T17:47:49Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;Welcome to the Yocto Project Wiki!&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project planning ==&lt;br /&gt;
&lt;br /&gt;
=== 1.8 (Current) Project Status and Schedule ===&lt;br /&gt;
&lt;br /&gt;
* [[Yocto 1.8 Schedule]]&lt;br /&gt;
&lt;br /&gt;
=== 1.7 Project Status and Schedule ===&lt;br /&gt;
* [[Yocto 1.7 Status]]&lt;br /&gt;
* [[Yocto 1.7 Schedule]]&lt;br /&gt;
* [[1.7 qa run history]]&lt;br /&gt;
* [[1.7 QA Status]]&lt;br /&gt;
* [[meta-intel-2.0-dizzy-1.7 release planning]]&lt;br /&gt;
&lt;br /&gt;
== Wiki reference sitemap ==&lt;br /&gt;
&lt;br /&gt;
=== Main Wiki Sections ===&lt;br /&gt;
&lt;br /&gt;
* [[Planning and Governance]]&lt;br /&gt;
* [[Community Guidelines]]&lt;br /&gt;
* [[Yocto Release Engineering | Yocto Project Release Engineering]]&lt;br /&gt;
* [[Processes and Activities]]&lt;br /&gt;
** [[YoctoCalendar]]&lt;br /&gt;
* [[Projects]]&lt;br /&gt;
* [[Yocto Interest Groups]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[How do I]]&lt;br /&gt;
* [[Contributors]]&lt;br /&gt;
* [[Training]]&lt;br /&gt;
* [[Testopia]] - The Yocto Project&#039;s community-opened test case management platform&lt;br /&gt;
&lt;br /&gt;
* [[Toaster]] - the web interface |  [[Web UI]] - The design plans for the new Web UI&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
* [http://yoctoproject.org Yocto Project Front Page]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13772</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13772"/>
		<updated>2014-11-17T17:46:49Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* 1.8 (Current) Project Status and Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the Yocto Project Wiki! ==&lt;br /&gt;
&lt;br /&gt;
=== 1.8 (Current) Project Status and Schedule ===&lt;br /&gt;
&lt;br /&gt;
* [[Yocto 1.8 Schedule]]&lt;br /&gt;
&lt;br /&gt;
=== 1.7 Project Status and Schedule ===&lt;br /&gt;
* [[Yocto 1.7 Status]]&lt;br /&gt;
* [[Yocto 1.7 Schedule]]&lt;br /&gt;
* [[1.7 qa run history]]&lt;br /&gt;
* [[1.7 QA Status]]&lt;br /&gt;
* [[meta-intel-2.0-dizzy-1.7 release planning]]&lt;br /&gt;
&lt;br /&gt;
=== Main Wiki Sections ===&lt;br /&gt;
* [[Planning and Governance]]&lt;br /&gt;
* [[Community Guidelines]]&lt;br /&gt;
* [[Yocto Release Engineering | Yocto Project Release Engineering]]&lt;br /&gt;
* [[Processes and Activities]]&lt;br /&gt;
** [[YoctoCalendar]]&lt;br /&gt;
* [[Projects]]&lt;br /&gt;
* [[Yocto Interest Groups]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[How do I]]&lt;br /&gt;
* [[Contributors]]&lt;br /&gt;
* [[Training]]&lt;br /&gt;
* [[Testopia]] - The Yocto Project&#039;s community-opened test case management platform&lt;br /&gt;
&lt;br /&gt;
* [[Toaster]] - the web interface |  [[Web UI]] - The design plans for the new Web UI&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
* [http://yoctoproject.org Yocto Project Front Page]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13771</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13771"/>
		<updated>2014-11-17T17:46:36Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Welcome to the Yocto Project Wiki! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the Yocto Project Wiki! ==&lt;br /&gt;
&lt;br /&gt;
=== 1.8 (Current) Project Status and Schedule ===&lt;br /&gt;
* [[Yocto 1.8 Status]]&lt;br /&gt;
* [[Yocto 1.8 Schedule]]&lt;br /&gt;
* [[1.8 qa run history]]&lt;br /&gt;
* [[1.8 QA Status]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 1.7 Project Status and Schedule ===&lt;br /&gt;
* [[Yocto 1.7 Status]]&lt;br /&gt;
* [[Yocto 1.7 Schedule]]&lt;br /&gt;
* [[1.7 qa run history]]&lt;br /&gt;
* [[1.7 QA Status]]&lt;br /&gt;
* [[meta-intel-2.0-dizzy-1.7 release planning]]&lt;br /&gt;
&lt;br /&gt;
=== Main Wiki Sections ===&lt;br /&gt;
* [[Planning and Governance]]&lt;br /&gt;
* [[Community Guidelines]]&lt;br /&gt;
* [[Yocto Release Engineering | Yocto Project Release Engineering]]&lt;br /&gt;
* [[Processes and Activities]]&lt;br /&gt;
** [[YoctoCalendar]]&lt;br /&gt;
* [[Projects]]&lt;br /&gt;
* [[Yocto Interest Groups]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[How do I]]&lt;br /&gt;
* [[Contributors]]&lt;br /&gt;
* [[Training]]&lt;br /&gt;
* [[Testopia]] - The Yocto Project&#039;s community-opened test case management platform&lt;br /&gt;
&lt;br /&gt;
* [[Toaster]] - the web interface |  [[Web UI]] - The design plans for the new Web UI&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
* [http://yoctoproject.org Yocto Project Front Page]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13770</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Main_Page&amp;diff=13770"/>
		<updated>2014-11-17T17:45:52Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Current Project Status and Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the Yocto Project Wiki! ==&lt;br /&gt;
=== 1.7 Project Status and Schedule ===&lt;br /&gt;
* [[Yocto 1.7 Status]]&lt;br /&gt;
* [[Yocto 1.7 Schedule]]&lt;br /&gt;
* [[1.7 qa run history]]&lt;br /&gt;
* [[1.7 QA Status]]&lt;br /&gt;
* [[meta-intel-2.0-dizzy-1.7 release planning]]&lt;br /&gt;
&lt;br /&gt;
=== Main Wiki Sections ===&lt;br /&gt;
* [[Planning and Governance]]&lt;br /&gt;
* [[Community Guidelines]]&lt;br /&gt;
* [[Yocto Release Engineering | Yocto Project Release Engineering]]&lt;br /&gt;
* [[Processes and Activities]]&lt;br /&gt;
** [[YoctoCalendar]]&lt;br /&gt;
* [[Projects]]&lt;br /&gt;
* [[Yocto Interest Groups]]&lt;br /&gt;
* [[FAQ]]&lt;br /&gt;
* [[How do I]]&lt;br /&gt;
* [[Contributors]]&lt;br /&gt;
* [[Training]]&lt;br /&gt;
* [[Testopia]] - The Yocto Project&#039;s community-opened test case management platform&lt;br /&gt;
* [[Toaster]] - the web interface |  [[Web UI]] - The design plans for the new Web UI&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
* [http://yoctoproject.org Yocto Project Front Page]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Using_virtualenv&amp;diff=13766</id>
		<title>Using virtualenv</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Using_virtualenv&amp;diff=13766"/>
		<updated>2014-11-17T16:38:09Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: Created page with &amp;quot;Category:Toaster  Toaster brings in extra Python dependencies that the Bitbake core doesn&amp;#039;t need in order to run. As such, it is expected that some Python packages required b...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
&lt;br /&gt;
Toaster brings in extra Python dependencies that the Bitbake core doesn&#039;t need in order to run. As such, it is expected that some Python packages required by Toaster may not be installed on the systems that currently run Bitbake without issues.&lt;br /&gt;
&lt;br /&gt;
In order to make it easy to run Toaster, a requirements file is provided; this file, named &amp;quot;toaster-requirements.txt&amp;quot;, in the root directory of bitbake, lists dependencies in a pip install-compatible format.&lt;br /&gt;
&lt;br /&gt;
The recommend usage is to install these dependencies in a Python virtual environment using pip.&lt;br /&gt;
&lt;br /&gt;
== How to ==&lt;br /&gt;
&lt;br /&gt;
1. create a virtual environment and activate it:&lt;br /&gt;
&lt;br /&gt;
 $ virtualenv venv&lt;br /&gt;
 $ source venv/bin/activate&lt;br /&gt;
&lt;br /&gt;
2. use pip to install needed packages&lt;br /&gt;
&lt;br /&gt;
 $ pip install -r bitbake/toaster-requirements.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. use toaster normally, either in &lt;br /&gt;
&lt;br /&gt;
* interactive mode&lt;br /&gt;
&lt;br /&gt;
 $ source oe-init-build-env&lt;br /&gt;
 $ source toaster start&lt;br /&gt;
&lt;br /&gt;
* managed mode&lt;br /&gt;
 &lt;br /&gt;
 $ bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Happy virtualenv-ing !&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=File:Toasterconf.json.txt.patch&amp;diff=13696</id>
		<title>File:Toasterconf.json.txt.patch</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=File:Toasterconf.json.txt.patch&amp;diff=13696"/>
		<updated>2014-11-06T13:36:33Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: Sample configuration file for setting up hosted-version managed-mode Toaster.

Available as a patch.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sample configuration file for setting up hosted-version managed-mode Toaster.&lt;br /&gt;
&lt;br /&gt;
Available as a patch.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Setting_up_a_production_instance_of_Toaster&amp;diff=13688</id>
		<title>Setting up a production instance of Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Setting_up_a_production_instance_of_Toaster&amp;diff=13688"/>
		<updated>2014-11-03T11:56:59Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* 1. Set up the SQL Logging Server and the Web Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
This page explains how to set up Toaster separately from the hardware running your Yocto Project builds. Do it this way if you want to share a single instance of Toaster across multiple users and build servers.&lt;br /&gt;
&lt;br /&gt;
== Setting up a Toaster Instance on a Remote Host ==&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, starting Toaster causes three things happen:&lt;br /&gt;
&lt;br /&gt;
* A BitBake server starts&lt;br /&gt;
&lt;br /&gt;
* The Toaster UI starts, which connects to the BitBake server on one side and to the SQL database on the other side&lt;br /&gt;
&lt;br /&gt;
* The web server starts, which reads the database and displays the web user interface&lt;br /&gt;
&lt;br /&gt;
Situations exist, however, where you might want to have multiple instances of Toaster running on various remote machines. You can create this situation by basically modifying how Toaster starts and where the common SQL database resides. You are able to do this because it is not required that Toaster starts the above set of components in order to run. Minimally, an instance of Toaster requires just one of the components to run. Consequently, you are free to manually start as many or few of the components as you need rather than using the Toaster script to cause all three things to happen.&lt;br /&gt;
&lt;br /&gt;
The concepts for setting up multiple instances of Toaster revolve around maintaining a common SQL database and Web server that show data from that common database and then setting up separate instances of BitBake servers and Toaster user interfaces for each separate BitBake build directory. Note that the common SQL database and the Web server show data from all the various BitBake builds. Setting the SQL database outside of any BitBake build directories maintains a&lt;br /&gt;
separation layer between the various builds.&lt;br /&gt;
&lt;br /&gt;
The database is persistent because the logging database is set up external to the database server (e.g. MySQL). It is not even necessary to run the BitBake servers, the SQL server, and the Web server on the same machine. Each component can be run on its own machine.&lt;br /&gt;
&lt;br /&gt;
== Steps to get set up ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Set up the SQL Logging Server and the Web Server ===&lt;br /&gt;
&lt;br /&gt;
You can use any SQL server out of the box (e.g. &amp;lt;code&amp;gt;apt-get install mysgl-server&amp;lt;/code&amp;gt; works for an Ubuntu system). If you are concerned about performance, you might want to hand-tune the server. You must set up proper username and password access for the server. You need administration rights for the mysql root account. Realize that this is not the same thing as root access on the machine.&lt;br /&gt;
&lt;br /&gt;
Clone a separate, local Git repository of the Toaster master branch to use for running the Web server. You do not perform builds on this tree. You need to create this local repository away from any build areas.&lt;br /&gt;
&lt;br /&gt;
In the separately cloned tree for the Web server, edit the &amp;lt;code&amp;gt;bitbake/lib/toaster/toastermain/settings.py&amp;lt;/code&amp;gt; file so that the &amp;lt;code&amp;gt;DATABASES&amp;lt;/code&amp;gt; value points to the previously created database server. Use the username and password you established earlier.&lt;br /&gt;
&lt;br /&gt;
Run the database sync scripts to create the needed tables as follows:&lt;br /&gt;
&lt;br /&gt;
     $ python bitbake/lib/toaster/manage.py syncdb&lt;br /&gt;
     $ python bitbake/lib/toaster/manage.py migrate orm&lt;br /&gt;
&lt;br /&gt;
Note: It is important, for toaster running in 1.6 mode, to not sync bldcontrol (only used in 1.7 mode).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Start the Web server using the following command:&lt;br /&gt;
&lt;br /&gt;
     $ python bitbake/lib/toaster/manage.py runserver&lt;br /&gt;
&lt;br /&gt;
... or in the background:&lt;br /&gt;
&lt;br /&gt;
     $ nohup python bitbake/lib/toaster/manage.py runserver 2&amp;gt;toaster_web.log &amp;gt;toaster_web.log &amp;amp;&lt;br /&gt;
&lt;br /&gt;
=== 2. Enable build logging to the common SQL server for each build directory you are using ===&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;_build local_ bitbake/lib/toaster/toastermain/settings.py&amp;lt;/code&amp;gt; to alter the &amp;lt;code&amp;gt;DATABASES&amp;lt;/code&amp;gt; value to point to the common SQL logging server.&lt;br /&gt;
&lt;br /&gt;
Create the required conf/toaster.conf file as per Bitbake extra options on &amp;quot;https://wiki.yoctoproject.org/wiki/Setting_up_a_local_instance_of_Toaster&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Start the BitBake server using the following command:&lt;br /&gt;
&lt;br /&gt;
     $ bitbake --postread conf/toaster.conf --server-only -t xmlrpc -B localhost:0 &amp;amp;&amp;amp; export BBSERVER=localhost:-1&lt;br /&gt;
&lt;br /&gt;
Start the logging user interface using the following command:&lt;br /&gt;
&lt;br /&gt;
     $ nohup bitbake --observe-only -u toasterui &amp;amp;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; No hard-coded ports are used as there is enough code to run autodiscovery for ports to prevent collisions.&lt;br /&gt;
&lt;br /&gt;
At this point, you are ready to run your builds using commands such as:&lt;br /&gt;
&lt;br /&gt;
     $ bitbake core-image-minimal&lt;br /&gt;
&lt;br /&gt;
When you are finished, you need to kill the BitBake server for that particular build area:&lt;br /&gt;
&lt;br /&gt;
     $ bitbake -m&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify that it all works ===&lt;br /&gt;
&lt;br /&gt;
You should examine the logs and be sure that the logging worked, that data is persistent, and that data from multiple builds from different areas was supported.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Start_Toaster_in_managed_mode&amp;diff=13685</id>
		<title>Start Toaster in managed mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Start_Toaster_in_managed_mode&amp;diff=13685"/>
		<updated>2014-11-03T11:43:41Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: Created page with &amp;quot;Starting Toaster in managed mode:  * For local instance, using a terminal where oe-init-build-env was NOT sourced, simply run Toaster from the POKY checkout directory.   POKY/bit...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starting Toaster in managed mode:&lt;br /&gt;
&lt;br /&gt;
* For local instance, using a terminal where oe-init-build-env was NOT sourced, simply run Toaster from the POKY checkout directory.&lt;br /&gt;
&lt;br /&gt;
 POKY/bitbake/bin/toaster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* For remote instance, use the instructions in the attached presentation [[https://wiki.yoctoproject.org/wiki/images/7/75/Toaster_Presentation_ELCE_2014_1.pdf]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=File:Toaster_Presentation_ELCE_2014_1.pdf&amp;diff=13684</id>
		<title>File:Toaster Presentation ELCE 2014 1.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=File:Toaster_Presentation_ELCE_2014_1.pdf&amp;diff=13684"/>
		<updated>2014-11-03T11:42:40Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: Toaster presentation that was given at ELCE 2014, Toaster-managed variant. 

Includes setup instructions for hosted managed-build Toaster.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Toaster presentation that was given at ELCE 2014, Toaster-managed variant. &lt;br /&gt;
&lt;br /&gt;
Includes setup instructions for hosted managed-build Toaster.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13683</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=13683"/>
		<updated>2014-11-03T11:35:10Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Using Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to OpenEmbedded and BitBake. You might have heard it is a replacement for [https://www.yoctoproject.org/documentation/hob-manual Hob]. The answer is &amp;quot;it will be at some point, but not yet&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Start Toaster in managed mode]]&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;br /&gt;
&lt;br /&gt;
=== In progress documentation ===&lt;br /&gt;
&lt;br /&gt;
We are currently preparing the documentation for the Toaster build functionality. The content here is just a brain dump of what we need to cover (in no particular order). Feel free to add and create content as you see fit:&lt;br /&gt;
&lt;br /&gt;
*[[Using virtualenv]]&lt;br /&gt;
*[[Toaster configuration]] - explain releases, layer sources, BitBake versions and default project configurations &lt;br /&gt;
*[[Set up Toaster locally]] - explain the set up process and the local version of the localconf.json file&lt;br /&gt;
*[[Set up production instance]] - explain the Django admin interface and the remove version of the localconf.json file&lt;br /&gt;
*[[manage.py commands]] - this should include an explanation of lsupdates&lt;br /&gt;
*[[Custom layer index]] - explain how to create your own layer index&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=File:Toaster.sqlite&amp;diff=13487</id>
		<title>File:Toaster.sqlite</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=File:Toaster.sqlite&amp;diff=13487"/>
		<updated>2014-09-25T14:49:02Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: uploaded a new version of &amp;amp;quot;File:Toaster.sqlite&amp;amp;quot;: Prepopulated db file for Toaster 1.7&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sample Toaster data for development purposes.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=13052</id>
		<title>Extending Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=13052"/>
		<updated>2014-06-25T14:34:12Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* How to create a Toaster extension */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In order to promote customizability of Toaster, we have here a set of guidelines on how to add functionality and customize the Toaster web interface.&lt;br /&gt;
&lt;br /&gt;
== Django extensibility model ==&lt;br /&gt;
&lt;br /&gt;
Django, per se, does not offer any extensibility / customization model. Being a framework for hosted application, it is assumed that the host will have complete access for modification. Because Django is not envisioned to be distributed / portable / reusable, there is no need to support insertion of 3rd party content after deployment, or to alter the user flows by 3rd party contributors. However, we can use Django modularization support to add custom extensibility capabilities to our distributable project.&lt;br /&gt;
&lt;br /&gt;
A Django project supports a number of &amp;quot;applications&amp;quot;, intended to allow developers to separate different scopes of a web site in different applications. For example, the custom admin interface for a web site should live in a different application than the normal user-facing site.&lt;br /&gt;
&lt;br /&gt;
Toaster consists of a basic set of applications - we have:&lt;br /&gt;
* bldviewer - the &amp;quot;simple&amp;quot; web interface, for development purposes only&lt;br /&gt;
* toastergui - the Toaster frontend for build inspection&lt;br /&gt;
* orm - a separate application just to hold the persistent object models&lt;br /&gt;
* bldcontrol - application containing the code to start and control bitbake in managed mode&lt;br /&gt;
&lt;br /&gt;
== Features for extensibility ==&lt;br /&gt;
&lt;br /&gt;
Toaster extensibility model is based on Django. To implement new functionality in Toaster, you have to add a new application containing the code implementing the functionality.&lt;br /&gt;
&lt;br /&gt;
Keeping the code separated in a different application will make for painless code rebases, as your application may live as a separate set of patches based on top of upstream Toaster.&lt;br /&gt;
&lt;br /&gt;
As a web application, the code is driven by HTTP requests. In order to use your handlers, Toaster will automatically redirect requests starting &amp;quot;{modulename}/&amp;quot; to the patterns listed in the &amp;quot;{modulename}/urls.py&amp;quot; file, where &amp;quot;{modulename}&amp;quot; is the name of the application you&#039;re creating.&lt;br /&gt;
&lt;br /&gt;
If your {modulename} application contains either views.py or models.py files, it will automatically be added to INSTALLED_APPS list, as to allow database synchronization applications, such as South, to work with your application. This means that you can use fixtures and migration in your application, just like any of the default Toaster applications&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In your application you can call any code and use any models from other default Toaster applications.&lt;br /&gt;
&lt;br /&gt;
If your application needs another contributed application, you have to manage any dependencies manually.&lt;br /&gt;
&lt;br /&gt;
== How to create a Toaster extension ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of what you have to do to add new functionality for Toaster:&lt;br /&gt;
&lt;br /&gt;
* create a new application holding that functionality: &amp;lt;code&amp;gt;python manage.py startapp {modulename}&amp;lt;/code&amp;gt;&lt;br /&gt;
* add in the application directory a urls.py file: &amp;lt;code&amp;gt; {modulename}/urls.py &amp;lt;/code&amp;gt;&lt;br /&gt;
* start toaster, and verify your pages are accessible with the &amp;quot;/{modulename}/&amp;quot; prefix&lt;br /&gt;
* limit all patches touching your application only to your application; this will ease the rebase (see below)&lt;br /&gt;
* when updating Toaster, use rebase (as opposed to merge) to move your applications&#039; patches on top of a new Toaster version&lt;br /&gt;
* database management functions will be automatically enabled for your applications&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=13051</id>
		<title>Extending Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=13051"/>
		<updated>2014-06-25T14:33:07Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In order to promote customizability of Toaster, we have here a set of guidelines on how to add functionality and customize the Toaster web interface.&lt;br /&gt;
&lt;br /&gt;
== Django extensibility model ==&lt;br /&gt;
&lt;br /&gt;
Django, per se, does not offer any extensibility / customization model. Being a framework for hosted application, it is assumed that the host will have complete access for modification. Because Django is not envisioned to be distributed / portable / reusable, there is no need to support insertion of 3rd party content after deployment, or to alter the user flows by 3rd party contributors. However, we can use Django modularization support to add custom extensibility capabilities to our distributable project.&lt;br /&gt;
&lt;br /&gt;
A Django project supports a number of &amp;quot;applications&amp;quot;, intended to allow developers to separate different scopes of a web site in different applications. For example, the custom admin interface for a web site should live in a different application than the normal user-facing site.&lt;br /&gt;
&lt;br /&gt;
Toaster consists of a basic set of applications - we have:&lt;br /&gt;
* bldviewer - the &amp;quot;simple&amp;quot; web interface, for development purposes only&lt;br /&gt;
* toastergui - the Toaster frontend for build inspection&lt;br /&gt;
* orm - a separate application just to hold the persistent object models&lt;br /&gt;
* bldcontrol - application containing the code to start and control bitbake in managed mode&lt;br /&gt;
&lt;br /&gt;
== Features for extensibility ==&lt;br /&gt;
&lt;br /&gt;
Toaster extensibility model is based on Django. To implement new functionality in Toaster, you have to add a new application containing the code implementing the functionality.&lt;br /&gt;
&lt;br /&gt;
Keeping the code separated in a different application will make for painless code rebases, as your application may live as a separate set of patches based on top of upstream Toaster.&lt;br /&gt;
&lt;br /&gt;
As a web application, the code is driven by HTTP requests. In order to use your handlers, Toaster will automatically redirect requests starting &amp;quot;{modulename}/&amp;quot; to the patterns listed in the &amp;quot;{modulename}/urls.py&amp;quot; file, where &amp;quot;{modulename}&amp;quot; is the name of the application you&#039;re creating.&lt;br /&gt;
&lt;br /&gt;
If your {modulename} application contains either views.py or models.py files, it will automatically be added to INSTALLED_APPS list, as to allow database synchronization applications, such as South, to work with your application. This means that you can use fixtures and migration in your application, just like any of the default Toaster applications&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In your application you can call any code and use any models from other default Toaster applications.&lt;br /&gt;
&lt;br /&gt;
If your application needs another contributed application, you have to manage any dependencies manually.&lt;br /&gt;
&lt;br /&gt;
== How to create a Toaster extension ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of what you have to do to add new functionality for Toaster:&lt;br /&gt;
&lt;br /&gt;
* create a new application holding that functionality: &amp;lt;code&amp;gt;python manage.py startapp {modulename}&amp;lt;/code&amp;gt;&lt;br /&gt;
* add in the application directory a urls.py file: &amp;lt;code&amp;gt; {modulename}/urls.py &amp;lt;/code&amp;gt;&lt;br /&gt;
* start toaster, and verify your pages are accessible with the &amp;quot;/{modulename}/&amp;quot; prefix&lt;br /&gt;
* limit all patches touching your application only to your application; this will ease the rebase (see below)&lt;br /&gt;
* when updating Toaster, use rebase (as opposed to merge) to move your applications&#039; patches on top of a new Toaster version&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=13050</id>
		<title>Extending Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=13050"/>
		<updated>2014-06-25T14:10:42Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Django extensibility model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In order to promote customizability of Toaster, we have here a set of guidelines on how to add functionality and customize the Toaster web interface.&lt;br /&gt;
&lt;br /&gt;
== Django extensibility model ==&lt;br /&gt;
&lt;br /&gt;
Django, per se, does not offer any extensibility / customization model. Being a framework for hosted application, it is assumed that the host will have complete access for modification. Because Django is not envisioned to be distributed / portable / reusable, there is no need to support insertion of 3rd party content after deployment, or to alter the user flows by 3rd party contributors. However, we can use Django modularization support to add custom extensibility capabilities to our distributable project.&lt;br /&gt;
&lt;br /&gt;
A Django project supports a number of &amp;quot;applications&amp;quot;, intended to allow developers to separate different scopes of a web site in different applications. For example, the custom admin interface for a web site should live in a different application than the normal user-facing site.&lt;br /&gt;
&lt;br /&gt;
Toaster consists of a basic set of applications - we have:&lt;br /&gt;
* bldviewer - the &amp;quot;simple&amp;quot; web interface, for development purposes only&lt;br /&gt;
* toastergui - the Toaster frontend for build inspection&lt;br /&gt;
* orm - a separate application just to hold the persistent object models&lt;br /&gt;
* bldcontrol - application containing the code to start and control bitbake in managed mode&lt;br /&gt;
&lt;br /&gt;
== Requirements for extensibility ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Toaster points - a proposal ==&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12898</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12898"/>
		<updated>2014-05-19T10:57:30Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* About Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to the Bitbake build system and the Poky distribution inside the Yocto Project.&lt;br /&gt;
This project was formely known as Web Hob / Webhob / webhob, and you may still find references to the old name in the documentation.&lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12897</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12897"/>
		<updated>2014-05-19T10:57:14Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* About Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to the Bitbake build system and the Poky distribution inside the Yocto Project.&lt;br /&gt;
This project was formely known as Web Hob / Webhob / webhob, and you may still find references to the old name in the documentation.&lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [[https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens Bug list]]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12896</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12896"/>
		<updated>2014-05-19T10:56:56Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* About Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to the Bitbake build system and the Poky distribution inside the Yocto Project.&lt;br /&gt;
This project was formely known as Web Hob / Webhob / webhob, and you may still find references to the old name in the documentation.&lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [[https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens | Bug list]]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12895</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12895"/>
		<updated>2014-05-19T10:56:39Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* About Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to the Bitbake build system and the Poky distribution inside the Yocto Project.&lt;br /&gt;
This project was formely known as Web Hob / Webhob / webhob, and you may still find references to the old name in the documentation.&lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [[https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens|Bug list]]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12894</id>
		<title>Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster&amp;diff=12894"/>
		<updated>2014-05-19T10:56:19Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* About Toaster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
[[Toaster]] is a web-based interface to the Bitbake build system and the Poky distribution inside the Yocto Project.&lt;br /&gt;
This project was formely known as Web Hob / Webhob / webhob, and you may still find references to the old name in the documentation.&lt;br /&gt;
&lt;br /&gt;
General discussion about &#039;&#039;&#039;Toaster&#039;&#039;&#039; happens on a dedicated mailing list: [https://lists.yoctoproject.org/listinfo/toaster https://lists.yoctoproject.org/listinfo/toaster]&lt;br /&gt;
&lt;br /&gt;
=== Using Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up a local instance of Toaster]]&lt;br /&gt;
* [[Setting up a production instance of Toaster]]&lt;br /&gt;
* [https://www.yoctoproject.org/documentation/toaster-manual How to use the Toaster web interface]&lt;br /&gt;
* [[How to delete information from the Toaster database]]&lt;br /&gt;
&lt;br /&gt;
=== About Toaster ===&lt;br /&gt;
&lt;br /&gt;
* [[Contribute to Toaster]]&lt;br /&gt;
* [[Our bug list|https://bugzilla.yoctoproject.org/buglist.cgi?list_id=213820&amp;amp;columnlist=status_whiteboard%2Cassigned_to%2Ctarget_milestone%2Cbug_status%2Cshort_desc%2Cbug_severity%2Cpriority&amp;amp;classification=Build%20System%20%26%20Metadata&amp;amp;query_based_on=Toaster-Opens&amp;amp;query_format=advanced&amp;amp;bug_status=NEW&amp;amp;bug_status=ACCEPTED&amp;amp;bug_status=IN%20PROGRESS%20DESIGN&amp;amp;bug_status=IN%20PROGRESS%20DESIGN%20COMPLETE&amp;amp;bug_status=IN%20PROGRESS%20IMPLEMENTATION&amp;amp;bug_status=REOPENED&amp;amp;bug_status=NEEDINFO&amp;amp;bug_status=WaitForUpstream&amp;amp;component=toaster&amp;amp;product=Toaster&amp;amp;known_name=Toaster-Opens]]&lt;br /&gt;
* [[Toaster architecture design]]&lt;br /&gt;
* [[Toaster testing plan]]&lt;br /&gt;
* [[Toaster 1.7 design | Scope and design]]&lt;br /&gt;
* [[Toaster archive | Archive]]&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=12826</id>
		<title>Extending Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=12826"/>
		<updated>2014-05-15T15:56:16Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In order to promote customizability of Toaster, we have here a set of guidelines on how to add functionality and customize the Toaster web interface.&lt;br /&gt;
&lt;br /&gt;
== Django extensibility model ==&lt;br /&gt;
&lt;br /&gt;
Django, per se, does not offer any extensibility / customization model. Being a framework for hosted application, it is assumed that the host will have complete access for modification. Because Django is not envisioned to be distributed / portable / reusable, there is no need to support insertion of 3rd party content after deployment, or to alter the user flows by 3rd party contributors. However, we can use Django modularization support to add custom extensibility capabilities to our distributable project.&lt;br /&gt;
&lt;br /&gt;
A Django project supports a number of &amp;quot;applications&amp;quot;, intended to allow developers to separate different scopes of a web site in different applications. For example, the custom admin interface for a web site should live in a different application than the normal user-facing site.&lt;br /&gt;
&lt;br /&gt;
Toaster consists of a basic set of applications - we have:&lt;br /&gt;
* bldviewer - the &amp;quot;simple&amp;quot; web interface, for development purposes only&lt;br /&gt;
* toastergui - the Toaster frontend for build inspection&lt;br /&gt;
* orm - a separate application just to hold the persistent object models&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements for extensibility ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Toaster points - a proposal ==&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=12825</id>
		<title>Extending Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Extending_Toaster&amp;diff=12825"/>
		<updated>2014-05-15T15:55:41Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: Created page with &amp;quot;In order to promote customizability of Toaster, we have here a set of guidelines on how to add functionality and customize the Toaster web interface.  * Django extensibility mode...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In order to promote customizability of Toaster, we have here a set of guidelines on how to add functionality and customize the Toaster web interface.&lt;br /&gt;
&lt;br /&gt;
* Django extensibility model *&lt;br /&gt;
&lt;br /&gt;
Django, per se, does not offer any extensibility / customization model. Being a framework for hosted application, it is assumed that the host will have complete access for modification. Because Django is not envisioned to be distributed / portable / reusable, there is no need to support insertion of 3rd party content after deployment, or to alter the user flows by 3rd party contributors. However, we can use Django modularization support to add custom extensibility capabilities to our distributable project.&lt;br /&gt;
&lt;br /&gt;
A Django project supports a number of &amp;quot;applications&amp;quot;, intended to allow developers to separate different scopes of a web site in different applications. For example, the custom admin interface for a web site should live in a different application than the normal user-facing site.&lt;br /&gt;
&lt;br /&gt;
Toaster consists of a basic set of applications - we have:&lt;br /&gt;
* bldviewer - the &amp;quot;simple&amp;quot; web interface, for development purposes only&lt;br /&gt;
* toastergui - the Toaster frontend for build inspection&lt;br /&gt;
* orm - a separate application just to hold the persistent object models&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Requirements for extensibility *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Toaster points - a proposal *&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12641</id>
		<title>Toaster 1.7 design</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12641"/>
		<updated>2014-04-25T09:45:37Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== A couple of videos to kick off things ==&lt;br /&gt;
&lt;br /&gt;
The following videos illustrate some of the features we are thinking of adding to Toaster during the 1.7 release cycle. When watching them, keep in mind that this is all very rough: more like sketches to help us start a conversation about scope than proper designs. Chances are the final designs will be completely different.&lt;br /&gt;
&lt;br /&gt;
About projects - [[media:Building-1.7.mov]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Starting a build - [[media:How-to-build.mov]]&lt;br /&gt;
&lt;br /&gt;
== Feature list ==&lt;br /&gt;
&lt;br /&gt;
=== Ability to create new projects ===&lt;br /&gt;
&lt;br /&gt;
This is the ability to use the Toaster interface to create new project directories, manage the content, and initiate the builds of selectable target images.&lt;br /&gt;
&lt;br /&gt;
===== Summary of discussion =====&lt;br /&gt;
&lt;br /&gt;
* A project is a set of layers and configuration variables values that describes how to do a build. &lt;br /&gt;
* Creating a project means writing up values for the above-mentioned set, and store these values in a persistent manner.&lt;br /&gt;
* A build for a project means effecting (instantiating) the build process for the current set of values.&lt;br /&gt;
* Build directory location (host/machine) is not relevant to Toaster.&lt;br /&gt;
* Saving the build artifacts and providing access to the build artifacts is critical for Toaster.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] What is a typical workflow that gets to the build project part?  I see the configure screens but not the actually build launch.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Does clicking &#039;new build&#039; fire off a build?  If so, which configuration is built?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Heh, I completely forgot to show that in the first video. [http://wiki.yoctoproject.org/wiki/images/b/b1/How-to-build.mov Here is part 2] showing how to start a build and answering (I hope) both questions.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can projects be configured, primed for builds, but not built? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Will the user be able to configure several builds, then queue them all to build?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Users might create more than one project then start a build for each of them by clicking the &amp;quot;build&amp;quot; button in each project page, but nothing more sophisticated than that for the time being. Here is where things can get tricky. Where does Toaster stop and something like Buildbot or Jenkins start? My take is that we want to work alongside and enhance build automation systems, not replace them. &lt;br /&gt;
&lt;br /&gt;
[DAVE] What is the size of the build variable list?  It&#039;s hard to figure from the conf/local.conf file.  If it is a small list, like 10, should we provide better and variable specific UI widgets rather than just edit boxes, depending on the variable&#039;s &amp;quot;type&amp;quot; (eg browse button with any path variable like SSTATE_DIR)?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is one of the questions we should start working on straight away. In informal chats we have spoken about a split between &amp;quot;build variables&amp;quot; (the ones that affect the build and therefore you can edit via Toaster) and &amp;quot;infrastructure variables&amp;quot; (to call them something, that affect the build infrastructure and you cannot edit via Toaster. Things like PARALLEL_MAKE for example). We should start getting into details about that split as soon as possible, and determine which variables we are going to expose via Toaster to be edited. Once again, Paul&#039;s feedback here would be good (RP&#039;s probably as well).&lt;br /&gt;
&lt;br /&gt;
Regarding variable &amp;quot;types&amp;quot;, I had a brief conversation with RP recently about this issue. It is unlikely that the meta data will provide us with information about the type of input expected by a variable. If and how the Toaster interface should fill that gap is up for discussion. From my perspective, we should do as much as we can to help users assign valid values to their variables.&lt;br /&gt;
&lt;br /&gt;
[DAVE] I don&#039;t recall a user entry on your videos that specify the project directory for the build. This must be part of the initial release. I don&#039;t recommend making it an edited data file option, eg not via in settings.py.  &lt;br /&gt;
&lt;br /&gt;
[BELEN] When you run Toaster locally you can configure the location of your build directory as you wish, but when Toaster is running remotely, do we want to let people select the location of their build directory?&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can we make any selection on any page &#039;stick&#039; with cookies or &#039;unstick&#039; with a &#039;reset to defaults&#039; button, in addition to propagating laborious configuration setups inputs via &#039;clone configuration&#039;?&lt;br /&gt;
&lt;br /&gt;
[BELEN] We will need to overcome my personal hate of &#039;reset to defaults&#039; options :) They are very dangerous if we don&#039;t provide an &#039;undo&#039; option as well: they might wipe your configuration and revert it to the rather useless default one, losing a bunch of work you did beforehand. Any configuration changes you make are saved: in that sense, they are &#039;sticky&#039;. If I create project A, then I add 2 layers to the project configuration, select a machine and 3 targets, all those options are saved to the project configuration. You don&#039;t need to add the 2 layers, select the machine and the 3 targets every time you want to run a build.&lt;br /&gt;
&lt;br /&gt;
[RAVI] I am wondering about the purpose of a project. In the design, project has a machine and owner attributes. If we define a project as a collection of builds for a machine, then we should not allow to change the machine after a project is created. Then, if a project is just a collection of builds for a particular machine, then we can modify the existing all builds view to group builds by machine. Based on this argument, I do not see a need for project and build hierarchy.&lt;br /&gt;
&lt;br /&gt;
[DAVID] My group understands that a &amp;quot;project&amp;quot; is a specific build directory. A project will most likely to have multiple builds, and things like the (a) machine, (b) layers, (c) conf variables, and so forth would be presumably set before the first target is selected and executed. It is also the case that the developer may decide to change any of those settings, including even the machine type, and then carry on with more builds. The use case would be for example is arch coverage testing of a particular set of kernel or user space packages.&lt;br /&gt;
&lt;br /&gt;
A host can then have multiple project directories (I most often work that way), for example when a developer truly wants to keep their development and/or debugging from not polluting other projects.&lt;br /&gt;
&lt;br /&gt;
Also, separate users should do their work in separate project directories, now that we are extending the model to cover that.&lt;br /&gt;
&lt;br /&gt;
There can then be multiple hosts, with all of their multiple projects, all channeling their Toaster data into a shared database. And with that you have a build farm.&lt;br /&gt;
&lt;br /&gt;
[RAVI] I see that the uniqueness of a project is the &amp;lt;hostname&amp;gt;://&amp;lt;build directory path&amp;gt;. The contents of the build directory can be changed and multiple builds can be kicked off from the same project with different configurations. If this the case, the project creation should also setup a build directory on the host.&lt;br /&gt;
&lt;br /&gt;
Looking at this use case, we should have toaster running on the host machine with a shared database. Or if we run a single toaster instance serving multiple projects (hosts and build directories), we should have a mechanism for the toaster machine to talk to the project machines. Am I missing something?&lt;br /&gt;
&lt;br /&gt;
[PAUL] Yes, but the project need not be tied to a specific host or location on disk. To my mind, the project is simply a configuration set - if you had a build farm the actual build could be run on any server within that farm and that side of it would be largely hidden from the user (until it needed to be visible, e.g. when you need to diagnose a host contamination issue.) This then means that the management of build directories can be independent, i.e. old build directories can be automatically deleted after a time period or when space runs low, but the project remains in the database for later use when needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] I am completely willing to accept the above definition of a &amp;quot;Toaster Project&amp;quot;. The part that convinces me is that (a) while under active build and development it does map to a physical location, but (b) it can hold the data and presumably the &amp;quot;snapshot&amp;quot; artifacts of a physical build directory long after that actual directory has been deleted. That last part is a highly desired feature from the Wind River team, and was also brought up as a specific question at my Toaster presentation at the Yocto Project Summit.&lt;br /&gt;
&lt;br /&gt;
This implies that given the abstract nature of a Toaster &amp;quot;Project&amp;quot;, it makes sense that not only can the developer share that &amp;quot;project&amp;quot; with another developer and Toaster instance (as per Belén design), but it makes sense that the original developer can make their own clones of that project when they for example want use as a reference basis for new projects with additional adjustments and/or for binding and running on a different host/directory.&lt;br /&gt;
&lt;br /&gt;
Here is what I would propose is the workflow.&lt;br /&gt;
&lt;br /&gt;
1) When a Toaster Project is created,&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;user&amp;quot; is the preset to the last &amp;quot;user&amp;quot;, else if this is the first time it is defaulted to $USER. This is a required field.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;email&amp;quot; is preset to the last email that matches &amp;quot;user&amp;quot;, else it is empty. QUESTION: Is this a required field?&lt;br /&gt;
&lt;br /&gt;
* The host:dir values are preset just as &amp;quot;poky/oe-init-build-env&amp;quot; would preset these values, in other words to the current machine and to &amp;quot;poky/../build&amp;quot; (unless redirected with the appropriate environment variables). If that directory (a) already exists and has a &amp;quot;conf/local.conf&amp;quot; file and (b) that directory exists for an existing Project, then that is an error. This would allow us to re-connect to a deleted or unregistered YP build directories.&lt;br /&gt;
&lt;br /&gt;
* We either have an explicit &amp;quot;Project Create&amp;quot; button, or we allow for the first build target command to insure that for new projects the project directory is created and the content preset by &amp;quot;poky/oe-init-build-env&amp;quot; before continuing.&lt;br /&gt;
&lt;br /&gt;
2) For external hosts mounted via NFS:&lt;br /&gt;
&lt;br /&gt;
* If an external host is mounted via a YP compatible NFS system, then that would be covered by the normal workflow above, using the local host and the respective NFS path. QUESTION: do we wish to identify the actual remove HOST ID in these circumstances, or just let the NFS path speak for itself?&lt;br /&gt;
&lt;br /&gt;
3) For fully external hosts&lt;br /&gt;
&lt;br /&gt;
This is the situation where a host remote to the Toaster, but is intended to be managed by this Toaster and use this Toaster&#039;s database.&lt;br /&gt;
&lt;br /&gt;
* This implies using some sort of rpc, probably via SSH, to execute the creation and build targets.&lt;br /&gt;
&lt;br /&gt;
* There would presumably be an installation of YP on that remote host, and that location would need to be known to Toaster. The installation could be as simple as an NFS mount that points to the local YP installation, which would provide a single source at the cost of NFS traffic.&lt;br /&gt;
&lt;br /&gt;
=== Hide builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option simply removes or hides selected builds from the Toaster display, for example builds quickly halted because the owner realized that they missed a setting. The database records and the project on the disk is untouched. This un-clutters the display, yet requires little programing (and development time).&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[BELEN] I have no strong feelings against this one, but we need to bear in mind that:&lt;br /&gt;
&lt;br /&gt;
* It will probably be hard to allow hiding in bulk, since the reasons why someone might want to hide a build could be wildly different. So this will have to be done on a build by build basis. &lt;br /&gt;
&lt;br /&gt;
* This also involves providing a way to reverse the hiding action, i.e. see hidden builds and show them again.&lt;br /&gt;
&lt;br /&gt;
[DAVID] In the Wind River version of Wiki, we have a &amp;quot;Manage&amp;quot; button at the bottom. This brings up a page of all of the entries, with the ability to change the entry&#039;s hidden and description attributes. This does allow a bulk update easily.&lt;br /&gt;
&lt;br /&gt;
I propose that we do the same, where a &amp;quot;Manage&amp;quot; button brings up all of the builds and/or projects, each highlighted according to if it is currently hidden, also each with a text entry for the description (see the next design proposal) and a check box to toggle the hidden state. &lt;br /&gt;
&lt;br /&gt;
We then need to decide if this meta date is stored in the database or in the page&#039;s cookie.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add a description to a build or project ===&lt;br /&gt;
&lt;br /&gt;
User&#039;s may not recall the difference and purpose of a given build or project, so it would be good for the Toaster interface to allow the user to add this and update this as needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] See the discussion above about &amp;quot;hidden&amp;quot; builds for a proposed implementation.&lt;br /&gt;
&lt;br /&gt;
=== Delete builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option is where a selected build and all its related database records are removed from the database. This removes the database overhead for this unwanted builds. The project on the disk is untouched. Since the database should be normalized, this operation should be clean and not interfere with other builds. I believe we have a command line version of this operation with Toaster-1.6.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[Alex] Technically, this is straightforward. In terms of policy access, we need to define one; I propose that only the project owner is allowed to delete builds. Impersonation is trivial right now, but once we implement authentication, bricks will fall in the right place in terms of access control.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add / remove layers ===&lt;br /&gt;
&lt;br /&gt;
Add and delete from the project layer directories. These layers may be within repositories or in plain directories on the disk.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] How would I upload my specialized device driver/library/system call handler/etc that necessarily needs to be part of&lt;br /&gt;
the build? Would this be done by importing a layer? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes. For the 1.7 release, all customisation must be done via layers.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Are you constraining &#039;import layer&#039; to a git repo path? Why not just a local directory that is not a git repo? In that case should we have a browse button as well as an edit box?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is a really good question. I need the technical crowd to establish what&#039;s possible / what we want to do. We can then design accordingly.&lt;br /&gt;
&lt;br /&gt;
[DAVID] It is the case that we recommend all of our customers to add their content via layers, and specifically layer directories since they are most likely to be under continual and direct change and would not be placed into a formal repo, or more likely they would be managed by their SCM system as is and certainly not packed into a base git clone.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify / set project owner / user ===&lt;br /&gt;
&lt;br /&gt;
A build farm manager (and their shared Toaster instance) may accept build sets from clients, in which case it is important to know who initiates and owns each specific build, for completion notifications and project space recycling.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] You presented the notion of a user - in the movie it was &#039;Belen&#039;. I think it may be necessary to formalize this&lt;br /&gt;
idea with a login screen and at least rudimentary permission and protection. Here is a use case: Imagine a vendor&lt;br /&gt;
deploys Toaster on a server which serves all of its customers. The customers are very diverse and are often competitors&lt;br /&gt;
of one another and do not want their configuration/information/ideas shared with other vendor customers.&lt;br /&gt;
&lt;br /&gt;
[BELEN] Very true: access control is a big deal and very important. However, we are not sure we can tackle this in the 1.7 release. That&#039;s why in the video I speak of &amp;quot;owners&amp;quot; instead of &amp;quot;users&amp;quot;. Our &amp;quot;owner&amp;quot; concept derives from the need to identify who created a certain project, but they are not really users since, for example, they don&#039;t involve authentication (there is no password). &lt;br /&gt;
&lt;br /&gt;
Here is a possible description of these &amp;quot;owners&amp;quot;. Each client accessing a Toaster instance might have an owner linked to it. You don&#039;t explicitly create these owners: you just set them in the process of creating your first project. Then, we remember them. Owners involve only 3 pieces of information: a name, an optional email address and the client they are associated with. You can change the details at any time. So &amp;quot;owners&amp;quot; don&#039;t involve access control: they just tell me who created (and therefore owns) a certain project. You can have the same owner details in several clients: I might have a laptop and a builds machine, I access the same Toaster instance from both, and I can use the same owner name and email address in both. &lt;br /&gt;
&lt;br /&gt;
The above opens some questions:&lt;br /&gt;
&lt;br /&gt;
* can others edit the configuration of a project I own?&lt;br /&gt;
* can others start builds against a project I own?&lt;br /&gt;
* can others download artifacts of a project I own?&lt;br /&gt;
* can others even see the projects I own?&lt;br /&gt;
&lt;br /&gt;
The simplest thing would be either: &lt;br /&gt;
&lt;br /&gt;
* &#039;yes&#039; to all of the above, but that means that people creating Toaster instances that can be accessed by more than one person have to be mindful of the fact that everything in them is open. &lt;br /&gt;
&lt;br /&gt;
* &#039;no&#039; to all of the above, and channel all collaboration through the export / import projects functionality, which is safer but also stifles co-operation.&lt;br /&gt;
&lt;br /&gt;
Just to clarify, ownership as above is established per project, not per build.&lt;br /&gt;
&lt;br /&gt;
[FARRELL] As much as I hate to suggest this...It may be necessary to introduce  the notion of group access - Owner/Group/Others ala unix/linux. I think it may be necessary for users to be able to share their results while excluding others. I can imagine a number of use cases.  Here is one:&lt;br /&gt;
&lt;br /&gt;
        Two customers/users, Fu and Bar, work for the same company C. Each wants to&lt;br /&gt;
        be able to have personal &#039;experimental&#039; builds but may need to share a &#039;production&#039;&lt;br /&gt;
        build - react to errors and download results, etc. Of course, company C doesn&#039;t want&lt;br /&gt;
        company B to see their results, configurations, custom drivers, etc. But, Fu needs to&lt;br /&gt;
        see and have access to some of Bar&#039;s results. These problems can be solved with the&lt;br /&gt;
        introduction of the group access.&lt;br /&gt;
&lt;br /&gt;
I realize this adds a layer of complexity which may be necessary. An alternative would be access control lists (acl). These can be even more flexible but a lot more complicated to implement, manage and maintain.&lt;br /&gt;
&lt;br /&gt;
I think we should decide on an access control model soon and work out an implementation. Even with the current implementation, retrofitting will be difficult and somewhat tedious which will become even more so as we add more features.&lt;br /&gt;
&lt;br /&gt;
[DAVID] The intermediate near term solution is to consider the 1.7 as working with only trusted users, in that they are all already within the same intranet. Under this limitation, if user Foo needs their work fully separate from user Bar, they could just have separate instances and databases of Toaster running, and use existing Linux security to accomplish this.&lt;br /&gt;
&lt;br /&gt;
That said, we could provide for the default build/project view to default to the current &amp;quot;owner&amp;quot;, where they would have to go out of their way to other people&#039;s work.&lt;br /&gt;
&lt;br /&gt;
We could also consider an &amp;quot;audit log&amp;quot; that captures project creation (and especially project deletion), so that at least you know if someone stomped on your stuff :-)&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am with David on this one: I think we can find temporary alternatives. It&#039;s not that I disagree with Farrell, mind: he is completely right that we will need this. Problem is: we need to be mindful of what we can deliver with the resources we have.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify build host and build directory ===&lt;br /&gt;
&lt;br /&gt;
To support distributed build hosts sharing a common Toaster database, there needs to be a way in the database to identify which host (IP address and or host name) and local directory the project was built in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[ALEX] I am not sure I follow the use case / user story here. Can we get more details on why this is important ?&lt;br /&gt;
&lt;br /&gt;
=== Ability to download files (YP #6096) ===&lt;br /&gt;
&lt;br /&gt;
While developers would presumably have access to all build files within the intranet for the build logs and generated target image files, there are cases where that is not so. For example, the owner may be using a Windows host or a portable device to access Toaster, and may wish to download and view the error logs to determine their next course of action. Also, it may be the case that the specific build host is accessible only to the build farm manager and not the individual project owner, and having Toaster serve the file(s) would resolve this barrier.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] The ability to download the result of the build should be somewhere - maybe a column on the All Builds page?&lt;br /&gt;
&lt;br /&gt;
[DAVID] As for things like file downloads, between Ravi and myself I think we will find time to get that one done since we both really want it!&lt;br /&gt;
&lt;br /&gt;
[BELEN] Absolutely: in fact, this is something I might start designing straight away so that it can be implemented in 1.7M1. However, in order to do that, we need to reach agreement as to what a build artifact is:&lt;br /&gt;
&lt;br /&gt;
* Is it just the rootfs files? Or do they include&lt;br /&gt;
* the cooker and task logs?&lt;br /&gt;
* shared state objects used?&lt;br /&gt;
* recipe files / patches?&lt;br /&gt;
* [yours here]&lt;br /&gt;
&lt;br /&gt;
=== Share projects via configuration (export / import) ===&lt;br /&gt;
&lt;br /&gt;
This is the capture and sharing of the minimal project configuration data, such that a remote developer can replicate the same project against their own Yocto Project installation.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] The video ended at the export project discussion. Is export just sending email, the conf file (or files) to someone, or is there be more to it?&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am not sure what the answer is: we need input from Paul and Alex here. In my head, the project configuration (not the builds) is exported to some kind of file(s) that I can then share with others in whichever way I see fit (email, file sharing, etc).&lt;br /&gt;
&lt;br /&gt;
[ALEX] I&#039;m thinking that exporting the project will produce a file that can be imported on another Toaster instance and replicate the original settings of the project that was exported. The concrete means of achieving this may be as simple as exporting a JSON snapshot of the relevant database entries.&lt;br /&gt;
&lt;br /&gt;
=== Definition of a Project ===&lt;br /&gt;
&lt;br /&gt;
The proposed design adds the new concept of the &amp;quot;Project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[PAUL] To my mind, the project is simply a configuration set - if you had a build farm the actual build could be run on any server within that farm and that side of it would be largely hidden from the user (until it needed to be visible, e.g. when you need to diagnose a host contamination issue.) This then means that the management of build directories can be independent, i.e. old build directories can be automatically deleted after a time period or when space runs low, but the project remains in the database for later use when needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] I am completely willing to accept your definition of a &amp;quot;Toaster Project&amp;quot;. The part that convinces me is that (a) while under active build and development it does map to a physical location, but (b) it can hold the data and presumably the &amp;quot;snapshot&amp;quot; artifacts of a physical build directory long after that actual directory has been deleted. That last part is a highly desired feature from the Wind River team, and was also brought up as a specific question at my Toaster presentation at the Yocto Project Summit.&lt;br /&gt;
&lt;br /&gt;
This implies that given the abstract nature of a Toaster &amp;quot;Project&amp;quot;, it makes sense that not only can the developer share that &amp;quot;project&amp;quot; with another developer and Toaster instance (as per Belén design), but it makes sense that the original developer can make their own clones of that project when they for example want use as a reference basis for new projects with additional adjustments and/or for binding and running on a different host/directory.&lt;br /&gt;
&lt;br /&gt;
===== Workflow around creating a Project =====&lt;br /&gt;
&lt;br /&gt;
[DAVID] Here is what I would propose as a workflow.&lt;br /&gt;
&lt;br /&gt;
1) When a Toaster Project is created, &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;user&amp;quot; is the preset to the last &amp;quot;user&amp;quot;, else if this is the first time it is defaulted to $USER. This is a required field.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;email&amp;quot; is preset to the last email that matches &amp;quot;user&amp;quot;, else it is empty. QUESTION: Is this a required field?&lt;br /&gt;
&lt;br /&gt;
* The host:dir values are preset just as &amp;quot;poky/oe-init-build-env&amp;quot; would preset these values, in other words to the current machine and to &amp;quot;poky/../build&amp;quot; (unless redirected with the appropriate environment variables). If that directory (a) already exists and has a &amp;quot;conf/local.conf&amp;quot; file and (b) that directory is already registered with an existing Project, then that is an error. This would provide some sanity check, but would also allow us to re-connect to an unregistered YP build directory (and/or ones previous registered with a subsequently deleted project).&lt;br /&gt;
&lt;br /&gt;
* We either have an explicit &amp;quot;Project Create&amp;quot; button, or we allow for the first build target command to insure that for new projects the project directory is created and the content preset by &amp;quot;poky/oe-init-build-env&amp;quot; before continuing.&lt;br /&gt;
&lt;br /&gt;
2) For external hosts mounted via NFS:&lt;br /&gt;
&lt;br /&gt;
* If an external host is mounted via a YP compatible NFS system, then that would be covered by the normal workflow above, using the local host and the respective NFS path. QUESTION: do we wish to identify the actual remove HOST ID in these circumstances, or just let the NFS path speak for itsel&lt;br /&gt;
&lt;br /&gt;
3) For fully external hosts&lt;br /&gt;
&lt;br /&gt;
This is the situation where a host remote to the Toaster, but is intended to be managed by this Toaster and use this Toaster&#039;s database.&lt;br /&gt;
&lt;br /&gt;
* This implies using some sort of rpc, probably via SSH, to execute the creation and build targets.&lt;br /&gt;
&lt;br /&gt;
* There would presumably be an installation of YP on that remote host, and that location would need to be known to Toaster. The installation could be as simple as an NFS mount that points to the local YP installation, which would provide a single source at the cost of NFS traffic.&lt;br /&gt;
&lt;br /&gt;
== Toaster System Architectures ==&lt;br /&gt;
&lt;br /&gt;
This is an iteration of the possible supported system architectures of a Toaster implementation. We should validate how the proposed design would work with each of these options.&lt;br /&gt;
&lt;br /&gt;
=== Minimal Local Project Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Local host, local project, database in project, toaster and web server started from project&lt;br /&gt;
&lt;br /&gt;
This is the default implementation, using the &amp;quot;source toaster [start|stop]&amp;quot; support.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Local Project Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Local host, Multiple local projects, shared local database, toaster and web server started separately&lt;br /&gt;
&lt;br /&gt;
This is currently supported by (a) edits to the local.conf file to point to the shared database location, and (b) using special commands to start the shared Toaster and webserver instance.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Distributed Host Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Multiple hosts, Multiple local projects per host, shared network database, toaster and web server started with network database instance&lt;br /&gt;
&lt;br /&gt;
Each host would either have its own installation of YP, or have a centralized copy shared over NFS. This implementation is currently not yet documented nor supported.&lt;br /&gt;
&lt;br /&gt;
== Open Bugzilla features / defects ==&lt;br /&gt;
&lt;br /&gt;
[http://wiki.yoctoproject.org/wiki/Bugzilla_feature_list This is what&#039;s open in Bugzilla right now]. Apart from what&#039;s already assigned to 1.6.1, there are 2 issues that I am keen on getting fixed:&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187] - Same cooker log file name used for several builds &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=6095 6095] - Retrieve full build information independently of task execution&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this list.&lt;br /&gt;
&lt;br /&gt;
== Future features ==&lt;br /&gt;
&lt;br /&gt;
A list of features that have come up in discussion, but not for the 1.7 release.&lt;br /&gt;
&lt;br /&gt;
===  Delete projects ===&lt;br /&gt;
 &lt;br /&gt;
This option deletes the project all the way down to the project&#039;s instance on the disk. This should be a safe operation unless a separate project is directly sharing its sstate cache. That would be an recommended usage, where a proper usage would a standalone shared sstate cache. There may be artifacts in that shared sstate cache that are specific and unique to the deleted project, but it is out of scope for this option to try to delete those as well.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add/remove recipes ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove recipes from the project&#039;s configuration.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to import source (tarballs, repos) ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to bring external sources into the project and include them with wrapper recipes.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to add/remove packages from image ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove specific binary packages from the respective image(s) of a project.&lt;br /&gt;
&lt;br /&gt;
===  Share projects via Copy (all but &amp;quot;./tmp&amp;quot;) ===&lt;br /&gt;
 &lt;br /&gt;
Project directories (all except for their local &amp;quot;tmp&amp;quot; directory) should be portable between hosts, where the receiving developer needs only to adjust the local.conf file for the local installation and sstate directories.&lt;br /&gt;
&lt;br /&gt;
=== Ability to get notification of build status ===&lt;br /&gt;
 &lt;br /&gt;
Since builds can take a long time, it would be very useful to get for example email notification when a build stops, either with success or with failure, rather than needing to continually and manually poll the Toaster interface.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] I agree, but can we generalize this post-build processing to enable post-build script execution triggered by either success, failure, or either?  We could provide a few parameterized scripts to, for example:&lt;br /&gt;
&lt;br /&gt;
* send email to a user or list with build status,&lt;br /&gt;
* (on success) start an emulation session with regression tests on a build,&lt;br /&gt;
* (on success) download the built file system or SDK to a user&#039;s host or target,&lt;br /&gt;
* provide hooks for the user to substitute their alternative post-build triggers.&lt;br /&gt;
&lt;br /&gt;
=== Ability to access Toaster from portable device ===&lt;br /&gt;
 &lt;br /&gt;
Since builds generally take a long time, the user may be away from their desk (or even work hours) and wish to track the status of their pending builds. Supporting a basic Toaster interface for such limited devices would be advantageous.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to compare projects/builds ===&lt;br /&gt;
&lt;br /&gt;
A user may not recall the difference between one build and another, or one project and another. The data is in the database, so it would not be hard to generate a report itemizing the observed differences. Here are some the potential changes that can be extracted:&lt;br /&gt;
&lt;br /&gt;
* Changed variable definitions (less base path differences). This would also cover changes in things like the machine, layers, extra added or excluded recipes, and multi-lib support.&lt;br /&gt;
* Changes in the included packages list&lt;br /&gt;
* Perhaps changes in the build/caching statistics&lt;br /&gt;
&lt;br /&gt;
=== Snapshots of builds for long term archiving (project dir lifecycle) ===&lt;br /&gt;
 &lt;br /&gt;
A build manager may wish to keep the pertinent facts of builds for an extended period of time. This could be for a few days to allow time for the build&#039;s owner to reconcile the results, or if maybe over a year for tracking long-term trends and regressions. In each case, there should be a way to capture a minimal set of information from the build directory (e.g. the conf files and any build failure logs) and preserve it so that together with the database there is enough information to study that project even when the full build directory is removed and recycled.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12640</id>
		<title>Toaster 1.7 design</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12640"/>
		<updated>2014-04-25T09:42:42Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Ability to identify build host and build directory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== A couple of videos to kick off things ==&lt;br /&gt;
&lt;br /&gt;
The following videos illustrate some of the features we are thinking of adding to Toaster during the 1.7 release cycle. When watching them, keep in mind that this is all very rough: more like sketches to help us start a conversation about scope than proper designs. Chances are the final designs will be completely different.&lt;br /&gt;
&lt;br /&gt;
About projects - [[media:Building-1.7.mov]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Starting a build - [[media:How-to-build.mov]]&lt;br /&gt;
&lt;br /&gt;
== Feature list ==&lt;br /&gt;
&lt;br /&gt;
=== Ability to create new projects ===&lt;br /&gt;
&lt;br /&gt;
This is the ability to use the Toaster interface to create new project directories, manage the content, and initiate the builds of selectable target images.&lt;br /&gt;
&lt;br /&gt;
===== Summary of discussion =====&lt;br /&gt;
&lt;br /&gt;
* A project is a set of layers and configuration variables values that describes how to do a build. &lt;br /&gt;
* Creating a project means writing up values for the above-mentioned set, and store these values in a persistent manner.&lt;br /&gt;
* A build for a project means effecting (instantiating) the build process for the current set of values.&lt;br /&gt;
* Build directory location (host/machine) is not relevant to Toaster.&lt;br /&gt;
* Saving the build artifacts and providing access to the build artifacts is critical for Toaster.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] What is a typical workflow that gets to the build project part?  I see the configure screens but not the actually build launch.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Does clicking &#039;new build&#039; fire off a build?  If so, which configuration is built?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Heh, I completely forgot to show that in the first video. [http://wiki.yoctoproject.org/wiki/images/b/b1/How-to-build.mov Here is part 2] showing how to start a build and answering (I hope) both questions.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can projects be configured, primed for builds, but not built? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Will the user be able to configure several builds, then queue them all to build?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Users might create more than one project then start a build for each of them by clicking the &amp;quot;build&amp;quot; button in each project page, but nothing more sophisticated than that for the time being. Here is where things can get tricky. Where does Toaster stop and something like Buildbot or Jenkins start? My take is that we want to work alongside and enhance build automation systems, not replace them. &lt;br /&gt;
&lt;br /&gt;
[DAVE] What is the size of the build variable list?  It&#039;s hard to figure from the conf/local.conf file.  If it is a small list, like 10, should we provide better and variable specific UI widgets rather than just edit boxes, depending on the variable&#039;s &amp;quot;type&amp;quot; (eg browse button with any path variable like SSTATE_DIR)?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is one of the questions we should start working on straight away. In informal chats we have spoken about a split between &amp;quot;build variables&amp;quot; (the ones that affect the build and therefore you can edit via Toaster) and &amp;quot;infrastructure variables&amp;quot; (to call them something, that affect the build infrastructure and you cannot edit via Toaster. Things like PARALLEL_MAKE for example). We should start getting into details about that split as soon as possible, and determine which variables we are going to expose via Toaster to be edited. Once again, Paul&#039;s feedback here would be good (RP&#039;s probably as well).&lt;br /&gt;
&lt;br /&gt;
Regarding variable &amp;quot;types&amp;quot;, I had a brief conversation with RP recently about this issue. It is unlikely that the meta data will provide us with information about the type of input expected by a variable. If and how the Toaster interface should fill that gap is up for discussion. From my perspective, we should do as much as we can to help users assign valid values to their variables.&lt;br /&gt;
&lt;br /&gt;
[DAVE] I don&#039;t recall a user entry on your videos that specify the project directory for the build. This must be part of the initial release. I don&#039;t recommend making it an edited data file option, eg not via in settings.py.  &lt;br /&gt;
&lt;br /&gt;
[BELEN] When you run Toaster locally you can configure the location of your build directory as you wish, but when Toaster is running remotely, do we want to let people select the location of their build directory?&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can we make any selection on any page &#039;stick&#039; with cookies or &#039;unstick&#039; with a &#039;reset to defaults&#039; button, in addition to propagating laborious configuration setups inputs via &#039;clone configuration&#039;?&lt;br /&gt;
&lt;br /&gt;
[BELEN] We will need to overcome my personal hate of &#039;reset to defaults&#039; options :) They are very dangerous if we don&#039;t provide an &#039;undo&#039; option as well: they might wipe your configuration and revert it to the rather useless default one, losing a bunch of work you did beforehand. Any configuration changes you make are saved: in that sense, they are &#039;sticky&#039;. If I create project A, then I add 2 layers to the project configuration, select a machine and 3 targets, all those options are saved to the project configuration. You don&#039;t need to add the 2 layers, select the machine and the 3 targets every time you want to run a build.&lt;br /&gt;
&lt;br /&gt;
[RAVI] I am wondering about the purpose of a project. In the design, project has a machine and owner attributes. If we define a project as a collection of builds for a machine, then we should not allow to change the machine after a project is created. Then, if a project is just a collection of builds for a particular machine, then we can modify the existing all builds view to group builds by machine. Based on this argument, I do not see a need for project and build hierarchy.&lt;br /&gt;
&lt;br /&gt;
[DAVID] My group understands that a &amp;quot;project&amp;quot; is a specific build directory. A project will most likely to have multiple builds, and things like the (a) machine, (b) layers, (c) conf variables, and so forth would be presumably set before the first target is selected and executed. It is also the case that the developer may decide to change any of those settings, including even the machine type, and then carry on with more builds. The use case would be for example is arch coverage testing of a particular set of kernel or user space packages.&lt;br /&gt;
&lt;br /&gt;
A host can then have multiple project directories (I most often work that way), for example when a developer truly wants to keep their development and/or debugging from not polluting other projects.&lt;br /&gt;
&lt;br /&gt;
Also, separate users should do their work in separate project directories, now that we are extending the model to cover that.&lt;br /&gt;
&lt;br /&gt;
There can then be multiple hosts, with all of their multiple projects, all channeling their Toaster data into a shared database. And with that you have a build farm.&lt;br /&gt;
&lt;br /&gt;
[RAVI] I see that the uniqueness of a project is the &amp;lt;hostname&amp;gt;://&amp;lt;build directory path&amp;gt;. The contents of the build directory can be changed and multiple builds can be kicked off from the same project with different configurations. If this the case, the project creation should also setup a build directory on the host.&lt;br /&gt;
&lt;br /&gt;
Looking at this use case, we should have toaster running on the host machine with a shared database. Or if we run a single toaster instance serving multiple projects (hosts and build directories), we should have a mechanism for the toaster machine to talk to the project machines. Am I missing something?&lt;br /&gt;
&lt;br /&gt;
[PAUL] Yes, but the project need not be tied to a specific host or location on disk. To my mind, the project is simply a configuration set - if you had a build farm the actual build could be run on any server within that farm and that side of it would be largely hidden from the user (until it needed to be visible, e.g. when you need to diagnose a host contamination issue.) This then means that the management of build directories can be independent, i.e. old build directories can be automatically deleted after a time period or when space runs low, but the project remains in the database for later use when needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] I am completely willing to accept the above definition of a &amp;quot;Toaster Project&amp;quot;. The part that convinces me is that (a) while under active build and development it does map to a physical location, but (b) it can hold the data and presumably the &amp;quot;snapshot&amp;quot; artifacts of a physical build directory long after that actual directory has been deleted. That last part is a highly desired feature from the Wind River team, and was also brought up as a specific question at my Toaster presentation at the Yocto Project Summit.&lt;br /&gt;
&lt;br /&gt;
This implies that given the abstract nature of a Toaster &amp;quot;Project&amp;quot;, it makes sense that not only can the developer share that &amp;quot;project&amp;quot; with another developer and Toaster instance (as per Belén design), but it makes sense that the original developer can make their own clones of that project when they for example want use as a reference basis for new projects with additional adjustments and/or for binding and running on a different host/directory.&lt;br /&gt;
&lt;br /&gt;
Here is what I would propose is the workflow.&lt;br /&gt;
&lt;br /&gt;
1) When a Toaster Project is created,&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;user&amp;quot; is the preset to the last &amp;quot;user&amp;quot;, else if this is the first time it is defaulted to $USER. This is a required field.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;email&amp;quot; is preset to the last email that matches &amp;quot;user&amp;quot;, else it is empty. QUESTION: Is this a required field?&lt;br /&gt;
&lt;br /&gt;
* The host:dir values are preset just as &amp;quot;poky/oe-init-build-env&amp;quot; would preset these values, in other words to the current machine and to &amp;quot;poky/../build&amp;quot; (unless redirected with the appropriate environment variables). If that directory (a) already exists and has a &amp;quot;conf/local.conf&amp;quot; file and (b) that directory exists for an existing Project, then that is an error. This would allow us to re-connect to a deleted or unregistered YP build directories.&lt;br /&gt;
&lt;br /&gt;
* We either have an explicit &amp;quot;Project Create&amp;quot; button, or we allow for the first build target command to insure that for new projects the project directory is created and the content preset by &amp;quot;poky/oe-init-build-env&amp;quot; before continuing.&lt;br /&gt;
&lt;br /&gt;
2) For external hosts mounted via NFS:&lt;br /&gt;
&lt;br /&gt;
* If an external host is mounted via a YP compatible NFS system, then that would be covered by the normal workflow above, using the local host and the respective NFS path. QUESTION: do we wish to identify the actual remove HOST ID in these circumstances, or just let the NFS path speak for itself?&lt;br /&gt;
&lt;br /&gt;
3) For fully external hosts&lt;br /&gt;
&lt;br /&gt;
This is the situation where a host remote to the Toaster, but is intended to be managed by this Toaster and use this Toaster&#039;s database.&lt;br /&gt;
&lt;br /&gt;
* This implies using some sort of rpc, probably via SSH, to execute the creation and build targets.&lt;br /&gt;
&lt;br /&gt;
* There would presumably be an installation of YP on that remote host, and that location would need to be known to Toaster. The installation could be as simple as an NFS mount that points to the local YP installation, which would provide a single source at the cost of NFS traffic.&lt;br /&gt;
&lt;br /&gt;
=== Hide builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option simply removes or hides selected builds from the Toaster display, for example builds quickly halted because the owner realized that they missed a setting. The database records and the project on the disk is untouched. This un-clutters the display, yet requires little programing (and development time).&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[BELEN] I have no strong feelings against this one, but we need to bear in mind that:&lt;br /&gt;
&lt;br /&gt;
* It will probably be hard to allow hiding in bulk, since the reasons why someone might want to hide a build could be wildly different. So this will have to be done on a build by build basis. &lt;br /&gt;
&lt;br /&gt;
* This also involves providing a way to reverse the hiding action, i.e. see hidden builds and show them again.&lt;br /&gt;
&lt;br /&gt;
[DAVID] In the Wind River version of Wiki, we have a &amp;quot;Manage&amp;quot; button at the bottom. This brings up a page of all of the entries, with the ability to change the entry&#039;s hidden and description attributes. This does allow a bulk update easily.&lt;br /&gt;
&lt;br /&gt;
I propose that we do the same, where a &amp;quot;Manage&amp;quot; button brings up all of the builds and/or projects, each highlighted according to if it is currently hidden, also each with a text entry for the description (see the next design proposal) and a check box to toggle the hidden state. &lt;br /&gt;
&lt;br /&gt;
We then need to decide if this meta date is stored in the database or in the page&#039;s cookie.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add a description to a build or project ===&lt;br /&gt;
&lt;br /&gt;
User&#039;s may not recall the difference and purpose of a given build or project, so it would be good for the Toaster interface to allow the user to add this and update this as needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] See the discussion above about &amp;quot;hidden&amp;quot; builds for a proposed implementation.&lt;br /&gt;
&lt;br /&gt;
=== Delete builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option is where a selected build and all its related database records are removed from the database. This removes the database overhead for this unwanted builds. The project on the disk is untouched. Since the database should be normalized, this operation should be clean and not interfere with other builds. I believe we have a command line version of this operation with Toaster-1.6.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[Alex] Technically, this is straightforward. In terms of policy access, we need to define one; I propose that only the project owner is allowed to delete builds. Impersonation is trivial right now, but once we implement authentication, bricks will fall in the right place in terms of access control.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add / remove layers ===&lt;br /&gt;
&lt;br /&gt;
Add and delete from the project layer directories. These layers may be within repositories or in plain directories on the disk.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] How would I upload my specialized device driver/library/system call handler/etc that necessarily needs to be part of&lt;br /&gt;
the build? Would this be done by importing a layer? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes. For the 1.7 release, all customisation must be done via layers.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Are you constraining &#039;import layer&#039; to a git repo path? Why not just a local directory that is not a git repo? In that case should we have a browse button as well as an edit box?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is a really good question. I need the technical crowd to establish what&#039;s possible / what we want to do. We can then design accordingly.&lt;br /&gt;
&lt;br /&gt;
[DAVID] It is the case that we recommend all of our customers to add their content via layers, and specifically layer directories since they are most likely to be under continual and direct change and would not be placed into a formal repo, or more likely they would be managed by their SCM system as is and certainly not packed into a base git clone.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify / set project owner / user ===&lt;br /&gt;
&lt;br /&gt;
A build farm manager (and their shared Toaster instance) may accept build sets from clients, in which case it is important to know who initiates and owns each specific build, for completion notifications and project space recycling.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] You presented the notion of a user - in the movie it was &#039;Belen&#039;. I think it may be necessary to formalize this&lt;br /&gt;
idea with a login screen and at least rudimentary permission and protection. Here is a use case: Imagine a vendor&lt;br /&gt;
deploys Toaster on a server which serves all of its customers. The customers are very diverse and are often competitors&lt;br /&gt;
of one another and do not want their configuration/information/ideas shared with other vendor customers.&lt;br /&gt;
&lt;br /&gt;
[BELEN] Very true: access control is a big deal and very important. However, we are not sure we can tackle this in the 1.7 release. That&#039;s why in the video I speak of &amp;quot;owners&amp;quot; instead of &amp;quot;users&amp;quot;. Our &amp;quot;owner&amp;quot; concept derives from the need to identify who created a certain project, but they are not really users since, for example, they don&#039;t involve authentication (there is no password). &lt;br /&gt;
&lt;br /&gt;
Here is a possible description of these &amp;quot;owners&amp;quot;. Each client accessing a Toaster instance might have an owner linked to it. You don&#039;t explicitly create these owners: you just set them in the process of creating your first project. Then, we remember them. Owners involve only 3 pieces of information: a name, an optional email address and the client they are associated with. You can change the details at any time. So &amp;quot;owners&amp;quot; don&#039;t involve access control: they just tell me who created (and therefore owns) a certain project. You can have the same owner details in several clients: I might have a laptop and a builds machine, I access the same Toaster instance from both, and I can use the same owner name and email address in both. &lt;br /&gt;
&lt;br /&gt;
The above opens some questions:&lt;br /&gt;
&lt;br /&gt;
* can others edit the configuration of a project I own?&lt;br /&gt;
* can others start builds against a project I own?&lt;br /&gt;
* can others download artifacts of a project I own?&lt;br /&gt;
* can others even see the projects I own?&lt;br /&gt;
&lt;br /&gt;
The simplest thing would be either: &lt;br /&gt;
&lt;br /&gt;
* &#039;yes&#039; to all of the above, but that means that people creating Toaster instances that can be accessed by more than one person have to be mindful of the fact that everything in them is open. &lt;br /&gt;
&lt;br /&gt;
* &#039;no&#039; to all of the above, and channel all collaboration through the export / import projects functionality, which is safer but also stifles co-operation.&lt;br /&gt;
&lt;br /&gt;
Just to clarify, ownership as above is established per project, not per build.&lt;br /&gt;
&lt;br /&gt;
[FARRELL] As much as I hate to suggest this...It may be necessary to introduce  the notion of group access - Owner/Group/Others ala unix/linux. I think it may be necessary for users to be able to share their results while excluding others. I can imagine a number of use cases.  Here is one:&lt;br /&gt;
&lt;br /&gt;
        Two customers/users, Fu and Bar, work for the same company C. Each wants to&lt;br /&gt;
        be able to have personal &#039;experimental&#039; builds but may need to share a &#039;production&#039;&lt;br /&gt;
        build - react to errors and download results, etc. Of course, company C doesn&#039;t want&lt;br /&gt;
        company B to see their results, configurations, custom drivers, etc. But, Fu needs to&lt;br /&gt;
        see and have access to some of Bar&#039;s results. These problems can be solved with the&lt;br /&gt;
        introduction of the group access.&lt;br /&gt;
&lt;br /&gt;
I realize this adds a layer of complexity which may be necessary. An alternative would be access control lists (acl). These can be even more flexible but a lot more complicated to implement, manage and maintain.&lt;br /&gt;
&lt;br /&gt;
I think we should decide on an access control model soon and work out an implementation. Even with the current implementation, retrofitting will be difficult and somewhat tedious which will become even more so as we add more features.&lt;br /&gt;
&lt;br /&gt;
[DAVID] The intermediate near term solution is to consider the 1.7 as working with only trusted users, in that they are all already within the same intranet. Under this limitation, if user Foo needs their work fully separate from user Bar, they could just have separate instances and databases of Toaster running, and use existing Linux security to accomplish this.&lt;br /&gt;
&lt;br /&gt;
That said, we could provide for the default build/project view to default to the current &amp;quot;owner&amp;quot;, where they would have to go out of their way to other people&#039;s work.&lt;br /&gt;
&lt;br /&gt;
We could also consider an &amp;quot;audit log&amp;quot; that captures project creation (and especially project deletion), so that at least you know if someone stomped on your stuff :-)&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am with David on this one: I think we can find temporary alternatives. It&#039;s not that I disagree with Farrell, mind: he is completely right that we will need this. Problem is: we need to be mindful of what we can deliver with the resources we have.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify build host and build directory ===&lt;br /&gt;
&lt;br /&gt;
To support distributed build hosts sharing a common Toaster database, there needs to be a way in the database to identify which host (IP address and or host name) and local directory the project was built in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[ALEX] I am not sure I follow the use case / user story here. Can we get more details on why this is important ?&lt;br /&gt;
&lt;br /&gt;
=== Ability to download files (YP #6096) ===&lt;br /&gt;
&lt;br /&gt;
While developers would presumably have access to all build files within the intranet for the build logs and generated target image files, there are cases where that is not so. For example, the owner may be using a Windows host or a portable device to access Toaster, and may wish to download and view the error logs to determine their next course of action. Also, it may be the case that the specific build host is accessible only to the build farm manager and not the individual project owner, and having Toaster serve the file(s) would resolve this barrier.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] The ability to download the result of the build should be somewhere - maybe a column on the All Builds page?&lt;br /&gt;
&lt;br /&gt;
[DAVID] As for things like file downloads, between Ravi and myself I think we will find time to get that one done since we both really want it!&lt;br /&gt;
&lt;br /&gt;
[BELEN] Absolutely: in fact, this is something I might start designing straight away so that it can be implemented in 1.7M1. However, in order to do that, we need to reach agreement as to what a build artifact is:&lt;br /&gt;
&lt;br /&gt;
* Is it just the rootfs files? Or do they include&lt;br /&gt;
* the cooker and task logs?&lt;br /&gt;
* shared state objects used?&lt;br /&gt;
* recipe files / patches?&lt;br /&gt;
* [yours here]&lt;br /&gt;
&lt;br /&gt;
=== Share projects via configuration (export / import) ===&lt;br /&gt;
&lt;br /&gt;
This is the capture and sharing of the minimal project configuration data, such that a remote developer can replicate the same project against their own Yocto Project installation.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] The video ended at the export project discussion. Is export just sending email, the conf file (or files) to someone, or is there be more to it?&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am not sure what the answer is: we need input from Paul and Alex here. In my head, the project configuration (not the builds) is exported to some kind of file(s) that I can then share with others in whichever way I see fit (email, file sharing, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definition of a Project ===&lt;br /&gt;
&lt;br /&gt;
The proposed design adds the new concept of the &amp;quot;Project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[PAUL] To my mind, the project is simply a configuration set - if you had a build farm the actual build could be run on any server within that farm and that side of it would be largely hidden from the user (until it needed to be visible, e.g. when you need to diagnose a host contamination issue.) This then means that the management of build directories can be independent, i.e. old build directories can be automatically deleted after a time period or when space runs low, but the project remains in the database for later use when needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] I am completely willing to accept your definition of a &amp;quot;Toaster Project&amp;quot;. The part that convinces me is that (a) while under active build and development it does map to a physical location, but (b) it can hold the data and presumably the &amp;quot;snapshot&amp;quot; artifacts of a physical build directory long after that actual directory has been deleted. That last part is a highly desired feature from the Wind River team, and was also brought up as a specific question at my Toaster presentation at the Yocto Project Summit.&lt;br /&gt;
&lt;br /&gt;
This implies that given the abstract nature of a Toaster &amp;quot;Project&amp;quot;, it makes sense that not only can the developer share that &amp;quot;project&amp;quot; with another developer and Toaster instance (as per Belén design), but it makes sense that the original developer can make their own clones of that project when they for example want use as a reference basis for new projects with additional adjustments and/or for binding and running on a different host/directory.&lt;br /&gt;
&lt;br /&gt;
===== Workflow around creating a Project =====&lt;br /&gt;
&lt;br /&gt;
[DAVID] Here is what I would propose as a workflow.&lt;br /&gt;
&lt;br /&gt;
1) When a Toaster Project is created, &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;user&amp;quot; is the preset to the last &amp;quot;user&amp;quot;, else if this is the first time it is defaulted to $USER. This is a required field.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;email&amp;quot; is preset to the last email that matches &amp;quot;user&amp;quot;, else it is empty. QUESTION: Is this a required field?&lt;br /&gt;
&lt;br /&gt;
* The host:dir values are preset just as &amp;quot;poky/oe-init-build-env&amp;quot; would preset these values, in other words to the current machine and to &amp;quot;poky/../build&amp;quot; (unless redirected with the appropriate environment variables). If that directory (a) already exists and has a &amp;quot;conf/local.conf&amp;quot; file and (b) that directory is already registered with an existing Project, then that is an error. This would provide some sanity check, but would also allow us to re-connect to an unregistered YP build directory (and/or ones previous registered with a subsequently deleted project).&lt;br /&gt;
&lt;br /&gt;
* We either have an explicit &amp;quot;Project Create&amp;quot; button, or we allow for the first build target command to insure that for new projects the project directory is created and the content preset by &amp;quot;poky/oe-init-build-env&amp;quot; before continuing.&lt;br /&gt;
&lt;br /&gt;
2) For external hosts mounted via NFS:&lt;br /&gt;
&lt;br /&gt;
* If an external host is mounted via a YP compatible NFS system, then that would be covered by the normal workflow above, using the local host and the respective NFS path. QUESTION: do we wish to identify the actual remove HOST ID in these circumstances, or just let the NFS path speak for itsel&lt;br /&gt;
&lt;br /&gt;
3) For fully external hosts&lt;br /&gt;
&lt;br /&gt;
This is the situation where a host remote to the Toaster, but is intended to be managed by this Toaster and use this Toaster&#039;s database.&lt;br /&gt;
&lt;br /&gt;
* This implies using some sort of rpc, probably via SSH, to execute the creation and build targets.&lt;br /&gt;
&lt;br /&gt;
* There would presumably be an installation of YP on that remote host, and that location would need to be known to Toaster. The installation could be as simple as an NFS mount that points to the local YP installation, which would provide a single source at the cost of NFS traffic.&lt;br /&gt;
&lt;br /&gt;
== Toaster System Architectures ==&lt;br /&gt;
&lt;br /&gt;
This is an iteration of the possible supported system architectures of a Toaster implementation. We should validate how the proposed design would work with each of these options.&lt;br /&gt;
&lt;br /&gt;
=== Minimal Local Project Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Local host, local project, database in project, toaster and web server started from project&lt;br /&gt;
&lt;br /&gt;
This is the default implementation, using the &amp;quot;source toaster [start|stop]&amp;quot; support.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Local Project Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Local host, Multiple local projects, shared local database, toaster and web server started separately&lt;br /&gt;
&lt;br /&gt;
This is currently supported by (a) edits to the local.conf file to point to the shared database location, and (b) using special commands to start the shared Toaster and webserver instance.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Distributed Host Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Multiple hosts, Multiple local projects per host, shared network database, toaster and web server started with network database instance&lt;br /&gt;
&lt;br /&gt;
Each host would either have its own installation of YP, or have a centralized copy shared over NFS. This implementation is currently not yet documented nor supported.&lt;br /&gt;
&lt;br /&gt;
== Open Bugzilla features / defects ==&lt;br /&gt;
&lt;br /&gt;
[http://wiki.yoctoproject.org/wiki/Bugzilla_feature_list This is what&#039;s open in Bugzilla right now]. Apart from what&#039;s already assigned to 1.6.1, there are 2 issues that I am keen on getting fixed:&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187] - Same cooker log file name used for several builds &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=6095 6095] - Retrieve full build information independently of task execution&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this list.&lt;br /&gt;
&lt;br /&gt;
== Future features ==&lt;br /&gt;
&lt;br /&gt;
A list of features that have come up in discussion, but not for the 1.7 release.&lt;br /&gt;
&lt;br /&gt;
===  Delete projects ===&lt;br /&gt;
 &lt;br /&gt;
This option deletes the project all the way down to the project&#039;s instance on the disk. This should be a safe operation unless a separate project is directly sharing its sstate cache. That would be an recommended usage, where a proper usage would a standalone shared sstate cache. There may be artifacts in that shared sstate cache that are specific and unique to the deleted project, but it is out of scope for this option to try to delete those as well.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add/remove recipes ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove recipes from the project&#039;s configuration.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to import source (tarballs, repos) ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to bring external sources into the project and include them with wrapper recipes.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to add/remove packages from image ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove specific binary packages from the respective image(s) of a project.&lt;br /&gt;
&lt;br /&gt;
===  Share projects via Copy (all but &amp;quot;./tmp&amp;quot;) ===&lt;br /&gt;
 &lt;br /&gt;
Project directories (all except for their local &amp;quot;tmp&amp;quot; directory) should be portable between hosts, where the receiving developer needs only to adjust the local.conf file for the local installation and sstate directories.&lt;br /&gt;
&lt;br /&gt;
=== Ability to get notification of build status ===&lt;br /&gt;
 &lt;br /&gt;
Since builds can take a long time, it would be very useful to get for example email notification when a build stops, either with success or with failure, rather than needing to continually and manually poll the Toaster interface.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] I agree, but can we generalize this post-build processing to enable post-build script execution triggered by either success, failure, or either?  We could provide a few parameterized scripts to, for example:&lt;br /&gt;
&lt;br /&gt;
* send email to a user or list with build status,&lt;br /&gt;
* (on success) start an emulation session with regression tests on a build,&lt;br /&gt;
* (on success) download the built file system or SDK to a user&#039;s host or target,&lt;br /&gt;
* provide hooks for the user to substitute their alternative post-build triggers.&lt;br /&gt;
&lt;br /&gt;
=== Ability to access Toaster from portable device ===&lt;br /&gt;
 &lt;br /&gt;
Since builds generally take a long time, the user may be away from their desk (or even work hours) and wish to track the status of their pending builds. Supporting a basic Toaster interface for such limited devices would be advantageous.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to compare projects/builds ===&lt;br /&gt;
&lt;br /&gt;
A user may not recall the difference between one build and another, or one project and another. The data is in the database, so it would not be hard to generate a report itemizing the observed differences. Here are some the potential changes that can be extracted:&lt;br /&gt;
&lt;br /&gt;
* Changed variable definitions (less base path differences). This would also cover changes in things like the machine, layers, extra added or excluded recipes, and multi-lib support.&lt;br /&gt;
* Changes in the included packages list&lt;br /&gt;
* Perhaps changes in the build/caching statistics&lt;br /&gt;
&lt;br /&gt;
=== Snapshots of builds for long term archiving (project dir lifecycle) ===&lt;br /&gt;
 &lt;br /&gt;
A build manager may wish to keep the pertinent facts of builds for an extended period of time. This could be for a few days to allow time for the build&#039;s owner to reconcile the results, or if maybe over a year for tracking long-term trends and regressions. In each case, there should be a way to capture a minimal set of information from the build directory (e.g. the conf files and any build failure logs) and preserve it so that together with the database there is enough information to study that project even when the full build directory is removed and recycled.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12639</id>
		<title>Toaster 1.7 design</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12639"/>
		<updated>2014-04-25T09:30:53Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Feature list */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== A couple of videos to kick off things ==&lt;br /&gt;
&lt;br /&gt;
The following videos illustrate some of the features we are thinking of adding to Toaster during the 1.7 release cycle. When watching them, keep in mind that this is all very rough: more like sketches to help us start a conversation about scope than proper designs. Chances are the final designs will be completely different.&lt;br /&gt;
&lt;br /&gt;
About projects - [[media:Building-1.7.mov]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Starting a build - [[media:How-to-build.mov]]&lt;br /&gt;
&lt;br /&gt;
== Feature list ==&lt;br /&gt;
&lt;br /&gt;
=== Ability to create new projects ===&lt;br /&gt;
&lt;br /&gt;
This is the ability to use the Toaster interface to create new project directories, manage the content, and initiate the builds of selectable target images.&lt;br /&gt;
&lt;br /&gt;
===== Summary of discussion =====&lt;br /&gt;
&lt;br /&gt;
* A project is a set of layers and configuration variables values that describes how to do a build. &lt;br /&gt;
* Creating a project means writing up values for the above-mentioned set, and store these values in a persistent manner.&lt;br /&gt;
* A build for a project means effecting (instantiating) the build process for the current set of values.&lt;br /&gt;
* Build directory location (host/machine) is not relevant to Toaster.&lt;br /&gt;
* Saving the build artifacts and providing access to the build artifacts is critical for Toaster.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] What is a typical workflow that gets to the build project part?  I see the configure screens but not the actually build launch.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Does clicking &#039;new build&#039; fire off a build?  If so, which configuration is built?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Heh, I completely forgot to show that in the first video. [http://wiki.yoctoproject.org/wiki/images/b/b1/How-to-build.mov Here is part 2] showing how to start a build and answering (I hope) both questions.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can projects be configured, primed for builds, but not built? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Will the user be able to configure several builds, then queue them all to build?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Users might create more than one project then start a build for each of them by clicking the &amp;quot;build&amp;quot; button in each project page, but nothing more sophisticated than that for the time being. Here is where things can get tricky. Where does Toaster stop and something like Buildbot or Jenkins start? My take is that we want to work alongside and enhance build automation systems, not replace them. &lt;br /&gt;
&lt;br /&gt;
[DAVE] What is the size of the build variable list?  It&#039;s hard to figure from the conf/local.conf file.  If it is a small list, like 10, should we provide better and variable specific UI widgets rather than just edit boxes, depending on the variable&#039;s &amp;quot;type&amp;quot; (eg browse button with any path variable like SSTATE_DIR)?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is one of the questions we should start working on straight away. In informal chats we have spoken about a split between &amp;quot;build variables&amp;quot; (the ones that affect the build and therefore you can edit via Toaster) and &amp;quot;infrastructure variables&amp;quot; (to call them something, that affect the build infrastructure and you cannot edit via Toaster. Things like PARALLEL_MAKE for example). We should start getting into details about that split as soon as possible, and determine which variables we are going to expose via Toaster to be edited. Once again, Paul&#039;s feedback here would be good (RP&#039;s probably as well).&lt;br /&gt;
&lt;br /&gt;
Regarding variable &amp;quot;types&amp;quot;, I had a brief conversation with RP recently about this issue. It is unlikely that the meta data will provide us with information about the type of input expected by a variable. If and how the Toaster interface should fill that gap is up for discussion. From my perspective, we should do as much as we can to help users assign valid values to their variables.&lt;br /&gt;
&lt;br /&gt;
[DAVE] I don&#039;t recall a user entry on your videos that specify the project directory for the build. This must be part of the initial release. I don&#039;t recommend making it an edited data file option, eg not via in settings.py.  &lt;br /&gt;
&lt;br /&gt;
[BELEN] When you run Toaster locally you can configure the location of your build directory as you wish, but when Toaster is running remotely, do we want to let people select the location of their build directory?&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can we make any selection on any page &#039;stick&#039; with cookies or &#039;unstick&#039; with a &#039;reset to defaults&#039; button, in addition to propagating laborious configuration setups inputs via &#039;clone configuration&#039;?&lt;br /&gt;
&lt;br /&gt;
[BELEN] We will need to overcome my personal hate of &#039;reset to defaults&#039; options :) They are very dangerous if we don&#039;t provide an &#039;undo&#039; option as well: they might wipe your configuration and revert it to the rather useless default one, losing a bunch of work you did beforehand. Any configuration changes you make are saved: in that sense, they are &#039;sticky&#039;. If I create project A, then I add 2 layers to the project configuration, select a machine and 3 targets, all those options are saved to the project configuration. You don&#039;t need to add the 2 layers, select the machine and the 3 targets every time you want to run a build.&lt;br /&gt;
&lt;br /&gt;
[RAVI] I am wondering about the purpose of a project. In the design, project has a machine and owner attributes. If we define a project as a collection of builds for a machine, then we should not allow to change the machine after a project is created. Then, if a project is just a collection of builds for a particular machine, then we can modify the existing all builds view to group builds by machine. Based on this argument, I do not see a need for project and build hierarchy.&lt;br /&gt;
&lt;br /&gt;
[DAVID] My group understands that a &amp;quot;project&amp;quot; is a specific build directory. A project will most likely to have multiple builds, and things like the (a) machine, (b) layers, (c) conf variables, and so forth would be presumably set before the first target is selected and executed. It is also the case that the developer may decide to change any of those settings, including even the machine type, and then carry on with more builds. The use case would be for example is arch coverage testing of a particular set of kernel or user space packages.&lt;br /&gt;
&lt;br /&gt;
A host can then have multiple project directories (I most often work that way), for example when a developer truly wants to keep their development and/or debugging from not polluting other projects.&lt;br /&gt;
&lt;br /&gt;
Also, separate users should do their work in separate project directories, now that we are extending the model to cover that.&lt;br /&gt;
&lt;br /&gt;
There can then be multiple hosts, with all of their multiple projects, all channeling their Toaster data into a shared database. And with that you have a build farm.&lt;br /&gt;
&lt;br /&gt;
[RAVI] I see that the uniqueness of a project is the &amp;lt;hostname&amp;gt;://&amp;lt;build directory path&amp;gt;. The contents of the build directory can be changed and multiple builds can be kicked off from the same project with different configurations. If this the case, the project creation should also setup a build directory on the host.&lt;br /&gt;
&lt;br /&gt;
Looking at this use case, we should have toaster running on the host machine with a shared database. Or if we run a single toaster instance serving multiple projects (hosts and build directories), we should have a mechanism for the toaster machine to talk to the project machines. Am I missing something?&lt;br /&gt;
&lt;br /&gt;
[PAUL] Yes, but the project need not be tied to a specific host or location on disk. To my mind, the project is simply a configuration set - if you had a build farm the actual build could be run on any server within that farm and that side of it would be largely hidden from the user (until it needed to be visible, e.g. when you need to diagnose a host contamination issue.) This then means that the management of build directories can be independent, i.e. old build directories can be automatically deleted after a time period or when space runs low, but the project remains in the database for later use when needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] I am completely willing to accept the above definition of a &amp;quot;Toaster Project&amp;quot;. The part that convinces me is that (a) while under active build and development it does map to a physical location, but (b) it can hold the data and presumably the &amp;quot;snapshot&amp;quot; artifacts of a physical build directory long after that actual directory has been deleted. That last part is a highly desired feature from the Wind River team, and was also brought up as a specific question at my Toaster presentation at the Yocto Project Summit.&lt;br /&gt;
&lt;br /&gt;
This implies that given the abstract nature of a Toaster &amp;quot;Project&amp;quot;, it makes sense that not only can the developer share that &amp;quot;project&amp;quot; with another developer and Toaster instance (as per Belén design), but it makes sense that the original developer can make their own clones of that project when they for example want use as a reference basis for new projects with additional adjustments and/or for binding and running on a different host/directory.&lt;br /&gt;
&lt;br /&gt;
Here is what I would propose is the workflow.&lt;br /&gt;
&lt;br /&gt;
1) When a Toaster Project is created,&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;user&amp;quot; is the preset to the last &amp;quot;user&amp;quot;, else if this is the first time it is defaulted to $USER. This is a required field.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;email&amp;quot; is preset to the last email that matches &amp;quot;user&amp;quot;, else it is empty. QUESTION: Is this a required field?&lt;br /&gt;
&lt;br /&gt;
* The host:dir values are preset just as &amp;quot;poky/oe-init-build-env&amp;quot; would preset these values, in other words to the current machine and to &amp;quot;poky/../build&amp;quot; (unless redirected with the appropriate environment variables). If that directory (a) already exists and has a &amp;quot;conf/local.conf&amp;quot; file and (b) that directory exists for an existing Project, then that is an error. This would allow us to re-connect to a deleted or unregistered YP build directories.&lt;br /&gt;
&lt;br /&gt;
* We either have an explicit &amp;quot;Project Create&amp;quot; button, or we allow for the first build target command to insure that for new projects the project directory is created and the content preset by &amp;quot;poky/oe-init-build-env&amp;quot; before continuing.&lt;br /&gt;
&lt;br /&gt;
2) For external hosts mounted via NFS:&lt;br /&gt;
&lt;br /&gt;
* If an external host is mounted via a YP compatible NFS system, then that would be covered by the normal workflow above, using the local host and the respective NFS path. QUESTION: do we wish to identify the actual remove HOST ID in these circumstances, or just let the NFS path speak for itself?&lt;br /&gt;
&lt;br /&gt;
3) For fully external hosts&lt;br /&gt;
&lt;br /&gt;
This is the situation where a host remote to the Toaster, but is intended to be managed by this Toaster and use this Toaster&#039;s database.&lt;br /&gt;
&lt;br /&gt;
* This implies using some sort of rpc, probably via SSH, to execute the creation and build targets.&lt;br /&gt;
&lt;br /&gt;
* There would presumably be an installation of YP on that remote host, and that location would need to be known to Toaster. The installation could be as simple as an NFS mount that points to the local YP installation, which would provide a single source at the cost of NFS traffic.&lt;br /&gt;
&lt;br /&gt;
=== Hide builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option simply removes or hides selected builds from the Toaster display, for example builds quickly halted because the owner realized that they missed a setting. The database records and the project on the disk is untouched. This un-clutters the display, yet requires little programing (and development time).&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[BELEN] I have no strong feelings against this one, but we need to bear in mind that:&lt;br /&gt;
&lt;br /&gt;
* It will probably be hard to allow hiding in bulk, since the reasons why someone might want to hide a build could be wildly different. So this will have to be done on a build by build basis. &lt;br /&gt;
&lt;br /&gt;
* This also involves providing a way to reverse the hiding action, i.e. see hidden builds and show them again.&lt;br /&gt;
&lt;br /&gt;
[DAVID] In the Wind River version of Wiki, we have a &amp;quot;Manage&amp;quot; button at the bottom. This brings up a page of all of the entries, with the ability to change the entry&#039;s hidden and description attributes. This does allow a bulk update easily.&lt;br /&gt;
&lt;br /&gt;
I propose that we do the same, where a &amp;quot;Manage&amp;quot; button brings up all of the builds and/or projects, each highlighted according to if it is currently hidden, also each with a text entry for the description (see the next design proposal) and a check box to toggle the hidden state. &lt;br /&gt;
&lt;br /&gt;
We then need to decide if this meta date is stored in the database or in the page&#039;s cookie.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add a description to a build or project ===&lt;br /&gt;
&lt;br /&gt;
User&#039;s may not recall the difference and purpose of a given build or project, so it would be good for the Toaster interface to allow the user to add this and update this as needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] See the discussion above about &amp;quot;hidden&amp;quot; builds for a proposed implementation.&lt;br /&gt;
&lt;br /&gt;
=== Delete builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option is where a selected build and all its related database records are removed from the database. This removes the database overhead for this unwanted builds. The project on the disk is untouched. Since the database should be normalized, this operation should be clean and not interfere with other builds. I believe we have a command line version of this operation with Toaster-1.6.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[Alex] Technically, this is straightforward. In terms of policy access, we need to define one; I propose that only the project owner is allowed to delete builds. Impersonation is trivial right now, but once we implement authentication, bricks will fall in the right place in terms of access control.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add / remove layers ===&lt;br /&gt;
&lt;br /&gt;
Add and delete from the project layer directories. These layers may be within repositories or in plain directories on the disk.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] How would I upload my specialized device driver/library/system call handler/etc that necessarily needs to be part of&lt;br /&gt;
the build? Would this be done by importing a layer? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes. For the 1.7 release, all customisation must be done via layers.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Are you constraining &#039;import layer&#039; to a git repo path? Why not just a local directory that is not a git repo? In that case should we have a browse button as well as an edit box?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is a really good question. I need the technical crowd to establish what&#039;s possible / what we want to do. We can then design accordingly.&lt;br /&gt;
&lt;br /&gt;
[DAVID] It is the case that we recommend all of our customers to add their content via layers, and specifically layer directories since they are most likely to be under continual and direct change and would not be placed into a formal repo, or more likely they would be managed by their SCM system as is and certainly not packed into a base git clone.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify / set project owner / user ===&lt;br /&gt;
&lt;br /&gt;
A build farm manager (and their shared Toaster instance) may accept build sets from clients, in which case it is important to know who initiates and owns each specific build, for completion notifications and project space recycling.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] You presented the notion of a user - in the movie it was &#039;Belen&#039;. I think it may be necessary to formalize this&lt;br /&gt;
idea with a login screen and at least rudimentary permission and protection. Here is a use case: Imagine a vendor&lt;br /&gt;
deploys Toaster on a server which serves all of its customers. The customers are very diverse and are often competitors&lt;br /&gt;
of one another and do not want their configuration/information/ideas shared with other vendor customers.&lt;br /&gt;
&lt;br /&gt;
[BELEN] Very true: access control is a big deal and very important. However, we are not sure we can tackle this in the 1.7 release. That&#039;s why in the video I speak of &amp;quot;owners&amp;quot; instead of &amp;quot;users&amp;quot;. Our &amp;quot;owner&amp;quot; concept derives from the need to identify who created a certain project, but they are not really users since, for example, they don&#039;t involve authentication (there is no password). &lt;br /&gt;
&lt;br /&gt;
Here is a possible description of these &amp;quot;owners&amp;quot;. Each client accessing a Toaster instance might have an owner linked to it. You don&#039;t explicitly create these owners: you just set them in the process of creating your first project. Then, we remember them. Owners involve only 3 pieces of information: a name, an optional email address and the client they are associated with. You can change the details at any time. So &amp;quot;owners&amp;quot; don&#039;t involve access control: they just tell me who created (and therefore owns) a certain project. You can have the same owner details in several clients: I might have a laptop and a builds machine, I access the same Toaster instance from both, and I can use the same owner name and email address in both. &lt;br /&gt;
&lt;br /&gt;
The above opens some questions:&lt;br /&gt;
&lt;br /&gt;
* can others edit the configuration of a project I own?&lt;br /&gt;
* can others start builds against a project I own?&lt;br /&gt;
* can others download artifacts of a project I own?&lt;br /&gt;
* can others even see the projects I own?&lt;br /&gt;
&lt;br /&gt;
The simplest thing would be either: &lt;br /&gt;
&lt;br /&gt;
* &#039;yes&#039; to all of the above, but that means that people creating Toaster instances that can be accessed by more than one person have to be mindful of the fact that everything in them is open. &lt;br /&gt;
&lt;br /&gt;
* &#039;no&#039; to all of the above, and channel all collaboration through the export / import projects functionality, which is safer but also stifles co-operation.&lt;br /&gt;
&lt;br /&gt;
Just to clarify, ownership as above is established per project, not per build.&lt;br /&gt;
&lt;br /&gt;
[FARRELL] As much as I hate to suggest this...It may be necessary to introduce  the notion of group access - Owner/Group/Others ala unix/linux. I think it may be necessary for users to be able to share their results while excluding others. I can imagine a number of use cases.  Here is one:&lt;br /&gt;
&lt;br /&gt;
        Two customers/users, Fu and Bar, work for the same company C. Each wants to&lt;br /&gt;
        be able to have personal &#039;experimental&#039; builds but may need to share a &#039;production&#039;&lt;br /&gt;
        build - react to errors and download results, etc. Of course, company C doesn&#039;t want&lt;br /&gt;
        company B to see their results, configurations, custom drivers, etc. But, Fu needs to&lt;br /&gt;
        see and have access to some of Bar&#039;s results. These problems can be solved with the&lt;br /&gt;
        introduction of the group access.&lt;br /&gt;
&lt;br /&gt;
I realize this adds a layer of complexity which may be necessary. An alternative would be access control lists (acl). These can be even more flexible but a lot more complicated to implement, manage and maintain.&lt;br /&gt;
&lt;br /&gt;
I think we should decide on an access control model soon and work out an implementation. Even with the current implementation, retrofitting will be difficult and somewhat tedious which will become even more so as we add more features.&lt;br /&gt;
&lt;br /&gt;
[DAVID] The intermediate near term solution is to consider the 1.7 as working with only trusted users, in that they are all already within the same intranet. Under this limitation, if user Foo needs their work fully separate from user Bar, they could just have separate instances and databases of Toaster running, and use existing Linux security to accomplish this.&lt;br /&gt;
&lt;br /&gt;
That said, we could provide for the default build/project view to default to the current &amp;quot;owner&amp;quot;, where they would have to go out of their way to other people&#039;s work.&lt;br /&gt;
&lt;br /&gt;
We could also consider an &amp;quot;audit log&amp;quot; that captures project creation (and especially project deletion), so that at least you know if someone stomped on your stuff :-)&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am with David on this one: I think we can find temporary alternatives. It&#039;s not that I disagree with Farrell, mind: he is completely right that we will need this. Problem is: we need to be mindful of what we can deliver with the resources we have.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify build host and build directory ===&lt;br /&gt;
&lt;br /&gt;
To support distributed build hosts sharing a common Toaster database, there needs to be a way in the database to identify which host (IP address and or host name) and local directory the project was built in.&lt;br /&gt;
&lt;br /&gt;
=== Ability to download files (YP #6096) ===&lt;br /&gt;
&lt;br /&gt;
While developers would presumably have access to all build files within the intranet for the build logs and generated target image files, there are cases where that is not so. For example, the owner may be using a Windows host or a portable device to access Toaster, and may wish to download and view the error logs to determine their next course of action. Also, it may be the case that the specific build host is accessible only to the build farm manager and not the individual project owner, and having Toaster serve the file(s) would resolve this barrier.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] The ability to download the result of the build should be somewhere - maybe a column on the All Builds page?&lt;br /&gt;
&lt;br /&gt;
[DAVID] As for things like file downloads, between Ravi and myself I think we will find time to get that one done since we both really want it!&lt;br /&gt;
&lt;br /&gt;
[BELEN] Absolutely: in fact, this is something I might start designing straight away so that it can be implemented in 1.7M1. However, in order to do that, we need to reach agreement as to what a build artifact is:&lt;br /&gt;
&lt;br /&gt;
* Is it just the rootfs files? Or do they include&lt;br /&gt;
* the cooker and task logs?&lt;br /&gt;
* shared state objects used?&lt;br /&gt;
* recipe files / patches?&lt;br /&gt;
* [yours here]&lt;br /&gt;
&lt;br /&gt;
=== Share projects via configuration (export / import) ===&lt;br /&gt;
&lt;br /&gt;
This is the capture and sharing of the minimal project configuration data, such that a remote developer can replicate the same project against their own Yocto Project installation.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] The video ended at the export project discussion. Is export just sending email, the conf file (or files) to someone, or is there be more to it?&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am not sure what the answer is: we need input from Paul and Alex here. In my head, the project configuration (not the builds) is exported to some kind of file(s) that I can then share with others in whichever way I see fit (email, file sharing, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definition of a Project ===&lt;br /&gt;
&lt;br /&gt;
The proposed design adds the new concept of the &amp;quot;Project&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[PAUL] To my mind, the project is simply a configuration set - if you had a build farm the actual build could be run on any server within that farm and that side of it would be largely hidden from the user (until it needed to be visible, e.g. when you need to diagnose a host contamination issue.) This then means that the management of build directories can be independent, i.e. old build directories can be automatically deleted after a time period or when space runs low, but the project remains in the database for later use when needed.&lt;br /&gt;
&lt;br /&gt;
[DAVID] I am completely willing to accept your definition of a &amp;quot;Toaster Project&amp;quot;. The part that convinces me is that (a) while under active build and development it does map to a physical location, but (b) it can hold the data and presumably the &amp;quot;snapshot&amp;quot; artifacts of a physical build directory long after that actual directory has been deleted. That last part is a highly desired feature from the Wind River team, and was also brought up as a specific question at my Toaster presentation at the Yocto Project Summit.&lt;br /&gt;
&lt;br /&gt;
This implies that given the abstract nature of a Toaster &amp;quot;Project&amp;quot;, it makes sense that not only can the developer share that &amp;quot;project&amp;quot; with another developer and Toaster instance (as per Belén design), but it makes sense that the original developer can make their own clones of that project when they for example want use as a reference basis for new projects with additional adjustments and/or for binding and running on a different host/directory.&lt;br /&gt;
&lt;br /&gt;
===== Workflow around creating a Project =====&lt;br /&gt;
&lt;br /&gt;
[DAVID] Here is what I would propose as a workflow.&lt;br /&gt;
&lt;br /&gt;
1) When a Toaster Project is created, &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;user&amp;quot; is the preset to the last &amp;quot;user&amp;quot;, else if this is the first time it is defaulted to $USER. This is a required field.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;email&amp;quot; is preset to the last email that matches &amp;quot;user&amp;quot;, else it is empty. QUESTION: Is this a required field?&lt;br /&gt;
&lt;br /&gt;
* The host:dir values are preset just as &amp;quot;poky/oe-init-build-env&amp;quot; would preset these values, in other words to the current machine and to &amp;quot;poky/../build&amp;quot; (unless redirected with the appropriate environment variables). If that directory (a) already exists and has a &amp;quot;conf/local.conf&amp;quot; file and (b) that directory is already registered with an existing Project, then that is an error. This would provide some sanity check, but would also allow us to re-connect to an unregistered YP build directory (and/or ones previous registered with a subsequently deleted project).&lt;br /&gt;
&lt;br /&gt;
* We either have an explicit &amp;quot;Project Create&amp;quot; button, or we allow for the first build target command to insure that for new projects the project directory is created and the content preset by &amp;quot;poky/oe-init-build-env&amp;quot; before continuing.&lt;br /&gt;
&lt;br /&gt;
2) For external hosts mounted via NFS:&lt;br /&gt;
&lt;br /&gt;
* If an external host is mounted via a YP compatible NFS system, then that would be covered by the normal workflow above, using the local host and the respective NFS path. QUESTION: do we wish to identify the actual remove HOST ID in these circumstances, or just let the NFS path speak for itsel&lt;br /&gt;
&lt;br /&gt;
3) For fully external hosts&lt;br /&gt;
&lt;br /&gt;
This is the situation where a host remote to the Toaster, but is intended to be managed by this Toaster and use this Toaster&#039;s database.&lt;br /&gt;
&lt;br /&gt;
* This implies using some sort of rpc, probably via SSH, to execute the creation and build targets.&lt;br /&gt;
&lt;br /&gt;
* There would presumably be an installation of YP on that remote host, and that location would need to be known to Toaster. The installation could be as simple as an NFS mount that points to the local YP installation, which would provide a single source at the cost of NFS traffic.&lt;br /&gt;
&lt;br /&gt;
== Toaster System Architectures ==&lt;br /&gt;
&lt;br /&gt;
This is an iteration of the possible supported system architectures of a Toaster implementation. We should validate how the proposed design would work with each of these options.&lt;br /&gt;
&lt;br /&gt;
=== Minimal Local Project Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Local host, local project, database in project, toaster and web server started from project&lt;br /&gt;
&lt;br /&gt;
This is the default implementation, using the &amp;quot;source toaster [start|stop]&amp;quot; support.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Local Project Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Local host, Multiple local projects, shared local database, toaster and web server started separately&lt;br /&gt;
&lt;br /&gt;
This is currently supported by (a) edits to the local.conf file to point to the shared database location, and (b) using special commands to start the shared Toaster and webserver instance.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Distributed Host Implementation ===&lt;br /&gt;
&lt;br /&gt;
Configuration: Multiple hosts, Multiple local projects per host, shared network database, toaster and web server started with network database instance&lt;br /&gt;
&lt;br /&gt;
Each host would either have its own installation of YP, or have a centralized copy shared over NFS. This implementation is currently not yet documented nor supported.&lt;br /&gt;
&lt;br /&gt;
== Open Bugzilla features / defects ==&lt;br /&gt;
&lt;br /&gt;
[http://wiki.yoctoproject.org/wiki/Bugzilla_feature_list This is what&#039;s open in Bugzilla right now]. Apart from what&#039;s already assigned to 1.6.1, there are 2 issues that I am keen on getting fixed:&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187] - Same cooker log file name used for several builds &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=6095 6095] - Retrieve full build information independently of task execution&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this list.&lt;br /&gt;
&lt;br /&gt;
== Future features ==&lt;br /&gt;
&lt;br /&gt;
A list of features that have come up in discussion, but not for the 1.7 release.&lt;br /&gt;
&lt;br /&gt;
===  Delete projects ===&lt;br /&gt;
 &lt;br /&gt;
This option deletes the project all the way down to the project&#039;s instance on the disk. This should be a safe operation unless a separate project is directly sharing its sstate cache. That would be an recommended usage, where a proper usage would a standalone shared sstate cache. There may be artifacts in that shared sstate cache that are specific and unique to the deleted project, but it is out of scope for this option to try to delete those as well.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add/remove recipes ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove recipes from the project&#039;s configuration.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to import source (tarballs, repos) ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to bring external sources into the project and include them with wrapper recipes.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to add/remove packages from image ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove specific binary packages from the respective image(s) of a project.&lt;br /&gt;
&lt;br /&gt;
===  Share projects via Copy (all but &amp;quot;./tmp&amp;quot;) ===&lt;br /&gt;
 &lt;br /&gt;
Project directories (all except for their local &amp;quot;tmp&amp;quot; directory) should be portable between hosts, where the receiving developer needs only to adjust the local.conf file for the local installation and sstate directories.&lt;br /&gt;
&lt;br /&gt;
=== Ability to get notification of build status ===&lt;br /&gt;
 &lt;br /&gt;
Since builds can take a long time, it would be very useful to get for example email notification when a build stops, either with success or with failure, rather than needing to continually and manually poll the Toaster interface.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] I agree, but can we generalize this post-build processing to enable post-build script execution triggered by either success, failure, or either?  We could provide a few parameterized scripts to, for example:&lt;br /&gt;
&lt;br /&gt;
* send email to a user or list with build status,&lt;br /&gt;
* (on success) start an emulation session with regression tests on a build,&lt;br /&gt;
* (on success) download the built file system or SDK to a user&#039;s host or target,&lt;br /&gt;
* provide hooks for the user to substitute their alternative post-build triggers.&lt;br /&gt;
&lt;br /&gt;
=== Ability to access Toaster from portable device ===&lt;br /&gt;
 &lt;br /&gt;
Since builds generally take a long time, the user may be away from their desk (or even work hours) and wish to track the status of their pending builds. Supporting a basic Toaster interface for such limited devices would be advantageous.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to compare projects/builds ===&lt;br /&gt;
&lt;br /&gt;
A user may not recall the difference between one build and another, or one project and another. The data is in the database, so it would not be hard to generate a report itemizing the observed differences. Here are some the potential changes that can be extracted:&lt;br /&gt;
&lt;br /&gt;
* Changed variable definitions (less base path differences). This would also cover changes in things like the machine, layers, extra added or excluded recipes, and multi-lib support.&lt;br /&gt;
* Changes in the included packages list&lt;br /&gt;
* Perhaps changes in the build/caching statistics&lt;br /&gt;
&lt;br /&gt;
=== Snapshots of builds for long term archiving (project dir lifecycle) ===&lt;br /&gt;
 &lt;br /&gt;
A build manager may wish to keep the pertinent facts of builds for an extended period of time. This could be for a few days to allow time for the build&#039;s owner to reconcile the results, or if maybe over a year for tracking long-term trends and regressions. In each case, there should be a way to capture a minimal set of information from the build directory (e.g. the conf files and any build failure logs) and preserve it so that together with the database there is enough information to study that project even when the full build directory is removed and recycled.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12512</id>
		<title>Toaster 1.7 design</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12512"/>
		<updated>2014-04-16T17:50:30Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Delete builds from a project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== A couple of videos to kick off things ==&lt;br /&gt;
&lt;br /&gt;
The following videos illustrate some of the features we are thinking of adding to Toaster during the 1.7 release cycle. When watching them, keep in mind that this is all very rough: more like sketches to help us start a conversation about scope than proper designs. Chances are the final designs will be completely different.&lt;br /&gt;
&lt;br /&gt;
About projects - [[media:Building-1.7.mov]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Starting a build - [[media:How-to-build.mov]]&lt;br /&gt;
&lt;br /&gt;
== Feature list ==&lt;br /&gt;
&lt;br /&gt;
=== Ability to create new projects ===&lt;br /&gt;
&lt;br /&gt;
This is the ability to use the Toaster interface to create new project directories, manage the content, and initiate the builds of selectable target images.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] What is a typical workflow that gets to the build project part?  I see the configure screens but not the actualy build launch.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Does clicking &#039;new build&#039; fire off a build?  If so, which configuration is built?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Heh, I completely forgot to show that in the first video. [http://wiki.yoctoproject.org/wiki/images/b/b1/How-to-build.mov Here is part 2] showing how to start a build and answering (I hope) both questions.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can projects be configured, primed for builds, but not built? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Will the user be able to configure several builds, then queue them all to build?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Users might create more than one project then start a build for each of them by clicking the &amp;quot;build&amp;quot; button in each project page, but nothing more sophisticated than that for the time being. Here is where things can get tricky. Where does Toaster stop and something like Buildbot or Jenkins start? My take is that we want to work alongside and enhance build automation systems, not replace them. &lt;br /&gt;
&lt;br /&gt;
[DAVE] What is the size of the build variable list?  It&#039;s hard to figure from the conf/local.conf file.  If it is a small list, like 10, should we provide better and variable specific UI widgets rather than just edit boxes, depending on the variable&#039;s &amp;quot;type&amp;quot; (eg browse button with any path variable like SSTATE_DIR)?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is one of the questions we should start working on straight away. In informal chats we have spoken about a split between &amp;quot;build variables&amp;quot; (the ones that affect the build and therefore you can edit via Toaster) and &amp;quot;infrastructure variables&amp;quot; (to call them something, that affect the build infrastructure and you cannot edit via Toaster. Things like PARALLEL_MAKE for example). We should start getting into details about that split as soon as possible, and determine which variables we are going to expose via Toaster to be edited. Once again, Paul&#039;s feedback here would be good (RP&#039;s probably as well).&lt;br /&gt;
&lt;br /&gt;
Regarding variable &amp;quot;types&amp;quot;, I had a brief conversation with RP recently about this issue. It is unlikely that the meta data will provide us with information about the type of input expected by a variable. If and how the Toaster interface should fill that gap is up for discussion. From my perspective, we should do as much as we can to help users assign valid values to their variables.&lt;br /&gt;
&lt;br /&gt;
[DAVE] I don&#039;t recall a user entry on your videos that specify the project directory for the build. This must be part of the initial release. I don&#039;t recommend making it an edited data file option, eg not via in settings.py.  &lt;br /&gt;
&lt;br /&gt;
[BELEN] When you run Toaster locally you can configure the location of your build directory as you wish, but when Toaster is running remotely, do we want to let people select the location of their build directory?&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can we make any selection on any page &#039;stick&#039; with cookies or &#039;unstick&#039; with a &#039;reset to defaults&#039; button, in addition to propagating laborious configuration setups inputs via &#039;clone configuration&#039;?&lt;br /&gt;
&lt;br /&gt;
[BELEN] We will need to overcome my personal hate of &#039;reset to defaults&#039; options :) They are very dangerous if we don&#039;t provide an &#039;undo&#039; option as well: they might wipe your configuration and revert it to the rather useless default one, losing a bunch of work you did beforehand. Any configuration changes you make are saved: in that sense, they are &#039;sticky&#039;. If I create project A, then I add 2 layers to the project configuration, select a machine and 3 targets, all those options are saved to the project configuration. You don&#039;t need to add the 2 layers, select the machine and the 3 targets every time you want to run a build.&lt;br /&gt;
&lt;br /&gt;
=== Hide builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option simply removes or hides selected builds from the Toaster display, for example builds quickly halted because the owner realized that they missed a setting. The database records and the project on the disk is untouched. This un-clutters the display, yet requires little programing (and development time).&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[BELEN] I have no strong feelings against this one, but we need to bear in mind that:&lt;br /&gt;
&lt;br /&gt;
* It will probably be hard to allow hiding in bulk, since the reasons why someone might want to hide a build could be wildly different. So this will have to be done on a build by build basis. &lt;br /&gt;
&lt;br /&gt;
* This also involves providing a way to reverse the hiding action, i.e. see hidden builds and show them again.&lt;br /&gt;
&lt;br /&gt;
=== Delete builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option is where a selected build and all its related database records are removed from the database. This removes the database overhead for this unwanted builds. The project on the disk is untouched. Since the database should be normalized, this operation should be clean and not interfere with other builds. I believe we have a command line version of this operation with Toaster-1.6.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[Alex] Technically, this is straightforward. In terms of policy access, we need to define one; I propose that only the project owner is allowed to delete builds. Impersonation is trivial right now, but once we implement authentication, bricks will fall in the right place in terms of access control.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add / remove layers ===&lt;br /&gt;
&lt;br /&gt;
Add and delete from the project layer directories. These layers may be within repositories or in plain directories on the disk.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] How would I upload my specialized device driver/library/system call handler/etc that necessarily needs to be part of&lt;br /&gt;
the build? Would this be done by importing a layer? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes. For the 1.7 release, all customisation must be done via layers.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Are you constraining &#039;import layer&#039; to a git repo path? Why not just a local directory that is not a git repo? In that case should we have a browse button as well as an edit box?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is a really good question. I need the technical crowd to establish what&#039;s possible / what we want to do. We can then design accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify / set project owner / user ===&lt;br /&gt;
&lt;br /&gt;
A build farm manager (and their shared Toaster instance) may accept build sets from clients, in which case it is important to know who initiates and owns each specific build, for completion notifications and project space recycling.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] You presented the notion of a user - in the movie it was &#039;Belen&#039;. I think it may be necessary to formalize this&lt;br /&gt;
idea with a login screen and at least rudimentary permission and protection. Here is a use case: Imagine a vendor&lt;br /&gt;
deploys Toaster on a server which serves all of its customers. The customers are very diverse and are often competitors&lt;br /&gt;
of one another and do not want their configuration/information/ideas shared with other vendor customers.&lt;br /&gt;
&lt;br /&gt;
[BELEN] Very true: access control is a big deal and very important. However, we are not sure we can tackle this in the 1.7 release. That&#039;s why in the video I speak of &amp;quot;owners&amp;quot; instead of &amp;quot;users&amp;quot;. Our &amp;quot;owner&amp;quot; concept derives from the need to identify who created a certain project, but they are not really users since, for example, they don&#039;t involve authentication (there is no password). &lt;br /&gt;
&lt;br /&gt;
Here is a possible description of these &amp;quot;owners&amp;quot;. Each client accessing a Toaster instance might have an owner linked to it. You don&#039;t explicitly create these owners: you just set them in the process of creating your first project. Then, we remember them. Owners involve only 3 pieces of information: a name, an optional email address and the client they are associated with. You can change the details at any time. So &amp;quot;owners&amp;quot; don&#039;t involve access control: they just tell me who created (and therefore owns) a certain project. You can have the same owner details in several clients: I might have a laptop and a builds machine, I access the same Toaster instance from both, and I can use the same owner name and email address in both. &lt;br /&gt;
&lt;br /&gt;
The above opens some questions:&lt;br /&gt;
&lt;br /&gt;
* can others edit the configuration of a project I own?&lt;br /&gt;
* can others start builds against a project I own?&lt;br /&gt;
* can others download artifacts of a project I own?&lt;br /&gt;
* can others even see the projects I own?&lt;br /&gt;
&lt;br /&gt;
The simplest thing would be either: &lt;br /&gt;
&lt;br /&gt;
* &#039;yes&#039; to all of the above, but that means that people creating Toaster instances that can be accessed by more than one person have to be mindful of the fact that everything in them is open. &lt;br /&gt;
&lt;br /&gt;
* &#039;no&#039; to all of the above, and channel all collaboration through the export / import projects functionality, which is safer but also stifles co-operation.&lt;br /&gt;
&lt;br /&gt;
Just to clarify, ownership as above is established per project, not per build.&lt;br /&gt;
&lt;br /&gt;
[FARRELL] As much as I hate to suggest this...It may be necessary to introduce  the notion of group access - Owner/Group/Others ala unix/linux. I think it may be necessary for users to be able to share their results while excluding others. I can imagine a number of use cases.  Here is one:&lt;br /&gt;
&lt;br /&gt;
        Two customers/users, Fu and Bar, work for the same company C. Each wants to&lt;br /&gt;
        be able to have personal &#039;experimental&#039; builds but may need to share a &#039;production&#039;&lt;br /&gt;
        build - react to errors and download results, etc. Of course, company C doesn&#039;t want&lt;br /&gt;
        company B to see their results, configurations, custom drivers, etc. But, Fu needs to&lt;br /&gt;
        see and have access to some of Bar&#039;s results. These problems can be solved with the&lt;br /&gt;
        introduction of the group access.&lt;br /&gt;
&lt;br /&gt;
I realize this adds a layer of complexity which may be necessary. An alternative would be access control lists (acl). These can be even more flexible but a lot more complicated to implement, manage and maintain.&lt;br /&gt;
&lt;br /&gt;
I think we should decide on an access control model soon and work out an implementation. Even with the current implementation, retrofitting will be difficult and somewhat tedious which will become even more so as we add more features.&lt;br /&gt;
&lt;br /&gt;
[DAVID] The intermediate near term solution is to consider the 1.7 as working with only trusted users, in that they are all already within the same intranet. Under this limitation, if user Foo needs their work fully separate from user Bar, they could just have separate instances and databases of Toaster running, and use existing Linux security to accomplish this.&lt;br /&gt;
&lt;br /&gt;
That said, we could provide for the default build/project view to default to the current &amp;quot;owner&amp;quot;, where they would have to go out of their way to other people&#039;s work.&lt;br /&gt;
&lt;br /&gt;
We could also consider an &amp;quot;audit log&amp;quot; that captures project creation (and especially project deletion), so that at least you know if someone stomped on your stuff :-)&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am with David on this one: I think we can find temporary alternatives. It&#039;s not that I disagree with Farrell, mind: he is completely right that we will need this. Problem is: we need to be mindful of what we can deliver with the resources we have.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify build host and build directory ===&lt;br /&gt;
&lt;br /&gt;
To support distributed build hosts sharing a common Toaster database, there needs to be a way in the database to identify which host (IP address and or host name) and local directory the project was built in.&lt;br /&gt;
&lt;br /&gt;
=== Ability to download files (YP #6096) ===&lt;br /&gt;
&lt;br /&gt;
While developers would presumably have access to all build files within the intranet for the build logs and generated target image files, there are cases where that is not so. For example, the owner may be using a Windows host or a portable device to access Toaster, and may wish to download and view the error logs to determine their next course of action. Also, it may be the case that the specific build host is accessible only to the build farm manager and not the individual project owner, and having Toaster serve the file(s) would resolve this barrier.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] The ability to download the result of the build should be somewhere - maybe a column on the All Builds page?&lt;br /&gt;
&lt;br /&gt;
[DAVID] As for things like file downloads, between Ravi and myself I think we will find time to get that one done since we both really want it!&lt;br /&gt;
&lt;br /&gt;
[BELEN] Absolutely: in fact, this is something I might start designing straight away so that it can be implemented in 1.7M1. However, in order to do that, we need to reach agreement as to what a build artifact is:&lt;br /&gt;
&lt;br /&gt;
* Is it just the rootfs files? Or do they include&lt;br /&gt;
* the cooker and task logs?&lt;br /&gt;
* shared state objects used?&lt;br /&gt;
* recipe files / patches?&lt;br /&gt;
* [yours here]&lt;br /&gt;
&lt;br /&gt;
=== Share projects via configuration (export / import) ===&lt;br /&gt;
&lt;br /&gt;
This is the capture and sharing of the minimal project configuration data, such that a remote developer can replicate the same project against their own Yocto Project installation.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] The video ended at the export project discussion. Is export just sending email, the conf file (or files) to someone, or is there be more to it?&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am not sure what the answer is: we need input from Paul and Alex here. In my head, the project configuration (not the builds) is exported to some kind of file(s) that I can then share with others in whichever way I see fit (email, file sharing, etc).&lt;br /&gt;
&lt;br /&gt;
== Open Bugzilla features / defects ==&lt;br /&gt;
&lt;br /&gt;
[http://wiki.yoctoproject.org/wiki/Bugzilla_feature_list This is what&#039;s open in Bugzilla right now]. Apart from what&#039;s already assigned to 1.6.1, there are 2 issues that I am keen on getting fixed:&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187] - Same cooker log file name used for several builds &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=6095 6095] - Retrieve full build information independently of task execution&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this list.&lt;br /&gt;
&lt;br /&gt;
== Future features ==&lt;br /&gt;
&lt;br /&gt;
A list of features that have come up in discussion, but not for the 1.7 release.&lt;br /&gt;
&lt;br /&gt;
===  Delete projects ===&lt;br /&gt;
 &lt;br /&gt;
This option deletes the project all the way down to the project&#039;s instance on the disk. This should be a safe operation unless a separate project is directly sharing its sstate cache. That would be an recommended usage, where a proper usage would a standalone shared sstate cache. There may be artifacts in that shared sstate cache that are specific and unique to the deleted project, but it is out of scope for this option to try to delete those as well.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add/remove recipes ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove recipes from the project&#039;s configuration.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to import source (tarballs, repos) ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to bring external sources into the project and include them with wrapper recipes.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to add/remove packages from image ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove specific binary packages from the respective image(s) of a project.&lt;br /&gt;
&lt;br /&gt;
===  Share projects via Copy (all but &amp;quot;./tmp&amp;quot;) ===&lt;br /&gt;
 &lt;br /&gt;
Project directories (all except for their local &amp;quot;tmp&amp;quot; directory) should be portable between hosts, where the receiving developer needs only to adjust the local.conf file for the local installation and sstate directories.&lt;br /&gt;
&lt;br /&gt;
=== Ability to get notification of build status ===&lt;br /&gt;
 &lt;br /&gt;
Since builds can take a long time, it would be very useful to get for example email notification when a build stops, either with success or with failure, rather than needing to continually and manually poll the Toaster interface.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] I agree, but can we generalize this post-build processing to enable post-build script execution triggered by either success, failure, or either?  We could provide a few parameterized scripts to, for example:&lt;br /&gt;
&lt;br /&gt;
* send email to a user or list with build status,&lt;br /&gt;
* (on success) start an emulation session with regression tests on a build,&lt;br /&gt;
* (on success) download the built file system or SDK to a user&#039;s host or target,&lt;br /&gt;
* provide hooks for the user to substitute their alternative post-build triggers.&lt;br /&gt;
&lt;br /&gt;
=== Ability to access Toaster from portable device ===&lt;br /&gt;
 &lt;br /&gt;
Since builds generally take a long time, the user may be away from their desk (or even work hours) and wish to track the status of their pending builds. Supporting a basic Toaster interface for such limited devices would be advantageous.&lt;br /&gt;
 &lt;br /&gt;
=== Snapshots of builds for long term archiving (project dir lifecycle) ===&lt;br /&gt;
 &lt;br /&gt;
A build manager may wish to keep the pertinent facts of builds for an extended period of time. This could be for a few days to allow time for the build&#039;s owner to reconcile the results, or if maybe over a year for tracking long-term trends and regressions. In each case, there should be a way to capture a minimal set of information from the build directory (e.g. the conf files and any build failure logs) and preserve it so that together with the database there is enough information to study that project even when the full build directory is removed and recycled.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12511</id>
		<title>Toaster 1.7 design</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Toaster_1.7_design&amp;diff=12511"/>
		<updated>2014-04-16T17:48:56Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: /* Delete builds from a project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== A couple of videos to kick off things ==&lt;br /&gt;
&lt;br /&gt;
The following videos illustrate some of the features we are thinking of adding to Toaster during the 1.7 release cycle. When watching them, keep in mind that this is all very rough: more like sketches to help us start a conversation about scope than proper designs. Chances are the final designs will be completely different.&lt;br /&gt;
&lt;br /&gt;
About projects - [[media:Building-1.7.mov]] &amp;lt;br /&amp;gt;&lt;br /&gt;
Starting a build - [[media:How-to-build.mov]]&lt;br /&gt;
&lt;br /&gt;
== Feature list ==&lt;br /&gt;
&lt;br /&gt;
=== Ability to create new projects ===&lt;br /&gt;
&lt;br /&gt;
This is the ability to use the Toaster interface to create new project directories, manage the content, and initiate the builds of selectable target images.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] What is a typical workflow that gets to the build project part?  I see the configure screens but not the actualy build launch.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Does clicking &#039;new build&#039; fire off a build?  If so, which configuration is built?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Heh, I completely forgot to show that in the first video. [http://wiki.yoctoproject.org/wiki/images/b/b1/How-to-build.mov Here is part 2] showing how to start a build and answering (I hope) both questions.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can projects be configured, primed for builds, but not built? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Will the user be able to configure several builds, then queue them all to build?&lt;br /&gt;
&lt;br /&gt;
[BELEN] Users might create more than one project then start a build for each of them by clicking the &amp;quot;build&amp;quot; button in each project page, but nothing more sophisticated than that for the time being. Here is where things can get tricky. Where does Toaster stop and something like Buildbot or Jenkins start? My take is that we want to work alongside and enhance build automation systems, not replace them. &lt;br /&gt;
&lt;br /&gt;
[DAVE] What is the size of the build variable list?  It&#039;s hard to figure from the conf/local.conf file.  If it is a small list, like 10, should we provide better and variable specific UI widgets rather than just edit boxes, depending on the variable&#039;s &amp;quot;type&amp;quot; (eg browse button with any path variable like SSTATE_DIR)?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is one of the questions we should start working on straight away. In informal chats we have spoken about a split between &amp;quot;build variables&amp;quot; (the ones that affect the build and therefore you can edit via Toaster) and &amp;quot;infrastructure variables&amp;quot; (to call them something, that affect the build infrastructure and you cannot edit via Toaster. Things like PARALLEL_MAKE for example). We should start getting into details about that split as soon as possible, and determine which variables we are going to expose via Toaster to be edited. Once again, Paul&#039;s feedback here would be good (RP&#039;s probably as well).&lt;br /&gt;
&lt;br /&gt;
Regarding variable &amp;quot;types&amp;quot;, I had a brief conversation with RP recently about this issue. It is unlikely that the meta data will provide us with information about the type of input expected by a variable. If and how the Toaster interface should fill that gap is up for discussion. From my perspective, we should do as much as we can to help users assign valid values to their variables.&lt;br /&gt;
&lt;br /&gt;
[DAVE] I don&#039;t recall a user entry on your videos that specify the project directory for the build. This must be part of the initial release. I don&#039;t recommend making it an edited data file option, eg not via in settings.py.  &lt;br /&gt;
&lt;br /&gt;
[BELEN] When you run Toaster locally you can configure the location of your build directory as you wish, but when Toaster is running remotely, do we want to let people select the location of their build directory?&lt;br /&gt;
&lt;br /&gt;
[DAVE] Can we make any selection on any page &#039;stick&#039; with cookies or &#039;unstick&#039; with a &#039;reset to defaults&#039; button, in addition to propagating laborious configuration setups inputs via &#039;clone configuration&#039;?&lt;br /&gt;
&lt;br /&gt;
[BELEN] We will need to overcome my personal hate of &#039;reset to defaults&#039; options :) They are very dangerous if we don&#039;t provide an &#039;undo&#039; option as well: they might wipe your configuration and revert it to the rather useless default one, losing a bunch of work you did beforehand. Any configuration changes you make are saved: in that sense, they are &#039;sticky&#039;. If I create project A, then I add 2 layers to the project configuration, select a machine and 3 targets, all those options are saved to the project configuration. You don&#039;t need to add the 2 layers, select the machine and the 3 targets every time you want to run a build.&lt;br /&gt;
&lt;br /&gt;
=== Hide builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option simply removes or hides selected builds from the Toaster display, for example builds quickly halted because the owner realized that they missed a setting. The database records and the project on the disk is untouched. This un-clutters the display, yet requires little programing (and development time).&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[BELEN] I have no strong feelings against this one, but we need to bear in mind that:&lt;br /&gt;
&lt;br /&gt;
* It will probably be hard to allow hiding in bulk, since the reasons why someone might want to hide a build could be wildly different. So this will have to be done on a build by build basis. &lt;br /&gt;
&lt;br /&gt;
* This also involves providing a way to reverse the hiding action, i.e. see hidden builds and show them again.&lt;br /&gt;
&lt;br /&gt;
=== Delete builds from a project ===&lt;br /&gt;
&lt;br /&gt;
This option is where a selected build and all its related database records are removed from the database. This removes the database overhead for this unwanted builds. The project on the disk is untouched. Since the database should be normalized, this operation should be clean and not interfere with other builds. I believe we have a command line version of this operation with Toaster-1.6.&lt;br /&gt;
&lt;br /&gt;
[Alex] Technically, this is straightforward. In terms of policy access, we need to define one; I propose that only the project owner is allowed to delete builds. Impersonation is trivial right now, but once we implement authentication, bricks will fall in the right place in terms of access control.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add / remove layers ===&lt;br /&gt;
&lt;br /&gt;
Add and delete from the project layer directories. These layers may be within repositories or in plain directories on the disk.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] How would I upload my specialized device driver/library/system call handler/etc that necessarily needs to be part of&lt;br /&gt;
the build? Would this be done by importing a layer? &lt;br /&gt;
&lt;br /&gt;
[BELEN] Yes. For the 1.7 release, all customisation must be done via layers.&lt;br /&gt;
&lt;br /&gt;
[DAVE] Are you constraining &#039;import layer&#039; to a git repo path? Why not just a local directory that is not a git repo? In that case should we have a browse button as well as an edit box?&lt;br /&gt;
&lt;br /&gt;
[BELEN] This is a really good question. I need the technical crowd to establish what&#039;s possible / what we want to do. We can then design accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify / set project owner / user ===&lt;br /&gt;
&lt;br /&gt;
A build farm manager (and their shared Toaster instance) may accept build sets from clients, in which case it is important to know who initiates and owns each specific build, for completion notifications and project space recycling.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] You presented the notion of a user - in the movie it was &#039;Belen&#039;. I think it may be necessary to formalize this&lt;br /&gt;
idea with a login screen and at least rudimentary permission and protection. Here is a use case: Imagine a vendor&lt;br /&gt;
deploys Toaster on a server which serves all of its customers. The customers are very diverse and are often competitors&lt;br /&gt;
of one another and do not want their configuration/information/ideas shared with other vendor customers.&lt;br /&gt;
&lt;br /&gt;
[BELEN] Very true: access control is a big deal and very important. However, we are not sure we can tackle this in the 1.7 release. That&#039;s why in the video I speak of &amp;quot;owners&amp;quot; instead of &amp;quot;users&amp;quot;. Our &amp;quot;owner&amp;quot; concept derives from the need to identify who created a certain project, but they are not really users since, for example, they don&#039;t involve authentication (there is no password). &lt;br /&gt;
&lt;br /&gt;
Here is a possible description of these &amp;quot;owners&amp;quot;. Each client accessing a Toaster instance might have an owner linked to it. You don&#039;t explicitly create these owners: you just set them in the process of creating your first project. Then, we remember them. Owners involve only 3 pieces of information: a name, an optional email address and the client they are associated with. You can change the details at any time. So &amp;quot;owners&amp;quot; don&#039;t involve access control: they just tell me who created (and therefore owns) a certain project. You can have the same owner details in several clients: I might have a laptop and a builds machine, I access the same Toaster instance from both, and I can use the same owner name and email address in both. &lt;br /&gt;
&lt;br /&gt;
The above opens some questions:&lt;br /&gt;
&lt;br /&gt;
* can others edit the configuration of a project I own?&lt;br /&gt;
* can others start builds against a project I own?&lt;br /&gt;
* can others download artifacts of a project I own?&lt;br /&gt;
* can others even see the projects I own?&lt;br /&gt;
&lt;br /&gt;
The simplest thing would be either: &lt;br /&gt;
&lt;br /&gt;
* &#039;yes&#039; to all of the above, but that means that people creating Toaster instances that can be accessed by more than one person have to be mindful of the fact that everything in them is open. &lt;br /&gt;
&lt;br /&gt;
* &#039;no&#039; to all of the above, and channel all collaboration through the export / import projects functionality, which is safer but also stifles co-operation.&lt;br /&gt;
&lt;br /&gt;
Just to clarify, ownership as above is established per project, not per build.&lt;br /&gt;
&lt;br /&gt;
[FARRELL] As much as I hate to suggest this...It may be necessary to introduce  the notion of group access - Owner/Group/Others ala unix/linux. I think it may be necessary for users to be able to share their results while excluding others. I can imagine a number of use cases.  Here is one:&lt;br /&gt;
&lt;br /&gt;
        Two customers/users, Fu and Bar, work for the same company C. Each wants to&lt;br /&gt;
        be able to have personal &#039;experimental&#039; builds but may need to share a &#039;production&#039;&lt;br /&gt;
        build - react to errors and download results, etc. Of course, company C doesn&#039;t want&lt;br /&gt;
        company B to see their results, configurations, custom drivers, etc. But, Fu needs to&lt;br /&gt;
        see and have access to some of Bar&#039;s results. These problems can be solved with the&lt;br /&gt;
        introduction of the group access.&lt;br /&gt;
&lt;br /&gt;
I realize this adds a layer of complexity which may be necessary. An alternative would be access control lists (acl). These can be even more flexible but a lot more complicated to implement, manage and maintain.&lt;br /&gt;
&lt;br /&gt;
I think we should decide on an access control model soon and work out an implementation. Even with the current implementation, retrofitting will be difficult and somewhat tedious which will become even more so as we add more features.&lt;br /&gt;
&lt;br /&gt;
[DAVID] The intermediate near term solution is to consider the 1.7 as working with only trusted users, in that they are all already within the same intranet. Under this limitation, if user Foo needs their work fully separate from user Bar, they could just have separate instances and databases of Toaster running, and use existing Linux security to accomplish this.&lt;br /&gt;
&lt;br /&gt;
That said, we could provide for the default build/project view to default to the current &amp;quot;owner&amp;quot;, where they would have to go out of their way to other people&#039;s work.&lt;br /&gt;
&lt;br /&gt;
We could also consider an &amp;quot;audit log&amp;quot; that captures project creation (and especially project deletion), so that at least you know if someone stomped on your stuff :-)&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am with David on this one: I think we can find temporary alternatives. It&#039;s not that I disagree with Farrell, mind: he is completely right that we will need this. Problem is: we need to be mindful of what we can deliver with the resources we have.&lt;br /&gt;
&lt;br /&gt;
=== Ability to identify build host and build directory ===&lt;br /&gt;
&lt;br /&gt;
To support distributed build hosts sharing a common Toaster database, there needs to be a way in the database to identify which host (IP address and or host name) and local directory the project was built in.&lt;br /&gt;
&lt;br /&gt;
=== Ability to download files (YP #6096) ===&lt;br /&gt;
&lt;br /&gt;
While developers would presumably have access to all build files within the intranet for the build logs and generated target image files, there are cases where that is not so. For example, the owner may be using a Windows host or a portable device to access Toaster, and may wish to download and view the error logs to determine their next course of action. Also, it may be the case that the specific build host is accessible only to the build farm manager and not the individual project owner, and having Toaster serve the file(s) would resolve this barrier.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[FARRELL] The ability to download the result of the build should be somewhere - maybe a column on the All Builds page?&lt;br /&gt;
&lt;br /&gt;
[DAVID] As for things like file downloads, between Ravi and myself I think we will find time to get that one done since we both really want it!&lt;br /&gt;
&lt;br /&gt;
[BELEN] Absolutely: in fact, this is something I might start designing straight away so that it can be implemented in 1.7M1. However, in order to do that, we need to reach agreement as to what a build artifact is:&lt;br /&gt;
&lt;br /&gt;
* Is it just the rootfs files? Or do they include&lt;br /&gt;
* the cooker and task logs?&lt;br /&gt;
* shared state objects used?&lt;br /&gt;
* recipe files / patches?&lt;br /&gt;
* [yours here]&lt;br /&gt;
&lt;br /&gt;
=== Share projects via configuration (export / import) ===&lt;br /&gt;
&lt;br /&gt;
This is the capture and sharing of the minimal project configuration data, such that a remote developer can replicate the same project against their own Yocto Project installation.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] The video ended at the export project discussion. Is export just sending email, the conf file (or files) to someone, or is there be more to it?&lt;br /&gt;
&lt;br /&gt;
[BELEN] I am not sure what the answer is: we need input from Paul and Alex here. In my head, the project configuration (not the builds) is exported to some kind of file(s) that I can then share with others in whichever way I see fit (email, file sharing, etc).&lt;br /&gt;
&lt;br /&gt;
== Open Bugzilla features / defects ==&lt;br /&gt;
&lt;br /&gt;
[http://wiki.yoctoproject.org/wiki/Bugzilla_feature_list This is what&#039;s open in Bugzilla right now]. Apart from what&#039;s already assigned to 1.6.1, there are 2 issues that I am keen on getting fixed:&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187] - Same cooker log file name used for several builds &amp;lt;br /&amp;gt;&lt;br /&gt;
[https://bugzilla.yoctoproject.org/show_bug.cgi?id=6095 6095] - Retrieve full build information independently of task execution&lt;br /&gt;
&lt;br /&gt;
Feel free to add to this list.&lt;br /&gt;
&lt;br /&gt;
== Future features ==&lt;br /&gt;
&lt;br /&gt;
A list of features that have come up in discussion, but not for the 1.7 release.&lt;br /&gt;
&lt;br /&gt;
===  Delete projects ===&lt;br /&gt;
 &lt;br /&gt;
This option deletes the project all the way down to the project&#039;s instance on the disk. This should be a safe operation unless a separate project is directly sharing its sstate cache. That would be an recommended usage, where a proper usage would a standalone shared sstate cache. There may be artifacts in that shared sstate cache that are specific and unique to the deleted project, but it is out of scope for this option to try to delete those as well.&lt;br /&gt;
&lt;br /&gt;
=== Ability to add/remove recipes ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove recipes from the project&#039;s configuration.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to import source (tarballs, repos) ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to bring external sources into the project and include them with wrapper recipes.&lt;br /&gt;
 &lt;br /&gt;
=== Ability to add/remove packages from image ===&lt;br /&gt;
 &lt;br /&gt;
This is the ability to add or remove specific binary packages from the respective image(s) of a project.&lt;br /&gt;
&lt;br /&gt;
===  Share projects via Copy (all but &amp;quot;./tmp&amp;quot;) ===&lt;br /&gt;
 &lt;br /&gt;
Project directories (all except for their local &amp;quot;tmp&amp;quot; directory) should be portable between hosts, where the receiving developer needs only to adjust the local.conf file for the local installation and sstate directories.&lt;br /&gt;
&lt;br /&gt;
=== Ability to get notification of build status ===&lt;br /&gt;
 &lt;br /&gt;
Since builds can take a long time, it would be very useful to get for example email notification when a build stops, either with success or with failure, rather than needing to continually and manually poll the Toaster interface.&lt;br /&gt;
&lt;br /&gt;
===== Discussion =====&lt;br /&gt;
&lt;br /&gt;
[DAVE] I agree, but can we generalize this post-build processing to enable post-build script execution triggered by either success, failure, or either?  We could provide a few parameterized scripts to, for example:&lt;br /&gt;
&lt;br /&gt;
* send email to a user or list with build status,&lt;br /&gt;
* (on success) start an emulation session with regression tests on a build,&lt;br /&gt;
* (on success) download the built file system or SDK to a user&#039;s host or target,&lt;br /&gt;
* provide hooks for the user to substitute their alternative post-build triggers.&lt;br /&gt;
&lt;br /&gt;
=== Ability to access Toaster from portable device ===&lt;br /&gt;
 &lt;br /&gt;
Since builds generally take a long time, the user may be away from their desk (or even work hours) and wish to track the status of their pending builds. Supporting a basic Toaster interface for such limited devices would be advantageous.&lt;br /&gt;
 &lt;br /&gt;
=== Snapshots of builds for long term archiving (project dir lifecycle) ===&lt;br /&gt;
 &lt;br /&gt;
A build manager may wish to keep the pertinent facts of builds for an extended period of time. This could be for a few days to allow time for the build&#039;s owner to reconcile the results, or if maybe over a year for tracking long-term trends and regressions. In each case, there should be a way to capture a minimal set of information from the build directory (e.g. the conf files and any build failure logs) and preserve it so that together with the database there is enough information to study that project even when the full build directory is removed and recycled.&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=11940</id>
		<title>Contribute to Toaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Contribute_to_Toaster&amp;diff=11940"/>
		<updated>2014-01-23T15:05:07Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page summarises the Toaster development process. We hope this will help you start contributing to the project. &lt;br /&gt;
&lt;br /&gt;
== Set up the local repository ==&lt;br /&gt;
&lt;br /&gt;
* Select a [http://www.yoctoproject.org/docs/1.5.1/ref-manual/ref-manual.html#detailed-supported-distros Yocto Project 1.5 compatible host], [https://www.djangoproject.com/download/ install Django-1.5] and South 0.8.4. The &amp;quot;pip&amp;quot; application is recommended to manage the install process.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ sudo apt-get install pip&lt;br /&gt;
    $ sudo pip uninstall django&lt;br /&gt;
    $ sudo pip install django==1.5&lt;br /&gt;
    $ sudo pip install South==0.8.4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Setup a local repository for the development branch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ cd &amp;lt;installdir&amp;gt;&lt;br /&gt;
    $ git clone git://git.yoctoproject.org/poky&lt;br /&gt;
    $ cd poky&lt;br /&gt;
    $ git remote add contrib http://git.yoctoproject.org/git/poky-contrib&lt;br /&gt;
    $ git fetch contrib&lt;br /&gt;
    $ git checkout contrib/toaster/master -b toaster-master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Setup up your branch for pushes to the Yocto Project [http://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/ poky-contrib repository]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git remote set-url contrib git@git.yoctoproject.org:poky-contrib&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set up the project and Toaster interface ==&lt;br /&gt;
&lt;br /&gt;
* Run a build, with Toaster database capture enabled&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ cd &amp;lt;installdir&amp;gt;&lt;br /&gt;
    $ source poky/oe-init-build-env&lt;br /&gt;
    $ source toaster start&lt;br /&gt;
    $ bitbake core-image-minimal&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; Toaster MUST be started before you start your build, else no data will be captured. You can recover a working (if sparse) database if you do this to execute a quick re-build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ source toaster start&lt;br /&gt;
    $ bitbake -c cleansstate base-files&lt;br /&gt;
    $ bitbake core-image-minimal&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Run the Toaster interface&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ xdg-open http://localhost:8000/&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; You can alternatively open your browser manually to &amp;lt;code&amp;gt;http://localhost:8000/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Edit and submit content for review ==&lt;br /&gt;
&lt;br /&gt;
* Create a local branch. The branch name is generally of the form &amp;lt;code&amp;gt;&amp;lt;username&amp;gt;/&amp;lt;a_name_for_the_branch&amp;gt;&amp;lt;/code&amp;gt;. For example: &amp;lt;code&amp;gt;dreyna/recipe-detail-view&amp;lt;/code&amp;gt;. You can choose any user name and send it to Michael Halstead (mhalstead at linuxfoundation dot org), together with your SSL public key to enable your pushes to the Yocto Project [http://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/ poky-contrib repository]. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git checkout -b dreyna/recipe-detail-view&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Edit and test your content. You mind find [https://getfirebug.com/ Firebug] useful for web development purposes. All rendered pages should be validated for HTML format compliance. There are lots of HTML validators you can use: [http://users.skynet.be/mgueury/mozilla/ HtmlValidator] is one of them.&lt;br /&gt;
&lt;br /&gt;
* Set up your commit(s). The same push can have several partitioned commits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ cd &amp;lt;installdir&amp;gt;/poky&lt;br /&gt;
    $ git add bitbake/lib/toaster/...&lt;br /&gt;
    $ git commit -s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;$ git commit -s&amp;lt;/code&amp;gt;  so that you don&#039;t need to add the &amp;lt;code&amp;gt;Signed-off-by&amp;lt;/code&amp;gt; manually to your patches.&lt;br /&gt;
&lt;br /&gt;
You might also find &amp;lt;code&amp;gt;$ git add -p [filename]&amp;lt;/code&amp;gt; helpful. It will allow you to review multiple changes to a single file one by one. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NOTE:&amp;lt;/strong&amp;gt; The format of the commit should be like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    vvvvvvvvvvvvvvvvvvvvvvvvv&lt;br /&gt;
    &amp;lt;short one line summary&amp;gt;&lt;br /&gt;
    &amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;long(er) description, can be multi-line, should break at around 60 chars&amp;gt;&lt;br /&gt;
    &amp;lt;br /&amp;gt;&lt;br /&gt;
    [YOCTO #0000]          # OPTIONAL LINE: replace with the real bugzilla issue number &lt;br /&gt;
    &amp;lt;br /&amp;gt;&lt;br /&gt;
    Signed-off-by: First Last &amp;lt;name@company.com&amp;gt;&lt;br /&gt;
    ^^^^^^^^^^^^^^^^^^^^^^^^^&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your patch is directly addressing a Bugzilla issue, you should reference the issue number by adding the &amp;lt;code&amp;gt;YOCTO #0000&amp;lt;/code&amp;gt; line just above the &amp;lt;code&amp;gt;Signed-off&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
A comprehensive document about commit messages is available at:&lt;br /&gt;
&lt;br /&gt;
http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines&lt;br /&gt;
&lt;br /&gt;
* Rebase your branch on the latest toaster/master. This will lower the probability that your code will conflict when trying to merge the patch upstream by making sure it&#039;s based on the latest upstream.&lt;br /&gt;
&lt;br /&gt;
* Push your branch for review. For example, if you branch name is &amp;lt;code&amp;gt;dreyna/recipe-detail-view&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ git push poky-contrib dreyna/recipe-detail-view&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Send an email to the [https://lists.yoctoproject.org/listinfo/webhob Toaster mailing list] with the following content:&lt;br /&gt;
&lt;br /&gt;
* Once the email comes back that the patches are merged, please abandon the branch, and start new development on a new branch.&lt;br /&gt;
&lt;br /&gt;
** A brief description of the review request together with the branch name&lt;br /&gt;
** Any technical details to call out to reviewers&lt;br /&gt;
** Any limitations, assumptions, dependencies, and/or differed work&lt;br /&gt;
** Ideally, a test plan that demonstrates how the feature was tested with sufficient detail for general testers and documentation writers. [https://lists.yoctoproject.org/pipermail/toaster/2014-January/000280.html This is a test plan example] you can use as a reference.&lt;br /&gt;
&lt;br /&gt;
* Update the Bugzilla entry. If your patch is directly addressing a Bugzilla issue, please mark the Bugzilla entry as &amp;quot;In Progress Review&amp;quot;, and when the patch is merged into upstream &amp;lt;code&amp;gt;bitbake/master&amp;lt;/code&amp;gt; (&amp;lt;strong&amp;gt;not&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;poky-contrib/toaster/master&amp;lt;/code&amp;gt;), please mark the Bugzilla entry as &amp;quot;Resolved / Fixed&amp;quot;. This will let the QA know what happens to the code base and the Bugzilla entries.&lt;br /&gt;
&lt;br /&gt;
== Rebase your repository from master ==&lt;br /&gt;
&lt;br /&gt;
To update your repository to the latest content, rebase it (as opposed to attempted a merge).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    $ cd &amp;lt;installdir&amp;gt;/poky&lt;br /&gt;
    $ git fetch&lt;br /&gt;
    $ git rebase [-i] poky-contrib/toaster/master&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=Analysis_REST_API_Contracts&amp;diff=11633</id>
		<title>Analysis REST API Contracts</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=Analysis_REST_API_Contracts&amp;diff=11633"/>
		<updated>2013-11-18T12:01:50Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Toaster]]&lt;br /&gt;
&lt;br /&gt;
* Implementation is released on http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=dora-toaster and http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=master&lt;br /&gt;
&lt;br /&gt;
This page gives you information on the Toaster Analysis REST API. This is a read-only API which provides information about a build that was recorded by Toaster.&lt;br /&gt;
&lt;br /&gt;
It documents the search operation endpoints, parameters, and responses. You might also be interested in the [[Toaster#Installation and Running|Toaster installation and running instructions]].&lt;br /&gt;
&lt;br /&gt;
Toaster is accessible through REST APIs, which make the backend available to any client.&lt;br /&gt;
The data collected during the build is available via an unrestricted, anonymous, read-only API running on the local host machine.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
The data interface is available as a search query returning a list of typed objects.&lt;br /&gt;
The request method must be GET. The answers are always returned as JSON.&lt;br /&gt;
&lt;br /&gt;
=== API version ===&lt;br /&gt;
&lt;br /&gt;
The REST API is versioned as to allow further upgrades without having to maintain backward compatibility through changing the major version number.&lt;br /&gt;
Minor version numbers are intended to signify a capability level while maintaining compatibility.&lt;br /&gt;
&lt;br /&gt;
This is the API version 1.0. All API requests are grouped under URL: &lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET /api/1.0/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
The API can return [[REST API Contracts#Build|Build]], [[REST API Contracts#Target|Target]], [[REST API Contracts#Target installed packages|Target installed packages]], [[REST API Contracts#Layer|Layer]], [[REST API Contracts#Layer version|Layer version]], [[REST API Contracts#Task|Task]], [[REST API Contracts#Task dependencies|Task dependencies]], [[REST API Contracts#Recipe|Recipe]], [[REST API Contracts#Recipe dependencies|Recipe dependencies]], [[REST API Contracts#Build packages|Build packages]], [[REST API Contracts#Package dependencies|Package dependencies]], [[REST API Contracts#Package files|Package files]], [[REST API Contracts#Variables|Variables]] and [[REST API Contracts#Log messages|Log messages]]. Each object is described below.&lt;br /&gt;
&lt;br /&gt;
=== Search operation ===&lt;br /&gt;
&lt;br /&gt;
The primary operation of the API is to retrieve a set of objects from the backend based on a search operation. The result will also contain all the data for the objects being returned, as to avoid separate connections to further bring the objects of the type queried.&lt;br /&gt;
&lt;br /&gt;
The search operation can also specify the ordering of the results by key.&lt;br /&gt;
&lt;br /&gt;
The search parameters are the same for all object types.&lt;br /&gt;
&lt;br /&gt;
==== URI ====&lt;br /&gt;
&lt;br /&gt;
All the search endpoints follow the same URI pattern&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
GET /api/1.0/{on}s/?{parameters}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;i&amp;gt;on&amp;lt;/i&amp;gt; is the object name, one the endpoints described below.&lt;br /&gt;
* The &amp;lt;i&amp;gt;parameters&amp;lt;/i&amp;gt; are described in the next section, and are the same for all search queries&lt;br /&gt;
&lt;br /&gt;
==== Parameters ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Description !! Comments &lt;br /&gt;
|-&lt;br /&gt;
| limit || number || The number of objects to be returned ||  -&lt;br /&gt;
|-&lt;br /&gt;
| offset || number || Offset into the search result index. || -&lt;br /&gt;
|-&lt;br /&gt;
| search || string || Search string for all fields || The argument is the string to be searched in the database. The backend MUST return only records that match the string.&lt;br /&gt;
|-&lt;br /&gt;
| filter || string || String used to specify result filter function || The general form: &amp;quot;&amp;lt;FIELD&amp;gt;:&amp;lt;VALUE&amp;gt;[,&amp;lt;FIELD&amp;gt;:&amp;lt;VALUE&amp;gt;]*&amp;quot;. The backend MUST only return records that have FIELD matching to the VALUE specified. The &amp;lt;FIELD&amp;gt; names for each object type are the property names of the object.&lt;br /&gt;
|-&lt;br /&gt;
| orderby || string || The name of the field that determines the sorting of the results. || &amp;quot;&amp;lt;FIELD&amp;gt;:&amp;lt;ORDER_DIRECTION&amp;gt;&amp;quot;. The results are ordered by the &amp;lt;FIELD&amp;gt; values in the &amp;lt;ORDER_DIRECTION&amp;gt; order. &amp;lt;ORDER_DIRECTION&amp;gt; values may be &amp;quot;asc&amp;quot; or &amp;quot;desc&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
All the responses are in JSON format. The response contains a set of fields describing the content of the data, and an array with the object data inside it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
&lt;br /&gt;
Returns information about the builds recorded by Toaster.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/builds || JSON || Returns page size-limited and search criteria-filtered builds from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of builds to be displayed (according to filter parameter)  || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;outcome&amp;lt;/span&amp;gt; || number || 2 || YES || - || Signals successful or failed build || 0 Failed build &amp;lt;br /&amp;gt; 1 Successful build&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;build_name&amp;lt;/span&amp;gt; || string || - || YES || - || Build name|| Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;machine&amp;lt;/span&amp;gt; || string || - || YES || - || The selected hardware || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;started_on&amp;lt;/span&amp;gt; || number representation of date || - || YES || - ||  Marks the moment the process is started || &lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;completed_on&amp;lt;/span&amp;gt; || number representation of date || - || YES || - || Marks the moment the process is completed || &lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;errors_no&amp;lt;/span&amp;gt; || number || - || YES || - || Number of errors thrown by the build || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;warnings_no&amp;lt;/span&amp;gt; || number || - || YES || - || Number of warnings thrown by the build || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;image_fstypes&amp;lt;/span&amp;gt; || string || - || YES || - || The file types create by this build || Space-separated file name suffixes. Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5453 5453]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;cooker_log_path&amp;lt;/span&amp;gt; || string || - || YES || - || Path to log file || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5187 5187]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;distro&amp;lt;/span&amp;gt; || string || - || YES || - || Distro name || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;distro_version&amp;lt;/span&amp;gt; || string || - || YES || - || Distro version || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;bitbake_version&amp;lt;/span&amp;gt; || string || - || YES || - || BitBake version || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Target ==&lt;br /&gt;
&lt;br /&gt;
Returns information about a build target(s).&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/targets || JSON || Returns page size-limited and search criteria-filtered targets from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of targets to be displayed (according to filter parameter)  || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;build&amp;lt;/span&amp;gt; || number || - || YES || - || The ID of the build that created this target || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;target&amp;lt;/span&amp;gt; || string || - || YES || - || The name of the build target || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;file_name&amp;lt;/span&amp;gt; || string || - || YES || - || Full path(s) to the root file system file(s) produced by the build (if any) || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5189 5189] &lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;file_size&amp;lt;/span&amp;gt; || number || - || YES || - || The file size of the build target || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5228 5228] &lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;is_image&amp;lt;/span&amp;gt; || boolean || - || YES || False || True if one of the build targets is an image recipe || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Target installed packages ==&lt;br /&gt;
&lt;br /&gt;
Returns information about the packages installed in a target, when such target is an image recipe. &lt;br /&gt;
&lt;br /&gt;
NOTE: [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#maintaining-build-output-quality Build history] &amp;lt;strong&amp;gt;must be enabled&amp;lt;/strong&amp;gt; to collect this information.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/target_packages || JSON || Returns page size-limited and search criteria-filtered installed packages from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of packages to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;target&amp;lt;/span&amp;gt; || number || - || YES || - || The pk of the target that has this package || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;recipe&amp;lt;/span&amp;gt; || number || - || YES || - || The pk of the recipe that generated this package || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5276 5276]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; || string || - || YES || - || Package name || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;version&amp;lt;/span&amp;gt; || string || - || YES || - || Package version || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5276 5276]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;size&amp;lt;/span&amp;gt; || number || - || YES || - || The size of the package, in bytes || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Layer ==&lt;br /&gt;
&lt;br /&gt;
Returns information about the layers used in the builds recorded by Toaster.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/layers || JSON || Returns page size-limited and search criteria-filtered layers from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of layers to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; || string || - || YES || - || The local name under which the layer is known || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;local_path&amp;lt;/span&amp;gt; || string || - || YES || - || Path to the layer on local machine || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;layer_index_url&amp;lt;/span&amp;gt; || URL || - || NO || - || URL to the layer index application || Possibly not available. Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5192 5192]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Layer version ==&lt;br /&gt;
&lt;br /&gt;
Returns information about the version (branch:commit in Git) of a layer used in a certain build.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/layerversions || JSON || Returns page size-limited and search criteria-filtered layers from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of layers to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;layer&amp;lt;/span&amp;gt; || number || - || YES || - || PK of the layer object || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;branch&amp;lt;/span&amp;gt; || string || - || YES || - || The branch name of the layer || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;commit&amp;lt;/span&amp;gt; || string || - || YES || - || The current commit of the layer || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;priority&amp;lt;/span&amp;gt; || number || - || NO || - || Priority of the layer || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5218 5218]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task ==&lt;br /&gt;
&lt;br /&gt;
Each build consists of a series of tasks. This is the endpoint for searching the task table.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/tasks || JSON || Returns page size-limited and search criteria-filtered tasks from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of tasks to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;build&amp;lt;/span&amp;gt; || number || - || YES || - || Identifies the build in which the task occurred || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;order&amp;lt;/span&amp;gt; || number || - || YES || - || The sequence ID of the task in launch order || &lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;task_executed&amp;lt;/span&amp;gt; || boolean || - || YES || - || True if task actually executed || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;outcome&amp;lt;/span&amp;gt; || number || 6 || YES || 6 || 0 Executed successfully &amp;lt;br/&amp;gt; 1 Covered by another task &amp;lt;br/&amp;gt; 2 Restored from sstate &amp;lt;br/&amp;gt; 3 Artifacts already existing &amp;lt;br/&amp;gt; 4 Fail during execution &amp;lt;br/&amp;gt; 5 Not available &amp;lt;br/&amp;gt; || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5216 5216]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;sstate_checksum&amp;lt;/span&amp;gt; || string || - || YES || - || Sstate checksum of the task || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;path_to_sstate_obj&amp;lt;/span&amp;gt; || string || - || NO || - || The path to the sstate file, if applicable || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5252 5252]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;recipe&amp;lt;/span&amp;gt; || number || - || YES || - || ID of the recipe generating the task || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;task_name&amp;lt;/span&amp;gt; || string || - || YES || - || Name of the task || e.g. &amp;quot;do_fetch&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;source_url&amp;lt;/span&amp;gt; || string || - || NO || - || Path to script source file (yes, it&#039;s misnamed) || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5255 5255]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;logfile&amp;lt;/span&amp;gt; || string || - || YES || - || Path to log file || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;work_directory&amp;lt;/span&amp;gt; || string || - || YES || - || Cwd during task execution || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5253 5253]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;script_type&amp;lt;/span&amp;gt; || number || 3 || NO || 0 || See if we executed a shell or python script, or no script was executed || 0 noexec &amp;lt;br/&amp;gt; 1 python &amp;lt;br/&amp;gt; 2 shell &amp;lt;br /&amp;gt;Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5327 5327]&lt;br /&gt;
|- &lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;line_number&amp;lt;/span&amp;gt; || number || - || NO || - || Starting number of the line in the source file || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5254 5254]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;disk_io&amp;lt;/span&amp;gt; || number || - || NO || - || Time spent by the task in I/O operations (in ms) || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5073 5073], [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5485 5485]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;cpu_usage&amp;lt;/span&amp;gt; || number || - || NO || - || Percent of the CPU used during the task || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5073 5073], [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5485 5485]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;sstate_result&amp;lt;/span&amp;gt; || number || 4 || NO || 0 || Outcome of the sstate task || 0 N/A &amp;lt;br/&amp;gt; 1 Missing &amp;lt;br/&amp;gt; 2 Failed &amp;lt;br/&amp;gt; 3 Restored successfully &amp;lt;br/&amp;gt; Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5220 5220]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;message&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;message&amp;lt;/span&amp;gt; || string || - || NO || - || Any message from the system regarding the task || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;message&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;elapsed_time&amp;lt;/span&amp;gt; || string || - || NO || - || Time taken by the task to complete (in seconds) || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5300 5300]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task dependencies ==&lt;br /&gt;
&lt;br /&gt;
Returns the tasks dependency data.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/task_dependencies || JSON || Returns page size-limited and search criteria-filtered tasks from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of tasks to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;task&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the target task || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;depends_on&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the task that the target task depends on  || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Recipe ==&lt;br /&gt;
&lt;br /&gt;
Returns information about recipes in a certain build.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/recipes || JSON || Returns page size-limited and search criteria-filtered recipes from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of recipes to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; || string || - || YES || - || The recipe name || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;version&amp;lt;/span&amp;gt; || string || - || YES || - || The recipe version || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5459 5459]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;layer_version&amp;lt;/span&amp;gt; || number || - || YES || - || The version of the layer in which the recipe existed at the task building time || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;summary&amp;lt;/span&amp;gt; || string || - || YES || - || The content of the SUMMARY variable || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;description&amp;lt;/span&amp;gt; || string || - || YES || - || The content of the DESCRIPTION variable || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;section&amp;lt;/span&amp;gt; || string || - || YES || - || The section to which the recipe belongs || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;license&amp;lt;/span&amp;gt; || string || - || YES || - || The license of the recipe || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;licensing_info&amp;lt;/span&amp;gt; || string || - || YES || - || The directory containing the recipe license files || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5194 5194]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;homepage&amp;lt;/span&amp;gt; || string || - || YES || - || The website for the software provided by the recipe || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;bugtracker&amp;lt;/span&amp;gt; || string || - || YES || - || The bug tracking website for the software provided by the recipe || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;author&amp;lt;/span&amp;gt; || string || - || YES || - || The author of the recipe || Know issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5449 5449]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;file_path&amp;lt;/span&amp;gt; || string || - || YES || - || Path to the recipe .bb file || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Recipe dependencies ==&lt;br /&gt;
&lt;br /&gt;
Returns the recipe dependency data.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/recipe_dependencies || JSON || Returns page size-limited and search criteria-filtered recipes from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of recipes to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;recipe&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the target recipe || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;depends_on&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the recipe that the target recipe depends on  || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;dep_type&amp;lt;/span&amp;gt; || number || 2 || YES || - || Dependency type || 0 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-DEPENDS DEPENDS] &amp;lt;br /&amp;gt; 1 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RDEPENDS RDEPENDS] &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Build packages ==&lt;br /&gt;
&lt;br /&gt;
Returns data about packages built. This information is collected at build time, while [[#Target installed packages | target installed packages]] information is collected from [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#maintaining-build-output-quality build history].&lt;br /&gt;
&lt;br /&gt;
Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5269 5269]&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/packages || JSON || Returns page size-limited and search criteria-filtered packages from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of packages to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;build&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the build that generated this package || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;recipe&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the recipe that generated this package || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt; || string || - || YES || - || The package name || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;version&amp;lt;/span&amp;gt; || string || - || YES || - || The package version || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;revision&amp;lt;/span&amp;gt; || string || - || YES || - || The package revision || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;size&amp;lt;/span&amp;gt; || number || - || YES || - || The size of the package, in kilobytes || Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5503 5503]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;section&amp;lt;/span&amp;gt; || string || - || YES || - || The section to which this package belongs || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;license&amp;lt;/span&amp;gt; || string || - || YES || - || The license of the package || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;summary&amp;lt;/span&amp;gt; || string || - || YES || - || The content of the recipe SUMMARY || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;description&amp;lt;/span&amp;gt; || string || - || YES || - || The content of the recipe DESCRIPTION || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Package dependencies ==&lt;br /&gt;
&lt;br /&gt;
Returns the package dependency data.&lt;br /&gt;
&lt;br /&gt;
Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5269 5269]&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/package_dependencies || JSON || Returns page size-limited and search criteria-filtered packages from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of packages to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;package&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the target package || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;depends_on&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the package that the target package depends on  || Known issues: [http://bugzilla.yoctoproject.org/show_bug.cgi?id=5225  5225]&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;dep_type&amp;lt;/span&amp;gt; || number || 6 || YES || - || Dependency type || 0 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RDEPENDS RDEPENDS] &amp;lt;br/&amp;gt; 1 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RPROVIDES RPROVIDES] &amp;lt;br/&amp;gt; 2 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RRECOMMENDS RRECOMMENDS] &amp;lt;br/&amp;gt; 5 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RSUGGESTS RSUGGESTS] &amp;lt;br/&amp;gt; 4 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RREPLACES RREPLACES] &amp;lt;br /&amp;gt; 5 [http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-RCONFLICTS RCONFLICTS] &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Package files ==&lt;br /&gt;
&lt;br /&gt;
Returns data about package-generated files.&lt;br /&gt;
&lt;br /&gt;
Known issues: [https://bugzilla.yoctoproject.org/show_bug.cgi?id=5269 5269]&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/package_files || JSON || Returns page size-limited and search criteria-filtered files for a package from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of files to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;bpackage&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the package generating the file || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;path&amp;lt;/span&amp;gt; || String || - || YES || - || Full file path  || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;size&amp;lt;/span&amp;gt; || number || - || YES || - || File size, in bytes || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Returns data about key-value pairs applied to a certain build.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/variables || JSON || Returns page size-limited and search criteria-filtered variables from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of variables to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;build&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the build that generated this variable || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;variable_name&amp;lt;/span&amp;gt; || string || - || YES || - || The key in a key-value pair || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;variable_value&amp;lt;/span&amp;gt; || string || - || YES || - || The value in a key-value pair || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;changed&amp;lt;/span&amp;gt; || boolean || - || YES || - || Not defined  || Not currently available&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;human_readable_name&amp;lt;/span&amp;gt; || string || - || YES || - || Not defined  || Not currently available&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;description&amp;lt;/span&amp;gt; || string || - || YES || - || Variable description in documentation.conf  || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Variable History ==&lt;br /&gt;
&lt;br /&gt;
Returns information on how the variable reached its current value. &lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/variablehistory || JSON || Returns page size-limited and search criteria-filtered variables from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of entries to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;variable&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the variable this operation changed || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;file_name&amp;lt;/span&amp;gt; || string || - || YES || - || The file name where the variable value change was specified || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;line_number&amp;lt;/span&amp;gt; || integer || - || YES || - || The line number in the file where the variable value change was specified || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;operation&amp;lt;/span&amp;gt; || string || - || YES || - || The change that took place, uninterpreted value  || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Log messages ==&lt;br /&gt;
&lt;br /&gt;
Returns data about errors / warnings thrown by the build.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! Endpoint !! Body !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| GET || /api/1.0/logmessages || JSON || Returns page size-limited and search criteria-filtered messages from the database || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Response ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Type !! Dimension !! Required !! Default value(s) !! Description !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root] || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;count&amp;lt;/span&amp;gt; || number || - || YES || - || Total amount of messages to be displayed (according to filter parameter) || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;list&amp;lt;/span&amp;gt; || object array || - || YES || - || - || To describe a generic object element of the array, the reference to its root is &amp;quot;list[]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;pk&amp;lt;/span&amp;gt; || number || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;model&amp;lt;/span&amp;gt; || string || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt; || object || - || YES || - || - || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;build&amp;lt;/span&amp;gt; || number || - || YES || - || The PK of the build that generated this message || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;level&amp;lt;/span&amp;gt; || number || 3 || YES || - || Message type ||  0 - INFO&amp;lt;br/&amp;gt; 1 - WARNING&amp;lt;br/&amp;gt; 2 - ERROR&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;message&amp;lt;/span&amp;gt; || string || - || YES || - || The message content || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;pathname&amp;lt;/span&amp;gt; || string || - || YES || - || Path to the file generating the message  || -&lt;br /&gt;
|-&lt;br /&gt;
| [Object Root].&amp;lt;span style=&amp;quot;color:#FF9900&amp;quot;&amp;gt;list[]&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#0066FF&amp;quot;&amp;gt;fields&amp;lt;/span&amp;gt;.&amp;lt;span style=&amp;quot;color:#006600&amp;quot;&amp;gt;lineno&amp;lt;/span&amp;gt; || number || - || YES || - || Line number generating the message || -&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
	<entry>
		<id>https://wiki.yoctoproject.org/wiki/index.php?title=REST_API_Contracts&amp;diff=11632</id>
		<title>REST API Contracts</title>
		<link rel="alternate" type="text/html" href="https://wiki.yoctoproject.org/wiki/index.php?title=REST_API_Contracts&amp;diff=11632"/>
		<updated>2013-11-18T11:59:02Z</updated>

		<summary type="html">&lt;p&gt;Ddalex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Toaster offers multiple REST APIs for interacting with the system.&lt;br /&gt;
The REST APIs are classified in modules, each module providing a different set of functionality.&lt;br /&gt;
&lt;br /&gt;
== Analysis Module ==&lt;br /&gt;
&lt;br /&gt;
Currently released on dora-toaster release, and ready to be used&lt;br /&gt;
* [[Analysis REST API Contracts]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Build Module ==&lt;br /&gt;
&lt;br /&gt;
This is in planning phases&lt;/div&gt;</summary>
		<author><name>Ddalex</name></author>
	</entry>
</feed>