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