fix logic for a workaround in POSIX.xs
[p5sagit/p5-mst-13.2.git] / pod / perlrepository.pod
CommitLineData
0549aefb 1=for comment
2Consistent formatting of this file is achieved with:
3 perl ./Porting/podtidy pod/perlrepository.pod
4
d7dd28b6 5=head1 NAME
6
7perlrepository - Using the Perl source repository
8
9=head1 SYNOPSIS
10
dc3c3040 11All of Perl's source code is kept centrally in a Git repository at
c26da522 12I<perl5.git.perl.org>. The repository contains many Perl revisions from
13Perl 1 onwards and all the revisions from Perforce, the version control
14system we were using previously. This repository is accessible in
15different ways.
d7dd28b6 16
17The full repository takes up about 80MB of disk space. A check out of
7f4ffa9d 18the blead branch (that is, the main development branch, which contains
6a7cbfe8 19bleadperl, the development version of perl 5) takes up about 160MB of
20disk space (including the repository). A build of bleadperl takes up
21about 200MB (including the repository and the check out).
d7dd28b6 22
23=head1 GETTING ACCESS TO THE REPOSITORY
24
25=head2 READ ACCESS VIA THE WEB
26
dc3c3040 27You may access the repository over the web. This allows you to browse
28the tree, see recent commits, subscribe to RSS feeds for the changes,
29search for particular commits and more. You may access it at:
d7dd28b6 30
31 http://perl5.git.perl.org/perl.git
32
dc3c3040 33A mirror of the repository is found at:
34
35 http://github.com/github/perl
36
d7dd28b6 37=head2 READ ACCESS VIA GIT
38
39You will need a copy of Git for your computer. You can fetch a copy of
40the repository using the Git protocol (which uses port 9418):
41
3b8a5fb0 42 git clone git://perl5.git.perl.org/perl.git perl-git
d7dd28b6 43
f755e97d 44This clones the repository and makes a local copy in the F<perl-git>
d7dd28b6 45directory.
46
47If your local network does not allow you to use port 9418, then you can
572f57ba 48fetch a copy of the repository over HTTP (this is slower):
d7dd28b6 49
3b8a5fb0 50 git clone http://perl5.git.perl.org/perl.git perl-http
d7dd28b6 51
f755e97d 52This clones the repository and makes a local copy in the F<perl-http>
d7dd28b6 53directory.
54
55=head2 WRITE ACCESS TO THE REPOSITORY
56
6acba58e 57If you are a committer, then you can fetch a copy of the repository
58that you can push back on with:
d7dd28b6 59
3b8a5fb0 60 git clone ssh://perl5.git.perl.org/gitroot/perl.git perl-ssh
d7dd28b6 61
8f718e95 62This clones the repository and makes a local copy in the F<perl-ssh>
d7dd28b6 63directory.
64
c26da522 65If you cloned using the git protocol, which is faster than ssh, then
66you will need to modify your config in order to enable pushing. Edit
67F<.git/config> where you will see something like:
1a0f15d5 68
69 [remote "origin"]
70 url = git://perl5.git.perl.org/perl.git
71
72change that to something like this:
73
74 [remote "origin"]
75 url = ssh://perl5.git.perl.org/gitroot/perl.git
76
dc3c3040 77NOTE: there are symlinks set up so that the /gitroot is optional and
78since SSH is the default protocol you can actually shorten the "url" to
79C<perl5.git.perl.org:/perl.git>.
d7dd28b6 80
184487f0 81You can also set up your user name and e-mail address. For example
82
83 % git config user.name "Leon Brocard"
84 % git config user.email acme@astray.com
85
6acba58e 86It is also possible to keep C<origin> as a git remote, and add a new
87remote for ssh access:
f6c12373 88
dc3c3040 89 % git remote add camel perl5.git.perl.org:/perl.git
f6c12373 90
6acba58e 91This allows you to update your local repository by pulling from
f755e97d 92C<origin>, which is faster and doesn't require you to authenticate, and
6acba58e 93to push your changes back with the C<camel> remote:
f6c12373 94
95 % git fetch camel
96 % git push camel
97
6acba58e 98The C<fetch> command just updates the C<camel> refs, as the objects
99themselves should have been fetched when pulling from C<origin>.
f6c12373 100
333f8875 101The committers have access to 2 servers that serve
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
107have a full CPAN mirror. To share files with the general public,
108dromedary serves your ~/public_html/ as
109C<http://users.perl5.git.perl.org/~yourlogin/>
b47aa495 110
d7dd28b6 111=head1 OVERVIEW OF THE REPOSITORY
112
6acba58e 113Once you have changed into the repository directory, you can inspect
114it.
d7dd28b6 115
39219fd3 116After a clone the repository will contain a single local branch, which
50eca761 117will be the current branch as well, as indicated by the asterisk.
39219fd3 118
119 % git branch
120 * blead
121
f755e97d 122Using the -a switch to C<branch> will also show the remote tracking
6acba58e 123branches in the repository:
39219fd3 124
d9847473 125 % git branch -a
09081495 126 * blead
d7dd28b6 127 origin/HEAD
128 origin/blead
129 ...
130
6acba58e 131The branches that begin with "origin" correspond to the "git remote"
132that you cloned from (which is named "origin"). Each branch on the
133remote will be exactly tracked by theses branches. You should NEVER do
134work on these remote tracking branches. You only ever do work in a
135local branch. Local branches can be configured to automerge (on pull)
136from a designated remote tracking branch. This is the case with the
137default branch C<blead> which will be configured to merge from the
138remote tracking branch C<origin/blead>.
39219fd3 139
d7dd28b6 140You can see recent commits:
141
c2cf2042 142 % git log
d7dd28b6 143
6acba58e 144And pull new changes from the repository, and update your local
145repository (must be clean first)
d7dd28b6 146
147 % git pull
09081495 148
6acba58e 149Assuming we are on the branch C<blead> immediately after a pull, this
150command would be more or less equivalent to:
39219fd3 151
152 % git fetch
153 % git merge origin/blead
154
6acba58e 155In fact if you want to update your local repository without touching
156your working directory you do:
39219fd3 157
158 % git fetch
159
6acba58e 160And if you want to update your remote-tracking branches for all defined
161remotes simultaneously you can do
39219fd3 162
163 % git remote update
164
6acba58e 165Neither of these last two commands will update your working directory,
166however both will update the remote-tracking branches in your
167repository.
39219fd3 168
09081495 169To switch to another branch:
170
171 % git checkout origin/maint-5.8-dor
172
6051489b 173To make a local branch of a remote branch:
174
175 % git checkout -b maint-5.10 origin/maint-5.10
176
09081495 177To switch back to blead:
178
179 % git checkout blead
c2cf2042 180
39219fd3 181=head2 FINDING OUT YOUR STATUS
182
183The most common git command you will use will probably be
184
185 % git status
186
6acba58e 187This command will produce as output a description of the current state
188of the repository, including modified files and unignored untracked
189files, and in addition it will show things like what files have been
190staged for the next commit, and usually some useful information about
191how to change things. For instance the following:
39219fd3 192
193 $ git status
194 # On branch blead
195 # Your branch is ahead of 'origin/blead' by 1 commit.
196 #
197 # Changes to be committed:
198 # (use "git reset HEAD <file>..." to unstage)
199 #
200 # modified: pod/perlrepository.pod
201 #
202 # Changed but not updated:
203 # (use "git add <file>..." to update what will be committed)
204 #
205 # modified: pod/perlrepository.pod
206 #
207 # Untracked files:
208 # (use "git add <file>..." to include in what will be committed)
209 #
210 # deliberate.untracked
211
6acba58e 212This shows that there were changes to this document staged for commit,
213and that there were further changes in the working directory not yet
214staged. It also shows that there was an untracked file in the working
215directory, and as you can see shows how to change all of this. It also
0549aefb 216shows that there is one commit on the working branch C<blead> which has
217not been pushed to the C<origin> remote yet. B<NOTE>: that this output
218is also what you see as a template if you do not provide a message to
219C<git commit>.
7f6effc7 220
221Assuming we commit all the mentioned changes above:
222
223 % git commit -a -m'explain git status and stuff about remotes'
224 Created commit daf8e63: explain git status and stuff about remotes
225 1 files changed, 83 insertions(+), 3 deletions(-)
226
227We can re-run git status and see something like this:
228
229 % git status
230 # On branch blead
231 # Your branch is ahead of 'origin/blead' by 2 commits.
232 #
233 # Untracked files:
234 # (use "git add <file>..." to include in what will be committed)
235 #
236 # deliberate.untracked
237 nothing added to commit but untracked files present (use "git add" to track)
238
39219fd3 239
6acba58e 240When in doubt, before you do anything else, check your status and read
241it carefully, many questions are answered directly by the git status
242output.
39219fd3 243
c2cf2042 244=head1 SUBMITTING A PATCH
245
246If you have a patch in mind for Perl, you should first get a copy of
247the repository:
248
249 % git clone git://perl5.git.perl.org/perl.git perl-git
250
251Then change into the directory:
252
253 % cd perl-git
254
6acba58e 255Alternatively, if you already have a Perl repository, you should ensure
256that you're on the I<blead> branch, and your repository is up to date:
12322d22 257
258 % git checkout blead
259 % git pull
260
6a7cbfe8 261It's preferable to patch against the latest blead version, since this
262is where new development occurs for all changes other than critical bug
263fixes. Critical bug fix patches should be made against the relevant
7f4ffa9d 264maint branches, or should be submitted with a note indicating all the
265branches where the fix should be applied.
a44f43ac 266
6acba58e 267Now that we have everything up to date, we need to create a temporary
268new branch for these changes and switch into it:
b1fccde5 269
a9b05323 270 % git checkout -b orange
23f8d33e 271
a9b05323 272which is the short form of
273
b1fccde5 274 % git branch orange
275 % git checkout orange
276
c2cf2042 277Then make your changes. For example, if Leon Brocard changes his name
278to Orange Brocard, we should change his name in the AUTHORS file:
279
280 % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
281
282You can see what files are changed:
283
284 % git status
f755e97d 285 # On branch orange
c2cf2042 286 # Changes to be committed:
287 # (use "git reset HEAD <file>..." to unstage)
288 #
2699d634 289 # modified: AUTHORS
c2cf2042 290 #
291
c2cf2042 292And you can see the changes:
293
294 % git diff
295 diff --git a/AUTHORS b/AUTHORS
296 index 293dd70..722c93e 100644
297 --- a/AUTHORS
298 +++ b/AUTHORS
7df2e4bc 299 @@ -541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
c2cf2042 300 Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
301 Leif Huhn <leif@hale.dkstat.com>
302 Len Johnson <lenjay@ibm.net>
303 -Leon Brocard <acme@astray.com>
304 +Orange Brocard <acme@astray.com>
305 Les Peters <lpeters@aol.net>
306 Lesley Binks <lesley.binks@gmail.com>
307 Lincoln D. Stein <lstein@cshl.org>
308
309Now commit your change locally:
310
dc3c3040 311 % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
c2cf2042 312 Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
313 1 files changed, 1 insertions(+), 1 deletions(-)
314
dc3c3040 315You can examine your last commit with:
316
317 % git show HEAD
318
319and if you are not happy with either the description or the patch
c26da522 320itself you can fix it up by editing the files once more and then issue:
dc3c3040 321
322 % git commit -a --amend
323
c2cf2042 324Now you should create a patch file for all your local changes:
325
2af192ee 326 % git format-patch origin
c2cf2042 327 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
328
329You should now send an email to perl5-porters@perl.org with a
dc3c3040 330description of your changes, and include this patch file as an
333f8875 331attachment. (See the next section for how to configure and use git to
332send these emails for you.)
c2cf2042 333
b1fccde5 334If you want to delete your temporary branch, you may do so with:
335
336 % git checkout blead
337 % git branch -d orange
338 error: The branch 'orange' is not an ancestor of your current HEAD.
339 If you are sure you want to delete it, run 'git branch -D orange'.
340 % git branch -D orange
341 Deleted branch orange.
7df2e4bc 342
2d5f1d01 343=head2 Using git to send patch emails
344
333f8875 345In your ~/git/perl repository, set the destination email to the
346perl5-porters mailing list.
2d5f1d01 347
348 $ git config sendemail.to perl5-porters@perl.org
349
350Then you can use git directly to send your patch emails:
351
352 $ git send-email 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
353
333f8875 354You may need to set some configuration variables for your particular
355email service provider. For example, to set your global git config to
356send email via a gmail account:
2d5f1d01 357
358 $ git config --global sendemail.smtpserver smtp.gmail.com
359 $ git config --global sendemail.smtpssl 1
360 $ git config --global sendemail.smtpuser YOURUSERNAME@gmail.com
361
333f8875 362With this configuration, you will be prompted for your gmail password
363when you run 'git send-email'. You can also configure
364C<sendemail.smtppass> with your password if you don't care about having
365your password in the .gitconfig file.
2d5f1d01 366
a44f43ac 367=head2 A note on derived files
368
369Be aware that many files in the distribution are derivative--avoid
0549aefb 370patching them, because git won't see the changes to them, and the build
371process will overwrite them. Patch the originals instead. Most
372utilities (like perldoc) are in this category, i.e. patch
373utils/perldoc.PL rather than utils/perldoc. Similarly, don't create
374patches for files under $src_root/ext from their copies found in
375$install_root/lib. If you are unsure about the proper location of a
376file that may have gotten copied while building the source
377distribution, consult the C<MANIFEST>.
a44f43ac 378
6e2cec71 379=for XXX
a44f43ac 380
6e2cec71 381What should we recommend about binary files now? Do we need anything?
a44f43ac 382
383=head2 Getting your patch accepted
384
0549aefb 385The first thing you should include with your patch is a description of
386the problem that the patch corrects. If it is a code patch (rather
387than a documentation patch) you should also include a small test case
388that illustrates the bug (a patch to an existing test file is
389preferred).
a44f43ac 390
391If you are submitting a code patch there are several other things that
392you need to do.
393
394=over 4
395
396=item Comments, Comments, Comments
397
0549aefb 398Be sure to adequately comment your code. While commenting every line
399is unnecessary, anything that takes advantage of side effects of
a44f43ac 400operators, that creates changes that will be felt outside of the
0549aefb 401function being patched, or that others may find confusing should be
402documented. If you are going to err, it is better to err on the side
403of adding too many comments than too few.
a44f43ac 404
405=item Style
406
0549aefb 407In general, please follow the particular style of the code you are
408patching.
a44f43ac 409
0549aefb 410In particular, follow these general guidelines for patching Perl
411sources:
a44f43ac 412
413 8-wide tabs (no exceptions!)
414 4-wide indents for code, 2-wide indents for nested CPP #defines
415 try hard not to exceed 79-columns
416 ANSI C prototypes
417 uncuddled elses and "K&R" style for indenting control constructs
418 no C++ style (//) comments
419 mark places that need to be revisited with XXX (and revisit often!)
420 opening brace lines up with "if" when conditional spans multiple
421 lines; should be at end-of-line otherwise
422 in function definitions, name starts in column 0 (return value is on
423 previous line)
424 single space after keywords that are followed by parens, no space
425 between function name and following paren
426 avoid assignments in conditionals, but if they're unavoidable, use
427 extra paren, e.g. "if (a && (b = c)) ..."
428 "return foo;" rather than "return(foo);"
429 "if (!foo) ..." rather than "if (foo == FALSE) ..." etc.
430
431=item Testsuite
432
0549aefb 433When submitting a patch you should make every effort to also include an
2699d634 434addition to perl's regression tests to properly exercise your patch.
0549aefb 435Your testsuite additions should generally follow these guidelines
436(courtesy of Gurusamy Sarathy <gsar@activestate.com>):
a44f43ac 437
438 Know what you're testing. Read the docs, and the source.
439 Tend to fail, not succeed.
440 Interpret results strictly.
441 Use unrelated features (this will flush out bizarre interactions).
442 Use non-standard idioms (otherwise you are not testing TIMTOWTDI).
443 Avoid using hardcoded test numbers whenever possible (the
444 EXPECTED/GOT found in t/op/tie.t is much more maintainable,
445 and gives better failure reports).
446 Give meaningful error messages when a test fails.
447 Avoid using qx// and system() unless you are testing for them. If you
448 do use them, make sure that you cover _all_ perl platforms.
449 Unlink any temporary files you create.
450 Promote unforeseen warnings to errors with $SIG{__WARN__}.
451 Be sure to use the libraries and modules shipped with the version
452 being tested, not those that were already installed.
453 Add comments to the code explaining what you are testing for.
454 Make updating the '1..42' string unnecessary. Or make sure that
455 you update it.
456 Test _all_ behaviors of a given operator, library, or function:
457 - All optional arguments
458 - Return values in various contexts (boolean, scalar, list, lvalue)
459 - Use both global and lexical variables
460 - Don't forget the exceptional, pathological cases.
461
462=back
463
7df2e4bc 464=head1 ACCEPTING A PATCH
465
466If you have received a patch file generated using the above section,
467you should try out the patch.
468
469First we need to create a temporary new branch for these changes and
470switch into it:
471
a9b05323 472 % git checkout -b experimental
7df2e4bc 473
6acba58e 474Patches that were formatted by C<git format-patch> are applied with
475C<git am>:
7df2e4bc 476
2af192ee 477 % git am 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
7df2e4bc 478 Applying Rename Leon Brocard to Orange Brocard
479
6acba58e 480If just a raw diff is provided, it is also possible use this two-step
481process:
09645c26 482
483 % git apply bugfix.diff
dc3c3040 484 % git commit -a -m "Some fixing" --author="That Guy <that.guy@internets.com>"
09645c26 485
7df2e4bc 486Now we can inspect the change:
487
dc3c3040 488 % git show HEAD
7df2e4bc 489 commit b1b3dab48344cff6de4087efca3dbd63548ab5e2
490 Author: Leon Brocard <acme@astray.com>
491 Date: Fri Dec 19 17:02:59 2008 +0000
492
493 Rename Leon Brocard to Orange Brocard
7df2e4bc 494
7df2e4bc 495 diff --git a/AUTHORS b/AUTHORS
496 index 293dd70..722c93e 100644
497 --- a/AUTHORS
498 +++ b/AUTHORS
499 @@ -541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
500 Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
501 Leif Huhn <leif@hale.dkstat.com>
502 Len Johnson <lenjay@ibm.net>
503 -Leon Brocard <acme@astray.com>
504 +Orange Brocard <acme@astray.com>
505 Les Peters <lpeters@aol.net>
506 Lesley Binks <lesley.binks@gmail.com>
507 Lincoln D. Stein <lstein@cshl.org>
508
509If you are a committer to Perl and you think the patch is good, you can
75fb7651 510then merge it into blead then push it out to the main repository:
7df2e4bc 511
512 % git checkout blead
d9847473 513 % git merge experimental
75fb7651 514 % git push
7df2e4bc 515
516If you want to delete your temporary branch, you may do so with:
517
518 % git checkout blead
519 % git branch -d experimental
520 error: The branch 'experimental' is not an ancestor of your current HEAD.
521 If you are sure you want to delete it, run 'git branch -D experimental'.
522 % git branch -D experimental
523 Deleted branch experimental.
b0d36535 524
525=head1 CLEANING A WORKING DIRECTORY
526
6acba58e 527The command C<git clean> can with varying arguments be used as a
dc3c3040 528replacement for C<make clean>.
b0d36535 529
530To reset your working directory to a pristine condition you can do:
531
532 git clean -dxf
533
534However, be aware this will delete ALL untracked content. You can use
535
536 git clean -Xf
537
6acba58e 538to remove all ignored untracked files, such as build and test
539byproduct, but leave any manually created files alone.
b0d36535 540
0549aefb 541If you only want to cancel some uncommitted edits, you can use C<git
c26da522 542checkout> and give it a list of files to be reverted, or C<git checkout
543-f> to revert them all.
f755e97d 544
545If you want to cancel one or several commits, you can use C<git reset>.
546
d82a90c1 547=head1 BISECTING
548
6acba58e 549C<git> provides a built-in way to determine, with a binary search in
550the history, which commit should be blamed for introducing a given bug.
d82a90c1 551
6acba58e 552Suppose that we have a script F<~/testcase.pl> that exits with C<0>
553when some behaviour is correct, and with C<1> when it's faulty. We need
554an helper script that automates building C<perl> and running the
555testcase:
d82a90c1 556
557 % cat ~/run
558 #!/bin/sh
559 git clean -dxf
560 # If you can use ccache, add -Dcc=ccache\ gcc -Dld=gcc to the Configure line
c0d1ef72 561 sh Configure -des -Dusedevel -Doptimize="-g"
562 test -f config.sh || exit 125
563 # Correct makefile for newer GNU gcc
564 perl -ni -we 'print unless /<(?:built-in|command)/' makefile x2p/makefile
565 # if you just need miniperl, replace test_prep with miniperl
566 make -j4 test_prep
68814ba4 567 [ -x ./perl ] || exit 125
d82a90c1 568 ./perl -Ilib ~/testcase.pl
c0d1ef72 569 ret=$?
7930c68b 570 [ $ret -gt 127 ] && ret=127
c0d1ef72 571 git clean -dxf
572 exit $ret
d82a90c1 573
6acba58e 574This script may return C<125> to indicate that the corresponding commit
575should be skipped. Otherwise, it returns the status of
576F<~/testcase.pl>.
d82a90c1 577
578We first enter in bisect mode with:
579
580 % git bisect start
581
6acba58e 582For example, if the bug is present on C<HEAD> but wasn't in 5.10.0,
583C<git> will learn about this when you enter:
d82a90c1 584
585 % git bisect bad
586 % git bisect good perl-5.10.0
587 Bisecting: 853 revisions left to test after this
588
6acba58e 589This results in checking out the median commit between C<HEAD> and
590C<perl-5.10.0>. We can then run the bisecting process with:
d82a90c1 591
592 % git bisect run ~/run
593
594When the first bad commit is isolated, C<git bisect> will tell you so:
595
596 ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5 is first bad commit
597 commit ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5
598 Author: Dave Mitchell <davem@fdisolutions.com>
599 Date: Sat Feb 9 14:56:23 2008 +0000
600
9469eb4a 601 [perl #49472] Attributes + Unknown Error
d82a90c1 602 ...
603
604 bisect run success
605
6acba58e 606You can peek into the bisecting process with C<git bisect log> and
607C<git bisect visualize>. C<git bisect reset> will get you out of bisect
608mode.
d82a90c1 609
6acba58e 610Please note that the first C<good> state must be an ancestor of the
611first C<bad> state. If you want to search for the commit that I<solved>
612some bug, you have to negate your test case (i.e. exit with C<1> if OK
613and C<0> if not) and still mark the lower bound as C<good> and the
614upper as C<bad>. The "first bad commit" has then to be understood as
615the "first commit where the bug is solved".
d82a90c1 616
6acba58e 617C<git help bisect> has much more information on how you can tweak your
618binary searches.
9d68b7ed 619
03050721 620=head1 SUBMITTING A PATCH VIA GITHUB
621
622GitHub is a website that makes it easy to fork and publish projects
623with Git. First you should set up a GitHub account and log in.
624
625Perl's git repository is mirrored on GitHub at this page:
626
627 http://github.com/github/perl/tree/blead
628
629Visit the page and click the "fork" button. This clones the Perl git
630repository for you and provides you with "Your Clone URL" from which
631you should clone:
632
633 % git clone git@github.com:USERNAME/perl.git perl-github
634
635We shall make the same patch as above, creating a new branch:
636
637 % cd perl-github
638 % git remote add upstream git://github.com/github/perl.git
639 % git pull upstream blead
640 % git checkout -b orange
641 % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
dc3c3040 642 % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
03050721 643 % git push origin orange
644
645The orange branch has been pushed to GitHub, so you should now send an
646email to perl5-porters@perl.org with a description of your changes and
647the following information:
648
649 http://github.com/USERNAME/perl/tree/orange
650 git@github.com:USERNAME/perl.git branch orange
651
c26da522 652=head1 MERGING FROM A BRANCH VIA GITHUB
653
654If someone has provided a branch via GitHub and you are a committer,
5c9c28c6 655you should use the following in your perl-ssh directory:
c26da522 656
657 % git remote add dandv git://github.com/dandv/perl.git
658 % git fetch
659
660Now you can see the differences between the branch and blead:
661
662 % git diff dandv/blead
663
664And you can see the commits:
665
666 % git log dandv/blead
667
668If you approve of a specific commit, you can cherry pick it:
669
2bab0636 670 % git cherry-pick 3adac458cb1c1d41af47fc66e67b49c8dec2323f
671
672Or you could just merge the whole branch if you like it all:
673
674 % git merge dandv/blead
c26da522 675
676And then push back to the repository:
677
678 % git push
679
ce2a8773 680
681=head1 TOPIC BRANCHES AND REWRITING HISTORY
682
683Individual committers should create topic branches under
333f8875 684B<yourname>/B<some_descriptive_name>. Other committers should check
685with a topic branch's creator before making any change to it.
ce2a8773 686
687If you are not the creator of B<yourname>/B<some_descriptive_name>, you
688might sometimes find that the original author has edited the branch's
689history. There are lots of good reasons for this. Sometimes, an author
333f8875 690might simply be rebasing the branch onto a newer source point.
691Sometimes, an author might have found an error in an early commit which
692they wanted to fix before merging the branch to blead.
ce2a8773 693
333f8875 694Currently the master repository is configured to forbid
695non-fast-forward merges. This means that the branches within can not
696be rebased and pushed as a single step.
ce2a8773 697
333f8875 698The only way you will ever be allowed to rebase or modify the history
699of a pushed branch is to delete it and push it as a new branch under
700the same name. Please think carefully about doing this. It may be
701better to sequentially rename your branches so that it is easier for
702others working with you to cherry-pick their local changes onto the new
703version. (XXX: needs explanation).
ce2a8773 704
705If you want to rebase a personal topic branch, you will have to delete
2699d634 706your existing topic branch and push as a new version of it. You can do
707this via the following formula (see the explanation about C<refspec>'s
708in the git push documentation for details) after you have rebased your
709branch:
710
711 # first rebase
712 $ git checkout $user/$topic
713 $ git fetch
714 $ git rebase origin/blead
715
716 # then "delete-and-push"
717 $ git push origin :$user/$topic
718 $ git push origin $user/$topic
719
720B<NOTE:> it is forbidden at the repository level to delete any of the
333f8875 721"primary" branches. That is any branch matching
722C<m!^(blead|maint|perl)!>. Any attempt to do so will result in git
723producing an error like this:
2699d634 724
725 $ git push origin :blead
726 *** It is forbidden to delete blead/maint branches in this repository
727 error: hooks/update exited with error code 1
728 error: hook declined to update refs/heads/blead
333f8875 729 To ssh://perl5.git.perl.org/perl
2699d634 730 ! [remote rejected] blead (hook declined)
333f8875 731 error: failed to push some refs to 'ssh://perl5.git.perl.org/perl'
2699d634 732
333f8875 733As a matter of policy we do B<not> edit the history of the blead and
734maint-* branches. If a typo (or worse) sneaks into a commit to blead or
735maint-*, we'll fix it in another commit. The only types of updates
736allowed on these branches are "fast-forward's", where all history is
737preserved.
2699d634 738
333f8875 739Annotated tags in the canonical perl.git repository will never be
740deleted or modified. Think long and hard about whether you want to push
741a local tag to perl.git before doing so. (Pushing unannotated tags is
2699d634 742not allowed.)
ce2a8773 743
9469eb4a 744=head1 COMMITTING TO MAINTENANCE VERSIONS
9d68b7ed 745
7f4ffa9d 746Maintenance versions should only be altered to add critical bug fixes.
747
9d68b7ed 748To commit to a maintenance version of perl, you need to create a local
749tracking branch:
750
751 % git checkout --track -b maint-5.005 origin/maint-5.005
752
0549aefb 753This creates a local branch named C<maint-5.005>, which tracks the
754remote branch C<origin/maint-5.005>. Then you can pull, commit, merge
755and push as before.
b0d36535 756
f755e97d 757You can also cherry-pick commits from blead and another branch, by
0549aefb 758using the C<git cherry-pick> command. It is recommended to use the
759B<-x> option to C<git cherry-pick> in order to record the SHA1 of the
760original commit in the new commit message.
f755e97d 761
e8589bfa 762=head1 GRAFTS
763
764The perl history contains one mistake which was not caught in the
765conversion -- a merge was recorded in the history between blead and
333f8875 766maint-5.10 where no merge actually occurred. Due to the nature of git,
767this is now impossible to fix in the public repository. You can remove
768this mis-merge locally by adding the following line to your
e8589bfa 769C<.git/info/grafts> file:
770
771 296f12bbbbaa06de9be9d09d3dcf8f4528898a49 434946e0cb7a32589ed92d18008aaa1d88515930
772
773It is particularly important to have this graft line if any bisecting
774is done in the area of the "merge" in question.
775
f755e97d 776=head1 SEE ALSO
777
778The git documentation, accessible via C<git help command>.
0549aefb 779