This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perlrepository.pod: Elaborate -a, -m
[perl5.git] / pod / perlrepository.pod
CommitLineData
49781f4a
AB
1=encoding utf8
2
0549aefb
LB
3=for comment
4Consistent formatting of this file is achieved with:
5 perl ./Porting/podtidy pod/perlrepository.pod
6
d7dd28b6
LB
7=head1 NAME
8
9perlrepository - Using the Perl source repository
10
11=head1 SYNOPSIS
12
dc3c3040 13All of Perl's source code is kept centrally in a Git repository at
c26da522
LB
14I<perl5.git.perl.org>. The repository contains many Perl revisions from
15Perl 1 onwards and all the revisions from Perforce, the version control
16system we were using previously. This repository is accessible in
17different ways.
d7dd28b6
LB
18
19The full repository takes up about 80MB of disk space. A check out of
7f4ffa9d 20the blead branch (that is, the main development branch, which contains
6a7cbfe8
LB
21bleadperl, the development version of perl 5) takes up about 160MB of
22disk space (including the repository). A build of bleadperl takes up
23about 200MB (including the repository and the check out).
d7dd28b6 24
ba336be1 25=head1 Getting access to the repository
d7dd28b6 26
ba336be1 27=head2 Read access via the web
d7dd28b6 28
dc3c3040
GA
29You may access the repository over the web. This allows you to browse
30the tree, see recent commits, subscribe to RSS feeds for the changes,
31search for particular commits and more. You may access it at:
d7dd28b6
LB
32
33 http://perl5.git.perl.org/perl.git
34
dc3c3040
GA
35A mirror of the repository is found at:
36
45b194c5 37 http://github.com/mirrors/perl
dc3c3040 38
ba336be1 39=head2 Read access via Git
d7dd28b6
LB
40
41You will need a copy of Git for your computer. You can fetch a copy of
42the repository using the Git protocol (which uses port 9418):
43
e0b2b458 44 % git clone git://perl5.git.perl.org/perl.git perl-git
d7dd28b6 45
f755e97d 46This clones the repository and makes a local copy in the F<perl-git>
d7dd28b6
LB
47directory.
48
49If your local network does not allow you to use port 9418, then you can
cf5e7595 50fetch a copy of the repository over HTTP (this is at least 4x slower):
d7dd28b6 51
e0b2b458 52 % git clone http://perl5.git.perl.org/perl.git perl-http
d7dd28b6 53
f755e97d 54This clones the repository and makes a local copy in the F<perl-http>
d7dd28b6
LB
55directory.
56
ba336be1 57=head2 Write access to the repository
d7dd28b6 58
6acba58e
LB
59If you are a committer, then you can fetch a copy of the repository
60that you can push back on with:
d7dd28b6 61
e0b2b458 62 % git clone ssh://perl5.git.perl.org/perl.git perl-ssh
d7dd28b6 63
8f718e95 64This clones the repository and makes a local copy in the F<perl-ssh>
d7dd28b6
LB
65directory.
66
c26da522 67If you cloned using the git protocol, which is faster than ssh, then
11ed6e28 68you will need to modify the URL for the origin remote to enable
77db6475 69pushing. To do that edit F<.git/config> with git-config(1) like this:
1a0f15d5 70
e0b2b458 71 % git config remote.origin.url ssh://perl5.git.perl.org/perl.git
d7dd28b6 72
9d77ce3f
AB
73You can also set up your user name and e-mail address. Most people do
74this once globally in their F<~/.gitconfig> by doing something like:
184487f0 75
9d77ce3f
AB
76 % git config --global user.name "Ævar Arnfjörð Bjarmason"
77 % git config --global user.email avarab@gmail.com
78
79However if you'd like to override that just for perl then execute then
80execute something like the following in F<perl-git>:
81
82 % git config user.email avar@cpan.org
184487f0 83
6acba58e
LB
84It is also possible to keep C<origin> as a git remote, and add a new
85remote for ssh access:
f6c12373 86
dc3c3040 87 % git remote add camel perl5.git.perl.org:/perl.git
f6c12373 88
6acba58e 89This allows you to update your local repository by pulling from
f755e97d 90C<origin>, which is faster and doesn't require you to authenticate, and
6acba58e 91to push your changes back with the C<camel> remote:
f6c12373
VP
92
93 % git fetch camel
94 % git push camel
95
6acba58e
LB
96The C<fetch> command just updates the C<camel> refs, as the objects
97themselves should have been fetched when pulling from C<origin>.
f6c12373 98
ba336be1 99=head2 A note on camel and dromedary
3482f01a
DK
100
101The committers have SSH access to the two servers that serve
333f8875
VP
102C<perl5.git.perl.org>. One is C<perl5.git.perl.org> itself (I<camel>),
103which is the 'master' repository. The second one is
104C<users.perl5.git.perl.org> (I<dromedary>), which can be used for
105general testing and development. Dromedary syncs the git tree from
106camel every few minutes, you should not push there. Both machines also
3482f01a
DK
107have a full CPAN mirror in /srv/CPAN, please use this. To share files
108with the general public, dromedary serves your ~/public_html/ as
333f8875 109C<http://users.perl5.git.perl.org/~yourlogin/>
b47aa495 110
3482f01a
DK
111These hosts have fairly strict firewalls to the outside. Outgoing, only
112rsync, ssh and git are allowed. For http and ftp, you can use
113http://webproxy:3128 as proxy. Incoming, the firewall tries to detect
114attacks and blocks IP addresses with suspicious activity. This
115sometimes (but very rarely) has false positives and you might get
116blocked. The quickest way to get unblocked is to notify the admins.
117
118These two boxes are owned, hosted, and operated by booking.com. You can
119reach the sysadmins in #p5p on irc.perl.org or via mail to
120C<perl5-porters@perl.org>
121
ba336be1 122=head1 Overview of the repository
d7dd28b6 123
6acba58e
LB
124Once you have changed into the repository directory, you can inspect
125it.
d7dd28b6 126
39219fd3 127After a clone the repository will contain a single local branch, which
50eca761 128will be the current branch as well, as indicated by the asterisk.
39219fd3
YO
129
130 % git branch
131 * blead
132
f755e97d 133Using the -a switch to C<branch> will also show the remote tracking
6acba58e 134branches in the repository:
39219fd3 135
d9847473 136 % git branch -a
09081495 137 * blead
d7dd28b6
LB
138 origin/HEAD
139 origin/blead
140 ...
141
6acba58e
LB
142The branches that begin with "origin" correspond to the "git remote"
143that you cloned from (which is named "origin"). Each branch on the
144remote will be exactly tracked by theses branches. You should NEVER do
145work on these remote tracking branches. You only ever do work in a
146local branch. Local branches can be configured to automerge (on pull)
147from a designated remote tracking branch. This is the case with the
148default branch C<blead> which will be configured to merge from the
149remote tracking branch C<origin/blead>.
39219fd3 150
d7dd28b6
LB
151You can see recent commits:
152
c2cf2042 153 % git log
d7dd28b6 154
6acba58e
LB
155And pull new changes from the repository, and update your local
156repository (must be clean first)
d7dd28b6
LB
157
158 % git pull
09081495 159
6acba58e
LB
160Assuming we are on the branch C<blead> immediately after a pull, this
161command would be more or less equivalent to:
39219fd3
YO
162
163 % git fetch
164 % git merge origin/blead
165
6acba58e
LB
166In fact if you want to update your local repository without touching
167your working directory you do:
39219fd3
YO
168
169 % git fetch
170
6acba58e
LB
171And if you want to update your remote-tracking branches for all defined
172remotes simultaneously you can do
39219fd3
YO
173
174 % git remote update
175
6acba58e
LB
176Neither of these last two commands will update your working directory,
177however both will update the remote-tracking branches in your
178repository.
39219fd3 179
6051489b
NC
180To make a local branch of a remote branch:
181
182 % git checkout -b maint-5.10 origin/maint-5.10
183
09081495
LB
184To switch back to blead:
185
186 % git checkout blead
c2cf2042 187
ba336be1 188=head2 Finding out your status
39219fd3
YO
189
190The most common git command you will use will probably be
191
192 % git status
193
6acba58e
LB
194This command will produce as output a description of the current state
195of the repository, including modified files and unignored untracked
196files, and in addition it will show things like what files have been
197staged for the next commit, and usually some useful information about
198how to change things. For instance the following:
39219fd3
YO
199
200 $ git status
201 # On branch blead
202 # Your branch is ahead of 'origin/blead' by 1 commit.
203 #
204 # Changes to be committed:
205 # (use "git reset HEAD <file>..." to unstage)
206 #
207 # modified: pod/perlrepository.pod
208 #
209 # Changed but not updated:
210 # (use "git add <file>..." to update what will be committed)
211 #
212 # modified: pod/perlrepository.pod
213 #
214 # Untracked files:
215 # (use "git add <file>..." to include in what will be committed)
216 #
217 # deliberate.untracked
218
6acba58e
LB
219This shows that there were changes to this document staged for commit,
220and that there were further changes in the working directory not yet
221staged. It also shows that there was an untracked file in the working
222directory, and as you can see shows how to change all of this. It also
0549aefb
LB
223shows that there is one commit on the working branch C<blead> which has
224not been pushed to the C<origin> remote yet. B<NOTE>: that this output
225is also what you see as a template if you do not provide a message to
226C<git commit>.
7f6effc7 227
77db6475
LB
228Assuming that you'd like to commit all the changes you've just made as
229a a single atomic unit, run this command:
bdaf0bc6
JV
230
231 % git commit -a
232
233(That C<-a> tells git to add every file you've changed to this commit.
77db6475
LB
234New files aren't automatically added to your commit when you use
235C<commit -a> If you want to add files or to commit some, but not all of
236your changes, have a look at the documentation for C<git add>.)
bdaf0bc6 237
e9360695 238Git will start up your favorite text editor, so that you can craft a
bdaf0bc6
JV
239commit message for your change. See L</Commit message> below for more
240information about what makes a good commit message.
241
77db6475
LB
242Once you've finished writing your commit message and exited your
243editor, git will write your change to disk and tell you something like
244this:
7f6effc7 245
7f6effc7
YO
246 Created commit daf8e63: explain git status and stuff about remotes
247 1 files changed, 83 insertions(+), 3 deletions(-)
248
bdaf0bc6
JV
249
250If you re-run C<git status>, you should see something like this:
7f6effc7
YO
251
252 % git status
253 # On branch blead
254 # Your branch is ahead of 'origin/blead' by 2 commits.
255 #
256 # Untracked files:
257 # (use "git add <file>..." to include in what will be committed)
258 #
259 # deliberate.untracked
260 nothing added to commit but untracked files present (use "git add" to track)
261
39219fd3 262
6acba58e
LB
263When in doubt, before you do anything else, check your status and read
264it carefully, many questions are answered directly by the git status
265output.
39219fd3 266
ba336be1 267=head1 Submitting a patch
c2cf2042
LB
268
269If you have a patch in mind for Perl, you should first get a copy of
270the repository:
271
272 % git clone git://perl5.git.perl.org/perl.git perl-git
273
274Then change into the directory:
275
276 % cd perl-git
277
6acba58e
LB
278Alternatively, if you already have a Perl repository, you should ensure
279that you're on the I<blead> branch, and your repository is up to date:
12322d22
A
280
281 % git checkout blead
282 % git pull
283
6a7cbfe8
LB
284It's preferable to patch against the latest blead version, since this
285is where new development occurs for all changes other than critical bug
286fixes. Critical bug fix patches should be made against the relevant
7f4ffa9d
RS
287maint branches, or should be submitted with a note indicating all the
288branches where the fix should be applied.
a44f43ac 289
6acba58e
LB
290Now that we have everything up to date, we need to create a temporary
291new branch for these changes and switch into it:
b1fccde5 292
a9b05323 293 % git checkout -b orange
23f8d33e 294
a9b05323
YO
295which is the short form of
296
b1fccde5
LB
297 % git branch orange
298 % git checkout orange
299
0c24b290
AB
300Creating a topic branch makes it easier for the maintainers to rebase
301or merge back into the master blead for a more linear history. If you
77db6475
LB
302don't work on a topic branch the maintainer has to manually cherry pick
303your changes onto blead before they can be applied.
0c24b290 304
77db6475 305That'll get you scolded on perl5-porters, so don't do that. Be Awesome.
0c24b290 306
c2cf2042
LB
307Then make your changes. For example, if Leon Brocard changes his name
308to Orange Brocard, we should change his name in the AUTHORS file:
309
310 % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
311
312You can see what files are changed:
313
314 % git status
f755e97d 315 # On branch orange
c2cf2042
LB
316 # Changes to be committed:
317 # (use "git reset HEAD <file>..." to unstage)
318 #
2699d634 319 # modified: AUTHORS
c2cf2042
LB
320 #
321
c2cf2042
LB
322And you can see the changes:
323
324 % git diff
325 diff --git a/AUTHORS b/AUTHORS
326 index 293dd70..722c93e 100644
327 --- a/AUTHORS
328 +++ b/AUTHORS
7df2e4bc 329 @@ -541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
c2cf2042
LB
330 Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
331 Leif Huhn <leif@hale.dkstat.com>
332 Len Johnson <lenjay@ibm.net>
333 -Leon Brocard <acme@astray.com>
334 +Orange Brocard <acme@astray.com>
335 Les Peters <lpeters@aol.net>
336 Lesley Binks <lesley.binks@gmail.com>
337 Lincoln D. Stein <lstein@cshl.org>
338
339Now commit your change locally:
340
dc3c3040 341 % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
c2cf2042
LB
342 Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
343 1 files changed, 1 insertions(+), 1 deletions(-)
344
2be70973
KW
345The C<-a> option is used to include all files that git tracks that you have
346changed. If at this time, you only want to commit some of the files you have
347worked on, you can omit the C<-a> and use the command C<S<git add I<FILE ...>>>
348before doing the commit. C<S<git add --interactive>> allows you to even just
349commit portions of files instead of all the changes in them.
350
351The C<-m> option is used to specify the commit message. If you omit it, git
352will open a text editor for you to compose the message interactively. This
353is useful when the changes are more complex than the sample given here, and,
354depending on the editor, to know that the first line of the commit message
355doesn't exceed the 50 character legal maximum.
356
dc3c3040
GA
357You can examine your last commit with:
358
359 % git show HEAD
360
361and if you are not happy with either the description or the patch
c26da522 362itself you can fix it up by editing the files once more and then issue:
dc3c3040
GA
363
364 % git commit -a --amend
365
c2cf2042
LB
366Now you should create a patch file for all your local changes:
367
f15b1f22 368 % git format-patch -M origin..
c2cf2042
LB
369 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
370
dce3ee48
AB
371You should now send an email to to
372L<perlbug@perl.org|mailto:perlbug@perl.org> with a description of your
373changes, and include this patch file as an attachment. In addition to
77db6475
LB
374being tracked by RT, mail to perlbug will automatically be forwarded to
375perl5-porters. You should only send patches to
dce3ee48
AB
376L<perl5-porters@perl.org|mailto:perl5-porters@perl.org> directly if the
377patch is not ready to be applied, but intended for discussion.
64a8e22b
AB
378
379See the next section for how to configure and use git to send these
380emails for you.
c2cf2042 381
b1fccde5
LB
382If you want to delete your temporary branch, you may do so with:
383
384 % git checkout blead
385 % git branch -d orange
386 error: The branch 'orange' is not an ancestor of your current HEAD.
387 If you are sure you want to delete it, run 'git branch -D orange'.
388 % git branch -D orange
389 Deleted branch orange.
7df2e4bc 390
2d5f1d01
DG
391=head2 Using git to send patch emails
392
64a8e22b
AB
393In your ~/git/perl repository, set the destination email to perl's bug
394tracker:
395
396 $ git config sendemail.to perlbug@perl.org
397
398Or maybe perl5-porters (discussed above):
2d5f1d01
DG
399
400 $ git config sendemail.to perl5-porters@perl.org
401
402Then you can use git directly to send your patch emails:
403
404 $ git send-email 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
405
333f8875
VP
406You may need to set some configuration variables for your particular
407email service provider. For example, to set your global git config to
408send email via a gmail account:
2d5f1d01
DG
409
410 $ git config --global sendemail.smtpserver smtp.gmail.com
411 $ git config --global sendemail.smtpssl 1
412 $ git config --global sendemail.smtpuser YOURUSERNAME@gmail.com
413
333f8875
VP
414With this configuration, you will be prompted for your gmail password
415when you run 'git send-email'. You can also configure
416C<sendemail.smtppass> with your password if you don't care about having
417your password in the .gitconfig file.
2d5f1d01 418
a44f43ac
RGS
419=head2 A note on derived files
420
421Be aware that many files in the distribution are derivative--avoid
0549aefb
LB
422patching them, because git won't see the changes to them, and the build
423process will overwrite them. Patch the originals instead. Most
424utilities (like perldoc) are in this category, i.e. patch
77db6475
LB
425F<utils/perldoc.PL> rather than F<utils/perldoc>. Similarly, don't
426create patches for files under $src_root/ext from their copies found in
0549aefb
LB
427$install_root/lib. If you are unsure about the proper location of a
428file that may have gotten copied while building the source
429distribution, consult the C<MANIFEST>.
a44f43ac 430
ac1cbfb0
JC
431As a special case, several files are regenerated by 'make regen' if
432your patch alters C<embed.fnc>. These are needed for compilation, but
433are included in the distribution so that you can build perl without
434needing another perl to generate the files. You must test with these
77db6475
LB
435regenerated files, but it is preferred that you instead note that 'make
436regen is needed' in both the email and the commit message, and submit
437your patch without them. If you're submitting a series of patches, it
438might be best to submit the regenerated changes immediately after the
439source-changes that caused them, so as to have as little effect as
440possible on the bisectability of your patchset.
ac1cbfb0 441
6e2cec71 442=for XXX
6e2cec71 443What should we recommend about binary files now? Do we need anything?
a44f43ac
RGS
444
445=head2 Getting your patch accepted
446
77db6475
LB
447If you are submitting a code patch there are several things that you
448need to do.
a44f43ac
RGS
449
450=over 4
451
bdaf0bc6
JV
452=item Commit message
453
454As you craft each patch you intend to submit to the Perl core, it's
455important to write a good commit message.
456
1a5f98ea 457The first line of the commit message should be a short description and
77db6475
LB
458should skip the full stop. It should be no longer than the subject line
459of an E-Mail, 50 characters being a good rule of thumb.
1a5f98ea
AB
460
461A lot of Git tools (Gitweb, GitHub, git log --pretty=oneline, ..) will
462only display the first line (cut off at 50 characters) when presenting
463commit summaries.
464
465The commit message should include description of the problem that the
466patch corrects or new functionality that the patch adds.
bdaf0bc6 467
bdaf0bc6 468As a general rule of thumb, your commit message should let a programmer
77db6475
LB
469with a reasonable familiarity with the Perl core quickly understand
470what you were trying to do, how you were trying to do it and why the
471change matters to Perl.
bdaf0bc6
JV
472
473=over 4
474
475=item What
476
ac1cbfb0
JC
477Your commit message should describe what part of the Perl core you're
478changing and what you expect your patch to do.
bdaf0bc6
JV
479
480=item Why
481
482Perhaps most importantly, your commit message should describe why the
483change you are making is important. When someone looks at your change
484in six months or six years, your intent should be clear. If you're
485deprecating a feature with the intent of later simplifying another bit
486of code, say so. If you're fixing a performance problem or adding a new
487feature to support some other bit of the core, mention that.
488
489=item How
490
491While it's not necessary for documentation changes, new tests or
492trivial patches, it's often worth explaining how your change works.
493Even if it's clear to you today, it may not be clear to a porter next
494month or next year.
495
496=back
497
ea9c0d74
JV
498A commit message isn't intended to take the place of comments in your
499code. Commit messages should describe the change you made, while code
80a0006a
JV
500comments should describe the current state of the code. If you've just
501implemented a new feature, complete with doc, tests and well-commented
502code, a brief commit message will often suffice. If, however, you've
503just changed a single character deep in the parser or lexer, you might
ea9c0d74
JV
504need to write a small novel to ensure that future readers understand
505what you did and why you did it.
506
a44f43ac
RGS
507=item Comments, Comments, Comments
508
0549aefb
LB
509Be sure to adequately comment your code. While commenting every line
510is unnecessary, anything that takes advantage of side effects of
a44f43ac 511operators, that creates changes that will be felt outside of the
0549aefb
LB
512function being patched, or that others may find confusing should be
513documented. If you are going to err, it is better to err on the side
514of adding too many comments than too few.
a44f43ac
RGS
515
516=item Style
517
0549aefb
LB
518In general, please follow the particular style of the code you are
519patching.
a44f43ac 520
0549aefb
LB
521In particular, follow these general guidelines for patching Perl
522sources:
a44f43ac
RGS
523
524 8-wide tabs (no exceptions!)
525 4-wide indents for code, 2-wide indents for nested CPP #defines
526 try hard not to exceed 79-columns
527 ANSI C prototypes
528 uncuddled elses and "K&R" style for indenting control constructs
529 no C++ style (//) comments
530 mark places that need to be revisited with XXX (and revisit often!)
531 opening brace lines up with "if" when conditional spans multiple
532 lines; should be at end-of-line otherwise
533 in function definitions, name starts in column 0 (return value is on
534 previous line)
535 single space after keywords that are followed by parens, no space
536 between function name and following paren
537 avoid assignments in conditionals, but if they're unavoidable, use
538 extra paren, e.g. "if (a && (b = c)) ..."
539 "return foo;" rather than "return(foo);"
540 "if (!foo) ..." rather than "if (foo == FALSE) ..." etc.
541
542=item Testsuite
543
77db6475
LB
544If your patch changes code (rather than just changing documentation)
545you should also include one or more test cases which illustrate the bug
546you're fixing or validate the new functionality you're adding. In
547general, you should update an existing test file rather than create a
548new one.
bdaf0bc6 549
0549aefb
LB
550Your testsuite additions should generally follow these guidelines
551(courtesy of Gurusamy Sarathy <gsar@activestate.com>):
a44f43ac
RGS
552
553 Know what you're testing. Read the docs, and the source.
554 Tend to fail, not succeed.
555 Interpret results strictly.
556 Use unrelated features (this will flush out bizarre interactions).
557 Use non-standard idioms (otherwise you are not testing TIMTOWTDI).
558 Avoid using hardcoded test numbers whenever possible (the
559 EXPECTED/GOT found in t/op/tie.t is much more maintainable,
560 and gives better failure reports).
561 Give meaningful error messages when a test fails.
562 Avoid using qx// and system() unless you are testing for them. If you
563 do use them, make sure that you cover _all_ perl platforms.
564 Unlink any temporary files you create.
565 Promote unforeseen warnings to errors with $SIG{__WARN__}.
566 Be sure to use the libraries and modules shipped with the version
567 being tested, not those that were already installed.
568 Add comments to the code explaining what you are testing for.
569 Make updating the '1..42' string unnecessary. Or make sure that
570 you update it.
571 Test _all_ behaviors of a given operator, library, or function:
572 - All optional arguments
573 - Return values in various contexts (boolean, scalar, list, lvalue)
574 - Use both global and lexical variables
575 - Don't forget the exceptional, pathological cases.
576
577=back
578
ba336be1 579=head1 Accepting a patch
7df2e4bc
LB
580
581If you have received a patch file generated using the above section,
582you should try out the patch.
583
584First we need to create a temporary new branch for these changes and
585switch into it:
586
a9b05323 587 % git checkout -b experimental
7df2e4bc 588
6acba58e
LB
589Patches that were formatted by C<git format-patch> are applied with
590C<git am>:
7df2e4bc 591
2af192ee 592 % git am 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
7df2e4bc
LB
593 Applying Rename Leon Brocard to Orange Brocard
594
6acba58e
LB
595If just a raw diff is provided, it is also possible use this two-step
596process:
09645c26
VP
597
598 % git apply bugfix.diff
dc3c3040 599 % git commit -a -m "Some fixing" --author="That Guy <that.guy@internets.com>"
09645c26 600
7df2e4bc
LB
601Now we can inspect the change:
602
dc3c3040 603 % git show HEAD
7df2e4bc
LB
604 commit b1b3dab48344cff6de4087efca3dbd63548ab5e2
605 Author: Leon Brocard <acme@astray.com>
606 Date: Fri Dec 19 17:02:59 2008 +0000
607
608 Rename Leon Brocard to Orange Brocard
7df2e4bc 609
7df2e4bc
LB
610 diff --git a/AUTHORS b/AUTHORS
611 index 293dd70..722c93e 100644
612 --- a/AUTHORS
613 +++ b/AUTHORS
614 @@ -541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
615 Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
616 Leif Huhn <leif@hale.dkstat.com>
617 Len Johnson <lenjay@ibm.net>
618 -Leon Brocard <acme@astray.com>
619 +Orange Brocard <acme@astray.com>
620 Les Peters <lpeters@aol.net>
621 Lesley Binks <lesley.binks@gmail.com>
622 Lincoln D. Stein <lstein@cshl.org>
623
624If you are a committer to Perl and you think the patch is good, you can
75fb7651 625then merge it into blead then push it out to the main repository:
7df2e4bc
LB
626
627 % git checkout blead
d9847473 628 % git merge experimental
75fb7651 629 % git push
7df2e4bc
LB
630
631If you want to delete your temporary branch, you may do so with:
632
633 % git checkout blead
634 % git branch -d experimental
635 error: The branch 'experimental' is not an ancestor of your current HEAD.
636 If you are sure you want to delete it, run 'git branch -D experimental'.
637 % git branch -D experimental
638 Deleted branch experimental.
b0d36535 639
ba336be1 640=head1 Cleaning a working directory
b0d36535 641
6acba58e 642The command C<git clean> can with varying arguments be used as a
dc3c3040 643replacement for C<make clean>.
b0d36535
YO
644
645To reset your working directory to a pristine condition you can do:
646
e0b2b458 647 % git clean -dxf
b0d36535
YO
648
649However, be aware this will delete ALL untracked content. You can use
650
e0b2b458 651 % git clean -Xf
b0d36535 652
6acba58e
LB
653to remove all ignored untracked files, such as build and test
654byproduct, but leave any manually created files alone.
b0d36535 655
0549aefb 656If you only want to cancel some uncommitted edits, you can use C<git
c26da522
LB
657checkout> and give it a list of files to be reverted, or C<git checkout
658-f> to revert them all.
f755e97d
RGS
659
660If you want to cancel one or several commits, you can use C<git reset>.
661
ba336be1 662=head1 Bisecting
d82a90c1 663
6acba58e
LB
664C<git> provides a built-in way to determine, with a binary search in
665the history, which commit should be blamed for introducing a given bug.
d82a90c1 666
6acba58e 667Suppose that we have a script F<~/testcase.pl> that exits with C<0>
77db6475
LB
668when some behaviour is correct, and with C<1> when it's faulty. You
669need an helper script that automates building C<perl> and running the
6acba58e 670testcase:
d82a90c1
VP
671
672 % cat ~/run
673 #!/bin/sh
674 git clean -dxf
a4583001
AB
675
676 # If you get './makedepend: 1: Syntax error: Unterminated quoted
677 # string' when bisecting versions of perl older than 5.9.5 this hack
678 # will work around the bug in makedepend.SH which was fixed in
cfe91bfa 679 # version 96a8704c. Make sure to comment out `git checkout makedepend.SH'
a4583001
AB
680 # below too.
681 git show blead:makedepend.SH > makedepend.SH
682
d82a90c1 683 # If you can use ccache, add -Dcc=ccache\ gcc -Dld=gcc to the Configure line
1d5fe431
MB
684 # if Encode is not needed for the test, you can speed up the bisect by
685 # excluding it from the runs with -Dnoextensions=Encode
c0d1ef72
MB
686 sh Configure -des -Dusedevel -Doptimize="-g"
687 test -f config.sh || exit 125
688 # Correct makefile for newer GNU gcc
689 perl -ni -we 'print unless /<(?:built-in|command)/' makefile x2p/makefile
690 # if you just need miniperl, replace test_prep with miniperl
d7923bfe 691 make test_prep
68814ba4 692 [ -x ./perl ] || exit 125
d82a90c1 693 ./perl -Ilib ~/testcase.pl
c0d1ef72 694 ret=$?
7930c68b 695 [ $ret -gt 127 ] && ret=127
cfe91bfa 696 # git checkout makedepend.SH
c0d1ef72
MB
697 git clean -dxf
698 exit $ret
d82a90c1 699
6acba58e
LB
700This script may return C<125> to indicate that the corresponding commit
701should be skipped. Otherwise, it returns the status of
702F<~/testcase.pl>.
d82a90c1 703
bdaf0bc6 704You first enter in bisect mode with:
d82a90c1
VP
705
706 % git bisect start
707
6acba58e
LB
708For example, if the bug is present on C<HEAD> but wasn't in 5.10.0,
709C<git> will learn about this when you enter:
d82a90c1
VP
710
711 % git bisect bad
712 % git bisect good perl-5.10.0
713 Bisecting: 853 revisions left to test after this
714
6acba58e 715This results in checking out the median commit between C<HEAD> and
bdaf0bc6 716C<perl-5.10.0>. You can then run the bisecting process with:
d82a90c1
VP
717
718 % git bisect run ~/run
719
720When the first bad commit is isolated, C<git bisect> will tell you so:
721
722 ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5 is first bad commit
723 commit ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5
724 Author: Dave Mitchell <davem@fdisolutions.com>
725 Date: Sat Feb 9 14:56:23 2008 +0000
726
9469eb4a 727 [perl #49472] Attributes + Unknown Error
d82a90c1
VP
728 ...
729
730 bisect run success
731
6acba58e
LB
732You can peek into the bisecting process with C<git bisect log> and
733C<git bisect visualize>. C<git bisect reset> will get you out of bisect
734mode.
d82a90c1 735
6acba58e
LB
736Please note that the first C<good> state must be an ancestor of the
737first C<bad> state. If you want to search for the commit that I<solved>
738some bug, you have to negate your test case (i.e. exit with C<1> if OK
739and C<0> if not) and still mark the lower bound as C<good> and the
740upper as C<bad>. The "first bad commit" has then to be understood as
741the "first commit where the bug is solved".
d82a90c1 742
6acba58e
LB
743C<git help bisect> has much more information on how you can tweak your
744binary searches.
9d68b7ed 745
ba336be1 746=head1 Submitting a patch via GitHub
03050721
LB
747
748GitHub is a website that makes it easy to fork and publish projects
749with Git. First you should set up a GitHub account and log in.
750
751Perl's git repository is mirrored on GitHub at this page:
752
45b194c5 753 http://github.com/mirrors/perl/tree/blead
03050721
LB
754
755Visit the page and click the "fork" button. This clones the Perl git
756repository for you and provides you with "Your Clone URL" from which
757you should clone:
758
759 % git clone git@github.com:USERNAME/perl.git perl-github
760
bdaf0bc6 761The same patch as above, using github might look like this:
03050721
LB
762
763 % cd perl-github
edb9e29e 764 % git remote add upstream git://perl5.git.perl.org/perl.git
03050721
LB
765 % git pull upstream blead
766 % git checkout -b orange
767 % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
dc3c3040 768 % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
03050721
LB
769 % git push origin orange
770
771The orange branch has been pushed to GitHub, so you should now send an
705c800c 772email (see L</Submitting a patch>) with a description of your changes
64a8e22b 773and the following information:
03050721
LB
774
775 http://github.com/USERNAME/perl/tree/orange
fb60e745 776 git://github.com/USERNAME/perl.git branch orange
03050721 777
ba336be1 778=head1 Merging from a branch via GitHub
c26da522
LB
779
780If someone has provided a branch via GitHub and you are a committer,
5c9c28c6 781you should use the following in your perl-ssh directory:
c26da522 782
e98adcab
AB
783 % git remote add avar git://github.com/avar/perl.git
784 % git fetch avar
c26da522
LB
785
786Now you can see the differences between the branch and blead:
787
e98adcab 788 % git diff avar/orange
c26da522
LB
789
790And you can see the commits:
791
e98adcab 792 % git log avar/orange
c26da522
LB
793
794If you approve of a specific commit, you can cherry pick it:
795
e98adcab 796 % git cherry-pick 0c24b290ae02b2ab3304f51d5e11e85eb3659eae
2bab0636
LB
797
798Or you could just merge the whole branch if you like it all:
799
e98adcab 800 % git merge avar/orange
c26da522
LB
801
802And then push back to the repository:
803
804 % git push
805
ce2a8773 806
ba336be1 807=head1 Topic branches and rewriting history
ce2a8773
JV
808
809Individual committers should create topic branches under
333f8875
VP
810B<yourname>/B<some_descriptive_name>. Other committers should check
811with a topic branch's creator before making any change to it.
ce2a8773 812
b16add97
AP
813The simplest way to create a remote topic branch that works on all
814versions of git is to push the current head as a new branch on the
815remote, then check it out locally:
816
817 $ branch="$yourname/$some_descriptive_name"
818 $ git push origin HEAD:$branch
819 $ git checkout -b $branch origin/$branch
820
821Users of git 1.7 or newer can do it in a more obvious manner:
822
823 $ branch="$yourname/$some_descriptive_name"
824 $ git checkout -b $branch
825 $ git push origin -u $branch
33e5002f 826
ce2a8773
JV
827If you are not the creator of B<yourname>/B<some_descriptive_name>, you
828might sometimes find that the original author has edited the branch's
829history. There are lots of good reasons for this. Sometimes, an author
333f8875
VP
830might simply be rebasing the branch onto a newer source point.
831Sometimes, an author might have found an error in an early commit which
832they wanted to fix before merging the branch to blead.
ce2a8773 833
333f8875
VP
834Currently the master repository is configured to forbid
835non-fast-forward merges. This means that the branches within can not
836be rebased and pushed as a single step.
ce2a8773 837
333f8875
VP
838The only way you will ever be allowed to rebase or modify the history
839of a pushed branch is to delete it and push it as a new branch under
840the same name. Please think carefully about doing this. It may be
841better to sequentially rename your branches so that it is easier for
842others working with you to cherry-pick their local changes onto the new
843version. (XXX: needs explanation).
ce2a8773
JV
844
845If you want to rebase a personal topic branch, you will have to delete
2699d634
YO
846your existing topic branch and push as a new version of it. You can do
847this via the following formula (see the explanation about C<refspec>'s
848in the git push documentation for details) after you have rebased your
849branch:
850
851 # first rebase
852 $ git checkout $user/$topic
853 $ git fetch
854 $ git rebase origin/blead
855
856 # then "delete-and-push"
857 $ git push origin :$user/$topic
858 $ git push origin $user/$topic
859
860B<NOTE:> it is forbidden at the repository level to delete any of the
333f8875
VP
861"primary" branches. That is any branch matching
862C<m!^(blead|maint|perl)!>. Any attempt to do so will result in git
863producing an error like this:
2699d634
YO
864
865 $ git push origin :blead
866 *** It is forbidden to delete blead/maint branches in this repository
867 error: hooks/update exited with error code 1
868 error: hook declined to update refs/heads/blead
333f8875 869 To ssh://perl5.git.perl.org/perl
2699d634 870 ! [remote rejected] blead (hook declined)
333f8875 871 error: failed to push some refs to 'ssh://perl5.git.perl.org/perl'
2699d634 872
333f8875
VP
873As a matter of policy we do B<not> edit the history of the blead and
874maint-* branches. If a typo (or worse) sneaks into a commit to blead or
875maint-*, we'll fix it in another commit. The only types of updates
876allowed on these branches are "fast-forward's", where all history is
877preserved.
2699d634 878
333f8875
VP
879Annotated tags in the canonical perl.git repository will never be
880deleted or modified. Think long and hard about whether you want to push
881a local tag to perl.git before doing so. (Pushing unannotated tags is
2699d634 882not allowed.)
ce2a8773 883
ba336be1 884=head1 Committing to maintenance versions
9d68b7ed 885
77db6475
LB
886Maintenance versions should only be altered to add critical bug fixes,
887see L<perlpolicy>.
7f4ffa9d 888
9d68b7ed
LB
889To commit to a maintenance version of perl, you need to create a local
890tracking branch:
891
892 % git checkout --track -b maint-5.005 origin/maint-5.005
893
0549aefb
LB
894This creates a local branch named C<maint-5.005>, which tracks the
895remote branch C<origin/maint-5.005>. Then you can pull, commit, merge
896and push as before.
b0d36535 897
f755e97d 898You can also cherry-pick commits from blead and another branch, by
0549aefb
LB
899using the C<git cherry-pick> command. It is recommended to use the
900B<-x> option to C<git cherry-pick> in order to record the SHA1 of the
901original commit in the new commit message.
f755e97d 902
ba336be1 903=head1 Grafts
e8589bfa
AV
904
905The perl history contains one mistake which was not caught in the
ac036724 906conversion: a merge was recorded in the history between blead and
333f8875
VP
907maint-5.10 where no merge actually occurred. Due to the nature of git,
908this is now impossible to fix in the public repository. You can remove
909this mis-merge locally by adding the following line to your
e8589bfa
AV
910C<.git/info/grafts> file:
911
912 296f12bbbbaa06de9be9d09d3dcf8f4528898a49 434946e0cb7a32589ed92d18008aaa1d88515930
913
914It is particularly important to have this graft line if any bisecting
915is done in the area of the "merge" in question.
916
041325d6 917=head1 SEE ALSO
bdaf0bc6 918
041325d6 919=over
bdaf0bc6 920
705c800c 921=item *
041325d6 922
705c800c
RGS
923The git documentation, accessible via the C<git help> command
924
925=item *
926
927L<perlpolicy> - Perl core development policy
041325d6
AB
928
929=back
f755e97d 930
041325d6 931=cut