[project @ 2000-04-20 15:48:20 by simonmar]
authorsimonmar <unknown>
Thu, 20 Apr 2000 15:48:20 +0000 (15:48 +0000)
committersimonmar <unknown>
Thu, 20 Apr 2000 15:48:20 +0000 (15:48 +0000)
Update this file to the one on the web site, and add Simon's latest
notes about using the cvs- lists for bug reports about the cvs
sources.

docs/cvs-cheat-sheet.html

index 3990999..76f4c2e 100644 (file)
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-<HTML>
-<HEAD>
-   <TITLE>Access To The GHC CVS Repository</TITLE>
-   <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; SunOS 5.5.1 i86pc) [Netscape]">
-</HEAD>
-<BODY TEXT="#2C3361" BGCOLOR="#FFFFFF" ALINK="#11BBFF">
-
-<H1><B>FP Tools CVS Cheat Sheet</B></H1>
-
-<p> At Glasgow, we use CVS (Concurrent Version System) to keep track
-of our sources for various software projects.  CVS lets several people
-work on the same software at the same time, allowing changes to be
-checked in incrementally.
-
-<p>Information on using CVS can be obtained from <a
-href="http://www.cyclic.com">Cyclic Software</a>.  If you're at
-Glasgow, the full documentation for CVS is online, in info format (use
-'info cvs' or run emacs and type C-h i).  A good source of tips is the
-CVS FAQ, in /local/doc/gnu/CVS.FAQ.  Bradley C. Kuszmaul also provides
-a "to the point" <a
-href="http://arch.cs.yale.edu:8080/~bradley/cvs-instructions">introduction
-to CVS</a>.
-
-<p>This note is supposed to be a set of guidelines for how to use our
-CVS repository, and will probably evolve in time.  The main thing to
-remember is that most mistakes can be undone, but if there's anything
-you're not sure about feel free to bug the local CVS meister (namely
-<a href="mailto:simonm@dcs.gla.ac.uk">Simon Marlow</a>).
-
-<p><b>Contents</b>
-
-<ul>
-<li><a href="#read-only">Read-only remote access</a>
-<li><a href="#read-write">Read-write remote access</a>
-<li><a href="#first">Using CVS for the first time</a>
-<li><a href="#checkout">Checking out a source tree</a>
-<li><a href="#commit">Committing changes</a>
-<li><a href="#update">Updating your source tree</a>
-<li><a href="#hints">General Hints</a>
-</ul>
-
-<h2><b><a name="read-only">Remote Read-only CVS Access</a></b></h2>
-
-<p> Read-only access is available to anyone - there's no need to ask
-us first.  We use the <a
-href="http://openbsd.org/anoncvs.html">anoncvs</a> mechanism pioneered
-by the <a href="http://openbsd.org/">OpenBSD</a> folks.  To get
-read-only access to our repository, just set your CVSROOT environment
-variable to
-
-<pre>
-       anoncvs@solander.dcs.gla.ac.uk:/cvs
-</pre>
-
-<p>and you can then check out a source tree using normal CVS commands.
-For example:
-
-<pre>
-       $ cvs checkout fpconfig
-       $ cd fptools
-       $ cvs checkout ghc
-</pre>
-
-<p> gets a brand spanking new set of GHC sources.  The layout of our
-CVS repository is described below, under <a
-href="cvs-cheat-sheet.html#first">Using CVS for the first time</a>.
-
-<p>With read-only CVS access you can do anything except commit changes
-to the repository.  You can make changes to your local tree, and still
-use CVS's merge facility to keep your tree up to date, and you can
-generate patches using 'cvs diff' in order to send to us for
-inclusion.
-
-<p>If you like, you can use <a
-href="http://www.cs.hut.fi/ssh/">ssh</a> instead of the standard
-<code>rsh</code> to connect to the CVS server.  Just set your
-<code>CVS_RSH</code> variable to <code>ssh</code>.
-
-<h2><b><a name="read-write">Remote Read-Write CVS Access</a></b></h2>
-
-<p>We generally supply read-write access to folk doing serious
-development on some part of the source tree, when going through us
-would be a pain.  If you're developing some feature, or think you have
-the time and inclination to fix bugs in our sources, feel free to ask
-for read-write access.  There is a certain amount of responsibility
-that goes with commit privileges; we are more likely to grant you
-access if you've demonstrated your competence by sending us patches
-via mail in the past.
-
-<p>To use remote CVS, you need to supply me with a username and
-encrypted password.  Once you've done that and the account has been
-set up, you need to do:
-
-<pre>
-     cvs -d &lt;username&gt;@solander.dcs.gla.ac.uk:/local/fp/src/cvsroot login
-</pre>
-
-<p>CVS will ask for a password.  You only need to enter the password
-once, it will be recorded in .cvspass in your home directory.
-
-<pre>
-   setenv CVSROOT :pserver:&lt;username&gt;@solander.dcs.gla.ac.uk:/local/fp/src/cvsroot
-</pre>
-
-<p>The <code>CVSROOT</code> environment variable will be recorded in the
-checked-out tree, so you don't need to set this every time either.
-Ignore the instructions for setting <code>CVSROOT</code> below.
-
-
-<h2><b><a name="first">Using CVS for the First Time</a></b></h2>
-
-<ul>
-<li>
-ok, everybody now...) Firstly, identify which areas of the source
-tree you'll be working on.  The directory structure looks like this:
-<p>
-
-<center>
-<table>
-<tr>   <td>fptools/ghc                 <td>GHC
-<tr>    <td>fptools/happy              <td>Happy
-<tr>    <td>fptools/haggis             <td>Haggis
-<tr>    <td>fptools/green-card         <td>Green Card
-<tr>    <td>fptools/nofib              <td>Nofib test suite
-<tr>    <td>fptools/hdirect            <td>IDL-to-Haskell compiler
-<tr>    <td>fptools/common-rts         <td>GHC/Hugs combined run-time system
-</table>
-</center>
-
-<p>For each directory, there's a mailing list:
-<code>fp-cvs-ghc</code>, <code>fp-cvs-nofib</code> etc.  Everyone on
-the mailing list is sent a message automatically by CVS whenever
-someone checks in a change, this helps to keep track of what's going
-on when several people are working on related stuff.  Ask the CVS
-meister to put you on the relevant mailing lists.  
-<p>
-
-<li>
- Create a .cvsrc file.  Mine looks like this:
-
-<pre>
-       checkout -P
-       release -d
-       update -P
-       diff -c
-</pre>
-
-  It just gives default flags for some of the CVS commands.  For instance,
-  the -P flag to 'checkout' says prune empty directories, which is
-  normally what you want.
-</ul>
-
-<h2><b><a name="checkout">Checking Out a Source Tree</a></b></h2>
-
-<ul>
-<li> Check out your sources.  If you're not at Glasgow, make sure you
-set your <code>CVSROOT</code> environment variable according to either of the
-remote methods above.  Glasgow folk need to set their
-<code>CVSROOT</code> environment variables as follows: 
-
-<pre>
-       $ CVSROOT=/local/fp/src/cvsroot
-       $ export CVSROOT
-</pre>
-
-       or, if you're using csh or tcsh:
-
-<pre>
-       $ setenv CVSROOT=/local/fp/src/cvsroot
-</pre>
-
-The Approved Way (at least by me) to check out a source tree is as
-follows:
-
-<pre>
-       $ cvs checkout fpconfig
-</pre>
-
-At this point you have a new directory called 'fptools' which contains
-the basic stuff for the fptools suite - including the configuration
-files and some other junk.
-
-<pre>
-       $ mv fptools &lt;directory&gt;
-</pre>
-
-  You can call the fptools directory whatever you like, CVS won't mind.
-
-<pre>
-       $ cd &lt;directory&gt;
-       $ cvs checkout ghc happy
-</pre>
-
-The second command here checks out the relevant modules you want to
-work on.  For a GHC build, for instance, you need at least the
-<code>ghc</code> module (in fact you can get away with just that).
-</ul>
-
-
-<h2><b><a name="commit">Committing Your Changes</a></b></h2>
-
-<p>This is only if you have read-write access to the repository.  For
-anoncvs users, CVS will issue a "read-only repository" error if you
-try to commit changes.
-
-<ul>
-<li>
-Build the software, if necessary.  Unless you're just working on
-documentation, you'll probably want to build the software in order
-to test any changes you make.  For GHC, instructions can be found
-in the GHC installation guide.<p>
-
-<li> Make changes.  Preferably small ones first.<p>
-
-<li> Test them.  You can see exactly what changes you've made by using
-the <code>cvs diff</code> command.  For example,<p>
-
-<pre>
-       $ cvs diff
-</pre>
-
-lists all the changes (using the <code>diff</code> command) in and
-below the current directory.  In emacs, C-c C-v C-= runs <code>cvs
-diff</code> on the current buffer and shows you the results.<p>
-
-<li> Before checking in a change, you need to update your source tree:
-
-<pre>
-       $ cd fptools
-       $ cvs update
-</pre>
-
-This pulls in any changes that other people have made, and merges them 
-with yours.  If there are any conflicts, CVS will tell you, and you'll 
-have to resolve them before you can check your changes in.  The 
-documentation describes what to do in the event of a conflict.
-
-<p> It's not always necessary to do a full cvs update before checking
-in a change, since CVS will always tell you if you try to check in a
-file that someone else has changed.  However, you should still update
-at regular intervals to avoid making changes that don't work in
-conjuction with changes that someone else made.  Keeping an eye on
-what goes by on the mailing list can help here.<p>
-
-<li> When you're happy that your change isn't going to break anything,
-  check it in.  For a one-file change:
-
-<pre>
-       $ cvs commit &lt;filename&gt;
-</pre>
-
-<p>CVS will then pop up an editor for you to enter a "commit message",
-this is just a short description of what your change does, and will
-be kept in the history of the file.  
-
-<p>If you're using emacs, simply load up the file into a buffer and type
-C-x C-q, and emacs will prompt for a commit message and then check in
-the file for you.
-
-<p>For a multiple-file change, things are a bit trickier.  There are 
-several ways to do this, but this is the way I find easiest.  
-First type the commit message into a temporary file.  Then either
-
-<pre>
-       $ cvs commit -F &lt;commit-message&gt; &lt;file_1&gt; .... &lt;file_n&gt;
-</pre>
-
-  or, if nothing else has changed in this part of the source tree,
-
-<pre>
-       $ cvs commit -F &lt;commit-message&gt; &lt;directory&gt;
-</pre>
-
-where &lt;directory> is a common parent directory for all your changes, 
-and &lt;commit-message> is the name of the file containing the commit
-message.
-
-<p>Shortly afterwards, you'll get some mail from the relevant mailing
-list saying which files changed, and giving the commit message.  For a
-multiple-file change, you should still get only *one* message.  
-
-</ul>
-
-<h2><b><a name="update">Updating Your Source Tree</a></b></h2>
-
-<p>It can be tempting to cvs update just part of a source tree to
-bring in some changes that someone else has made, or before committing
-your own changes.  This is NOT RECOMMENDED!  Quite often changes in
-one part of the tree are dependent on changes in another part of the
-tree (the <code>mk/*.mk</code> files are a good example where problems
-crop up quite often).  Having an inconsistent tree is a major cause of
-headaches.
-
-<p>So, to avoid a lot of hassle, follow this recipe for updating your
-tree:
-
-<pre>
-$ cd fptools
-$ cvs update -Pd 2>&1 | tee log
-</pre>
-
-<p>Look at the log file, and fix any conflicts (denoted by a 'C' in the
-first column).  If you're using multiple build trees, then for every
-build tree you have pointing at this source tree, you need to update
-the links in case any new files have appeared:
-
-<pre>
-$ cd &lt;build-tree&gt;
-$ lndir &lt;source-tree&gt;
-</pre>
-
-<p>Some files might have been removed, so you need to remove the links
-pointing to these non-existent files:
-
-<pre>
-$ find . -xtype l -exec rm '{}' \;
-</pre>
-
-<p>And finally, re-configure to take into accound any changes in
-mk/config.mk.in.
-
-<pre>
-$ ./configure
-</pre>
-
-<p>To be *really* safe, you should do
-
-<pre>
-$ gmake boot && gmake all
-</pre>
-
-<p>from the top-level, to update the dependencies and build any changed
-files.
-
-
-<h2><b><a name="hints">General Hints</a></b></h2>
-
-<ul>
-<li> As a general rule: commit changes in small units, preferably
-  addressing one issue or implementing a single feature.  Provide a 
-  descriptive log message so that the repository records exactly which 
-  changes were required to implement a given feature/fix a bug.  I've 
-  found this *very* useful in the past for finding out when a particular
-  bug was introduced: you can just wind back the CVS tree until
-  the bug disappears.<p>
-
-<li> Keep the sources at least *buildable* at any given time.  No
-  doubt bugs will creep in, but it's quite easy to ensure that any
-  change made at least leaves the tree in a buildable state.  We do
-  nightly builds of GHC to keep an eye on what things work/don't work
-  each day and how we're doing in relation to previous verions.  This
-  idea is truely wrecked if the compiler won't build in the first
-  place!<p>
-
-
-<li> To check out extra bits into an already-checked-out tree, use the
-  following procedure.  Suppose you have a checked-out fptools tree containing
-  just ghc, and you want to add nofib to it:
-
-<pre>
-       cd fptools
-       cvs checkout nofib
-</pre>
-
-  or:
-       
-<pre>
-       cd fptools
-       cvs update -d nofib
-</pre>
-
-  (the -d flag tells update to create a new directory).  If you just want
-  part of the nofib suite, you can do
-
-<pre>
-       cd fptools
-       cvs checkout nofib/spectral
-</pre>
-
-This works because <code>nofib</code> is a module in its own right,
-and spectral is a subdirectory of the nofib module.  The path
-argument to checkout must always start with a module name.  There's
-no equivalent form of this command using <code>update</code>.
-</ul>
-
-Ok, that'll do for now.  If there's anything else you'd like to see in
-this file, just let me know.
-
-<p><a href="mailto:simonm@dcs.gla.ac.uk">Simon Marlow</a>
-
-</body>
-</html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">\r
+<html>\r
+\r
+<head>\r
+<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">\r
+<meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0">\r
+<title>Access To The GHC CVS Repository</title>\r
+</head>\r
+\r
+<body TEXT="#2C3361" BGCOLOR="#FFFFFF" ALINK="#11BBFF">\r
+\r
+<h1><b>FP Tools CVS Cheat Sheet</b></h1>\r
+\r
+<p>We use CVS (Concurrent Version System) to keep track of our sources for various\r
+software projects. CVS lets several people work on the same software at the same time,\r
+allowing changes to be checked in incrementally. </p>\r
+\r
+<p>Information on using CVS can be obtained from <a HREF="http://www.cyclic.com">Cyclic\r
+Software</a>. </p>\r
+\r
+<p>This note is supposed to be a set of guidelines for how to use our CVS repository, and\r
+will probably evolve in time. The main thing to remember is that most mistakes can be\r
+undone, but if there's anything you're not sure about feel free to bug the local CVS\r
+meister (namely <a HREF="mailto:jlewis@cse.ogi.edu">Jeff Lewis</a>). </p>\r
+\r
+<p><b>Contents</b> \r
+\r
+<ul>\r
+  <li><a HREF="#read-only">Read-only remote access</a></li>\r
+  <li><a HREF="#read-write">Read-write remote access</a></li>\r
+  <li><a HREF="#first">Using CVS for the first time</a></li>\r
+  <li><a HREF="#checkout">Checking out a source tree</a></li>\r
+  <li><a HREF="#commit">Committing changes</a></li>\r
+  <li><a HREF="#update">Updating your source tree</a></li>\r
+  <li><a HREF="#hints">General Hints</a></li>\r
+</ul>\r
+\r
+<h2><a NAME="read-only"></a><b>Remote Read-only CVS Access</b></h2>\r
+\r
+<p>Read-only access is available to anyone - there's no need to ask us first. To get\r
+read-only access to our repository:\r
+\r
+<ul>\r
+  <li>set your CVSROOT environment variable to <tt>:pserver:anoncvs@glass.cse.ogi.edu:/cvs</tt></li>\r
+  <li>The first time you access the repository, you'll need to do <tt>cvs login</tt>.&nbsp;\r
+    The password is simply <tt>cvs</tt>.&nbsp; This sets up a file in your home directory\r
+    called <tt>.cvspass</tt>, which squirrels away the dummy password, so you only need to do\r
+    this step one time.</li>\r
+  <li>Now, you can check out a source tree using normal CVS commands. For example:</li>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs checkout fpconfig\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cd fptools\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs checkout ghc</pre>\r
+  <p>gets a brand spanking new set of GHC sources.</p>\r
+</ul>\r
+\r
+<p>The layout of our CVS repository is described below, under <a HREF="#first">Using CVS\r
+for the first time</a>. </p>\r
+\r
+<p>With read-only CVS access you can do anything except commit changes to the repository.\r
+You can make changes to your local tree, and still use CVS's merge facility to keep your\r
+tree up to date, and you can generate patches using 'cvs diff' in order to send to us for\r
+inclusion. </p>\r
+\r
+<h2><a NAME="read-write"></a><b>Remote Read-Write CVS Access</b></h2>\r
+\r
+<p>We generally supply read-write access to folk doing serious development on some part of\r
+the source tree, when going through us would be a pain. If you're developing some feature,\r
+or think you have the time and inclination to fix bugs in our sources, feel free to ask\r
+for read-write access. There is a certain amount of responsibility that goes with commit\r
+privileges; we are more likely to grant you access if you've demonstrated your competence\r
+by sending us patches via mail in the past. </p>\r
+\r
+<p>To use remote CVS, you need to supply me with a username and\r
+encrypted password. Once you've done that and the account on\r
+cvs.haskell.org has been set up, you need to install <a\r
+HREF="http://www.ssh.fi/">ssh</a>, which is relatively painless.  Log\r
+in to cvs.haskell.org, and set up your <tt>.ssh/authorized_keys</tt>\r
+file to allow logins from your local machine without a password (the\r
+ssh documentation has details on how to do this).  Then, just\r
+\r
+<ul>\r
+  <li> set your <tt>CVSROOT</tt> environment variable to <tt>:ext:&lt;username&gt;@cvs.haskell.org:/home/cvs/root</tt>.\r
+  </li>\r
+  <li>set your<tt> CVS_RSH </tt>environment variable to <tt>ssh</tt>.</li>\r
+</ul>\r
+\r
+<p>The <tt>CVSROOT</tt> environment variable will be recorded in the checked-out tree, so\r
+you don't need to set this every time either. Ignore the instructions for setting <tt>CVSROOT</tt>\r
+below. </p>\r
+<b>\r
+\r
+<p>Caveats:</b> \r
+\r
+<ul>\r
+  <li>Setting your <tt>CVS_RSH</tt> to <tt>ssh</tt> assumes that your CVS client understands\r
+    how to execute shell script (&quot;#!&quot;s,really), which is what <tt>ssh</tt> is. This\r
+    may not be the case on some platforms (read: Win32), so in that case set <tt>CVS_RSH</tt>\r
+    to <tt>ssh1</tt>.</li>\r
+</ul>\r
+\r
+<h2><a NAME="first"></a><b>Using CVS for the First Time</b></h2>\r
+\r
+<ul>\r
+  <li>(ok, everybody now...) Firstly, identify which areas of the source tree you'll be\r
+    working on. The directory structure looks like this:</li>\r
+  <div align="center"><center><table>\r
+    <tr>\r
+      <td>fptools/ghc&nbsp;</td>\r
+      <td>GHC</td>\r
+    </tr>\r
+    <tr>\r
+      <td>fptools/happy&nbsp;</td>\r
+      <td>Happy</td>\r
+    </tr>\r
+    <tr>\r
+      <td>fptools/green-card&nbsp;</td>\r
+      <td>Green Card</td>\r
+    </tr>\r
+    <tr>\r
+      <td>fptools/nofib&nbsp;</td>\r
+      <td>Nofib test suite</td>\r
+    </tr>\r
+    <tr>\r
+      <td>fptools/hdirect&nbsp;</td>\r
+      <td>IDL-to-Haskell compiler</td>\r
+    </tr>\r
+  </table>\r
+  </center></div><p>For each directory, there's a mailing list: <tt>cvs-ghc</tt>, <tt>cvs-nofib</tt>\r
+  etc. Everyone on the mailing list is sent a message automatically by CVS whenever someone\r
+  checks in a change, this helps to keep track of what's going on when several people are\r
+  working on related stuff. To join any of these mailing lists, mail <a\r
+  href="mailto:majordomo@haskell.org">majordomo@haskell.org</a>. </p>\r
+  <li>Create a .cvsrc file. Mine looks like this:</li>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkout -P\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; release -d\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update -P\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diff -c</pre>\r
+  <p>It just gives default flags for some of the CVS commands. For instance, the -P flag to\r
+  'checkout' says prune empty directories, which is normally what you want.</p>\r
+</ul>\r
+\r
+<h2><a NAME="checkout"></a><b>Checking Out a Source Tree</b></h2>\r
+\r
+<ul>\r
+  <li>Check out your sources. Make sure you set your <tt>CVSROOT</tt> environment variable\r
+    according to either of the remote methods above. The Approved Way (at least by me) to\r
+    check out a source tree is as follows:</li>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs checkout fpconfig</pre>\r
+  <p>At this point you have a new directory called 'fptools' which contains the basic stuff\r
+  for the fptools suite - including the configuration files and some other junk. </p>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ mv fptools &lt;directory&gt;</pre>\r
+  <p>You can call the fptools directory whatever you like, CVS won't mind. </p>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cd &lt;directory&gt;\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs checkout ghc happy</pre>\r
+  <p>The second command here checks out the relevant modules you want to work on. For a GHC\r
+  build, for instance, you need at least the <tt>ghc</tt> module (in fact you can get away\r
+  with just that).</p>\r
+</ul>\r
+\r
+<h2><a NAME="commit"></a><b>Committing Your Changes</b></h2>\r
+\r
+<p>This is only if you have read-write access to the repository. For anoncvs users, CVS\r
+will issue a &quot;read-only repository&quot; error if you try to commit changes. \r
+\r
+<ul>\r
+  <li>Build the software, if necessary. Unless you're just working on documentation, you'll\r
+    probably want to build the software in order to test any changes you make. For GHC,\r
+    instructions can be found in the GHC installation guide.</li>\r
+  <li>Make changes. Preferably small ones first.</li>\r
+  <li>Test them. You can see exactly what changes you've made by using the <tt>cvs diff</tt>\r
+    command. For example, <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs diff</pre>\r
+    <p>lists all the changes (using the <tt>diff</tt> command) in and below the current\r
+    directory. In emacs, C-c C-v C-= runs <tt>cvs diff</tt> on the current buffer and shows\r
+    you the results.</p>\r
+  </li>\r
+  <li>Before checking in a change, you need to update your source tree:</li>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cd fptools\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs update</pre>\r
+  <p>This pulls in any changes that other people have made, and merges them with yours. If\r
+  there are any conflicts, CVS will tell you, and you'll have to resolve them before you can\r
+  check your changes in. The documentation describes what to do in the event of a conflict. </p>\r
+  <p>It's not always necessary to do a full cvs update before checking in a change, since\r
+  CVS will always tell you if you try to check in a file that someone else has changed.\r
+  However, you should still update at regular intervals to avoid making changes that don't\r
+  work in conjuction with changes that someone else made. Keeping an eye on what goes by on\r
+  the mailing list can help here. <br>\r
+  &nbsp; <br>\r
+  &nbsp; </p>\r
+  <li>When you're happy that your change isn't going to break anything, check it in. For a\r
+    one-file change:</li>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs commit &lt;filename&gt;</pre>\r
+  <p>CVS will then pop up an editor for you to enter a &quot;commit message&quot;, this is\r
+  just a short description of what your change does, and will be kept in the history of the\r
+  file. </p>\r
+  <p>If you're using emacs, simply load up the file into a buffer and type C-x C-q, and\r
+  emacs will prompt for a commit message and then check in the file for you. </p>\r
+  <p>For a multiple-file change, things are a bit trickier. There are several ways to do\r
+  this, but this is the way I find easiest. First type the commit message into a temporary\r
+  file. Then either </p>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs commit -F &lt;commit-message&gt; &lt;file_1&gt; .... &lt;file_n&gt;</pre>\r
+  <p>or, if nothing else has changed in this part of the source tree, </p>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ cvs commit -F &lt;commit-message&gt; &lt;directory&gt;</pre>\r
+  <p>where &lt;directory&gt; is a common parent directory for all your changes, and\r
+  &lt;commit-message&gt; is the name of the file containing the commit message. </p>\r
+  <p>Shortly afterwards, you'll get some mail from the relevant mailing list saying which\r
+  files changed, and giving the commit message. For a multiple-file change, you should still\r
+  get only *one* message.</p>\r
+</ul>\r
+\r
+<h2><a NAME="update"></a><b>Updating Your Source Tree</b></h2>\r
+\r
+<p>It can be tempting to cvs update just part of a source tree to bring in some changes\r
+that someone else has made, or before committing your own changes. This is NOT\r
+RECOMMENDED! Quite often changes in one part of the tree are dependent on changes in\r
+another part of the tree (the <tt>mk/*.mk</tt> files are a good example where problems\r
+crop up quite often). Having an inconsistent tree is a major cause of headaches. </p>\r
+\r
+<p>So, to avoid a lot of hassle, follow this recipe for updating your tree: </p>\r
+\r
+<pre>$ cd fptools\r
+$ cvs update -Pd 2&gt;&amp;1 | tee log</pre>\r
+\r
+<p>Look at the log file, and fix any conflicts (denoted by a 'C' in the first column). If\r
+you're using multiple build trees, then for every build tree you have pointing at this\r
+source tree, you need to update the links in case any new files have appeared: </p>\r
+\r
+<pre>$ cd &lt;build-tree&gt;\r
+$ lndir &lt;source-tree&gt;</pre>\r
+\r
+<p>Some files might have been removed, so you need to remove the links pointing to these\r
+non-existent files: </p>\r
+\r
+<pre>$ find . -xtype l -exec rm '{}' \;</pre>\r
+\r
+<p>And finally, re-configure to take into accound any changes in mk/config.mk.in. </p>\r
+\r
+<pre>$ ./configure</pre>\r
+\r
+<p>To be *really* safe, you should do </p>\r
+\r
+<pre>$ gmake boot &amp;&amp; gmake all</pre>\r
+\r
+<p>from the top-level, to update the dependencies and build any changed files. </p>\r
+\r
+<h2><a NAME="tags"></a><b>GHC Tag Policy</b></h2>\r
+\r
+If you want to check out a particular version of GHC, you'll need to\r
+know how we tag versions in the repository.  The policy (as of 4.04)\r
+is:\r
+\r
+<ul>\r
+   <li> The tree is branched before every major release.  The branch\r
+   tag is <tt>ghc-x-xx-branch</tt>, where <tt>x-xx</tt> is the version\r
+   number of the release with the <tt>'.'</tt> replaced by a\r
+   <tt>'-'</tt>.  For example, the 4.04 release lives on\r
+   <tt>ghc-4-04-branch</tt>.</li>\r
+\r
+   <li> The release itself is tagged with <tt>ghc-x-xx</tt> (on the\r
+   branch).  eg. 4.06 is called <tt>ghc-4-06</tt>.</li>\r
+\r
+   <li> We didn't always follow these guidelines, so to see what tags\r
+   there are for previous versions, do <tt>cvs log</tt> on a file\r
+   that's been around for a while (like <tt>fptools/ghc/README</tt>).\r
+</ul>\r
+\r
+So, to check out a fresh GHC 4.06 tree you would do:\r
+\r
+<pre>\r
+     $ cvs co -r ghc-4-06 fpconfig\r
+     $ cd fptools\r
+     $ cvs co -r ghc-4-06 ghc hslibs\r
+</pre>\r
+\r
+\r
+<h2><a NAME="hints"></a><b>General Hints</b></h2>\r
+\r
+<ul>\r
+  <li>As a general rule: commit changes in small units, preferably addressing one issue or\r
+    implementing a single feature. Provide a descriptive log message so that the repository\r
+    records exactly which changes were required to implement a given feature/fix a bug. I've\r
+    found this *very* useful in the past for finding out when a particular bug was introduced:\r
+    you can just wind back the CVS tree until the bug disappears.</li>\r
+  <li>Keep the sources at least *buildable* at any given time. No doubt bugs will creep in,\r
+    but it's quite easy to ensure that any change made at least leaves the tree in a buildable\r
+    state. We do nightly builds of GHC to keep an eye on what things work/don't work each day\r
+    and how we're doing in relation to previous verions. This idea is truely wrecked if the\r
+    compiler won't build in the first place!</li>\r
+  <li>To check out extra bits into an already-checked-out tree, use the following procedure.\r
+    Suppose you have a checked-out fptools tree containing just ghc, and you want to add nofib\r
+    to it:</li>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd fptools\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cvs checkout nofib</pre>\r
+  <p>or: </p>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd fptools\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cvs update -d nofib</pre>\r
+  <p>(the -d flag tells update to create a new directory). If you just want part of the\r
+  nofib suite, you can do </p>\r
+  <pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd fptools\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cvs checkout nofib/spectral</pre>\r
+  <p>This works because <tt>nofib</tt> is a module in its own right, and spectral is a\r
+  subdirectory of the nofib module. The path argument to checkout must always start with a\r
+  module name. There's no equivalent form of this command using <tt>update</tt>.</p>\r
+</ul>\r
+\r
+<h2>Reporting Bugs in the CVS sources</h2>\r
+\r
+<p> If you are reporting a bug or infelicity in the CVS version of\r
+GHC, please send your message to </p>\r
+\r
+<table align="center">\r
+<tr><td>\r
+       <a href="mailto:cvs-ghc@haskell.org">cvs-ghc@haskell.org</a><td></td>\r
+</td></tr>\r
+<tr><td>\r
+       <a href="mailto:cvs-hslibs@haskell.org">cvs-hslibs@haskell.org</a> \r
+       <td>(for hslibs/ stuff)</td>\r
+</td></tr>\r
+<tr><td>\r
+       <a href="mailto:cvs-nofib@haskell.org">cvs-nofib@haskell.org</a>\r
+       <td>(for nofib/ stuff)</td>\r
+</td></tr>\r
+</table>\r
+\r
+<p>(not to glasgow-haskell-bugs).   Two reasons:</p>\r
+\r
+<ul>\r
+<li> Readers of glasgow-haskell-bugs will get less junk mail</li>\r
+\r
+<li> I'm a little worried that ghc-bugs readers are beginning to think\r
+  "is ghc really this unreliable?"!    The checked-in-last-night version\r
+  of GHC just isn't going to be solid.  No one expects it to be.  But\r
+  a casual reader might not distinguish.</li>\r
+</ul>\r
+\r
+<p>Please don't stop sending bug reports though.  They are really useful.</p>\r
+\r
+<hr>\r
+\r
+<p>Ok, that'll do for now. If there's anything else you'd like to see\r
+in this file, just let us know. </p>\r
+\r
+<table>\r
+  <tr>\r
+    <td><a HREF="mailto:jlewis@cse.ogi.edu">Jeff Lewis</a> </td>\r
+  </tr>\r
+  <tr>\r
+    <td><a HREF="mailto:simonm@dcs.gla.ac.uk">Simon Marlow</a> </td>\r
+  </tr>\r
+</table>\r
+</body>\r
+</html>\r