3 repository - Using the Perl repository
7 First, we assume here that you have already decided that you will
8 need B<write> access to the repository. If all you need is B<read>
9 access, there are much better ways to access the most current state of
10 the perl repository, or explore individual files and patches therein.
11 See L<perlhack> for details.
13 This document describes what a Perl Porter needs to do to start using
18 You'll need to get hold of the following software.
24 Download a perforce client from:
26 http://www.perforce.com/perforce/loadprog.html
28 You'll probably also want to look at:
30 http://www.perforce.com/perforce/technical.html
32 where you can look at or download its documentation.
36 If you don't already have access to an ssh client, then look at its
37 home site C<http://www.cs.hut.fi/ssh> which mentions ftp sites from
38 which it's available. You only need to build the client parts (ssh
39 and ssh-keygen should suffice).
41 If you're on Windows then you might like to obtain MSYS (Minimal System)
44 http://www.mingw.org/download.shtml
46 which contains an ssh client. If you use this outside of the MSYS
47 environment then you'll need to ensure the HOME environment variable
48 is set to a suitable directory: ssh.exe will want to access files in
49 a F<.ssh> sub-directory of %HOME%.
51 Alternatively, the "plink" program, part of PuTTY:
53 http://www.chiark.greenend.org.uk/~sgtatham/putty/
55 should also work fine for Windows users.
59 =head1 Creating an SSH Key Pair
61 If you already use ssh and want to use the same key pair for perl
62 repository access then you can skip the rest of this section.
63 Otherwise, generate an ssh key pair for use with the repository
68 After generating a key pair and testing it, ssh-keygen will ask you
69 to enter a filename in which to save the key. The default it offers
70 will be the file F<~/.ssh/identity> which is suitable unless you
71 particularly want to keep separate ssh identities for some reason.
72 If so, you could save the perl repository private key in the file
73 F<~/.ssh/perl>, for example, but I will use the standard filename
74 in the remainder of the examples of this document.
76 After typing in the filename, it will prompt you to type in a
77 passphrase. The private key will itself be encrypted so that it is
78 usable only when that passphrase is typed. (When using ssh, you will
79 be prompted when it requires a pass phrase to unlock a private key.)
80 If you provide a blank passphrase then no passphrase will be needed
81 to unlock the key and, as a consequence, anyone who gains access to
82 the key file gains access to accounts protected with that key
83 (barring additional configuration to restrict access by IP address).
85 When you have typed the passphrase in twice, ssh-keygen will confirm
86 where it has saved the private key (in the filename you gave and
87 with permissions set to be only readable by you), what your public
88 key is (don't worry: you don't need to memorise it) and where it
89 has saved the corresponding public key. The public key is saved in
90 a filename corresponding to your private key's filename but with
91 ".pub" appended, usually F<~/.ssh/identity.pub>. That public key
92 can be (but need not be) world readable. It is not used by your
95 Note that the above process creates a key pair for ssh protocol 1.
96 You can request ssh protocol 2 (RSA) instead if you prefer (if your
97 particular ssh client supports it), via the command
101 This will create private/public identity files called F<~/.ssh/id_rsa>
102 and F<~/.ssh/id_rsa.pub> respectively. Protocol 2 offers a higher
103 level of security than protocol 1. This is not required for access to
104 the Perl repository -- ssh is used for authentication rather than
105 encryption (the Perl sources are open anyway) -- but either protocol
106 is supported by the server.
108 =head1 Notifying the Repository Keeper
110 Mail the contents of that public key file to the keeper of the perl
111 repository (see L</Contact Information> below).
112 When the key is added to the repository host's configuration file,
113 you will be able to connect to it with ssh by using the corresponding
114 private key file (after unlocking it with your chosen passphrase).
116 There is no harm in creating both protocol 1 and protocol 2 keys and
117 mailing them both in. That way you'll be able to connect using either
118 protocol, which may be useful if you later find yourself using a client
119 that only supports one or the other protocol.
121 =head1 Connecting to the Repository
123 Connections to the repository are made by using ssh to provide a
124 TCP "tunnel" rather than by using ssh to login to or invoke any
125 ordinary commands on the repository.
127 The ssh (secure shell) protocol runs over port number 22, so if you
128 have a firewall installed at the client end then you must ensure that
129 it is configured to allow you to make an outgoing connection to port 22
130 on sickle.activestate.com.
132 When you want to start a session using the repository, use the command:
134 ssh -l perlrep -f -q -x -L 1666:127.0.0.1:1666 sickle.activestate.com foo
136 If you are not using the default filename of F<~/.ssh/identity> or
137 F<~/.ssh/id_rsa> to hold your perl repository private key then you'll
138 need to add the option B<-i filename> to tell ssh where it is. Unless
139 you chose a blank passphrase for that private key, ssh will prompt you
140 for the passphrase to unlock that key. Then ssh will fork and put itself
141 in the background, returning you (silently) to your shell prompt.
143 Note that the first time you connect you may see a message like
144 "The authenticity of host 'sickle.activestate.com' can't be established,"
145 and asking you if you want to continue. Just answer yes and sickle's
146 details will be cached in a F<known_hosts> or F<known_hosts2> file. You
147 will not see that message again unless you delete the cache file.
149 The tunnel for repository access is now ready for use.
151 For the sake of completeness (and for the case where the chosen
152 port of 1666 is already in use on your machine), I'll briefly
153 describe what all those ssh arguments are for.
159 Use a remote username of perlrep. (The account on the repository which
160 provides the end-point of the ssh tunnel is named "perlrep".)
164 Tells ssh to fork and remain running in the background. Since ssh
165 is only being used for its tunnelling capabilities, the command
166 that ssh runs never does any I/O and can sit silently in the
171 Tells ssh to be quiet. Without this option, ssh will output a
172 message each time you use a p4 command (since each p4 command
173 tunnels over the ssh connection to reach the repository).
177 Tells ssh not to bother to set up a tunnel for X11 connections.
178 The repository doesn't allow this anyway.
180 =item B<-L 1666:127.0.0.1:1666>
182 This is the important option. It tells ssh to listen out for
183 connections made to port 1666 on your local machine. When such
184 a connection is made, the ssh client tells the remote side
185 (the corresponding ssh daemon on the repository) to make a
186 connection to IP address 127.0.0.1, port 1666. Data flowing
187 along that connection is tunnelled over the ssh connection
188 (encrypted). The perforce daemon running on the repository
189 only accepts connections from localhost and that is exactly
190 where ssh-tunnelled connections appear to come from.
192 If port 1666 is already in use on your machine then you can
193 choose any non-privileged port (a number between 1024 and 65535)
194 which happens to be free on your machine. It's the first of the
195 three colon separated values that you should change. Picking
196 port 2345 would mean changing the option to
197 B<-L 2345:127.0.0.1:1666>. Whatever port number you choose should
198 be used for the value of the P4PORT environment variable (q.v.).
200 =item sickle.activestate.com
202 This is the canonical name of the host on which the perl repository
207 This is a dummy place holder argument. Without an argument
208 here, ssh will try to perform an interactive login to the
209 repository which is not allowed. Ordinarily, this argument
210 is for the one-off command which is to be executed on the
211 remote host. However, the repository's ssh configuration
212 file uses the "command=" option to force a particular
213 command to run so the actual value of the argument is
214 ignored. The command that's actually run merely pauses and
215 waits for the ssh connection to drop, then exits.
221 You should normally get a prompt that asks for the passphrase
222 for your RSA key when you connect with the ssh command shown
223 above. If you see a prompt that looks like:
225 perlrep@sickle.activestate.com's password:
227 Then you either don't have a F<~/.ssh/identity> or F<~/.ssh/id_rsa>
228 file corresponding to your public key, or that file is not readable.
229 Fix the problem and try again.
231 If you only had the public key file for one protocol installed at the
232 server end then make sure your client is using the corresponding
233 protocol. An ssh client that supports protocol 2 will probably choose
234 that by default, which will fail if the server end only has your public
235 key file for protocol 1. Some ssh clients have "-1" and "-2" arguments
236 to force which protocol to use.
238 The "-v" (verbose) flag can be useful for seeing what protocol your
239 client is actually trying to connect with, and for spotting any other
240 problems. The flag can be specified multiple times to increase
241 verbosity. Note that specifying the "-q" flag as well might override
242 your request for verbose output, so drop the "-q" flag when trying this.
244 =head1 Using the Perforce Client
246 Remember to read the documentation for Perforce. You need
247 to make sure that three environment variable are set
248 correctly before using the p4 client with the perl repository.
254 Set this to localhost:1666 (the port for your ssh client to listen on)
255 unless that port is already in use on your host. If it is, see
256 the section above on the B<-L 1666:127.0.0.1:1666> option to ssh.
260 The value of this is the name by which Perforce knows your
261 host's workspace. You need to pick a name (normally, your
262 Perforce username, a dash, and your host's short name)
263 when you first start using the perl repository and then
266 Perforce keeps track of the files you have on your machine. It
267 does this through your client. When you first sync a version of a
268 file, the file comes from the server to your machine. If you sync
269 the same file again the server does nothing because it
270 knows you already have the file.
272 You should NOT use the same client on different machines. If you do
273 you probably won't get the files you expect, and may end up with
274 nasty corruption. Perforce allows you to have as many clients as
275 you want. For example, sally-home, sally-openbsd, sally-laptop.
277 Also, never change the client's root and view at the same time.
278 See C<http://www.perforce.com/perforce/doc.002/manuals/p4guide/04_details.html#1048341>
280 If you have multiple hosts sharing the same directory structure
281 via NFS then you may be able to get away with only one client name,
284 The C<p4 clients> command lists all currently known clients.
288 This is the username by which perforce knows you. Use your
289 username if you have a well known or obvious one or else pick
290 a new one which other perl5-porters will recognise. There is
291 a licence limit on the number of these usernames, so be sure not
292 to use more than one.
294 It is very important to set a password for your Perforce username,
295 or else anyone can impersonate you. Use the C<p4 passwd> command
296 to do this. Once a password is set for your account, you'll need
297 to tell Perforce what it is. You can do this by setting the
298 environment variable P4PASSWD, or you can use the C<-P> flag
299 with the C<p4> command.
301 There are a few techniques you can use to avoid having to either
302 set an environment variable or type the password on every command.
303 One is to create a shell alias, for example, in bash, add something like
304 alias p4='p4 -P secret'
305 to your F<.bash_profile> file. Another way is to create a small shell
309 And use this instead of running C<p4> directly.
311 With either of these, be sure the file containing your password
312 (the F<.bash_profile> or shell script file) is only readable by you.
314 The C<p4 users> command lists all currently known users.
318 Note that on Windows P4PORT and P4USER are requested when installing
319 Perforce. They are stored in the registry, so they do not need to be
320 set in the environment.
322 Once these three environment variables are set, you can use the
323 perforce p4 client exactly as described in its documentation.
325 After setting these variables and connecting to the repository
326 for the first time, you should use the C<p4 user> command to
327 set a valid email address for yourself. Messages to the commit list
328 are sent (faked) from whatever email address you set here.
330 Also use the C<p4 client> command to specify your workspace
331 specifications for each individual client from which you will interact
332 with the repository. The P4CLIENT environment variable, of course,
333 needs to be set to one of these client workspace names.
335 =head1 Ending a Repository Session
337 When you have finished a session using the repository, you
338 should kill off the ssh client process to break the tunnel.
339 Since ssh forked itself into the background, you'll need to use
340 something like ps with the appropriate options to find the ssh
341 process and then kill it manually. The default signal of
344 =head1 Overview of the Repository
346 Please read at least the introductory sections of the Perforce
347 User Guide (and perhaps the Quick Start Guide as well) before
348 reading this section.
350 Every repository user typically "owns" a "branch" of the mainline
351 code in the repository. They hold the "pumpkin" for things in this
352 area, and are usually the only user who will modify files there.
353 This is not strictly enforced in order to allow the flexibility
354 of other users stealing the pumpkin for short periods with the
357 Here is (part of) the current structure of the repository:
359 /----+-----perl - Mainline development (bleadperl)
360 +-----perlio - PerlIO Pumpkin's Perl
361 +-----vmsperl - VMS Pumpkin's Perl
362 +-----maint-5.004------perl - Maintainance branches
363 +-----maint-5.005------perl
364 +-----maint-5.6--------perl
365 +-----maint-5.8--------perl
366 +-----pureperl---------pureperl
368 Perforce uses a branching model that simply tracks relationships
369 between files. It does not care about directories at all, so
370 any file can be a branch of any other file--the fully qualified
371 depot path name (of the form //depot/foo/bar.c) uniquely determines
372 a file for the purpose of establishing branching relationships.
373 Since a branch usually involves hundreds of files, such relationships
374 are typically specified en masse using a branch map (try `p4 help branch`).
375 `p4 branches` lists the existing branches that have been set up.
376 `p4 branch -o branchname` can be used to view the map for a particular
377 branch, if you want to determine the ancestor for a particular set of
380 The mainline (aka "trunk") code in the Perl repository is under
381 "//depot/perl/...". Most branches typically map its entire
382 contents under a directory that goes by the same name as the branch
383 name. Thus the contents of the perlio branch are to be found
386 Run `p4 client` to specify how the repository contents should map to
387 your local disk. Most users will typically have a client map that
388 includes at least their entire branch and the contents of the mainline.
390 Run `p4 changes -l -m10` to check on the activity in the repository.
391 //depot/perl/Porting/genlog is useful to get an annotated changelog
392 that shows files and branches. You can use this listing to determine
393 if there are any changes in the mainline that you need to merge into
394 your own branch. A typical merging session looks like this:
397 % p4 integrate -b perlio # to bring parent changes into perlio
398 % p4 resolve -am ./... # auto merge the changes
399 % p4 resolve ./... # manual merge conflicting changes
400 % p4 submit ./... # check in
402 If the owner of the mainline wants to bring the changes in perlio
403 back into the mainline, they do:
405 % p4 integrate -r -b perlio
408 Generating a patch for change#42 is done as follows:
410 % p4genpatch 42 > change-42.patch
412 F<p4genpatch> is to be found in //depot/perl/Porting/.
414 The usual routine to apply a patch is
416 % p4 edit file.c file.h
419 (any necessary, re-Configure, make regen_headers, make clean, etc, here)
423 (preferably make all test in several platforms and under several
424 different Configurations)
433 Other useful Perforce commands
435 % p4 describe -du 12345 # show change 12345
437 Note: the output of "p4 describe" is not in proper diff format, use
438 the F<Porting/p4genpatch> to get a diff-compatible format.
439 (Note that it may be easier to get one already prepared: grep
440 L<perlhack> for APC, and append eg "/diffs/12345.gz" to one of the
441 URLs to get a usable patch.)
443 % p4 diff -se ./... # have I modified something but forgotten
444 # to "p4 edit", easy faux pas with autogenerated
445 # files like proto.h, or if one forgets to
446 # look carefully which files a patch modifies
447 % p4 sync file.h # if someone else has modified file.h
448 % p4 opened # which files are opened (p4 edit) by me
449 % p4 opened -a # which files are opened by anybody
450 % p4 diff -du file.c # what changes have I done
451 % p4 revert file.h # never mind my changes
452 % p4 sync -f argh.c # forcibly synchronize your file
453 # from the repository
454 % p4 diff -sr | p4 -x - revert
455 # throw away (opened but) unchanged files
456 # (in Perforce it's a little bit too easy
457 # to checkin unchanged files)
459 Integrate patch 12345 from the mainline to the maint-5.6 branch:
460 (you have to in the directory that has both the mainline and
461 the maint-5.6/perl as subdirectories)
463 % p4 integrate -d perl/...@12345,12345 maint-5.6/perl/...
465 Integrate patches 12347-12350 from the perlio branch to the mainline:
467 % p4 integrate -d perlio/...@12347,12350 perl/...
469 =head1 Contact Information
471 The mail alias E<lt>perl-repository-keepers@perl.orgE<gt> can be used to reach
472 all current users of the repository.
474 The repository keeper is currently Gurusamy Sarathy
475 E<lt>gsar@activestate.comE<gt>.
479 Malcolm Beattie, E<lt>mbeattie@sable.ox.ac.ukE<gt>, 24 June 1997.
481 Gurusamy Sarathy, E<lt>gsar@activestate.comE<gt>, 8 May 1999.
483 Slightly updated by Simon Cozens, E<lt>simon@brecon.co.ukE<gt>, 3 July 2000.
485 More updates by Jarkko Hietaniemi, E<lt>jhi@iki.fiE<gt>, 28 June 2001.
487 Perforce clarifications by Randall Gellens, E<lt>rcg@users.sourceforge.netE<gt>, 12 July 2001.
489 Windows-related updates by Steve Hay E<lt>shay@cpan.orgE<gt>, 23 July 2004.