    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: Using CVS (A Beginner's Guide)</title>
        <link>https://members.accu.org/index.php/articles/1147</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Project Management + CVu Journal Vol 13, #6 - Dec 2001</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c66/">Management</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c77/">CVu</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c117/">136</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c66-117/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c66+117/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;Using CVS (A Beginner's Guide)</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 03 December 2001 13:15:48 +00:00 or Mon, 03 December 2001 13:15:48 +00:00</p>
<p><strong>Summary:</strong>&nbsp;<p>This is a pretty short introduction to using CVS on a small-ish project. The scope covers basic versioning tasks (adding, removing, check-in, check-out) and goes up to very basic multi-user access tasks (branching and merging).</p></p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e22" id="d0e22"></a></h2>
</div>
<p>This is a pretty short introduction to using CVS on a small-ish
project. The scope covers basic versioning tasks (adding, removing,
check-in, check-out) and goes up to very basic multi-user access
tasks (branching and merging).</p>
<p>It's not intended to be a user guide; it's more the Blind
leading the Blind. That's why the apostrophe is not misplaced in
the sub-title - I am a beginner as a write this, hoping to pass on
what I've learned to you.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e28" id="d0e28"></a>Setting Up</h2>
</div>
<p>Start as you mean to go on. If this is your first exploration
into CVS territory, this bit is for you.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e33" id="d0e33"></a>Create The
Repository</h3>
</div>
<p>The first thing to do is to create a new repository: (I am
assuming a projects directory throughout this article)</p>
<pre class="programlisting">
cvs -d :local:/projects/cvs init
</pre>
<p>The <tt class="literal">-d</tt> argument tells CVS where to find
the repository. The first part of what follows is the server type -
in this case, the local machine. This will be different for remote
repositories, which I won't be covering here. After that, the path
to where you want the repository to live.</p>
<p>I have used the Unix path convention here. I recommend getting
Cygwin from RedHat<sup>[<a name="redhat" href="#ftn.redhat" id=
"redhat">1</a>]</sup>. This allows you to use the same convention
throughout as is used here. CVS is ported to Win32 as well, and
that version will accept Win32 path names, too:</p>
<pre class="programlisting">
cvs -d :local:c:\projects\cvs init
</pre>
<p>Having done this, you should notice a new directory called cvs
in your projects directory. This entry in turn has a CVSROOT
directory, which contains CVS's administrative files.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e56" id="d0e56"></a>Import a
Project</h3>
</div>
<p>In fact we will start a new project; when I say start as you
mean to go on, here's where it means the most: when you start a
project, the very first thing is to add the empty project to CVS.
That way, you can track all of your changes, including the first
check in. Let's start a project called helloworld. (If that sounds
familiar, you're in the right place!)</p>
<p>Create a new directory. It doesn't actually matter what it's
called, as long as it contains no files. Make it the current
directory.</p>
<p>Now we'll add a new project to CVS:</p>
<pre class="programlisting">
cvs import -m &quot;Initial Project&quot; helloworld
                 snl start
</pre>
<p>This creates a new project in CVS called <tt class=
"literal">helloworld</tt>, containing all files in the current
directory (yes - none at all). The import has a log message
&quot;Initial Project&quot;. The last two items are a vendor tag and a
release tag. These are useful when you are importing sources from a
third party (like a library), but are required on the import
command line. I use these items consistently; <tt class=
"literal">snl</tt> is the vendor (me) and <tt class=
"literal">start</tt> seems a suitable tag for the project head.</p>
<p>This command doesn't actually set up the current directory as a
working directory. For that, you need to check out the project to
the Working Directory.</p>
<p>Note that there is one other element to creating modules in CVS,
and that's defining them in the modules file. I recommend you look
in cvshome.org<sup>[<a name="cvshome" href="#ftn.cvshome" id=
"cvshome">2</a>]</sup>for that - it's really out of scope here.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e87" id="d0e87"></a>Getting The
Project Out</h3>
</div>
<p>Whenever you want to work on a project - whether you've just
imported it, or have worked on it previously - you need to check
out the module. In this case, we check out the module so we can add
files to it. Note that the default path for the module is the
repository name - in this case <tt class="literal">helloworld</tt>
- and CVS will create a directory called this as a child of the
current directory if it doesn't exist.</p>
<pre class="programlisting">
cvs co helloworld
</pre>
<p>This command will create the <tt class="literal">helloworld</tt>
directory, within which there will be a CVS directory. This is
where CVS keeps local information about the working project. Don't
mess with files in here!</p>
<p>Now we need to add files to the project. Here's where it gets
interesting.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e104" id="d0e104"></a>The Working
Project</h2>
</div>
<p>Now that you have a working directory, you can add files, and
put them under version control from the outset. First off, create a
new file called <tt class="literal">hello.cpp</tt> in the
<tt class="literal">helloworld</tt> directory.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e115" id="d0e115"></a>CVS
Keywords</h3>
</div>
<p>When you do anything in CVS that changes the repository, a log
entry is added to the history for that file. This log can be echoed
in your text files using keywords that CVS replaces with the log
entry. For example:</p>
<pre class="programlisting">
$Author$ $Date$
$Log$
</pre>
<p>Will get replaced by your login name, the current date and the
current history for the file. Put this in the top of the new file
now, and save it.</p>
<p>Now we'll add it to the repository.</p>
<pre class="programlisting">
cvs add hello.cpp
</pre>
<p>You don't need to put a log message to add because it doesn't
change the repository. As with all commands which <span class=
"emphasis"><em>potentially</em></span> change the repository, you
must commit your changes.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e133" id="d0e133"></a>Making Changes
Permanent</h3>
</div>
<p>This is the opposite of the cvs co command:</p>
<pre class="programlisting">
cvs ci -m &quot;Added file to the project&quot; hello.cpp
</pre>
<p>If you don't specify a <tt class="literal">-m</tt> argument to
<tt class="literal">ci</tt>, CVS will bring up your favourite text
editor for you to add a log message. The history of a file can be a
very useful thing to track, and leaving this blank would render it
useless.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e148" id="d0e148"></a>Seeing what
needs to be done</h3>
</div>
<p>Another feature of CVS is the ability to query the current
project to see what needs to be done. This is performed by the
update function, and this is just an overview of what it can
do.</p>
<p>Create a new file called <tt class="literal">hello.h</tt>. Leave
it blank for the moment.</p>
<p>Open up hello.cpp, and write the hello, world! Program. For the
purposes of this exercise, make it this one (it is deliberately in
error - it doesn't have to compile yet!):</p>
<pre class="programlisting">
#include iostream.h
void main()
{
  cout &lt;&lt; &quot;Hello, World\n&quot;;
}
</pre>
<p>Now type: <tt class="literal">cvs -n update</tt></p>
<p>Note the order of arguments: <tt class="literal">-n</tt> is an
option to CVS itself, not to the update function of CVS (which has
a number of its own options). This command checks the current
project for things that need to be done to bring the repository (or
the project itself) up to date. In this case, you should see
something like:</p>
<pre class="programlisting">
cvs update: Updating .
? hello.h
M hello.cpp
</pre>
<p>This output is CVS code for &quot;I don't know what <tt class=
"literal">hello.h</tt> is. <tt class="literal">hello.cpp</tt> has
been <tt class="literal">M</tt>odified&quot;. So, to bring the
repository in line, we need to add <tt class="literal">hello.h</tt>
and check in both files. Firstly, add the new file. Now run the
same update command again. This time, it should look like:</p>
<pre class="programlisting">
cvs update: Updating .
A hello.h
M hello.cpp
</pre>
<p>Which means &quot;<tt class="literal">hello.h</tt> has been added
locally, and needs to be committed&quot;.</p>
<p>We can check in the entire project at once by specifying no
files (CVS will by default recurse into any subdirectories you may
have, and check in any modified files):</p>
<pre class="programlisting">
cvs ci -m &quot;Added new header file. Added hello, world program to the main unit&quot;
</pre>
<p>Having done this, running the same update function again should
report no files out of line.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e200" id="d0e200"></a>Reverting
Changes</h3>
</div>
<p>The update function is also used to replace the local working
copy with a repository copy. For example, if you've made changes
you want/need to lose, or you want a specific (old) version of a
file.</p>
<pre class="programlisting">
cvs update -C
</pre>
<p>will retrieve the latest clean copy of a file from the
repository, overwriting locally modified files.</p>
<p>The update function is also used to merge two revisions of a
file. This is useful when you operate more than one branch (which
we discuss briefly later).</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e211" id="d0e211"></a>Binary
Files</h3>
</div>
<p>CVS does not check to see what kind of file you are adding. What
it may do, regardless of file name, extension etc. is change the
line endings to match some local convention. CVS always stores
files with linefeed only (UNIX style). This conversion is almost
guaranteed to corrupt any binary file such as an image or database
file.</p>
<p>Secondly, keyword substitution takes place, unless you
explicitly switch it off. This one is less likely to occur in most
cases, but it can be the cause of corrupted files.</p>
<p>Because CVS doesn't check for file types, you need to tell it
the difference between different files. This is done at add
time.</p>
<pre class="programlisting">
cvs add -k b filename
</pre>
<p>This specifies two things, that the file is binary, and that no
keyword substitution is to take place. There are other options; see
the manual<sup>[<a href="#ftn.cvshome">2</a>]</sup>.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e226" id="d0e226"></a>Release
Time</h2>
</div>
<p>When it's time to release the program, you need to be able to
mark the current sources. This is so that at any time, you can go
back and get the project as it was at that point in time. This is
very important in software development. What we want to do is to
name the files in the current project as a release. To do that, we
use a tag.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e231" id="d0e231"></a>Versions vs.
Revisions</h3>
</div>
<p>Have a look first at the status of the <tt class=
"literal">helloworld</tt> project:</p>
<pre class="programlisting">
cvs status
</pre>
<p>If we've both followed the instructions so far, it should report
that <tt class="literal">hello.cpp</tt> is revision 1.2 and
<tt class="literal">hello.h</tt> is revision 1.1. These numbers
really only mean something to CVS - they don't refer to a release
number or anything - they are the revision numbers used by CVS to
manage the file revisions.</p>
<p>What we want is to mark this project now to be a particular
<span class="emphasis"><em>version</em></span>.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e254" id="d0e254"></a>Creating a
Symbolic Release</h3>
</div>
<p>Tagging the current project is simple. Deciding on tag names is
less easy - a bit like naming variables in a program. The reason is
that a tag can be anything that starts with an alpha character
(upper or lowercase letter) and doesn't contain certain characters
like '.'.</p>
<p>Deciding on a naming convention early is a good goal. I use the
following:</p>
<pre class="programlisting">
v1_1ft2
v1_2rc2
v1_3
</pre>
<p>Where <tt class="literal">ft</tt> means Field Test and
<tt class="literal">rc</tt> means Release Candidate. I haven't
patented it ;-)</p>
<p>To tag a project, use the tag function:</p>
<pre class="programlisting">
cvs tag v0_1ft1 .
</pre>
<p>Note the trailing '.' to indicate the current directory.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e277" id="d0e277"></a>Go Back In
Time</h3>
</div>
<p>The main reason for tagging is so that you can go back to a
specific revision - a known working copy - of a project. If you're
familiar with Microsoft's Visual Source Safe, you may recognise
this as labelling.</p>
<p>Imagine you've been working on the <tt class=
"literal">helloworld</tt> project for a little while, and a bug is
reported in version 0.1 Release Candiate 1. Imagine also you're
currently in the middle of work on 0.1rc2, and you can't reproduce
the bug in the current version.</p>
<p>You need to check out the code for 0.1rc1 and work on that. The
check-out option (see Getting The Project Out) is used with the -r
flag:</p>
<pre class="programlisting">
cvs co -r v0_1ft1 helloworld
</pre>
<p>will get the project. You may also wan to check it out to a
different directory than the module name; CVS uses the module name
as the parent directory by default, but it doesn't care if you want
a different name. Try:</p>
<pre class="programlisting">
cvs co -r v0_1ft1 -d helloworld_0_1ft1
</pre>
<p>To see what tags a project has, you need to check out the HEAD
revision (the current revision), and look at the status with the
verbose option:</p>
<pre class="programlisting">
cvs status -v
</pre>
<p>Now if you can fix the bug, but it changes code in the current
release (rc2), you have a conflict. You may need to branch the
project and work in a clean-room.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e301" id="d0e301"></a>Branching
&amp; Merging</h2>
</div>
<p>Even on a so-called single-user project, it can be useful to
branch the project, so you can work on a &quot;clean&quot; copy.</p>
<p>For example, say you have written a program, and released it for
a field test (where users get to break the program). At the same
time, you want to work on a new version - the next full release -
but you know that the field-test will produce bugs and problems
with <span class="emphasis"><em>this</em></span> one. You have
three options:</p>
<div class="orderedlist">
<ol type="1">
<li>
<p>Hold off on the new release until after this full release has
gone ahead. Spin your wheels until the field tests are
complete...</p>
</li>
<li>
<p>Start a new project in the repository (a new working directory,
the whole thing). A bit of a waste of effort, unless the new
release is an entire re-write.</p>
</li>
<li>
<p>Branch your project under CVS and work on both in tandem. When
field testing is complete, you can merge changes occurring back to
the main project.</p>
</li>
</ol>
</div>
<p>If you've already decided on (1) or (2), you can skip the next
bit...</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e323" id="d0e323"></a>What is a
Branch?</h3>
</div>
<p>Using the example given above, and our <tt class=
"literal">helloworld</tt> project, let's examine what a branch is,
and how it works.</p>
<p>I assume you've performed the actions in the last section -
Release Time - and you have a tag on the current project of
<tt class="literal">v0_1ft1</tt>. A branch is a bit like a tag,
it's a named version of the project. What it gives you over a
normal tag is the ability to perform changes on the branch without
polluting the main trunk. Merging code back into the main trunk is
a controlled process, generally seen as the most complex and
error-prone aspect of branching.</p>
<p>To create the branch, check out the (possibly tagged at an
earlier stage - see above) project. Now create the branch tag:</p>
<pre class="programlisting">
cvs tag -b v0_1ft1_fix1
</pre>
<p>Now look at the output from:</p>
<pre class="programlisting">
cvs status -v
</pre>
<p>You'll see a new tag, and that it is a branch, and what version
it represents. The new version will (should) have a .2 appended to
the old revision (the one from which the branch was created).</p>
<p>As with newly imported projects, the current directory still
represents the main trunk working copy. To work on the branch, you
must check it out. Since we're still working on the main trunk in
tandem, we'll check out the branch to its own directory:</p>
<pre class="programlisting">
cd ..
cvs co -r v0_1ft1_fix1 -d helloworld_0_1ft1_fix1 helloworld
</pre>
<p>Change to the <tt class="literal">helloworld_0_1ft1_fix1</tt>
directory and look at the status. Note the section labelled &quot;Sticky
Tag&quot;. It has the current branch tag next to it. What this means is
that any changes you make to the repository here (for this working
copy) will happen only to the revision indicated by that tag.</p>
<p>Change the program to look like this:</p>
<pre class="programlisting">
#include iostream
int main()
{
  std::cout &lt;&lt; &quot;Hello, World\n&quot;;
  return 0;
}
</pre>
<p>Check it in. Now go back to the main trunk directory (<tt class=
"literal">../helloworld</tt>) and change the program to look like
this:</p>
<pre class="programlisting">
#include iostream.h
#include string
void main() 
{
  std::string message = &quot;Hello, World!&quot;;
  cout &lt;&lt; message &lt;&lt; &quot;\n&quot;;
}
</pre>
<p>and check it in. We now have two independent branches of
development, and the changes in each overlap.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e368" id="d0e368"></a>Merging the
Branches</h3>
</div>
<p>CVS is pretty handy at merging branches. If for example you made
changes on the branch to one file, and there were changes on the
main trunk but not to that file, CVS will merge all the changes for
you automatically. Similarly, if changes in a single file are in
different portions, CVS will try to merge automatically.</p>
<p>In our case, however, the changes conflict with each other.
Let's see what CVS does with them:</p>
<pre class="programlisting">
cvs update -j v0_1ft1_fix1
</pre>
<p>The -j option to the update function tells it the branch name
from which to merge. CVS tells you it's retrieving the branch and
the revision the branch was made from, and merging the differences
into the current revision. It should also tell you there are
conflicts.</p>
<p>Look at the status of <tt class="literal">hello.cpp</tt>. Now
open up <tt class="literal">hello.cpp</tt> in your favourite
editor.</p>
<div class="sect3" lang="en">
<div class="titlepage">
<h3><a name="d0e387" id="d0e387"></a>Understanding
the Differences</h4>
</div>
<p>Ignoring for now any conflicts in the keyword expansions at the
top of the file (assuming you used them), here are the two files
side by side:</p>
<pre class="programlisting">
// main truck
#include &lt;iostream&gt;
#include &lt;string&gt;
void main ()
{
  std::string message = &quot;Hello World!&quot;
  cout &lt;&lt; message &lt;&lt; &quot;\n&quot;;
}
// fix1 branch
#include &lt;iostream&gt;
void main () 
{
  cout &lt;&lt; &quot;Hello World\n&quot;;
  return 0;
}
</pre>
<p>Here's what the merged file should now look like:</p>
<pre class="programlisting">
#include &lt;iostream&gt;
int main()
{
 hello.cpp
  std::string message = &quot;Hello, World!&quot;;
  cout  message  &quot;\n&quot;;
=======
  std::cout &lt;&lt; &quot;Hello, World!\n&quot;;
  return 0;
 1.2.2.1
}
</pre>
<p>CVS successfully auto-merged the first three lines. If only
those changes had been made on the branch, we would not have a
conflict.</p>
<p>However, CVS was unable to merge the main body of the program.
We have to do this manually. We have arrows pointing left, and the
file name. This represents the main trunk file (the file being
merged into), followed by a horizontal line, and then the text of
the right hand file (the branch), with arrows pointing right and
the tag name of the branch.</p>
<p>This should be enough information to determine what the merged
file should look like; we need some text from both sides of the
merge:</p>
<pre class="programlisting">
#include iostream
int main()
{
  std::string message = &quot;Hello, World!&quot;;
  std::cout &lt;&lt; message &lt;&lt; &quot;\n&quot;;
  return 0;
}
</pre>
<p>We can now save this file.</p>
<p>During the merge, CVS saved our existing working copy of any
files changed as a result of the merge. In this case <tt class=
"literal">hello.cpp</tt> was changed. The existing copy will be
called something like <tt class="literal">.#hello.cpp.1.3</tt>. If
needed you can always replace the new merged file with the old one,
and re-merge if necessary.</p>
<p>However, in this case, we're happy with the merge, and so can
commit the changes to the repository.</p>
<pre class="programlisting">
cvs ci -m &quot;Merged Fix1 branch into the development trunk&quot;
</pre>
<p>Merging branches is generally not as easy as that! It requires
care and patience, but is ultimately more efficient than other
methods of handling the same problems.</p>
</div>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e422" id="d0e422"></a>Final
Thoughts</h2>
</div>
<p>You can't use CVS effectively without access to the
manual<sup>[<a href="#ftn.cvshome">2</a>]</sup>. It is a pretty
complicated program, but all full-featured tools are. With luck,
this guide will help get you started.</p>
<p>personally started using CVS with WinCVS<sup>[<a name="d0e431"
href="#ftn.d0e431" id="d0e431">3</a>]</sup> on Windows NT and 98.
Many people disparage it, because it tries to put a Visual Source
Safe-like GUI on top of CVS. (I actually think it's more like
WinMKS, but there you go!). It's still a useful tool, and you can
use the command line access to perform tasks it won't or can't do
for you. When you run an interactive command, WinCVS also tells you
what CVS command it has issued, and the direct output from it,
which can be very useful in understanding the CVS command line.</p>
<p>Now go ahead and play with it. Use the repository we created
here as a play-area, a kind of sandbox you can muck about it
without fear of getting in too much of a mess.</p>
<p>When you're confident, start using it to manage your own
projects.</p>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e440" id="d0e440"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Griffiths" id="Griffiths"></a>
<p class="bibliomixed">[Griffiths] Using Version Control, Alan
Griffiths, Overload 44 August 2001</p>
</div>
<div class="bibliomixed"><a name="CVS" id="CVS"></a>
<p class="bibliomixed">[CVS] <span class="bibliomisc"><a href=
"http://cvshome.org/docs/manual/cvs.html" target=
"_top">CVS--Concurrent Versions System v1.11.1p1</a></span> AKA
&quot;The Cederqvist&quot;</p>
</div>
</div>
<div class="footnotes"><br>
<hr class="c2" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.redhat" href="#redhat" id=
"ftn.redhat">1</a>]</sup> <a name="redhaturl" href=
"http://sources.redhat.com/cygwin" target="_top" id=
"redhaturl">http://sources.redhat.com/cygwin</a></p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.cvshome" href="#cvshome" id=
"ftn.cvshome">2</a>]</sup> <a name="cvshomeurl" href=
"http://cvshome.org/docs/manual/cvs.html" target="_top" id=
"cvshomeurl">http://cvshome.org/docs/manual/cvs.html</a></p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e431" href="#d0e431" id=
"ftn.d0e431">3</a>]</sup> <a href="http://wincvs.org" target=
"_top">http://wincvs.org</a></p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
