xref: /OK3568_Linux_fs/buildroot/docs/manual/contribute.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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