1*4882a593Smuzhiyun// -*- mode:doc; -*- 2*4882a593Smuzhiyun// vim: set syntax=asciidoc: 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun== Contributing to Buildroot 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThere are many ways in which you can contribute to Buildroot: analyzing 7*4882a593Smuzhiyunand fixing bugs, analyzing and fixing package build failures detected by 8*4882a593Smuzhiyunthe autobuilders, testing and reviewing patches sent by other 9*4882a593Smuzhiyundevelopers, working on the items in our TODO list and sending your own 10*4882a593Smuzhiyunimprovements to Buildroot or its manual. The following sections give a 11*4882a593Smuzhiyunlittle more detail on each of these items. 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunIf you are interested in contributing to Buildroot, the first thing you 14*4882a593Smuzhiyunshould do is to subscribe to the Buildroot mailing list. This list is 15*4882a593Smuzhiyunthe main way of interacting with other Buildroot developers and to send 16*4882a593Smuzhiyuncontributions to. If you aren't subscribed yet, then refer to 17*4882a593Smuzhiyunxref:community-resources[] for the subscription link. 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunIf you are going to touch the code, it is highly recommended to use a 20*4882a593Smuzhiyungit repository of Buildroot, rather than starting from an extracted 21*4882a593Smuzhiyunsource code tarball. Git is the easiest way to develop from and directly 22*4882a593Smuzhiyunsend your patches to the mailing list. Refer to xref:getting-buildroot[] 23*4882a593Smuzhiyunfor more information on obtaining a Buildroot git tree. 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun=== Reproducing, analyzing and fixing bugs 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunA first way of contributing is to have a look at the open bug reports in 28*4882a593Smuzhiyunthe https://bugs.buildroot.org/buglist.cgi?product=buildroot[Buildroot bug 29*4882a593Smuzhiyuntracker]. As we strive to keep the bug count as small as possible, all 30*4882a593Smuzhiyunhelp in reproducing, analyzing and fixing reported bugs is more than 31*4882a593Smuzhiyunwelcome. Don't hesitate to add a comment to bug reports reporting your 32*4882a593Smuzhiyunfindings, even if you don't yet see the full picture. 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun=== Analyzing and fixing autobuild failures 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunThe Buildroot autobuilders are a set of build machines that continuously 37*4882a593Smuzhiyunrun Buildroot builds based on random configurations. This is done for 38*4882a593Smuzhiyunall architectures supported by Buildroot, with various toolchains, and 39*4882a593Smuzhiyunwith a random selection of packages. With the large commit activity on 40*4882a593SmuzhiyunBuildroot, these autobuilders are a great help in detecting problems 41*4882a593Smuzhiyunvery early after commit. 42*4882a593Smuzhiyun 43*4882a593SmuzhiyunAll build results are available at http://autobuild.buildroot.org[], 44*4882a593Smuzhiyunstatistics are at http://autobuild.buildroot.org/stats.php[]. Every day, 45*4882a593Smuzhiyunan overview of all failed packages is sent to the mailing list. 46*4882a593Smuzhiyun 47*4882a593SmuzhiyunDetecting problems is great, but obviously these problems have to be 48*4882a593Smuzhiyunfixed as well. Your contribution is very welcome here! There are 49*4882a593Smuzhiyunbasically two things that can be done: 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun- Analyzing the problems. The daily summary mails do not contain details 52*4882a593Smuzhiyun about the actual failures: in order to see what's going on you have to 53*4882a593Smuzhiyun open the build log and check the last output. Having someone doing 54*4882a593Smuzhiyun this for all packages in the mail is very useful for other developers, 55*4882a593Smuzhiyun as they can make a quick initial analysis based on this output alone. 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun- Fixing a problem. When fixing autobuild failures, you should follow 58*4882a593Smuzhiyun these steps: 59*4882a593Smuzhiyun . Check if you can reproduce the problem by building with the same 60*4882a593Smuzhiyun configuration. You can do this manually, or use the 61*4882a593Smuzhiyun http://git.buildroot.org/buildroot-test/tree/utils/br-reproduce-build[br-reproduce-build] 62*4882a593Smuzhiyun script that will automatically clone a Buildroot git repository, 63*4882a593Smuzhiyun checkout the correct revision, download and set the right 64*4882a593Smuzhiyun configuration, and start the build. 65*4882a593Smuzhiyun . Analyze the problem and create a fix. 66*4882a593Smuzhiyun . Verify that the problem is really fixed by starting from a clean 67*4882a593Smuzhiyun Buildroot tree and only applying your fix. 68*4882a593Smuzhiyun . Send the fix to the Buildroot mailing list (see 69*4882a593Smuzhiyun xref:submitting-patches[]). In case you created a patch against the 70*4882a593Smuzhiyun package sources, you should also send the patch upstream so that the 71*4882a593Smuzhiyun problem will be fixed in a later release, and the patch in Buildroot 72*4882a593Smuzhiyun can be removed. 73*4882a593Smuzhiyun In the commit message of a patch fixing an autobuild failure, add a 74*4882a593Smuzhiyun reference to the build result directory, as follows: 75*4882a593Smuzhiyun--------------------- 76*4882a593SmuzhiyunFixes: http://autobuild.buildroot.org/results/51000a9d4656afe9e0ea6f07b9f8ed374c2e4069 77*4882a593Smuzhiyun--------------------- 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun=== Reviewing and testing patches 80*4882a593Smuzhiyun 81*4882a593SmuzhiyunWith the amount of patches sent to the mailing list each day, the 82*4882a593Smuzhiyunmaintainer has a very hard job to judge which patches are ready to apply 83*4882a593Smuzhiyunand which ones aren't. Contributors can greatly help here by reviewing 84*4882a593Smuzhiyunand testing these patches. 85*4882a593Smuzhiyun 86*4882a593SmuzhiyunIn the review process, do not hesitate to respond to patch submissions 87*4882a593Smuzhiyunfor remarks, suggestions or anything that will help everyone to 88*4882a593Smuzhiyununderstand the patches and make them better. Please use internet 89*4882a593Smuzhiyunstyle replies in plain text emails when responding to patch 90*4882a593Smuzhiyunsubmissions. 91*4882a593Smuzhiyun 92*4882a593SmuzhiyunTo indicate approval of a patch, there are three formal tags that keep 93*4882a593Smuzhiyuntrack of this approval. To add your tag to a patch, reply to it with the 94*4882a593Smuzhiyunapproval tag below the original author's Signed-off-by line. These tags 95*4882a593Smuzhiyunwill be picked up automatically by patchwork (see 96*4882a593Smuzhiyunxref:apply-patches-patchwork[]) and will be part of the commit log when 97*4882a593Smuzhiyunthe patch is accepted. 98*4882a593Smuzhiyun 99*4882a593SmuzhiyunTested-by:: Indicates that the patch has been tested successfully. 100*4882a593Smuzhiyun You are encouraged to specify what kind of testing you performed 101*4882a593Smuzhiyun (compile-test on architecture X and Y, runtime test on target A, 102*4882a593Smuzhiyun ...). This additional information helps other testers and the 103*4882a593Smuzhiyun maintainer. 104*4882a593Smuzhiyun 105*4882a593SmuzhiyunReviewed-by:: Indicates that you code-reviewed the patch and did your 106*4882a593Smuzhiyun best in spotting problems, but you are not sufficiently familiar with 107*4882a593Smuzhiyun the area touched to provide an Acked-by tag. This means that there 108*4882a593Smuzhiyun may be remaining problems in the patch that would be spotted by 109*4882a593Smuzhiyun someone with more experience in that area. Should such problems be 110*4882a593Smuzhiyun detected, your Reviewed-by tag remains appropriate and you cannot 111*4882a593Smuzhiyun be blamed. 112*4882a593Smuzhiyun 113*4882a593SmuzhiyunAcked-by:: Indicates that you code-reviewed the patch and you are 114*4882a593Smuzhiyun familiar enough with the area touched to feel that the patch can be 115*4882a593Smuzhiyun committed as-is (no additional changes required). In case it later 116*4882a593Smuzhiyun turns out that something is wrong with the patch, your Acked-by could 117*4882a593Smuzhiyun be considered inappropriate. The difference between Acked-by and 118*4882a593Smuzhiyun Reviewed-by is thus mainly that you are prepared to take the blame on 119*4882a593Smuzhiyun Acked patches, but not on Reviewed ones. 120*4882a593Smuzhiyun 121*4882a593SmuzhiyunIf you reviewed a patch and have comments on it, you should simply reply 122*4882a593Smuzhiyunto the patch stating these comments, without providing a Reviewed-by or 123*4882a593SmuzhiyunAcked-by tag. These tags should only be provided if you judge the patch 124*4882a593Smuzhiyunto be good as it is. 125*4882a593Smuzhiyun 126*4882a593SmuzhiyunIt is important to note that neither Reviewed-by nor Acked-by imply 127*4882a593Smuzhiyunthat testing has been performed. To indicate that you both reviewed and 128*4882a593Smuzhiyuntested the patch, provide two separate tags (Reviewed/Acked-by and 129*4882a593SmuzhiyunTested-by). 130*4882a593Smuzhiyun 131*4882a593SmuzhiyunNote also that _any developer_ can provide Tested/Reviewed/Acked-by 132*4882a593Smuzhiyuntags, without exception, and we encourage everyone to do this. Buildroot 133*4882a593Smuzhiyundoes not have a defined group of _core_ developers, it just so happens 134*4882a593Smuzhiyunthat some developers are more active than others. The maintainer will 135*4882a593Smuzhiyunvalue tags according to the track record of their submitter. Tags 136*4882a593Smuzhiyunprovided by a regular contributor will naturally be trusted more than 137*4882a593Smuzhiyuntags provided by a newcomer. As you provide tags more regularly, your 138*4882a593Smuzhiyun'trustworthiness' (in the eyes of the maintainer) will go up, but _any_ 139*4882a593Smuzhiyuntag provided is valuable. 140*4882a593Smuzhiyun 141*4882a593SmuzhiyunBuildroot's Patchwork website can be used to pull in patches for testing 142*4882a593Smuzhiyunpurposes. Please see xref:apply-patches-patchwork[] for more 143*4882a593Smuzhiyuninformation on using Buildroot's Patchwork website to apply patches. 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun[[apply-patches-patchwork]] 146*4882a593Smuzhiyun==== Applying Patches from Patchwork 147*4882a593Smuzhiyun 148*4882a593SmuzhiyunThe main use of Buildroot's Patchwork website for a developer is for 149*4882a593Smuzhiyunpulling in patches into their local git repository for testing 150*4882a593Smuzhiyunpurposes. 151*4882a593Smuzhiyun 152*4882a593SmuzhiyunWhen browsing patches in the patchwork management interface, an +mbox+ 153*4882a593Smuzhiyunlink is provided at the top of the page. Copy this link address and 154*4882a593Smuzhiyunrun the following commands: 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun--------------------- 157*4882a593Smuzhiyun$ git checkout -b <test-branch-name> 158*4882a593Smuzhiyun$ wget -O - <mbox-url> | git am 159*4882a593Smuzhiyun--------------------- 160*4882a593Smuzhiyun 161*4882a593SmuzhiyunAnother option for applying patches is to create a bundle. A bundle is 162*4882a593Smuzhiyuna set of patches that you can group together using the patchwork 163*4882a593Smuzhiyuninterface. Once the bundle is created and the bundle is made public, 164*4882a593Smuzhiyunyou can copy the +mbox+ link for the bundle and apply the bundle 165*4882a593Smuzhiyunusing the above commands. 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun=== Work on items from the TODO list 169*4882a593Smuzhiyun 170*4882a593SmuzhiyunIf you want to contribute to Buildroot but don't know where to start, 171*4882a593Smuzhiyunand you don't like any of the above topics, you can always work on items 172*4882a593Smuzhiyunfrom the http://elinux.org/Buildroot#Todo_list[Buildroot TODO list]. 173*4882a593SmuzhiyunDon't hesitate to discuss an item first on the mailing list or on IRC. 174*4882a593SmuzhiyunDo edit the wiki to indicate when you start working on an item, so we 175*4882a593Smuzhiyunavoid duplicate efforts. 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun[[submitting-patches]] 178*4882a593Smuzhiyun=== Submitting patches 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun[NOTE] 181*4882a593Smuzhiyun_Please, do not attach patches to bugs, send them to the mailing list 182*4882a593Smuzhiyuninstead_. 183*4882a593Smuzhiyun 184*4882a593SmuzhiyunIf you made some changes to Buildroot and you would like to contribute 185*4882a593Smuzhiyunthem to the Buildroot project, proceed as follows. 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun==== The formatting of a patch 188*4882a593Smuzhiyun 189*4882a593SmuzhiyunWe expect patches to be formatted in a specific way. This is necessary 190*4882a593Smuzhiyunto make it easy to review patches, to be able to apply them easily to 191*4882a593Smuzhiyunthe git repository, to make it easy to find back in the history how 192*4882a593Smuzhiyunand why things have changed, and to make it possible to use +git 193*4882a593Smuzhiyunbisect+ to locate the origin of a problem. 194*4882a593Smuzhiyun 195*4882a593SmuzhiyunFirst of all, it is essential that the patch has a good commit 196*4882a593Smuzhiyunmessage. The commit message should start with a separate line with a 197*4882a593Smuzhiyunbrief summary of the change, prefixed by the area touched by the 198*4882a593Smuzhiyunpatch. A few examples of good commit titles: 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun* +package/linuxptp: bump version to 2.0+ 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun* +configs/imx23evk: bump Linux version to 4.19+ 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun* +package/pkg-generic: postpone evaluation of dependency conditions+ 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun* +boot/uboot: needs host-{flex,bison}+ 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun* +support/testing: add python-ubjson tests+ 209*4882a593Smuzhiyun 210*4882a593SmuzhiyunThe description that follows the prefix should start with a lower case 211*4882a593Smuzhiyunletter (i.e "bump", "needs", "postpone", "add" in the above examples). 212*4882a593Smuzhiyun 213*4882a593SmuzhiyunSecond, the body of the commit message should describe _why_ this 214*4882a593Smuzhiyunchange is needed, and if necessary also give details about _how_ it 215*4882a593Smuzhiyunwas done. When writing the commit message, think of how the reviewers 216*4882a593Smuzhiyunwill read it, but also think about how you will read it when you look 217*4882a593Smuzhiyunat this change again a few years down the line. 218*4882a593Smuzhiyun 219*4882a593SmuzhiyunThird, the patch itself should do only one change, but do it 220*4882a593Smuzhiyuncompletely. Two unrelated or weakly related changes should usually be 221*4882a593Smuzhiyundone in two separate patches. This usually means that a patch affects 222*4882a593Smuzhiyunonly a single package. If several changes are related, it is often 223*4882a593Smuzhiyunstill possible to split them up in small patches and apply them in a 224*4882a593Smuzhiyunspecific order. Small patches make it easier to review, and often 225*4882a593Smuzhiyunmake it easier to understand afterwards why a change was done. 226*4882a593SmuzhiyunHowever, each patch must be complete. It is not allowed that the 227*4882a593Smuzhiyunbuild is broken when only the first but not the second patch is 228*4882a593Smuzhiyunapplied. This is necessary to be able to use +git bisect+ afterwards. 229*4882a593Smuzhiyun 230*4882a593SmuzhiyunOf course, while you're doing your development, you're probably going 231*4882a593Smuzhiyunback and forth between packages, and certainly not committing things 232*4882a593Smuzhiyunimmediately in a way that is clean enough for submission. So most 233*4882a593Smuzhiyundevelopers rewrite the history of commits to produce a clean set of 234*4882a593Smuzhiyuncommits that is appropriate for submission. To do this, you need to 235*4882a593Smuzhiyunuse _interactive rebasing_. You can learn about it 236*4882a593Smuzhiyunhttps://git-scm.com/book/en/v2/Git-Tools-Rewriting-History[in the Pro 237*4882a593SmuzhiyunGit book]. Sometimes, it is even easier to discard you history with 238*4882a593Smuzhiyun+git reset --soft origin/master+ and select individual changes with 239*4882a593Smuzhiyun+git add -i+ or +git add -p+. 240*4882a593Smuzhiyun 241*4882a593SmuzhiyunFinally, the patch should be signed off. This is done by adding 242*4882a593Smuzhiyun+Signed-off-by: Your Real Name <your@email.address>+ at the end of the 243*4882a593Smuzhiyuncommit message. +git commit -s+ does that for you, if configured 244*4882a593Smuzhiyunproperly. The +Signed-off-by+ tag means that you publish the patch 245*4882a593Smuzhiyununder the Buildroot license (i.e. GPL-2.0+, except for package patches, 246*4882a593Smuzhiyunwhich have the upstream license), and that you are allowed to do so. 247*4882a593SmuzhiyunSee http://developercertificate.org/[the Developer Certificate of 248*4882a593SmuzhiyunOrigin] for details. 249*4882a593Smuzhiyun 250*4882a593SmuzhiyunWhen adding new packages, you should submit every package in a 251*4882a593Smuzhiyunseparate patch. This patch should have the update to 252*4882a593Smuzhiyun+package/Config.in+, the package +Config.in+ file, the +.mk+ file, the 253*4882a593Smuzhiyun+.hash+ file, any init script, and all package patches. If the package 254*4882a593Smuzhiyunhas many sub-options, these are sometimes better added as separate 255*4882a593Smuzhiyunfollow-up patches. The summary line should be something like 256*4882a593Smuzhiyun+<packagename>: new package+. The body of the commit message can be 257*4882a593Smuzhiyunempty for simple packages, or it can contain the description of the 258*4882a593Smuzhiyunpackage (like the Config.in help text). If anything special has to be 259*4882a593Smuzhiyundone to build the package, this should also be explained explicitly in 260*4882a593Smuzhiyunthe commit message body. 261*4882a593Smuzhiyun 262*4882a593SmuzhiyunWhen you bump a package to a new version, you should also submit a 263*4882a593Smuzhiyunseparate patch for each package. Don't forget to update the +.hash+ 264*4882a593Smuzhiyunfile, or add it if it doesn't exist yet. Also don't forget to check if 265*4882a593Smuzhiyunthe +_LICENSE+ and +_LICENSE_FILES+ are still valid. The summary line 266*4882a593Smuzhiyunshould be something like +<packagename>: bump to version <new 267*4882a593Smuzhiyunversion>+. If the new version only contains security updates compared 268*4882a593Smuzhiyunto the existing one, the summary should be +<packagename>: security 269*4882a593Smuzhiyunbump to version <new version>+ and the commit message body should show 270*4882a593Smuzhiyunthe CVE numbers that are fixed. If some package patches can be removed 271*4882a593Smuzhiyunin the new version, it should be explained explicitly why they can be 272*4882a593Smuzhiyunremoved, preferably with the upstream commit ID. Also any other 273*4882a593Smuzhiyunrequired changes should be explained explicitly, like configure 274*4882a593Smuzhiyunoptions that no longer exist or are no longer needed. 275*4882a593Smuzhiyun 276*4882a593SmuzhiyunIf you are interested in getting notified of build failures and of 277*4882a593Smuzhiyunfurther changes in the packages you added or modified, please add 278*4882a593Smuzhiyunyourself to the DEVELOPERS file. This should be done in the same patch 279*4882a593Smuzhiyuncreating or modifying the package. See xref:DEVELOPERS[the DEVELOPERS file] 280*4882a593Smuzhiyunfor more information. 281*4882a593Smuzhiyun 282*4882a593SmuzhiyunBuildroot provides a handy tool to check for common coding style 283*4882a593Smuzhiyunmistakes on files you created or modified, called +check-package+ (see 284*4882a593Smuzhiyunxref:check-package[] for more information). 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun==== Preparing a patch series 287*4882a593Smuzhiyun 288*4882a593SmuzhiyunStarting from the changes committed in your local git view, _rebase_ 289*4882a593Smuzhiyunyour development branch on top of the upstream tree before generating 290*4882a593Smuzhiyuna patch set. To do so, run: 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun--------------------- 293*4882a593Smuzhiyun$ git fetch --all --tags 294*4882a593Smuzhiyun$ git rebase origin/master 295*4882a593Smuzhiyun--------------------- 296*4882a593Smuzhiyun 297*4882a593SmuzhiyunNow, you are ready to generate then submit your patch set. 298*4882a593Smuzhiyun 299*4882a593SmuzhiyunTo generate it, run: 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun--------------------- 302*4882a593Smuzhiyun$ git format-patch -M -n -s -o outgoing origin/master 303*4882a593Smuzhiyun--------------------- 304*4882a593Smuzhiyun 305*4882a593SmuzhiyunThis will generate patch files in the +outgoing+ subdirectory, 306*4882a593Smuzhiyunautomatically adding the +Signed-off-by+ line. 307*4882a593Smuzhiyun 308*4882a593SmuzhiyunOnce patch files are generated, you can review/edit the commit message 309*4882a593Smuzhiyunbefore submitting them, using your favorite text editor. 310*4882a593Smuzhiyun 311*4882a593SmuzhiyunBuildroot provides a handy tool to know to whom your patches should be 312*4882a593Smuzhiyunsent, called +get-developers+ (see xref:DEVELOPERS[] for more 313*4882a593Smuzhiyuninformation). This tool reads your patches and outputs the appropriate 314*4882a593Smuzhiyun+git send-email+ command to use: 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun--------------------- 317*4882a593Smuzhiyun$ ./utils/get-developers outgoing/* 318*4882a593Smuzhiyun--------------------- 319*4882a593Smuzhiyun 320*4882a593SmuzhiyunUse the output of +get-developers+ to send your patches: 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun--------------------- 323*4882a593Smuzhiyun$ git send-email --to buildroot@buildroot.org --cc bob --cc alice outgoing/* 324*4882a593Smuzhiyun--------------------- 325*4882a593Smuzhiyun 326*4882a593SmuzhiyunAlternatively, +get-developers -e+ can be used directly with the 327*4882a593Smuzhiyun+--cc-cmd+ argument to +git send-email+ to automatically CC the 328*4882a593Smuzhiyunaffected developers: 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun--------------------- 331*4882a593Smuzhiyun$ git send-email --to buildroot@buildroot.org \ 332*4882a593Smuzhiyun --cc-cmd './utils/get-developers -e' origin/master 333*4882a593Smuzhiyun--------------------- 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun+git+ can be configured to automatically do this out of the box with: 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun--------------------- 338*4882a593Smuzhiyun$ git config sendemail.to buildroot@buildroot.org 339*4882a593Smuzhiyun$ git config sendemail.ccCmd "$(pwd)/utils/get-developers -e" 340*4882a593Smuzhiyun--------------------- 341*4882a593Smuzhiyun 342*4882a593SmuzhiyunAnd then just do: 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun--------------------- 345*4882a593Smuzhiyun$ git send-email origin/master 346*4882a593Smuzhiyun--------------------- 347*4882a593Smuzhiyun 348*4882a593SmuzhiyunNote that +git+ should be configured to use your mail account. 349*4882a593SmuzhiyunTo configure +git+, see +man git-send-email+ or google it. 350*4882a593Smuzhiyun 351*4882a593SmuzhiyunIf you do not use +git send-email+, make sure posted *patches are not 352*4882a593Smuzhiyunline-wrapped*, otherwise they cannot easily be applied. In such a case, 353*4882a593Smuzhiyunfix your e-mail client, or better yet, learn to use +git send-email+. 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun==== Cover letter 356*4882a593Smuzhiyun 357*4882a593SmuzhiyunIf you want to present the whole patch set in a separate mail, add 358*4882a593Smuzhiyun+--cover-letter+ to the +git format-patch+ command (see +man 359*4882a593Smuzhiyungit-format-patch+ for further information). This will generate a 360*4882a593Smuzhiyuntemplate for an introduction e-mail to your patch series. 361*4882a593Smuzhiyun 362*4882a593SmuzhiyunA 'cover letter' may be useful to introduce the changes you propose 363*4882a593Smuzhiyunin the following cases: 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun* large number of commits in the series; 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun* deep impact of the changes in the rest of the project; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun* RFC footnote:[RFC: (Request for comments) change proposal]; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun* whenever you feel it will help presenting your work, your choices, 372*4882a593Smuzhiyun the review process, etc. 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun==== Patches for maintenance branches 375*4882a593Smuzhiyun 376*4882a593SmuzhiyunWhen fixing bugs on a maintenance branch, bugs should be fixed on the 377*4882a593Smuzhiyunmaster branch first. The commit log for such a patch may then contain a 378*4882a593Smuzhiyunpost-commit note specifying what branches are affected: 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun---- 381*4882a593Smuzhiyunpackage/foo: fix stuff 382*4882a593Smuzhiyun 383*4882a593SmuzhiyunSigned-off-by: Your Real Name <your@email.address> 384*4882a593Smuzhiyun--- 385*4882a593SmuzhiyunBackport to: 2020.02.x, 2020.05.x 386*4882a593Smuzhiyun(2020.08.x not affected as the version was bumped) 387*4882a593Smuzhiyun---- 388*4882a593Smuzhiyun 389*4882a593SmuzhiyunThose changes will then be backported by a maintainer to the affected 390*4882a593Smuzhiyunbranches. 391*4882a593Smuzhiyun 392*4882a593SmuzhiyunHowever, some bugs may apply only to a specific release, for example 393*4882a593Smuzhiyunbecause it is using an older version of a package. In that case, patches 394*4882a593Smuzhiyunshould be based off the maintenance branch, and the patch subject prefix 395*4882a593Smuzhiyunmust include the maintenance branch name (for example "[PATCH 2020.02.x]"). 396*4882a593SmuzhiyunThis can be done with the +git format-patch+ flag +--subject-prefix+: 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun--------------------- 399*4882a593Smuzhiyun$ git format-patch --subject-prefix "PATCH 2020.02.x" \ 400*4882a593Smuzhiyun -M -s -o outgoing origin/2020.02.x 401*4882a593Smuzhiyun--------------------- 402*4882a593Smuzhiyun 403*4882a593SmuzhiyunThen send the patches with +git send-email+, as described above. 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun==== Patch revision changelog 406*4882a593Smuzhiyun 407*4882a593SmuzhiyunWhen improvements are requested, the new revision of each commit 408*4882a593Smuzhiyunshould include a changelog of the modifications between each 409*4882a593Smuzhiyunsubmission. Note that when your patch series is introduced by a cover 410*4882a593Smuzhiyunletter, an overall changelog may be added to the cover letter in 411*4882a593Smuzhiyunaddition to the changelog in the individual commits. 412*4882a593SmuzhiyunThe best thing to rework a patch series is by interactive rebasing: 413*4882a593Smuzhiyun+git rebase -i origin/master+. Consult the git manual for more 414*4882a593Smuzhiyuninformation. 415*4882a593Smuzhiyun 416*4882a593SmuzhiyunWhen added to the individual commits, this changelog is added when 417*4882a593Smuzhiyunediting the commit message. Below the +Signed-off-by+ section, add 418*4882a593Smuzhiyun+---+ and your changelog. 419*4882a593Smuzhiyun 420*4882a593SmuzhiyunAlthough the changelog will be visible for the reviewers in the mail 421*4882a593Smuzhiyunthread, as well as in http://patchwork.buildroot.org[patchwork], +git+ 422*4882a593Smuzhiyunwill automatically ignores lines below +---+ when the patch will be 423*4882a593Smuzhiyunmerged. This is the intended behavior: the changelog is not meant to 424*4882a593Smuzhiyunbe preserved forever in the +git+ history of the project. 425*4882a593Smuzhiyun 426*4882a593SmuzhiyunHereafter the recommended layout: 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun--------------- 429*4882a593SmuzhiyunPatch title: short explanation, max 72 chars 430*4882a593Smuzhiyun 431*4882a593SmuzhiyunA paragraph that explains the problem, and how it manifests itself. If 432*4882a593Smuzhiyunthe problem is complex, it is OK to add more paragraphs. All paragraphs 433*4882a593Smuzhiyunshould be wrapped at 72 characters. 434*4882a593Smuzhiyun 435*4882a593SmuzhiyunA paragraph that explains the root cause of the problem. Again, more 436*4882a593Smuzhiyunthan one paragraph is OK. 437*4882a593Smuzhiyun 438*4882a593SmuzhiyunFinally, one or more paragraphs that explain how the problem is solved. 439*4882a593SmuzhiyunDon't hesitate to explain complex solutions in detail. 440*4882a593Smuzhiyun 441*4882a593SmuzhiyunSigned-off-by: John DOE <john.doe@example.net> 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun--- 444*4882a593SmuzhiyunChanges v2 -> v3: 445*4882a593Smuzhiyun - foo bar (suggested by Jane) 446*4882a593Smuzhiyun - bar buz 447*4882a593Smuzhiyun 448*4882a593SmuzhiyunChanges v1 -> v2: 449*4882a593Smuzhiyun - alpha bravo (suggested by John) 450*4882a593Smuzhiyun - charly delta 451*4882a593Smuzhiyun--------------- 452*4882a593Smuzhiyun 453*4882a593SmuzhiyunAny patch revision should include the version number. The version number 454*4882a593Smuzhiyunis simply composed of the letter +v+ followed by an +integer+ greater or 455*4882a593Smuzhiyunequal to two (i.e. "PATCH v2", "PATCH v3" ...). 456*4882a593Smuzhiyun 457*4882a593SmuzhiyunThis can be easily handled with +git format-patch+ by using the option 458*4882a593Smuzhiyun+--subject-prefix+: 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun--------------------- 461*4882a593Smuzhiyun$ git format-patch --subject-prefix "PATCH v4" \ 462*4882a593Smuzhiyun -M -s -o outgoing origin/master 463*4882a593Smuzhiyun--------------------- 464*4882a593Smuzhiyun 465*4882a593SmuzhiyunSince git version 1.8.1, you can also use +-v <n>+ (where <n> is the 466*4882a593Smuzhiyunversion number): 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun--------------------- 469*4882a593Smuzhiyun$ git format-patch -v4 -M -s -o outgoing origin/master 470*4882a593Smuzhiyun--------------------- 471*4882a593Smuzhiyun 472*4882a593SmuzhiyunWhen you provide a new version of a patch, please mark the old one as 473*4882a593Smuzhiyunsuperseded in http://patchwork.buildroot.org[patchwork]. You need to 474*4882a593Smuzhiyuncreate an account on http://patchwork.buildroot.org[patchwork] to be 475*4882a593Smuzhiyunable to modify the status of your patches. Note that you can only change 476*4882a593Smuzhiyunthe status of patches you submitted yourself, which means the email 477*4882a593Smuzhiyunaddress you register in http://patchwork.buildroot.org[patchwork] should 478*4882a593Smuzhiyunmatch the one you use for sending patches to the mailing list. 479*4882a593Smuzhiyun 480*4882a593SmuzhiyunYou can also add the +--in-reply-to <message-id>+ option when 481*4882a593Smuzhiyunsubmitting a patch to the mailing list. The id of the mail to reply to 482*4882a593Smuzhiyuncan be found under the "Message Id" tag on 483*4882a593Smuzhiyunhttp://patchwork.buildroot.org[patchwork]. The advantage of 484*4882a593Smuzhiyun*in-reply-to* is that patchwork will automatically mark the previous 485*4882a593Smuzhiyunversion of the patch as superseded. 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun[[reporting-bugs]] 488*4882a593Smuzhiyun=== Reporting issues/bugs or getting help 489*4882a593Smuzhiyun 490*4882a593SmuzhiyunBefore reporting any issue, please check in 491*4882a593Smuzhiyunxref:community-resources[the mailing list archive] whether someone has 492*4882a593Smuzhiyunalready reported and/or fixed a similar problem. 493*4882a593Smuzhiyun 494*4882a593SmuzhiyunHowever you choose to report bugs or get help, either by 495*4882a593Smuzhiyunopening a bug in the xref:community-resources[bug tracker] or by 496*4882a593Smuzhiyunxref:community-resources[sending a mail to the mailing list], there are 497*4882a593Smuzhiyuna number of details to provide in order to help people reproduce and 498*4882a593Smuzhiyunfind a solution to the issue. 499*4882a593Smuzhiyun 500*4882a593SmuzhiyunTry to think as if you were trying to help someone else; in 501*4882a593Smuzhiyunthat case, what would you need? 502*4882a593Smuzhiyun 503*4882a593SmuzhiyunHere is a short list of details to provide in such case: 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun* host machine (OS/release) 506*4882a593Smuzhiyun* version of Buildroot 507*4882a593Smuzhiyun* target for which the build fails 508*4882a593Smuzhiyun* package(s) for which the build fails 509*4882a593Smuzhiyun* the command that fails and its output 510*4882a593Smuzhiyun* any information you think that may be relevant 511*4882a593Smuzhiyun 512*4882a593SmuzhiyunAdditionally, you should add the +.config+ file (or if you know how, a 513*4882a593Smuzhiyun+defconfig+; see xref:customize-store-buildroot-config[]). 514*4882a593Smuzhiyun 515*4882a593SmuzhiyunIf some of these details are too large, do not hesitate to use a 516*4882a593Smuzhiyunpastebin service. Note that not all available pastebin services will 517*4882a593Smuzhiyunpreserve Unix-style line terminators when downloading raw pastes. 518*4882a593SmuzhiyunFollowing pastebin services are known to work correctly: 519*4882a593Smuzhiyun- https://gist.github.com/ 520*4882a593Smuzhiyun- http://code.bulix.org/ 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun=== Using the runtime tests framework 523*4882a593Smuzhiyun 524*4882a593SmuzhiyunBuildroot includes a run-time testing framework built upon Python 525*4882a593Smuzhiyunscripting and QEMU runtime execution. The goals of the framework are 526*4882a593Smuzhiyunthe following: 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun* build a well defined Buildroot configuration 529*4882a593Smuzhiyun* optionally, verify some properties of the build output 530*4882a593Smuzhiyun* optionally, boot the build results under Qemu, and verify that a 531*4882a593Smuzhiyun given feature is working as expected 532*4882a593Smuzhiyun 533*4882a593SmuzhiyunThe entry point to use the runtime tests framework is the 534*4882a593Smuzhiyun+support/testing/run-tests+ tool, which has a series of options 535*4882a593Smuzhiyundocumented in the tool's help '-h' description. Some common options 536*4882a593Smuzhiyuninclude setting the download folder, the output folder, keeping build 537*4882a593Smuzhiyunoutput, and for multiple test cases, you can set the JLEVEL for each. 538*4882a593Smuzhiyun 539*4882a593SmuzhiyunHere is an example walk through of running a test case. 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun* For a first step, let us see what all the test case options are. The test 542*4882a593Smuzhiyuncases can be listed by executing +support/testing/run-tests -l+. These tests 543*4882a593Smuzhiyuncan all be run individually during test development from the console. Both 544*4882a593Smuzhiyunone at a time and selectively as a group of a subset of tests. 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun--------------------- 547*4882a593Smuzhiyun$ support/testing/run-tests -l 548*4882a593SmuzhiyunList of tests 549*4882a593Smuzhiyuntest_run (tests.utils.test_check_package.TestCheckPackage) 550*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainBuildrootMusl) ... ok 551*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainBuildrootuClibc) ... ok 552*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainCCache) ... ok 553*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainCtngMusl) ... ok 554*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainLinaroArm) ... ok 555*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainSourceryArmv4) ... ok 556*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainSourceryArmv5) ... ok 557*4882a593Smuzhiyuntest_run (tests.toolchain.test_external.TestExternalToolchainSourceryArmv7) ... ok 558*4882a593Smuzhiyun[snip] 559*4882a593Smuzhiyuntest_run (tests.init.test_systemd.TestInitSystemSystemdRoFull) ... ok 560*4882a593Smuzhiyuntest_run (tests.init.test_systemd.TestInitSystemSystemdRoIfupdown) ... ok 561*4882a593Smuzhiyuntest_run (tests.init.test_systemd.TestInitSystemSystemdRoNetworkd) ... ok 562*4882a593Smuzhiyuntest_run (tests.init.test_systemd.TestInitSystemSystemdRwFull) ... ok 563*4882a593Smuzhiyuntest_run (tests.init.test_systemd.TestInitSystemSystemdRwIfupdown) ... ok 564*4882a593Smuzhiyuntest_run (tests.init.test_systemd.TestInitSystemSystemdRwNetworkd) ... ok 565*4882a593Smuzhiyuntest_run (tests.init.test_busybox.TestInitSystemBusyboxRo) ... ok 566*4882a593Smuzhiyuntest_run (tests.init.test_busybox.TestInitSystemBusyboxRoNet) ... ok 567*4882a593Smuzhiyuntest_run (tests.init.test_busybox.TestInitSystemBusyboxRw) ... ok 568*4882a593Smuzhiyuntest_run (tests.init.test_busybox.TestInitSystemBusyboxRwNet) ... ok 569*4882a593Smuzhiyun 570*4882a593SmuzhiyunRan 157 tests in 0.021s 571*4882a593Smuzhiyun 572*4882a593SmuzhiyunOK 573*4882a593Smuzhiyun--------------------- 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun* Then, to run one test case: 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun--------------------- 578*4882a593Smuzhiyun$ support/testing/run-tests -d dl -o output_folder -k tests.init.test_busybox.TestInitSystemBusyboxRw 579*4882a593Smuzhiyun15:03:26 TestInitSystemBusyboxRw Starting 580*4882a593Smuzhiyun15:03:28 TestInitSystemBusyboxRw Building 581*4882a593Smuzhiyun15:08:18 TestInitSystemBusyboxRw Building done 582*4882a593Smuzhiyun15:08:27 TestInitSystemBusyboxRw Cleaning up 583*4882a593Smuzhiyun. 584*4882a593SmuzhiyunRan 1 test in 301.140s 585*4882a593Smuzhiyun 586*4882a593SmuzhiyunOK 587*4882a593Smuzhiyun--------------------- 588*4882a593Smuzhiyun 589*4882a593SmuzhiyunThe standard output indicates if the test is successful or not. By 590*4882a593Smuzhiyundefault, the output folder for the test is deleted automatically 591*4882a593Smuzhiyununless the option +-k+ is passed to *keep* the output directory. 592*4882a593Smuzhiyun 593*4882a593Smuzhiyun==== Creating a test case 594*4882a593Smuzhiyun 595*4882a593SmuzhiyunWithin the Buildroot repository, the testing framework is organized at the 596*4882a593Smuzhiyuntop level in +support/testing/+ by folders of +conf+, +infra+ and +tests+. 597*4882a593SmuzhiyunAll the test cases live under the +tests+ folder and are organized in various 598*4882a593Smuzhiyunfolders representing the category of test. 599*4882a593Smuzhiyun 600*4882a593SmuzhiyunThe best way to get familiar with how to create a test case is to look 601*4882a593Smuzhiyunat a few of the basic file system +support/testing/tests/fs/+ and init 602*4882a593Smuzhiyun+support/testing/tests/init/+ test scripts. Those tests give good 603*4882a593Smuzhiyunexamples of a basic tests that include both checking the build 604*4882a593Smuzhiyunresults, and doing runtime tests. There are other more advanced cases 605*4882a593Smuzhiyunthat use things like nested +br2-external+ folders to provide 606*4882a593Smuzhiyunskeletons and additional packages. 607*4882a593Smuzhiyun 608*4882a593SmuzhiyunCreating a basic test case involves: 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun* Defining a test class that inherits from +infra.basetest.BRTest+ 611*4882a593Smuzhiyun 612*4882a593Smuzhiyun* Defining the +config+ member of the test class, to the Buildroot 613*4882a593Smuzhiyun configuration to build for this test case. It can optionally rely on 614*4882a593Smuzhiyun configuration snippets provided by the runtime test infrastructure: 615*4882a593Smuzhiyun +infra.basetest.BASIC_TOOLCHAIN_CONFIG+ to get a basic 616*4882a593Smuzhiyun architecture/toolchain configuration, and 617*4882a593Smuzhiyun +infra.basetest.MINIMAL_CONFIG+ to not build any filesystem. The 618*4882a593Smuzhiyun advantage of using +infra.basetest.BASIC_TOOLCHAIN_CONFIG+ is that a 619*4882a593Smuzhiyun matching Linux kernel image is provided, which allows to boot the 620*4882a593Smuzhiyun resulting image in Qemu without having to build a Linux kernel image 621*4882a593Smuzhiyun as part of the test case, therefore significant decreasing the build 622*4882a593Smuzhiyun time required for the test case. 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun* Implementing a +def test_run(self):+ function to implement the 625*4882a593Smuzhiyun actual tests to run after the build has completed. They may be tests 626*4882a593Smuzhiyun that verify the build output, by running command on the host using 627*4882a593Smuzhiyun the +run_cmd_on_host()+ helper function. Or they may boot the 628*4882a593Smuzhiyun generated system in Qemu using the +Emulator+ object available as 629*4882a593Smuzhiyun +self.emulator+ in the test case. For example +self.emulator.boot()+ 630*4882a593Smuzhiyun allows to boot the system in Qemu, +self.emulator.login()+ allows to 631*4882a593Smuzhiyun login, +self.emulator.run()+ allows to run shell commands inside 632*4882a593Smuzhiyun Qemu. 633*4882a593Smuzhiyun 634*4882a593SmuzhiyunAfter creating the test script, add yourself to the +DEVELOPERS+ file to 635*4882a593Smuzhiyunbe the maintainer of that test case. 636*4882a593Smuzhiyun 637*4882a593Smuzhiyun==== Debugging a test case 638*4882a593Smuzhiyun 639*4882a593SmuzhiyunWhen a test case runs, the +output_folder+ will contain the following: 640*4882a593Smuzhiyun 641*4882a593Smuzhiyun--------------------- 642*4882a593Smuzhiyun$ ls output_folder/ 643*4882a593SmuzhiyunTestInitSystemBusyboxRw/ 644*4882a593SmuzhiyunTestInitSystemBusyboxRw-build.log 645*4882a593SmuzhiyunTestInitSystemBusyboxRw-run.log 646*4882a593Smuzhiyun--------------------- 647*4882a593Smuzhiyun 648*4882a593Smuzhiyun+TestInitSystemBusyboxRw/+ is the Buildroot output directory, and it 649*4882a593Smuzhiyunis preserved only if the +-k+ option is passed. 650*4882a593Smuzhiyun 651*4882a593Smuzhiyun+TestInitSystemBusyboxRw-build.log+ is the log of the Buildroot build. 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun+TestInitSystemBusyboxRw-run.log+ is the log of the Qemu boot and 654*4882a593Smuzhiyuntest. This file will only exist if the build was successful and the 655*4882a593Smuzhiyuntest case involves booting under Qemu. 656*4882a593Smuzhiyun 657*4882a593SmuzhiyunIf you want to manually run Qemu to do manual tests of the build 658*4882a593Smuzhiyunresult, the first few lines of +TestInitSystemBusyboxRw-run.log+ 659*4882a593Smuzhiyuncontain the Qemu command line to use. 660*4882a593Smuzhiyun 661*4882a593SmuzhiyunYou can also make modifications to the current sources inside the 662*4882a593Smuzhiyun+output_folder+ (e.g. for debug purposes) and rerun the standard 663*4882a593SmuzhiyunBuildroot make targets (in order to regenerate the complete image with 664*4882a593Smuzhiyunthe new modifications) and then rerun the test. 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun==== Runtime tests and Gitlab CI 667*4882a593Smuzhiyun 668*4882a593SmuzhiyunAll runtime tests are regularly executed by Buildroot Gitlab CI 669*4882a593Smuzhiyuninfrastructure, see .gitlab.yml and 670*4882a593Smuzhiyunhttps://gitlab.com/buildroot.org/buildroot/-/jobs. 671*4882a593Smuzhiyun 672*4882a593SmuzhiyunYou can also use Gitlab CI to test your new test cases, or verify that 673*4882a593Smuzhiyunexisting tests continue to work after making changes in Buildroot. 674*4882a593Smuzhiyun 675*4882a593SmuzhiyunIn order to achieve this, you need to create a fork of the Buildroot 676*4882a593Smuzhiyunproject on Gitlab, and be able to push branches to your Buildroot fork 677*4882a593Smuzhiyunon Gitlab. 678*4882a593Smuzhiyun 679*4882a593SmuzhiyunThe name of the branch that you push will determine if a Gitlab CI 680*4882a593Smuzhiyunpipeline will be triggered or not, and for which test cases. 681*4882a593Smuzhiyun 682*4882a593SmuzhiyunIn the examples below, the <name> component of the branch name is an 683*4882a593Smuzhiyunarbitrary string you choose. 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun* To trigger all run-test test case jobs, push a branch that ends with 686*4882a593Smuzhiyun +-runtime-tests+: 687*4882a593Smuzhiyun 688*4882a593Smuzhiyun--------------------- 689*4882a593Smuzhiyun $ git push gitlab HEAD:<name>-runtime-tests 690*4882a593Smuzhiyun--------------------- 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun* To trigger one or several test case jobs, push a branch that ends 693*4882a593Smuzhiyun with the complete test case name 694*4882a593Smuzhiyun (+tests.init.test_busybox.TestInitSystemBusyboxRo+) or with the name 695*4882a593Smuzhiyun of a category of tests (+tests.init.test_busybox+): 696*4882a593Smuzhiyun 697*4882a593Smuzhiyun--------------------- 698*4882a593Smuzhiyun $ git push gitlab HEAD:<name>-<test case name> 699*4882a593Smuzhiyun--------------------- 700*4882a593Smuzhiyun 701*4882a593SmuzhiyunExample to run one test: 702*4882a593Smuzhiyun 703*4882a593Smuzhiyun--------------------- 704*4882a593Smuzhiyun $ git push gitlab HEAD:foo-tests.init.test_busybox.TestInitSystemBusyboxRo 705*4882a593Smuzhiyun--------------------- 706*4882a593Smuzhiyun 707*4882a593SmuzhiyunExamples to run several tests part of the same group: 708*4882a593Smuzhiyun 709*4882a593Smuzhiyun--------------------- 710*4882a593Smuzhiyun $ git push gitlab HEAD:foo-tests.init.test_busybox 711*4882a593Smuzhiyun $ git push gitlab HEAD:foo-tests.init 712*4882a593Smuzhiyun--------------------- 713