All of Perl's source code is kept centrally in a Git repository at perl5.git.perl.org. The repository contains many Perl revisions from Perl 1 onwards and all the revisions from Perforce, the version control system we were using previously. This repository is accessible in different ways.

All of Perl's source code is kept centrally in a Git repository at perl5.git.perl.org. The repository contains many Perl revisions from Perl 1 onwards and all the revisions from Perforce, the version control system we were using previously. This repository is accessible in different ways. (TBT)

The full repository takes up about 80MB of disk space. A check out of the blead branch (that is, the main development branch, which contains bleadperl, the development version of perl 5) takes up about 160MB of disk space (including the repository). A build of bleadperl takes up about 200MB (including the repository and the check out).

The full repository takes up about 80MB of disk space. A check out of the blead branch (that is, the main development branch, which contains bleadperl, the development version of perl 5) takes up about 160MB of disk space (including the repository). A build of bleadperl takes up about 200MB (including the repository and the check out). (TBT)

You may access the repository over the web. This allows you to browse the tree, see recent commits, subscribe to RSS feeds for the changes, search for particular commits and more. You may access it at:

You may access the repository over the web. This allows you to browse the tree, see recent commits, subscribe to RSS feeds for the changes, search for particular commits and more. You may access it at: (TBT)

It is also possible to keep origin as a git remote, and add a new remote for ssh access:

It is also possible to keep origin as a git remote, and add a new remote for ssh access: (TBT)

% git remote add camel perl5.git.perl.org:/perl.git

This allows you to update your local repository by pulling from origin, which is faster and doesn't require you to authenticate, and to push your changes back with the camel remote:

This allows you to update your local repository by pulling from origin, which is faster and doesn't require you to authenticate, and to push your changes back with the camel remote: (TBT)

% git fetch camel
% git push camel

The fetch command just updates the camel refs, as the objects themselves should have been fetched when pulling from origin.

The fetch command just updates the camel refs, as the objects themselves should have been fetched when pulling from origin. (TBT)

The committers have access to 2 servers that serve perl5.git.perl.org. One is camel.booking.com, which is the 'master' repository. The perl5.git.perl.org IP address also lives on this machine. The second one is dromedary.booking.com, which can be used for general testing and development. Dromedary syncs the git tree from camel every few minutes, you should not push there. Both machines also have a full CPAN mirror. To share files with the general public, dromedary serves your ~/public_html/ as http://users.perl5.git.perl.org/~yourlogin/

The committers have access to 2 servers that serve perl5.git.perl.org. One is camel.booking.com, which is the 'master' repository. The perl5.git.perl.org IP address also lives on this machine. The second one is dromedary.booking.com, which can be used for general testing and development. Dromedary syncs the git tree from camel every few minutes, you should not push there. Both machines also have a full CPAN mirror. To share files with the general public, dromedary serves your ~/public_html/ as http://users.perl5.git.perl.org/~yourlogin/ (TBT)

Once you have changed into the repository directory, you can inspect it.

Once you have changed into the repository directory, you can inspect it. (TBT)

After a clone the repository will contain a single local branch, which will be the current branch as well, as indicated by the asterisk.

After a clone the repository will contain a single local branch, which will be the current branch as well, as indicated by the asterisk. (TBT)

% git branch
* blead

Using the -a switch to branch will also show the remote tracking branches in the repository:

Using the -a switch to branch will also show the remote tracking branches in the repository: (TBT)

% git branch -a
* blead
origin/HEAD
origin/blead
...

The branches that begin with "origin" correspond to the "git remote" that you cloned from (which is named "origin"). Each branch on the remote will be exactly tracked by theses branches. You should NEVER do work on these remote tracking branches. You only ever do work in a local branch. Local branches can be configured to automerge (on pull) from a designated remote tracking branch. This is the case with the default branch blead which will be configured to merge from the remote tracking branch origin/blead.

The branches that begin with "origin" correspond to the "git remote" that you cloned from (which is named "origin"). Each branch on the remote will be exactly tracked by theses branches. You should NEVER do work on these remote tracking branches. You only ever do work in a local branch. Local branches can be configured to automerge (on pull) from a designated remote tracking branch. This is the case with the default branch blead which will be configured to merge from the remote tracking branch origin/blead. (TBT)

You can see recent commits:

最近のコミットを見られます:

% git log

And pull new changes from the repository, and update your local repository (must be clean first)

And pull new changes from the repository, and update your local repository (must be clean first) (TBT)

% git pull

Assuming we are on the branch blead immediately after a pull, this command would be more or less equivalent to:

Assuming we are on the branch blead immediately after a pull, this command would be more or less equivalent to: (TBT)

% git fetch
% git merge origin/blead

In fact if you want to update your local repository without touching your working directory you do:

In fact if you want to update your local repository without touching your working directory you do: (TBT)

% git fetch

And if you want to update your remote-tracking branches for all defined remotes simultaneously you can do

And if you want to update your remote-tracking branches for all defined remotes simultaneously you can do (TBT)

% git remote update

Neither of these last two commands will update your working directory, however both will update the remote-tracking branches in your repository.

Neither of these last two commands will update your working directory, however both will update the remote-tracking branches in your repository. (TBT)

This command will produce as output a description of the current state of the repository, including modified files and unignored untracked files, and in addition it will show things like what files have been staged for the next commit, and usually some useful information about how to change things. For instance the following:

This command will produce as output a description of the current state of the repository, including modified files and unignored untracked files, and in addition it will show things like what files have been staged for the next commit, and usually some useful information about how to change things. For instance the following: (TBT)

This shows that there were changes to this document staged for commit, and that there were further changes in the working directory not yet staged. It also shows that there was an untracked file in the working directory, and as you can see shows how to change all of this. It also shows that there is one commit on the working branch blead which has not been pushed to the origin remote yet. NOTE: that this output is also what you see as a template if you do not provide a message to git commit.

This shows that there were changes to this document staged for commit, and that there were further changes in the working directory not yet staged. It also shows that there was an untracked file in the working directory, and as you can see shows how to change all of this. It also shows that there is one commit on the working branch blead which has not been pushed to the origin remote yet. NOTE: that this output is also what you see as a template if you do not provide a message to git commit. (TBT)

If you have a patch in mind for Perl, you should first get a copy of the repository:

If you have a patch in mind for Perl, you should first get a copy of the repository: (TBT)

% git clone git://perl5.git.perl.org/perl.git perl-git

Then change into the directory:

それからディレクトリを変更します:

% cd perl-git

Alternatively, if you already have a Perl repository, you should ensure that you're on the blead branch, and your repository is up to date:

Alternatively, if you already have a Perl repository, you should ensure that you're on the blead branch, and your repository is up to date: (TBT)

% git checkout blead
% git pull

It's preferable to patch against the latest blead version, since this is where new development occurs for all changes other than critical bug fixes. Critical bug fix patches should be made against the relevant maint branches, or should be submitted with a note indicating all the branches where the fix should be applied.

It's preferable to patch against the latest blead version, since this is where new development occurs for all changes other than critical bug fixes. Critical bug fix patches should be made against the relevant maint branches, or should be submitted with a note indicating all the branches where the fix should be applied. (TBT)

Now that we have everything up to date, we need to create a temporary new branch for these changes and switch into it:

Now that we have everything up to date, we need to create a temporary new branch for these changes and switch into it: (TBT)

% git checkout -b orange

which is the short form of

これは以下のものの短縮形です

% git branch orange
% git checkout orange

Then make your changes. For example, if Leon Brocard changes his name to Orange Brocard, we should change his name in the AUTHORS file:

Then make your changes. For example, if Leon Brocard changes his name to Orange Brocard, we should change his name in the AUTHORS file: (TBT)

Be aware that many files in the distribution are derivative--avoid patching them, because git won't see the changes to them, and the build process will overwrite them. Patch the originals instead. Most utilities (like perldoc) are in this category, i.e. patch utils/perldoc.PL rather than utils/perldoc. Similarly, don't create patches for files under $src_root/ext from their copies found in $install_root/lib. If you are unsure about the proper location of a file that may have gotten copied while building the source distribution, consult the MANIFEST.

Be aware that many files in the distribution are derivative--avoid patching them, because git won't see the changes to them, and the build process will overwrite them. Patch the originals instead. Most utilities (like perldoc) are in this category, i.e. patch utils/perldoc.PL rather than utils/perldoc. Similarly, don't create patches for files under $src_root/ext from their copies found in $install_root/lib. If you are unsure about the proper location of a file that may have gotten copied while building the source distribution, consult the MANIFEST. (TBT)

Since the patch(1) utility cannot deal with binary files, it's important that you either avoid the use of binary files in your patch, generate the files dynamically, or that you encode any binary files using the uupacktool.pl utility.

Since the patch(1) utility cannot deal with binary files, it's important that you either avoid the use of binary files in your patch, generate the files dynamically, or that you encode any binary files using the uupacktool.pl utility. (TBT)

Assuming you needed to include a gzip-encoded file for a module's test suite, you might do this as follows using the uupacktool.pl utility:

Assuming you needed to include a gzip-encoded file for a module's test suite, you might do this as follows using the uupacktool.pl utility: (TBT)

This will replace the t.gz file with an encoded counterpart. During make test, before any tests are run, perl's Makefile will restore all the .packed files mentioned in the MANIFEST to their original name. This means that the test suite does not need to be aware of this packing scheme and will not need to be altered.

This will replace the t.gz file with an encoded counterpart. During make test, before any tests are run, perl's Makefile will restore all the .packed files mentioned in the MANIFEST to their original name. This means that the test suite does not need to be aware of this packing scheme and will not need to be altered. (TBT)

The first thing you should include with your patch is a description of the problem that the patch corrects. If it is a code patch (rather than a documentation patch) you should also include a small test case that illustrates the bug (a patch to an existing test file is preferred).

The first thing you should include with your patch is a description of the problem that the patch corrects. If it is a code patch (rather than a documentation patch) you should also include a small test case that illustrates the bug (a patch to an existing test file is preferred). (TBT)

If you are submitting a code patch there are several other things that you need to do.

If you are submitting a code patch there are several other things that you need to do. (TBT)

Comments, Comments, Comments

Be sure to adequately comment your code. While commenting every line is unnecessary, anything that takes advantage of side effects of operators, that creates changes that will be felt outside of the function being patched, or that others may find confusing should be documented. If you are going to err, it is better to err on the side of adding too many comments than too few.

Be sure to adequately comment your code. While commenting every line is unnecessary, anything that takes advantage of side effects of operators, that creates changes that will be felt outside of the function being patched, or that others may find confusing should be documented. If you are going to err, it is better to err on the side of adding too many comments than too few. (TBT)

Style

In general, please follow the particular style of the code you are patching.

In general, please follow the particular style of the code you are patching. (TBT)

In particular, follow these general guidelines for patching Perl sources:

In particular, follow these general guidelines for patching Perl sources: (TBT)

8-wide tabs (no exceptions!)
4-wide indents for code, 2-wide indents for nested CPP #defines
try hard not to exceed 79-columns
ANSI C prototypes
uncuddled elses and "K&R" style for indenting control constructs
no C++ style (//) comments
mark places that need to be revisited with XXX (and revisit often!)
opening brace lines up with "if" when conditional spans multiple
lines; should be at end-of-line otherwise
in function definitions, name starts in column 0 (return value is on
previous line)
single space after keywords that are followed by parens, no space
between function name and following paren
avoid assignments in conditionals, but if they're unavoidable, use
extra paren, e.g. "if (a && (b = c)) ..."
"return foo;" rather than "return(foo);"
"if (!foo) ..." rather than "if (foo == FALSE) ..." etc.

Testsuite

When submitting a patch you should make every effort to also include an addition to perl's regression tests to properly exercise your patch. Your testsuite additions should generally follow these guidelines (courtesy of Gurusamy Sarathy <gsar@activestate.com>):

When submitting a patch you should make every effort to also include an addition to perl's regression tests to properly exercise your patch. Your testsuite additions should generally follow these guidelines (courtesy of Gurusamy Sarathy <gsar@activestate.com>): (TBT)

Know what you're testing. Read the docs, and the source.
Tend to fail, not succeed.
Interpret results strictly.
Use unrelated features (this will flush out bizarre interactions).
Use non-standard idioms (otherwise you are not testing TIMTOWTDI).
Avoid using hardcoded test numbers whenever possible (the
EXPECTED/GOT found in t/op/tie.t is much more maintainable,
and gives better failure reports).
Give meaningful error messages when a test fails.
Avoid using qx// and system() unless you are testing for them. If you
do use them, make sure that you cover _all_ perl platforms.
Unlink any temporary files you create.
Promote unforeseen warnings to errors with $SIG{__WARN__}.
Be sure to use the libraries and modules shipped with the version
being tested, not those that were already installed.
Add comments to the code explaining what you are testing for.
Make updating the '1..42' string unnecessary. Or make sure that
you update it.
Test _all_ behaviors of a given operator, library, or function:
- All optional arguments
- Return values in various contexts (boolean, scalar, list, lvalue)
- Use both global and lexical variables
- Don't forget the exceptional, pathological cases.

git provides a built-in way to determine, with a binary search in the history, which commit should be blamed for introducing a given bug.

git provides a built-in way to determine, with a binary search in the history, which commit should be blamed for introducing a given bug. (TBT)

Suppose that we have a script ~/testcase.pl that exits with 0 when some behaviour is correct, and with 1 when it's faulty. We need an helper script that automates building perl and running the testcase:

Suppose that we have a script ~/testcase.pl that exits with 0 when some behaviour is correct, and with 1 when it's faulty. We need an helper script that automates building perl and running the testcase: (TBT)

You can peek into the bisecting process with git bisect log and git bisect visualize. git bisect reset will get you out of bisect mode.

You can peek into the bisecting process with git bisect log and git bisect visualize. git bisect reset will get you out of bisect mode. (TBT)

Please note that the first good state must be an ancestor of the first bad state. If you want to search for the commit that solved some bug, you have to negate your test case (i.e. exit with 1 if OK and 0 if not) and still mark the lower bound as good and the upper as bad. The "first bad commit" has then to be understood as the "first commit where the bug is solved".

Please note that the first good state must be an ancestor of the first bad state. If you want to search for the commit that solved some bug, you have to negate your test case (i.e. exit with 1 if OK and 0 if not) and still mark the lower bound as good and the upper as bad. The "first bad commit" has then to be understood as the "first commit where the bug is solved". (TBT)

git help bisect has much more information on how you can tweak your binary searches.

git help bisect has much more information on how you can tweak your binary searches. (TBT)

Maintenance versions should only be altered to add critical bug fixes.

Maintenance versions should only be altered to add critical bug fixes. (TBT)

To commit to a maintenance version of perl, you need to create a local tracking branch:

To commit to a maintenance version of perl, you need to create a local tracking branch: (TBT)

% git checkout --track -b maint-5.005 origin/maint-5.005

This creates a local branch named maint-5.005, which tracks the remote branch origin/maint-5.005. Then you can pull, commit, merge and push as before.

This creates a local branch named maint-5.005, which tracks the remote branch origin/maint-5.005. Then you can pull, commit, merge and push as before. (TBT)

You can also cherry-pick commits from blead and another branch, by using the git cherry-pick command. It is recommended to use the -x option to git cherry-pick in order to record the SHA1 of the original commit in the new commit message.

You can also cherry-pick commits from blead and another branch, by using the git cherry-pick command. It is recommended to use the -x option to git cherry-pick in order to record the SHA1 of the original commit in the new commit message. (TBT)